@strapi/core 5.46.1 → 5.47.1

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 (232) hide show
  1. package/dist/Strapi.d.ts.map +1 -1
  2. package/dist/Strapi.js +12 -3
  3. package/dist/Strapi.js.map +1 -1
  4. package/dist/Strapi.mjs +12 -3
  5. package/dist/Strapi.mjs.map +1 -1
  6. package/dist/compile.d.ts.map +1 -1
  7. package/dist/compile.js +12 -5
  8. package/dist/compile.js.map +1 -1
  9. package/dist/compile.mjs +12 -5
  10. package/dist/compile.mjs.map +1 -1
  11. package/dist/core-api/routes/index.js +2 -0
  12. package/dist/core-api/routes/index.js.map +1 -1
  13. package/dist/core-api/routes/index.mjs +2 -0
  14. package/dist/core-api/routes/index.mjs.map +1 -1
  15. package/dist/core-api/routes/validation/content-type.d.ts +13 -1
  16. package/dist/core-api/routes/validation/content-type.d.ts.map +1 -1
  17. package/dist/core-api/routes/validation/content-type.js +15 -2
  18. package/dist/core-api/routes/validation/content-type.js.map +1 -1
  19. package/dist/core-api/routes/validation/content-type.mjs +15 -2
  20. package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
  21. package/dist/middlewares/session.d.ts +2 -2
  22. package/dist/middlewares/session.d.ts.map +1 -1
  23. package/dist/middlewares/session.js +1 -1
  24. package/dist/middlewares/session.js.map +1 -1
  25. package/dist/middlewares/session.mjs +2 -2
  26. package/dist/middlewares/session.mjs.map +1 -1
  27. package/dist/migrations/database/5.0.0-discard-drafts.d.ts +2 -1
  28. package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
  29. package/dist/migrations/database/5.0.0-discard-drafts.js +41 -30
  30. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  31. package/dist/migrations/database/5.0.0-discard-drafts.mjs +41 -30
  32. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  33. package/dist/package.json.js +16 -15
  34. package/dist/package.json.js.map +1 -1
  35. package/dist/package.json.mjs +16 -15
  36. package/dist/package.json.mjs.map +1 -1
  37. package/dist/providers/index.d.ts.map +1 -1
  38. package/dist/providers/index.js +3 -1
  39. package/dist/providers/index.js.map +1 -1
  40. package/dist/providers/index.mjs +3 -1
  41. package/dist/providers/index.mjs.map +1 -1
  42. package/dist/providers/mcp.d.ts +3 -0
  43. package/dist/providers/mcp.d.ts.map +1 -0
  44. package/dist/providers/mcp.js +39 -0
  45. package/dist/providers/mcp.js.map +1 -0
  46. package/dist/providers/mcp.mjs +37 -0
  47. package/dist/providers/mcp.mjs.map +1 -0
  48. package/dist/providers/session-manager.d.ts.map +1 -1
  49. package/dist/providers/session-manager.js +3 -0
  50. package/dist/providers/session-manager.js.map +1 -1
  51. package/dist/providers/session-manager.mjs +3 -0
  52. package/dist/providers/session-manager.mjs.map +1 -1
  53. package/dist/services/ai.d.ts.map +1 -1
  54. package/dist/services/ai.js +3 -0
  55. package/dist/services/ai.js.map +1 -1
  56. package/dist/services/ai.mjs +3 -0
  57. package/dist/services/ai.mjs.map +1 -1
  58. package/dist/services/cron.d.ts +1 -1
  59. package/dist/services/cron.d.ts.map +1 -1
  60. package/dist/services/cron.js +10 -2
  61. package/dist/services/cron.js.map +1 -1
  62. package/dist/services/cron.mjs +10 -2
  63. package/dist/services/cron.mjs.map +1 -1
  64. package/dist/services/document-service/draft-and-publish.d.ts +2 -16
  65. package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
  66. package/dist/services/document-service/draft-and-publish.js +0 -53
  67. package/dist/services/document-service/draft-and-publish.js.map +1 -1
  68. package/dist/services/document-service/draft-and-publish.mjs +2 -53
  69. package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
  70. package/dist/services/document-service/params.d.ts +2 -2
  71. package/dist/services/document-service/params.d.ts.map +1 -1
  72. package/dist/services/document-service/publication-filter.d.ts +6 -0
  73. package/dist/services/document-service/publication-filter.d.ts.map +1 -0
  74. package/dist/services/document-service/publication-filter.js +20 -0
  75. package/dist/services/document-service/publication-filter.js.map +1 -0
  76. package/dist/services/document-service/publication-filter.mjs +15 -0
  77. package/dist/services/document-service/publication-filter.mjs.map +1 -0
  78. package/dist/services/document-service/transform/query.d.ts +1 -1
  79. package/dist/services/document-service/transform/query.d.ts.map +1 -1
  80. package/dist/services/document-service/transform/query.js +32 -19
  81. package/dist/services/document-service/transform/query.js.map +1 -1
  82. package/dist/services/document-service/transform/query.mjs +33 -20
  83. package/dist/services/document-service/transform/query.mjs.map +1 -1
  84. package/dist/services/entity-validator/blocks-validator.js +1 -1
  85. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  86. package/dist/services/entity-validator/blocks-validator.mjs +1 -1
  87. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  88. package/dist/services/mcp/authentication.d.ts +23 -0
  89. package/dist/services/mcp/authentication.d.ts.map +1 -0
  90. package/dist/services/mcp/authentication.js +45 -0
  91. package/dist/services/mcp/authentication.js.map +1 -0
  92. package/dist/services/mcp/authentication.mjs +43 -0
  93. package/dist/services/mcp/authentication.mjs.map +1 -0
  94. package/dist/services/mcp/handlers/handlePost.d.ts +4 -0
  95. package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -0
  96. package/dist/services/mcp/handlers/handlePost.js +59 -0
  97. package/dist/services/mcp/handlers/handlePost.js.map +1 -0
  98. package/dist/services/mcp/handlers/handlePost.mjs +57 -0
  99. package/dist/services/mcp/handlers/handlePost.mjs.map +1 -0
  100. package/dist/services/mcp/handlers/types.d.ts +12 -0
  101. package/dist/services/mcp/handlers/types.d.ts.map +1 -0
  102. package/dist/services/mcp/index.d.ts +6 -0
  103. package/dist/services/mcp/index.d.ts.map +1 -0
  104. package/dist/services/mcp/index.js +101 -0
  105. package/dist/services/mcp/index.js.map +1 -0
  106. package/dist/services/mcp/index.mjs +99 -0
  107. package/dist/services/mcp/index.mjs.map +1 -0
  108. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts +13 -0
  109. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts.map +1 -0
  110. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js +53 -0
  111. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js.map +1 -0
  112. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs +51 -0
  113. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs.map +1 -0
  114. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +43 -0
  115. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -0
  116. package/dist/services/mcp/internal/McpCapabilityRegistry.js +108 -0
  117. package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -0
  118. package/dist/services/mcp/internal/McpCapabilityRegistry.mjs +106 -0
  119. package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -0
  120. package/dist/services/mcp/internal/McpConfiguration.d.ts +11 -0
  121. package/dist/services/mcp/internal/McpConfiguration.d.ts.map +1 -0
  122. package/dist/services/mcp/internal/McpConfiguration.js +34 -0
  123. package/dist/services/mcp/internal/McpConfiguration.js.map +1 -0
  124. package/dist/services/mcp/internal/McpConfiguration.mjs +32 -0
  125. package/dist/services/mcp/internal/McpConfiguration.mjs.map +1 -0
  126. package/dist/services/mcp/internal/McpServerFactory.d.ts +37 -0
  127. package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -0
  128. package/dist/services/mcp/internal/McpServerFactory.js +71 -0
  129. package/dist/services/mcp/internal/McpServerFactory.js.map +1 -0
  130. package/dist/services/mcp/internal/McpServerFactory.mjs +69 -0
  131. package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -0
  132. package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts +21 -0
  133. package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts.map +1 -0
  134. package/dist/services/mcp/internal/syncMcpSessionCapabilities.js +76 -0
  135. package/dist/services/mcp/internal/syncMcpSessionCapabilities.js.map +1 -0
  136. package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs +73 -0
  137. package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs.map +1 -0
  138. package/dist/services/mcp/metrics/metrics.d.ts +29 -0
  139. package/dist/services/mcp/metrics/metrics.d.ts.map +1 -0
  140. package/dist/services/mcp/metrics/metrics.js +97 -0
  141. package/dist/services/mcp/metrics/metrics.js.map +1 -0
  142. package/dist/services/mcp/metrics/metrics.mjs +88 -0
  143. package/dist/services/mcp/metrics/metrics.mjs.map +1 -0
  144. package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts +11 -0
  145. package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts.map +1 -0
  146. package/dist/services/mcp/metrics/normalizeMcpCapability.js +10 -0
  147. package/dist/services/mcp/metrics/normalizeMcpCapability.js.map +1 -0
  148. package/dist/services/mcp/metrics/normalizeMcpCapability.mjs +8 -0
  149. package/dist/services/mcp/metrics/normalizeMcpCapability.mjs.map +1 -0
  150. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts +4 -0
  151. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts.map +1 -0
  152. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js +27 -0
  153. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js.map +1 -0
  154. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs +25 -0
  155. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs.map +1 -0
  156. package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts +3 -0
  157. package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts.map +1 -0
  158. package/dist/services/mcp/middleware/oauthDiscoveryFallback.js +47 -0
  159. package/dist/services/mcp/middleware/oauthDiscoveryFallback.js.map +1 -0
  160. package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs +45 -0
  161. package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs.map +1 -0
  162. package/dist/services/mcp/prompt-registry.d.ts +16 -0
  163. package/dist/services/mcp/prompt-registry.d.ts.map +1 -0
  164. package/dist/services/mcp/prompt-registry.js +77 -0
  165. package/dist/services/mcp/prompt-registry.js.map +1 -0
  166. package/dist/services/mcp/prompt-registry.mjs +75 -0
  167. package/dist/services/mcp/prompt-registry.mjs.map +1 -0
  168. package/dist/services/mcp/resource-registry.d.ts +14 -0
  169. package/dist/services/mcp/resource-registry.d.ts.map +1 -0
  170. package/dist/services/mcp/resource-registry.js +67 -0
  171. package/dist/services/mcp/resource-registry.js.map +1 -0
  172. package/dist/services/mcp/resource-registry.mjs +65 -0
  173. package/dist/services/mcp/resource-registry.mjs.map +1 -0
  174. package/dist/services/mcp/routes.d.ts +11 -0
  175. package/dist/services/mcp/routes.d.ts.map +1 -0
  176. package/dist/services/mcp/routes.js +58 -0
  177. package/dist/services/mcp/routes.js.map +1 -0
  178. package/dist/services/mcp/routes.mjs +56 -0
  179. package/dist/services/mcp/routes.mjs.map +1 -0
  180. package/dist/services/mcp/tool-registry.d.ts +25 -0
  181. package/dist/services/mcp/tool-registry.d.ts.map +1 -0
  182. package/dist/services/mcp/tool-registry.js +102 -0
  183. package/dist/services/mcp/tool-registry.js.map +1 -0
  184. package/dist/services/mcp/tool-registry.mjs +99 -0
  185. package/dist/services/mcp/tool-registry.mjs.map +1 -0
  186. package/dist/services/mcp/tools/log.d.ts +87 -0
  187. package/dist/services/mcp/tools/log.d.ts.map +1 -0
  188. package/dist/services/mcp/tools/log.js +88 -0
  189. package/dist/services/mcp/tools/log.js.map +1 -0
  190. package/dist/services/mcp/tools/log.mjs +86 -0
  191. package/dist/services/mcp/tools/log.mjs.map +1 -0
  192. package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts +36 -0
  193. package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts.map +1 -0
  194. package/dist/services/mcp/utils/createSafeCapabilityRegistration.js +59 -0
  195. package/dist/services/mcp/utils/createSafeCapabilityRegistration.js.map +1 -0
  196. package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs +56 -0
  197. package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs.map +1 -0
  198. package/dist/services/mcp/utils/jsonRpcErrors.d.ts +22 -0
  199. package/dist/services/mcp/utils/jsonRpcErrors.d.ts.map +1 -0
  200. package/dist/services/mcp/utils/jsonRpcErrors.js +25 -0
  201. package/dist/services/mcp/utils/jsonRpcErrors.js.map +1 -0
  202. package/dist/services/mcp/utils/jsonRpcErrors.mjs +23 -0
  203. package/dist/services/mcp/utils/jsonRpcErrors.mjs.map +1 -0
  204. package/dist/services/mcp/utils/safeHandlerWrapper.d.ts +18 -0
  205. package/dist/services/mcp/utils/safeHandlerWrapper.d.ts.map +1 -0
  206. package/dist/services/mcp/utils/safeHandlerWrapper.js +29 -0
  207. package/dist/services/mcp/utils/safeHandlerWrapper.js.map +1 -0
  208. package/dist/services/mcp/utils/safeHandlerWrapper.mjs +27 -0
  209. package/dist/services/mcp/utils/safeHandlerWrapper.mjs.map +1 -0
  210. package/dist/services/mcp/utils/sendJsonRpcError.d.ts +5 -0
  211. package/dist/services/mcp/utils/sendJsonRpcError.d.ts.map +1 -0
  212. package/dist/services/mcp/utils/sendJsonRpcError.js +23 -0
  213. package/dist/services/mcp/utils/sendJsonRpcError.js.map +1 -0
  214. package/dist/services/mcp/utils/sendJsonRpcError.mjs +21 -0
  215. package/dist/services/mcp/utils/sendJsonRpcError.mjs.map +1 -0
  216. package/dist/services/mcp/utils/withTimeout.d.ts +7 -0
  217. package/dist/services/mcp/utils/withTimeout.d.ts.map +1 -0
  218. package/dist/services/mcp/utils/withTimeout.js +23 -0
  219. package/dist/services/mcp/utils/withTimeout.js.map +1 -0
  220. package/dist/services/mcp/utils/withTimeout.mjs +21 -0
  221. package/dist/services/mcp/utils/withTimeout.mjs.map +1 -0
  222. package/dist/services/metrics/index.d.ts.map +1 -1
  223. package/dist/services/metrics/index.js +9 -6
  224. package/dist/services/metrics/index.js.map +1 -1
  225. package/dist/services/metrics/index.mjs +9 -6
  226. package/dist/services/metrics/index.mjs.map +1 -1
  227. package/dist/services/metrics/sender.d.ts.map +1 -1
  228. package/dist/services/metrics/sender.js +11 -3
  229. package/dist/services/metrics/sender.js.map +1 -1
  230. package/dist/services/metrics/sender.mjs +11 -3
  231. package/dist/services/metrics/sender.mjs.map +1 -1
  232. package/package.json +16 -15
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+
3
+ var McpCapabilityRegistry = require('./internal/McpCapabilityRegistry.js');
4
+ var createSafeCapabilityRegistration = require('./utils/createSafeCapabilityRegistration.js');
5
+ var wrapCapabilityHandlerForMetrics = require('./metrics/wrapCapabilityHandlerForMetrics.js');
6
+
7
+ function _class_private_field_loose_base(receiver, privateKey) {
8
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
9
+ throw new TypeError("attempted to use private field on non-instance");
10
+ }
11
+ return receiver;
12
+ }
13
+ var id = 0;
14
+ function _class_private_field_loose_key(name) {
15
+ return "__private_" + id++ + "_" + name;
16
+ }
17
+ var _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi");
18
+ class McpResourceRegistry extends McpCapabilityRegistry.McpCapabilityRegistryBase {
19
+ bind(mcpServer) {
20
+ const strapi = _class_private_field_loose_base(this, _strapi)[_strapi];
21
+ super.register((definition)=>{
22
+ const { name, uri, metadata, createHandler } = definition;
23
+ return createSafeCapabilityRegistration.createSafeCapabilityRegistration({
24
+ strapi,
25
+ capabilityType: 'Resource',
26
+ name,
27
+ createHandler,
28
+ createFallbackHandler (errorMessage) {
29
+ return async (resourceUri)=>({
30
+ contents: [
31
+ {
32
+ uri: resourceUri.href,
33
+ text: `Resource "${name}" failed to initialize: ${errorMessage}`,
34
+ mimeType: 'text/plain'
35
+ }
36
+ ]
37
+ });
38
+ },
39
+ createErrorResult (error, args) {
40
+ return {
41
+ contents: [
42
+ {
43
+ uri: args[0] instanceof URL ? args[0].href : uri,
44
+ text: `Resource "${name}" execution failed: ${error.message}`,
45
+ mimeType: 'text/plain'
46
+ }
47
+ ]
48
+ };
49
+ },
50
+ registerWithSdk (safeHandler) {
51
+ const sdkHandler = wrapCapabilityHandlerForMetrics.wrapCapabilityHandlerForMetrics(strapi, 'resource', name, definition.telemetry, safeHandler);
52
+ return mcpServer.registerResource(name, uri, metadata, sdkHandler);
53
+ }
54
+ });
55
+ });
56
+ }
57
+ constructor(ctx){
58
+ super(ctx.definitions), Object.defineProperty(this, _strapi, {
59
+ writable: true,
60
+ value: void 0
61
+ });
62
+ _class_private_field_loose_base(this, _strapi)[_strapi] = ctx.strapi;
63
+ }
64
+ }
65
+
66
+ exports.McpResourceRegistry = McpResourceRegistry;
67
+ //# sourceMappingURL=resource-registry.js.map
@@ -0,0 +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\nexport const makeMcpResourceDefinition = <Definition extends Modules.MCP.McpResourceDefinition>(\n resource: Definition\n): Definition => resource;\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":["McpResourceRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","definition","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":";;;;;;;;;;;;;;;;AA0BE,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AARK,MAAMA,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,CAACC,UAAAA,GAAAA;YACd,MAAM,EAAEC,IAAI,EAAEC,GAAG,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGJ,UAAAA;AAE/C,YAAA,OAAOK,iEAAAA,CAAiC;AACtCP,gBAAAA,MAAAA;gBACAQ,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,CACjBxB,MAAAA,EACA,YACAG,IAAAA,EACAD,UAAAA,CAAWuB,SAAS,EACpBH,WAAAA,CAAAA;AAGF,oBAAA,OAAOvB,SAAAA,CAAU2B,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,IAAI3B,MAAM;AAC3B,IAAA;AAiDF;;;;"}
@@ -0,0 +1,65 @@
1
+ import { McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry.mjs';
2
+ import { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration.mjs';
3
+ import { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics.mjs';
4
+
5
+ function _class_private_field_loose_base(receiver, privateKey) {
6
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
7
+ throw new TypeError("attempted to use private field on non-instance");
8
+ }
9
+ return receiver;
10
+ }
11
+ var id = 0;
12
+ function _class_private_field_loose_key(name) {
13
+ return "__private_" + id++ + "_" + name;
14
+ }
15
+ var _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi");
16
+ class McpResourceRegistry extends McpCapabilityRegistryBase {
17
+ bind(mcpServer) {
18
+ const strapi = _class_private_field_loose_base(this, _strapi)[_strapi];
19
+ super.register((definition)=>{
20
+ const { name, uri, metadata, createHandler } = definition;
21
+ return createSafeCapabilityRegistration({
22
+ strapi,
23
+ capabilityType: 'Resource',
24
+ name,
25
+ createHandler,
26
+ createFallbackHandler (errorMessage) {
27
+ return async (resourceUri)=>({
28
+ contents: [
29
+ {
30
+ uri: resourceUri.href,
31
+ text: `Resource "${name}" failed to initialize: ${errorMessage}`,
32
+ mimeType: 'text/plain'
33
+ }
34
+ ]
35
+ });
36
+ },
37
+ createErrorResult (error, args) {
38
+ return {
39
+ contents: [
40
+ {
41
+ uri: args[0] instanceof URL ? args[0].href : uri,
42
+ text: `Resource "${name}" execution failed: ${error.message}`,
43
+ mimeType: 'text/plain'
44
+ }
45
+ ]
46
+ };
47
+ },
48
+ registerWithSdk (safeHandler) {
49
+ const sdkHandler = wrapCapabilityHandlerForMetrics(strapi, 'resource', name, definition.telemetry, safeHandler);
50
+ return mcpServer.registerResource(name, uri, metadata, sdkHandler);
51
+ }
52
+ });
53
+ });
54
+ }
55
+ constructor(ctx){
56
+ super(ctx.definitions), Object.defineProperty(this, _strapi, {
57
+ writable: true,
58
+ value: void 0
59
+ });
60
+ _class_private_field_loose_base(this, _strapi)[_strapi] = ctx.strapi;
61
+ }
62
+ }
63
+
64
+ export { McpResourceRegistry };
65
+ //# sourceMappingURL=resource-registry.mjs.map
@@ -0,0 +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\nexport const makeMcpResourceDefinition = <Definition extends Modules.MCP.McpResourceDefinition>(\n resource: Definition\n): Definition => resource;\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":["McpResourceRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","definition","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":";;;;;;;;;;;;;;AA0BE,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AARK,MAAMA,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,CAACC,UAAAA,GAAAA;YACd,MAAM,EAAEC,IAAI,EAAEC,GAAG,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGJ,UAAAA;AAE/C,YAAA,OAAOK,gCAAAA,CAAiC;AACtCP,gBAAAA,MAAAA;gBACAQ,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,CACjBxB,MAAAA,EACA,YACAG,IAAAA,EACAD,UAAAA,CAAWuB,SAAS,EACpBH,WAAAA,CAAAA;AAGF,oBAAA,OAAOvB,SAAAA,CAAU2B,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,IAAI3B,MAAM;AAC3B,IAAA;AAiDF;;;;"}
@@ -0,0 +1,11 @@
1
+ import type { Core } from '@strapi/types';
2
+ import { McpConfiguration } from './internal/McpConfiguration';
3
+ export type McpRouteHandlers = {
4
+ handlePost: Core.MiddlewareHandler;
5
+ };
6
+ /**
7
+ * Creates MCP route definitions for registration with Strapi server.
8
+ * @internal
9
+ */
10
+ export declare const createMcpRoutes: (config: McpConfiguration, handlers: McpRouteHandlers) => Omit<Core.Route, 'info'>[];
11
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAgB/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC;CACpC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,WAClB,gBAAgB,YACd,gBAAgB,KACzB,KAAK,KAAK,KAAK,EAAE,MAAM,CAAC,EAU1B,CAAC"}
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ var sendJsonRpcError = require('./utils/sendJsonRpcError.js');
4
+
5
+ /**
6
+ * Handler for unsupported HTTP methods on /mcp endpoint.
7
+ * Returns JSON-RPC error instead of plain text so MCP clients can parse it.
8
+ */ const handleMethodNotAllowed = async (ctx)=>{
9
+ // Opt out of Koa's response phase — sendJsonRpcError writes directly to ctx.res.
10
+ ctx.respond = false;
11
+ // ctx.set() writes to Koa's in-memory headers which are never flushed when ctx.respond = false.
12
+ // Use res.setHeader() so the header is included when sendJsonRpcError calls res.writeHead().
13
+ ctx.res.setHeader('Allow', 'POST');
14
+ sendJsonRpcError.sendJsonRpcError(ctx.res, 'METHOD_NOT_ALLOWED');
15
+ };
16
+ /**
17
+ * Creates MCP route definitions for registration with Strapi server.
18
+ * @internal
19
+ */ const createMcpRoutes = (config, handlers)=>{
20
+ const noAuth = {
21
+ auth: false
22
+ };
23
+ return [
24
+ {
25
+ method: 'POST',
26
+ path: config.path,
27
+ handler: handlers.handlePost,
28
+ config: noAuth
29
+ },
30
+ {
31
+ method: 'GET',
32
+ path: config.path,
33
+ handler: handleMethodNotAllowed,
34
+ config: noAuth
35
+ },
36
+ {
37
+ method: 'DELETE',
38
+ path: config.path,
39
+ handler: handleMethodNotAllowed,
40
+ config: noAuth
41
+ },
42
+ {
43
+ method: 'PUT',
44
+ path: config.path,
45
+ handler: handleMethodNotAllowed,
46
+ config: noAuth
47
+ },
48
+ {
49
+ method: 'PATCH',
50
+ path: config.path,
51
+ handler: handleMethodNotAllowed,
52
+ config: noAuth
53
+ }
54
+ ];
55
+ };
56
+
57
+ exports.createMcpRoutes = createMcpRoutes;
58
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sources":["../../../src/services/mcp/routes.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { McpConfiguration } from './internal/McpConfiguration';\nimport { sendJsonRpcError } from './utils/sendJsonRpcError';\n\n/**\n * Handler for unsupported HTTP methods on /mcp endpoint.\n * Returns JSON-RPC error instead of plain text so MCP clients can parse it.\n */\nconst handleMethodNotAllowed: Core.MiddlewareHandler = async (ctx) => {\n // Opt out of Koa's response phase — sendJsonRpcError writes directly to ctx.res.\n ctx.respond = false;\n // ctx.set() writes to Koa's in-memory headers which are never flushed when ctx.respond = false.\n // Use res.setHeader() so the header is included when sendJsonRpcError calls res.writeHead().\n ctx.res.setHeader('Allow', 'POST');\n sendJsonRpcError(ctx.res, 'METHOD_NOT_ALLOWED');\n};\n\nexport type McpRouteHandlers = {\n handlePost: Core.MiddlewareHandler;\n};\n\n/**\n * Creates MCP route definitions for registration with Strapi server.\n * @internal\n */\nexport const createMcpRoutes = (\n config: McpConfiguration,\n handlers: McpRouteHandlers\n): Omit<Core.Route, 'info'>[] => {\n const noAuth = { auth: false } as const;\n\n return [\n { method: 'POST', path: config.path, handler: handlers.handlePost, config: noAuth },\n { method: 'GET', path: config.path, handler: handleMethodNotAllowed, config: noAuth },\n { method: 'DELETE', path: config.path, handler: handleMethodNotAllowed, config: noAuth },\n { method: 'PUT', path: config.path, handler: handleMethodNotAllowed, config: noAuth },\n { method: 'PATCH', path: config.path, handler: handleMethodNotAllowed, config: noAuth },\n ];\n};\n"],"names":["handleMethodNotAllowed","ctx","respond","res","setHeader","sendJsonRpcError","createMcpRoutes","config","handlers","noAuth","auth","method","path","handler","handlePost"],"mappings":";;;;AAIA;;;IAIA,MAAMA,yBAAiD,OAAOC,GAAAA,GAAAA;;AAE5DA,IAAAA,GAAAA,CAAIC,OAAO,GAAG,KAAA;;;AAGdD,IAAAA,GAAAA,CAAIE,GAAG,CAACC,SAAS,CAAC,OAAA,EAAS,MAAA,CAAA;IAC3BC,iCAAAA,CAAiBJ,GAAAA,CAAIE,GAAG,EAAE,oBAAA,CAAA;AAC5B,CAAA;AAMA;;;AAGC,IACM,MAAMG,eAAAA,GAAkB,CAC7BC,MAAAA,EACAC,QAAAA,GAAAA;AAEA,IAAA,MAAMC,MAAAA,GAAS;QAAEC,IAAAA,EAAM;AAAM,KAAA;IAE7B,OAAO;AACL,QAAA;YAAEC,MAAAA,EAAQ,MAAA;AAAQC,YAAAA,IAAAA,EAAML,OAAOK,IAAI;AAAEC,YAAAA,OAAAA,EAASL,SAASM,UAAU;YAAEP,MAAAA,EAAQE;AAAO,SAAA;AAClF,QAAA;YAAEE,MAAAA,EAAQ,KAAA;AAAOC,YAAAA,IAAAA,EAAML,OAAOK,IAAI;YAAEC,OAAAA,EAASb,sBAAAA;YAAwBO,MAAAA,EAAQE;AAAO,SAAA;AACpF,QAAA;YAAEE,MAAAA,EAAQ,QAAA;AAAUC,YAAAA,IAAAA,EAAML,OAAOK,IAAI;YAAEC,OAAAA,EAASb,sBAAAA;YAAwBO,MAAAA,EAAQE;AAAO,SAAA;AACvF,QAAA;YAAEE,MAAAA,EAAQ,KAAA;AAAOC,YAAAA,IAAAA,EAAML,OAAOK,IAAI;YAAEC,OAAAA,EAASb,sBAAAA;YAAwBO,MAAAA,EAAQE;AAAO,SAAA;AACpF,QAAA;YAAEE,MAAAA,EAAQ,OAAA;AAASC,YAAAA,IAAAA,EAAML,OAAOK,IAAI;YAAEC,OAAAA,EAASb,sBAAAA;YAAwBO,MAAAA,EAAQE;AAAO;AACvF,KAAA;AACH;;;;"}
@@ -0,0 +1,56 @@
1
+ import { sendJsonRpcError } from './utils/sendJsonRpcError.mjs';
2
+
3
+ /**
4
+ * Handler for unsupported HTTP methods on /mcp endpoint.
5
+ * Returns JSON-RPC error instead of plain text so MCP clients can parse it.
6
+ */ const handleMethodNotAllowed = async (ctx)=>{
7
+ // Opt out of Koa's response phase — sendJsonRpcError writes directly to ctx.res.
8
+ ctx.respond = false;
9
+ // ctx.set() writes to Koa's in-memory headers which are never flushed when ctx.respond = false.
10
+ // Use res.setHeader() so the header is included when sendJsonRpcError calls res.writeHead().
11
+ ctx.res.setHeader('Allow', 'POST');
12
+ sendJsonRpcError(ctx.res, 'METHOD_NOT_ALLOWED');
13
+ };
14
+ /**
15
+ * Creates MCP route definitions for registration with Strapi server.
16
+ * @internal
17
+ */ const createMcpRoutes = (config, handlers)=>{
18
+ const noAuth = {
19
+ auth: false
20
+ };
21
+ return [
22
+ {
23
+ method: 'POST',
24
+ path: config.path,
25
+ handler: handlers.handlePost,
26
+ config: noAuth
27
+ },
28
+ {
29
+ method: 'GET',
30
+ path: config.path,
31
+ handler: handleMethodNotAllowed,
32
+ config: noAuth
33
+ },
34
+ {
35
+ method: 'DELETE',
36
+ path: config.path,
37
+ handler: handleMethodNotAllowed,
38
+ config: noAuth
39
+ },
40
+ {
41
+ method: 'PUT',
42
+ path: config.path,
43
+ handler: handleMethodNotAllowed,
44
+ config: noAuth
45
+ },
46
+ {
47
+ method: 'PATCH',
48
+ path: config.path,
49
+ handler: handleMethodNotAllowed,
50
+ config: noAuth
51
+ }
52
+ ];
53
+ };
54
+
55
+ export { createMcpRoutes };
56
+ //# sourceMappingURL=routes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.mjs","sources":["../../../src/services/mcp/routes.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { McpConfiguration } from './internal/McpConfiguration';\nimport { sendJsonRpcError } from './utils/sendJsonRpcError';\n\n/**\n * Handler for unsupported HTTP methods on /mcp endpoint.\n * Returns JSON-RPC error instead of plain text so MCP clients can parse it.\n */\nconst handleMethodNotAllowed: Core.MiddlewareHandler = async (ctx) => {\n // Opt out of Koa's response phase — sendJsonRpcError writes directly to ctx.res.\n ctx.respond = false;\n // ctx.set() writes to Koa's in-memory headers which are never flushed when ctx.respond = false.\n // Use res.setHeader() so the header is included when sendJsonRpcError calls res.writeHead().\n ctx.res.setHeader('Allow', 'POST');\n sendJsonRpcError(ctx.res, 'METHOD_NOT_ALLOWED');\n};\n\nexport type McpRouteHandlers = {\n handlePost: Core.MiddlewareHandler;\n};\n\n/**\n * Creates MCP route definitions for registration with Strapi server.\n * @internal\n */\nexport const createMcpRoutes = (\n config: McpConfiguration,\n handlers: McpRouteHandlers\n): Omit<Core.Route, 'info'>[] => {\n const noAuth = { auth: false } as const;\n\n return [\n { method: 'POST', path: config.path, handler: handlers.handlePost, config: noAuth },\n { method: 'GET', path: config.path, handler: handleMethodNotAllowed, config: noAuth },\n { method: 'DELETE', path: config.path, handler: handleMethodNotAllowed, config: noAuth },\n { method: 'PUT', path: config.path, handler: handleMethodNotAllowed, config: noAuth },\n { method: 'PATCH', path: config.path, handler: handleMethodNotAllowed, config: noAuth },\n ];\n};\n"],"names":["handleMethodNotAllowed","ctx","respond","res","setHeader","sendJsonRpcError","createMcpRoutes","config","handlers","noAuth","auth","method","path","handler","handlePost"],"mappings":";;AAIA;;;IAIA,MAAMA,yBAAiD,OAAOC,GAAAA,GAAAA;;AAE5DA,IAAAA,GAAAA,CAAIC,OAAO,GAAG,KAAA;;;AAGdD,IAAAA,GAAAA,CAAIE,GAAG,CAACC,SAAS,CAAC,OAAA,EAAS,MAAA,CAAA;IAC3BC,gBAAAA,CAAiBJ,GAAAA,CAAIE,GAAG,EAAE,oBAAA,CAAA;AAC5B,CAAA;AAMA;;;AAGC,IACM,MAAMG,eAAAA,GAAkB,CAC7BC,MAAAA,EACAC,QAAAA,GAAAA;AAEA,IAAA,MAAMC,MAAAA,GAAS;QAAEC,IAAAA,EAAM;AAAM,KAAA;IAE7B,OAAO;AACL,QAAA;YAAEC,MAAAA,EAAQ,MAAA;AAAQC,YAAAA,IAAAA,EAAML,OAAOK,IAAI;AAAEC,YAAAA,OAAAA,EAASL,SAASM,UAAU;YAAEP,MAAAA,EAAQE;AAAO,SAAA;AAClF,QAAA;YAAEE,MAAAA,EAAQ,KAAA;AAAOC,YAAAA,IAAAA,EAAML,OAAOK,IAAI;YAAEC,OAAAA,EAASb,sBAAAA;YAAwBO,MAAAA,EAAQE;AAAO,SAAA;AACpF,QAAA;YAAEE,MAAAA,EAAQ,QAAA;AAAUC,YAAAA,IAAAA,EAAML,OAAOK,IAAI;YAAEC,OAAAA,EAASb,sBAAAA;YAAwBO,MAAAA,EAAQE;AAAO,SAAA;AACvF,QAAA;YAAEE,MAAAA,EAAQ,KAAA;AAAOC,YAAAA,IAAAA,EAAML,OAAOK,IAAI;YAAEC,OAAAA,EAASb,sBAAAA;YAAwBO,MAAAA,EAAQE;AAAO,SAAA;AACpF,QAAA;YAAEE,MAAAA,EAAQ,OAAA;AAASC,YAAAA,IAAAA,EAAML,OAAOK,IAAI;YAAEC,OAAAA,EAASb,sBAAAA;YAAwBO,MAAAA,EAAQE;AAAO;AACvF,KAAA;AACH;;;;"}
@@ -0,0 +1,25 @@
1
+ import type { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Core, Modules } from '@strapi/types';
3
+ import { z } from '@strapi/utils';
4
+ import { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';
5
+ import { type McpCapabilityRegistry, McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry';
6
+ import type { McpAdminTokenAbility } from './authentication';
7
+ export declare function makeMcpToolDefinition<Name extends string, Title extends string, Description extends string, OutputSchema extends z.ZodObject<z.ZodRawShape>, InputSchema extends z.ZodObject<z.ZodRawShape> | undefined = undefined, Access extends Modules.MCP.McpCapabilityAccess = Modules.MCP.McpCapabilityAccess>(tool: {
8
+ name: Name;
9
+ title: Title;
10
+ description: Description;
11
+ resolveInputSchema?: (context: Modules.MCP.McpHandlerContext) => InputSchema;
12
+ resolveOutputSchema: (context: Modules.MCP.McpHandlerContext) => OutputSchema;
13
+ createHandler: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) => Modules.MCP.McpToolHandler<NoInfer<InputSchema>, NoInfer<OutputSchema>>;
14
+ } & Access): Modules.MCP.McpToolDefinition<Name, InputSchema, OutputSchema, Title, Description> & Access;
15
+ export declare class McpToolRegistry extends McpCapabilityRegistryBase<'tool', Modules.MCP.McpToolDefinition, RegisteredTool> implements McpCapabilityRegistry {
16
+ #private;
17
+ constructor(ctx: {
18
+ strapi: Core.Strapi;
19
+ definitions: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;
20
+ ability: McpAdminTokenAbility;
21
+ user: Modules.MCP.McpHandlerContext['user'];
22
+ });
23
+ bind(mcpServer: McpServer): void;
24
+ }
25
+ //# sourceMappingURL=tool-registry.d.ts.map
@@ -0,0 +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,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,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,wBAAgB,qBAAqB,CACnC,IAAI,SAAS,MAAM,EACnB,KAAK,SAAS,MAAM,EACpB,WAAW,SAAS,MAAM,EAC1B,YAAY,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,EAC/C,WAAW,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,SAAS,GAAG,SAAS,EACtE,MAAM,SAAS,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAEhF,IAAI,EAAE;IACJ,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,WAAW,CAAC;IAC7E,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,YAAY,CAAC;IAC9E,aAAa,EAAE,CACb,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KACnC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;CAC9E,GAAG,MAAM,GACT,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,MAAM,CAS7F;AAED,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"}
@@ -0,0 +1,102 @@
1
+ 'use strict';
2
+
3
+ var McpCapabilityRegistry = require('./internal/McpCapabilityRegistry.js');
4
+ var wrapCapabilityHandlerForMetrics = require('./metrics/wrapCapabilityHandlerForMetrics.js');
5
+ var createSafeCapabilityRegistration = require('./utils/createSafeCapabilityRegistration.js');
6
+
7
+ // eslint-disable-next-line import/extensions
8
+ function _class_private_field_loose_base(receiver, privateKey) {
9
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
10
+ throw new TypeError("attempted to use private field on non-instance");
11
+ }
12
+ return receiver;
13
+ }
14
+ var id = 0;
15
+ function _class_private_field_loose_key(name) {
16
+ return "__private_" + id++ + "_" + name;
17
+ }
18
+ function makeMcpToolDefinition(tool) {
19
+ return tool;
20
+ }
21
+ var _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi"), _ability = /*#__PURE__*/ _class_private_field_loose_key("_ability"), _user = /*#__PURE__*/ _class_private_field_loose_key("_user");
22
+ class McpToolRegistry extends McpCapabilityRegistry.McpCapabilityRegistryBase {
23
+ bind(mcpServer) {
24
+ const strapi = _class_private_field_loose_base(this, _strapi)[_strapi];
25
+ super.register((definition)=>{
26
+ const { name, title, description, resolveInputSchema, resolveOutputSchema, createHandler } = definition;
27
+ // Bind the session ability and token owner into the handler context so handlers can enforce
28
+ // field-level and entity-level permission checks and set creator fields.
29
+ const context = {
30
+ userAbility: _class_private_field_loose_base(this, _ability)[_ability],
31
+ user: _class_private_field_loose_base(this, _user)[_user]
32
+ };
33
+ const createHandlerWithContext = (strapi)=>createHandler(strapi, context);
34
+ return createSafeCapabilityRegistration.createSafeCapabilityRegistration({
35
+ strapi,
36
+ capabilityType: 'Tool',
37
+ name,
38
+ createHandler: createHandlerWithContext,
39
+ createFallbackHandler (errorMessage) {
40
+ return async ()=>({
41
+ content: [
42
+ {
43
+ type: 'text',
44
+ text: `Tool "${name}" failed to initialize: ${errorMessage}`
45
+ }
46
+ ],
47
+ isError: true
48
+ });
49
+ },
50
+ createErrorResult (error) {
51
+ return {
52
+ content: [
53
+ {
54
+ type: 'text',
55
+ text: `Tool "${name}" execution failed: ${error.message}`
56
+ }
57
+ ],
58
+ isError: true
59
+ };
60
+ },
61
+ registerWithSdk (safeHandler) {
62
+ const inputSchema = resolveInputSchema !== undefined ? resolveInputSchema(context) : undefined;
63
+ const outputSchema = resolveOutputSchema(context);
64
+ // Adapt from our object-literal handler `({ args, extra })` to
65
+ // the MCP SDK's positional form `(args, extra)` / `(extra)`.
66
+ const baseHandler = inputSchema !== undefined ? (args, extra)=>safeHandler({
67
+ args,
68
+ extra
69
+ }) : (extra)=>safeHandler({
70
+ extra
71
+ });
72
+ const sdkHandler = wrapCapabilityHandlerForMetrics.wrapCapabilityHandlerForMetrics(strapi, 'tool', name, definition.telemetry, baseHandler);
73
+ return mcpServer.registerTool(name, {
74
+ title,
75
+ description,
76
+ inputSchema,
77
+ outputSchema
78
+ }, sdkHandler);
79
+ }
80
+ });
81
+ });
82
+ }
83
+ constructor(ctx){
84
+ super(ctx.definitions), Object.defineProperty(this, _strapi, {
85
+ writable: true,
86
+ value: void 0
87
+ }), Object.defineProperty(this, _ability, {
88
+ writable: true,
89
+ value: void 0
90
+ }), Object.defineProperty(this, _user, {
91
+ writable: true,
92
+ value: void 0
93
+ });
94
+ _class_private_field_loose_base(this, _strapi)[_strapi] = ctx.strapi;
95
+ _class_private_field_loose_base(this, _ability)[_ability] = ctx.ability;
96
+ _class_private_field_loose_base(this, _user)[_user] = ctx.user;
97
+ }
98
+ }
99
+
100
+ exports.McpToolRegistry = McpToolRegistry;
101
+ exports.makeMcpToolDefinition = makeMcpToolDefinition;
102
+ //# sourceMappingURL=tool-registry.js.map
@@ -0,0 +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 { z } from '@strapi/utils';\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\nexport function makeMcpToolDefinition<\n Name extends string,\n Title extends string,\n Description extends string,\n OutputSchema extends z.ZodObject<z.ZodRawShape>,\n InputSchema extends z.ZodObject<z.ZodRawShape> | undefined = undefined,\n Access extends Modules.MCP.McpCapabilityAccess = Modules.MCP.McpCapabilityAccess,\n>(\n tool: {\n name: Name;\n title: Title;\n description: Description;\n resolveInputSchema?: (context: Modules.MCP.McpHandlerContext) => InputSchema;\n resolveOutputSchema: (context: Modules.MCP.McpHandlerContext) => OutputSchema;\n createHandler: (\n strapi: Core.Strapi,\n context: Modules.MCP.McpHandlerContext\n ) => Modules.MCP.McpToolHandler<NoInfer<InputSchema>, NoInfer<OutputSchema>>;\n } & Access\n): Modules.MCP.McpToolDefinition<Name, InputSchema, OutputSchema, Title, Description> & Access {\n return tool as Modules.MCP.McpToolDefinition<\n Name,\n InputSchema,\n OutputSchema,\n Title,\n Description\n > &\n Access;\n}\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","tool","McpToolRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","definition","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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"}
@@ -0,0 +1,99 @@
1
+ import { McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry.mjs';
2
+ import { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics.mjs';
3
+ import { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration.mjs';
4
+
5
+ // eslint-disable-next-line import/extensions
6
+ function _class_private_field_loose_base(receiver, privateKey) {
7
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
8
+ throw new TypeError("attempted to use private field on non-instance");
9
+ }
10
+ return receiver;
11
+ }
12
+ var id = 0;
13
+ function _class_private_field_loose_key(name) {
14
+ return "__private_" + id++ + "_" + name;
15
+ }
16
+ function makeMcpToolDefinition(tool) {
17
+ return tool;
18
+ }
19
+ var _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi"), _ability = /*#__PURE__*/ _class_private_field_loose_key("_ability"), _user = /*#__PURE__*/ _class_private_field_loose_key("_user");
20
+ class McpToolRegistry extends McpCapabilityRegistryBase {
21
+ bind(mcpServer) {
22
+ const strapi = _class_private_field_loose_base(this, _strapi)[_strapi];
23
+ super.register((definition)=>{
24
+ const { name, title, description, resolveInputSchema, resolveOutputSchema, createHandler } = definition;
25
+ // Bind the session ability and token owner into the handler context so handlers can enforce
26
+ // field-level and entity-level permission checks and set creator fields.
27
+ const context = {
28
+ userAbility: _class_private_field_loose_base(this, _ability)[_ability],
29
+ user: _class_private_field_loose_base(this, _user)[_user]
30
+ };
31
+ const createHandlerWithContext = (strapi)=>createHandler(strapi, context);
32
+ return createSafeCapabilityRegistration({
33
+ strapi,
34
+ capabilityType: 'Tool',
35
+ name,
36
+ createHandler: createHandlerWithContext,
37
+ createFallbackHandler (errorMessage) {
38
+ return async ()=>({
39
+ content: [
40
+ {
41
+ type: 'text',
42
+ text: `Tool "${name}" failed to initialize: ${errorMessage}`
43
+ }
44
+ ],
45
+ isError: true
46
+ });
47
+ },
48
+ createErrorResult (error) {
49
+ return {
50
+ content: [
51
+ {
52
+ type: 'text',
53
+ text: `Tool "${name}" execution failed: ${error.message}`
54
+ }
55
+ ],
56
+ isError: true
57
+ };
58
+ },
59
+ registerWithSdk (safeHandler) {
60
+ const inputSchema = resolveInputSchema !== undefined ? resolveInputSchema(context) : undefined;
61
+ const outputSchema = resolveOutputSchema(context);
62
+ // Adapt from our object-literal handler `({ args, extra })` to
63
+ // the MCP SDK's positional form `(args, extra)` / `(extra)`.
64
+ const baseHandler = inputSchema !== undefined ? (args, extra)=>safeHandler({
65
+ args,
66
+ extra
67
+ }) : (extra)=>safeHandler({
68
+ extra
69
+ });
70
+ const sdkHandler = wrapCapabilityHandlerForMetrics(strapi, 'tool', name, definition.telemetry, baseHandler);
71
+ return mcpServer.registerTool(name, {
72
+ title,
73
+ description,
74
+ inputSchema,
75
+ outputSchema
76
+ }, sdkHandler);
77
+ }
78
+ });
79
+ });
80
+ }
81
+ constructor(ctx){
82
+ super(ctx.definitions), Object.defineProperty(this, _strapi, {
83
+ writable: true,
84
+ value: void 0
85
+ }), Object.defineProperty(this, _ability, {
86
+ writable: true,
87
+ value: void 0
88
+ }), Object.defineProperty(this, _user, {
89
+ writable: true,
90
+ value: void 0
91
+ });
92
+ _class_private_field_loose_base(this, _strapi)[_strapi] = ctx.strapi;
93
+ _class_private_field_loose_base(this, _ability)[_ability] = ctx.ability;
94
+ _class_private_field_loose_base(this, _user)[_user] = ctx.user;
95
+ }
96
+ }
97
+
98
+ export { McpToolRegistry, makeMcpToolDefinition };
99
+ //# sourceMappingURL=tool-registry.mjs.map
@@ -0,0 +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 { z } from '@strapi/utils';\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\nexport function makeMcpToolDefinition<\n Name extends string,\n Title extends string,\n Description extends string,\n OutputSchema extends z.ZodObject<z.ZodRawShape>,\n InputSchema extends z.ZodObject<z.ZodRawShape> | undefined = undefined,\n Access extends Modules.MCP.McpCapabilityAccess = Modules.MCP.McpCapabilityAccess,\n>(\n tool: {\n name: Name;\n title: Title;\n description: Description;\n resolveInputSchema?: (context: Modules.MCP.McpHandlerContext) => InputSchema;\n resolveOutputSchema: (context: Modules.MCP.McpHandlerContext) => OutputSchema;\n createHandler: (\n strapi: Core.Strapi,\n context: Modules.MCP.McpHandlerContext\n ) => Modules.MCP.McpToolHandler<NoInfer<InputSchema>, NoInfer<OutputSchema>>;\n } & Access\n): Modules.MCP.McpToolDefinition<Name, InputSchema, OutputSchema, Title, Description> & Access {\n return tool as Modules.MCP.McpToolDefinition<\n Name,\n InputSchema,\n OutputSchema,\n Title,\n Description\n > &\n Access;\n}\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","tool","McpToolRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","definition","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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"}