@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,32 @@
1
+ function _class_private_field_loose_base(receiver, privateKey) {
2
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
3
+ throw new TypeError("attempted to use private field on non-instance");
4
+ }
5
+ return receiver;
6
+ }
7
+ var id = 0;
8
+ function _class_private_field_loose_key(name) {
9
+ return "__private_" + id++ + "_" + name;
10
+ }
11
+ var _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi");
12
+ class McpConfiguration {
13
+ isEnabled() {
14
+ return _class_private_field_loose_base(this, _strapi)[_strapi].config.get('server.mcp.enabled', false) === true;
15
+ }
16
+ isDevMode() {
17
+ return _class_private_field_loose_base(this, _strapi)[_strapi].config.get('autoReload', false);
18
+ }
19
+ constructor(strapi){
20
+ Object.defineProperty(this, _strapi, {
21
+ writable: true,
22
+ value: void 0
23
+ });
24
+ _class_private_field_loose_base(this, _strapi)[_strapi] = strapi;
25
+ this.path = '/mcp';
26
+ this.connectTimeoutMs = strapi.config.get('server.mcp.connectTimeoutMs', 5 * 1000); // 5 seconds
27
+ this.requestTimeoutMs = strapi.config.get('server.mcp.requestTimeoutMs', 60 * 1000); // 60 seconds
28
+ }
29
+ }
30
+
31
+ export { McpConfiguration };
32
+ //# sourceMappingURL=McpConfiguration.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpConfiguration.mjs","sources":["../../../../src/services/mcp/internal/McpConfiguration.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport class McpConfiguration {\n readonly path: string;\n\n readonly connectTimeoutMs: number;\n\n readonly requestTimeoutMs: number;\n\n #strapi: Core.Strapi;\n\n constructor(strapi: Core.Strapi) {\n this.#strapi = strapi;\n this.path = '/mcp';\n this.connectTimeoutMs = strapi.config.get('server.mcp.connectTimeoutMs', 5 * 1000); // 5 seconds\n this.requestTimeoutMs = strapi.config.get('server.mcp.requestTimeoutMs', 60 * 1000); // 60 seconds\n }\n\n isEnabled(): boolean {\n return this.#strapi.config.get<boolean>('server.mcp.enabled', false) === true;\n }\n\n isDevMode(): boolean {\n return this.#strapi.config.get('autoReload', false);\n }\n}\n"],"names":["McpConfiguration","isEnabled","config","get","isDevMode","strapi","path","connectTimeoutMs","requestTimeoutMs"],"mappings":";;;;;;;;;;AASE,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AAPK,MAAMA,gBAAAA,CAAAA;IAgBXC,SAAAA,GAAqB;QACnB,OAAO,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,CAAQC,MAAM,CAACC,GAAG,CAAU,oBAAA,EAAsB,KAAA,CAAA,KAAW,IAAA;AAC3E,IAAA;IAEAC,SAAAA,GAAqB;QACnB,OAAO,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,SAAQF,MAAM,CAACC,GAAG,CAAC,YAAA,EAAc,KAAA,CAAA;AAC/C,IAAA;AAbA,IAAA,WAAA,CAAYE,MAAmB,CAAE;QAFjC,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;mBAAA;;QAGE,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,GAAUA,MAAAA;QACf,IAAI,CAACC,IAAI,GAAG,MAAA;QACZ,IAAI,CAACC,gBAAgB,GAAGF,MAAAA,CAAOH,MAAM,CAACC,GAAG,CAAC,6BAAA,EAA+B,CAAA,GAAI,IAAA,CAAA,CAAA;QAC7E,IAAI,CAACK,gBAAgB,GAAGH,MAAAA,CAAOH,MAAM,CAACC,GAAG,CAAC,6BAAA,EAA+B,EAAA,GAAK,IAAA,CAAA,CAAA;AAChF,IAAA;AASF;;;;"}
@@ -0,0 +1,37 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Core, Modules } from '@strapi/types';
3
+ import { McpPromptRegistry } from '../prompt-registry';
4
+ import { McpResourceRegistry } from '../resource-registry';
5
+ import { McpToolRegistry } from '../tool-registry';
6
+ import type { McpAdminTokenAbility } from '../authentication';
7
+ import { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';
8
+ import type { McpCapabilityRegistryReadonly } from './McpCapabilityRegistry';
9
+ export type McpCapabilityDefinitions = {
10
+ tools: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;
11
+ prompts: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;
12
+ resources: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;
13
+ };
14
+ export type McpRegistries = {
15
+ tools: McpToolRegistry;
16
+ prompts: McpPromptRegistry;
17
+ resources: McpResourceRegistry;
18
+ };
19
+ /** Read-only registry surface exposed on McpServerWithRegistries. */
20
+ export type McpRegistriesReadonly = {
21
+ tools: McpCapabilityRegistryReadonly;
22
+ prompts: McpCapabilityRegistryReadonly;
23
+ resources: McpCapabilityRegistryReadonly;
24
+ };
25
+ export type McpServerWithRegistries = {
26
+ mcpServer: McpServer;
27
+ registries: McpRegistriesReadonly;
28
+ };
29
+ export type CreateMcpServerWithRegistriesParams = {
30
+ strapi: Core.Strapi;
31
+ definitions: McpCapabilityDefinitions;
32
+ isDevMode: boolean;
33
+ ability: McpAdminTokenAbility;
34
+ user: Modules.MCP.McpHandlerContext['user'];
35
+ };
36
+ export declare const createMcpServerWithRegistries: ({ strapi, definitions, isDevMode, ability, user, }: CreateMcpServerWithRegistriesParams) => McpServerWithRegistries;
37
+ //# sourceMappingURL=McpServerFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpServerFactory.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAG7E,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,+BAA+B,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9E,OAAO,EAAE,+BAA+B,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACpF,SAAS,EAAE,+BAA+B,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;CAC3F,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,mBAAmB,CAAC;CAChC,CAAC;AAEF,qEAAqE;AACrE,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,6BAA6B,CAAC;IACrC,OAAO,EAAE,6BAA6B,CAAC;IACvC,SAAS,EAAE,6BAA6B,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,qBAAqB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,WAAW,EAAE,wBAAwB,CAAC;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,6BAA6B,uDAMvC,mCAAmC,KAAG,uBAuExC,CAAC"}
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
4
+ var promptRegistry = require('../prompt-registry.js');
5
+ var resourceRegistry = require('../resource-registry.js');
6
+ var toolRegistry = require('../tool-registry.js');
7
+ var syncMcpSessionCapabilities = require('./syncMcpSessionCapabilities.js');
8
+
9
+ // eslint-disable-next-line import/extensions
10
+ const createMcpServerWithRegistries = ({ strapi, definitions, isDevMode, ability, user })=>{
11
+ const capabilities = {
12
+ logging: {}
13
+ };
14
+ // Advertise capability categories when definitions exist (server-level), not per-user enabled
15
+ // count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.
16
+ if (definitions.tools.size > 0) {
17
+ capabilities.tools = {};
18
+ }
19
+ if (definitions.prompts.size > 0) {
20
+ capabilities.prompts = {};
21
+ }
22
+ if (definitions.resources.size > 0) {
23
+ capabilities.resources = {};
24
+ }
25
+ const mcpServer = new mcp_js.McpServer({
26
+ name: 'strapi-mcp-server',
27
+ version: '1.0.0'
28
+ }, {
29
+ capabilities
30
+ });
31
+ // Bootstrap registries with current definitions
32
+ const tools = new toolRegistry.McpToolRegistry({
33
+ strapi,
34
+ definitions: definitions.tools,
35
+ ability,
36
+ user
37
+ });
38
+ const prompts = new promptRegistry.McpPromptRegistry({
39
+ strapi,
40
+ definitions: definitions.prompts
41
+ });
42
+ const resources = new resourceRegistry.McpResourceRegistry({
43
+ strapi,
44
+ definitions: definitions.resources
45
+ });
46
+ // Register capabilities (disabled by default)
47
+ tools.bind(mcpServer);
48
+ prompts.bind(mcpServer);
49
+ resources.bind(mcpServer);
50
+ syncMcpSessionCapabilities.syncMcpSessionCapabilities({
51
+ registries: {
52
+ tools,
53
+ prompts,
54
+ resources
55
+ },
56
+ definitions,
57
+ ability,
58
+ isDevMode
59
+ });
60
+ return {
61
+ mcpServer,
62
+ registries: {
63
+ tools,
64
+ prompts,
65
+ resources
66
+ }
67
+ };
68
+ };
69
+
70
+ exports.createMcpServerWithRegistries = createMcpServerWithRegistries;
71
+ //# sourceMappingURL=McpServerFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpServerFactory.js","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpPromptRegistry } from '../prompt-registry';\nimport { McpResourceRegistry } from '../resource-registry';\nimport { McpToolRegistry } from '../tool-registry';\nimport type { McpAdminTokenAbility } from '../authentication';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\nimport type { McpCapabilityRegistryReadonly } from './McpCapabilityRegistry';\nimport { syncMcpSessionCapabilities } from './syncMcpSessionCapabilities';\n\nexport type McpCapabilityDefinitions = {\n tools: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n prompts: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n resources: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n};\n\nexport type McpRegistries = {\n tools: McpToolRegistry;\n prompts: McpPromptRegistry;\n resources: McpResourceRegistry;\n};\n\n/** Read-only registry surface exposed on McpServerWithRegistries. */\nexport type McpRegistriesReadonly = {\n tools: McpCapabilityRegistryReadonly;\n prompts: McpCapabilityRegistryReadonly;\n resources: McpCapabilityRegistryReadonly;\n};\n\nexport type McpServerWithRegistries = {\n mcpServer: McpServer;\n registries: McpRegistriesReadonly;\n};\n\nexport type CreateMcpServerWithRegistriesParams = {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitions;\n isDevMode: boolean;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n};\n\nexport const createMcpServerWithRegistries = ({\n strapi,\n definitions,\n isDevMode,\n ability,\n user,\n}: CreateMcpServerWithRegistriesParams): McpServerWithRegistries => {\n const capabilities: {\n logging?: Record<string, unknown>;\n tools?: Record<string, unknown>;\n prompts?: Record<string, unknown>;\n resources?: Record<string, unknown>;\n } = {\n logging: {},\n };\n // Advertise capability categories when definitions exist (server-level), not per-user enabled\n // count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.\n if (definitions.tools.size > 0) {\n capabilities.tools = {};\n }\n if (definitions.prompts.size > 0) {\n capabilities.prompts = {};\n }\n if (definitions.resources.size > 0) {\n capabilities.resources = {};\n }\n\n const mcpServer = new McpServer(\n {\n name: 'strapi-mcp-server',\n version: '1.0.0',\n },\n {\n capabilities,\n }\n );\n\n // Bootstrap registries with current definitions\n const tools = new McpToolRegistry({\n strapi,\n definitions: definitions.tools,\n ability,\n user,\n });\n const prompts = new McpPromptRegistry({\n strapi,\n definitions: definitions.prompts,\n });\n const resources = new McpResourceRegistry({\n strapi,\n definitions: definitions.resources,\n });\n\n // Register capabilities (disabled by default)\n tools.bind(mcpServer);\n prompts.bind(mcpServer);\n resources.bind(mcpServer);\n\n syncMcpSessionCapabilities({\n registries: {\n tools,\n prompts,\n resources,\n },\n definitions,\n ability,\n isDevMode,\n });\n\n return {\n mcpServer,\n registries: {\n tools,\n prompts,\n resources,\n },\n };\n};\n"],"names":["createMcpServerWithRegistries","strapi","definitions","isDevMode","ability","user","capabilities","logging","tools","size","prompts","resources","mcpServer","McpServer","name","version","McpToolRegistry","McpPromptRegistry","McpResourceRegistry","bind","syncMcpSessionCapabilities","registries"],"mappings":";;;;;;;;AAAA;AA2CO,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,MAAM,EACNC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,IAAI,EACgC,GAAA;AACpC,IAAA,MAAMC,YAAAA,GAKF;AACFC,QAAAA,OAAAA,EAAS;AACX,KAAA;;;AAGA,IAAA,IAAIL,WAAAA,CAAYM,KAAK,CAACC,IAAI,GAAG,CAAA,EAAG;QAC9BH,YAAAA,CAAaE,KAAK,GAAG,EAAC;AACxB,IAAA;AACA,IAAA,IAAIN,WAAAA,CAAYQ,OAAO,CAACD,IAAI,GAAG,CAAA,EAAG;QAChCH,YAAAA,CAAaI,OAAO,GAAG,EAAC;AAC1B,IAAA;AACA,IAAA,IAAIR,WAAAA,CAAYS,SAAS,CAACF,IAAI,GAAG,CAAA,EAAG;QAClCH,YAAAA,CAAaK,SAAS,GAAG,EAAC;AAC5B,IAAA;IAEA,MAAMC,SAAAA,GAAY,IAAIC,gBAAAA,CACpB;QACEC,IAAAA,EAAM,mBAAA;QACNC,OAAAA,EAAS;KACX,EACA;AACET,QAAAA;AACF,KAAA,CAAA;;IAIF,MAAME,KAAAA,GAAQ,IAAIQ,4BAAAA,CAAgB;AAChCf,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYM,KAAK;AAC9BJ,QAAAA,OAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IACA,MAAMK,OAAAA,GAAU,IAAIO,gCAAAA,CAAkB;AACpChB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYQ;AAC3B,KAAA,CAAA;IACA,MAAMC,SAAAA,GAAY,IAAIO,oCAAAA,CAAoB;AACxCjB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYS;AAC3B,KAAA,CAAA;;AAGAH,IAAAA,KAAAA,CAAMW,IAAI,CAACP,SAAAA,CAAAA;AACXF,IAAAA,OAAAA,CAAQS,IAAI,CAACP,SAAAA,CAAAA;AACbD,IAAAA,SAAAA,CAAUQ,IAAI,CAACP,SAAAA,CAAAA;IAEfQ,qDAAAA,CAA2B;QACzBC,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF,SAAA;AACAT,QAAAA,WAAAA;AACAE,QAAAA,OAAAA;AACAD,QAAAA;AACF,KAAA,CAAA;IAEA,OAAO;AACLS,QAAAA,SAAAA;QACAS,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,69 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { McpPromptRegistry } from '../prompt-registry.mjs';
3
+ import { McpResourceRegistry } from '../resource-registry.mjs';
4
+ import { McpToolRegistry } from '../tool-registry.mjs';
5
+ import { syncMcpSessionCapabilities } from './syncMcpSessionCapabilities.mjs';
6
+
7
+ // eslint-disable-next-line import/extensions
8
+ const createMcpServerWithRegistries = ({ strapi, definitions, isDevMode, ability, user })=>{
9
+ const capabilities = {
10
+ logging: {}
11
+ };
12
+ // Advertise capability categories when definitions exist (server-level), not per-user enabled
13
+ // count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.
14
+ if (definitions.tools.size > 0) {
15
+ capabilities.tools = {};
16
+ }
17
+ if (definitions.prompts.size > 0) {
18
+ capabilities.prompts = {};
19
+ }
20
+ if (definitions.resources.size > 0) {
21
+ capabilities.resources = {};
22
+ }
23
+ const mcpServer = new McpServer({
24
+ name: 'strapi-mcp-server',
25
+ version: '1.0.0'
26
+ }, {
27
+ capabilities
28
+ });
29
+ // Bootstrap registries with current definitions
30
+ const tools = new McpToolRegistry({
31
+ strapi,
32
+ definitions: definitions.tools,
33
+ ability,
34
+ user
35
+ });
36
+ const prompts = new McpPromptRegistry({
37
+ strapi,
38
+ definitions: definitions.prompts
39
+ });
40
+ const resources = new McpResourceRegistry({
41
+ strapi,
42
+ definitions: definitions.resources
43
+ });
44
+ // Register capabilities (disabled by default)
45
+ tools.bind(mcpServer);
46
+ prompts.bind(mcpServer);
47
+ resources.bind(mcpServer);
48
+ syncMcpSessionCapabilities({
49
+ registries: {
50
+ tools,
51
+ prompts,
52
+ resources
53
+ },
54
+ definitions,
55
+ ability,
56
+ isDevMode
57
+ });
58
+ return {
59
+ mcpServer,
60
+ registries: {
61
+ tools,
62
+ prompts,
63
+ resources
64
+ }
65
+ };
66
+ };
67
+
68
+ export { createMcpServerWithRegistries };
69
+ //# sourceMappingURL=McpServerFactory.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpServerFactory.mjs","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpPromptRegistry } from '../prompt-registry';\nimport { McpResourceRegistry } from '../resource-registry';\nimport { McpToolRegistry } from '../tool-registry';\nimport type { McpAdminTokenAbility } from '../authentication';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\nimport type { McpCapabilityRegistryReadonly } from './McpCapabilityRegistry';\nimport { syncMcpSessionCapabilities } from './syncMcpSessionCapabilities';\n\nexport type McpCapabilityDefinitions = {\n tools: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n prompts: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n resources: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n};\n\nexport type McpRegistries = {\n tools: McpToolRegistry;\n prompts: McpPromptRegistry;\n resources: McpResourceRegistry;\n};\n\n/** Read-only registry surface exposed on McpServerWithRegistries. */\nexport type McpRegistriesReadonly = {\n tools: McpCapabilityRegistryReadonly;\n prompts: McpCapabilityRegistryReadonly;\n resources: McpCapabilityRegistryReadonly;\n};\n\nexport type McpServerWithRegistries = {\n mcpServer: McpServer;\n registries: McpRegistriesReadonly;\n};\n\nexport type CreateMcpServerWithRegistriesParams = {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitions;\n isDevMode: boolean;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n};\n\nexport const createMcpServerWithRegistries = ({\n strapi,\n definitions,\n isDevMode,\n ability,\n user,\n}: CreateMcpServerWithRegistriesParams): McpServerWithRegistries => {\n const capabilities: {\n logging?: Record<string, unknown>;\n tools?: Record<string, unknown>;\n prompts?: Record<string, unknown>;\n resources?: Record<string, unknown>;\n } = {\n logging: {},\n };\n // Advertise capability categories when definitions exist (server-level), not per-user enabled\n // count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.\n if (definitions.tools.size > 0) {\n capabilities.tools = {};\n }\n if (definitions.prompts.size > 0) {\n capabilities.prompts = {};\n }\n if (definitions.resources.size > 0) {\n capabilities.resources = {};\n }\n\n const mcpServer = new McpServer(\n {\n name: 'strapi-mcp-server',\n version: '1.0.0',\n },\n {\n capabilities,\n }\n );\n\n // Bootstrap registries with current definitions\n const tools = new McpToolRegistry({\n strapi,\n definitions: definitions.tools,\n ability,\n user,\n });\n const prompts = new McpPromptRegistry({\n strapi,\n definitions: definitions.prompts,\n });\n const resources = new McpResourceRegistry({\n strapi,\n definitions: definitions.resources,\n });\n\n // Register capabilities (disabled by default)\n tools.bind(mcpServer);\n prompts.bind(mcpServer);\n resources.bind(mcpServer);\n\n syncMcpSessionCapabilities({\n registries: {\n tools,\n prompts,\n resources,\n },\n definitions,\n ability,\n isDevMode,\n });\n\n return {\n mcpServer,\n registries: {\n tools,\n prompts,\n resources,\n },\n };\n};\n"],"names":["createMcpServerWithRegistries","strapi","definitions","isDevMode","ability","user","capabilities","logging","tools","size","prompts","resources","mcpServer","McpServer","name","version","McpToolRegistry","McpPromptRegistry","McpResourceRegistry","bind","syncMcpSessionCapabilities","registries"],"mappings":";;;;;;AAAA;AA2CO,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,MAAM,EACNC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,IAAI,EACgC,GAAA;AACpC,IAAA,MAAMC,YAAAA,GAKF;AACFC,QAAAA,OAAAA,EAAS;AACX,KAAA;;;AAGA,IAAA,IAAIL,WAAAA,CAAYM,KAAK,CAACC,IAAI,GAAG,CAAA,EAAG;QAC9BH,YAAAA,CAAaE,KAAK,GAAG,EAAC;AACxB,IAAA;AACA,IAAA,IAAIN,WAAAA,CAAYQ,OAAO,CAACD,IAAI,GAAG,CAAA,EAAG;QAChCH,YAAAA,CAAaI,OAAO,GAAG,EAAC;AAC1B,IAAA;AACA,IAAA,IAAIR,WAAAA,CAAYS,SAAS,CAACF,IAAI,GAAG,CAAA,EAAG;QAClCH,YAAAA,CAAaK,SAAS,GAAG,EAAC;AAC5B,IAAA;IAEA,MAAMC,SAAAA,GAAY,IAAIC,SAAAA,CACpB;QACEC,IAAAA,EAAM,mBAAA;QACNC,OAAAA,EAAS;KACX,EACA;AACET,QAAAA;AACF,KAAA,CAAA;;IAIF,MAAME,KAAAA,GAAQ,IAAIQ,eAAAA,CAAgB;AAChCf,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYM,KAAK;AAC9BJ,QAAAA,OAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IACA,MAAMK,OAAAA,GAAU,IAAIO,iBAAAA,CAAkB;AACpChB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYQ;AAC3B,KAAA,CAAA;IACA,MAAMC,SAAAA,GAAY,IAAIO,mBAAAA,CAAoB;AACxCjB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYS;AAC3B,KAAA,CAAA;;AAGAH,IAAAA,KAAAA,CAAMW,IAAI,CAACP,SAAAA,CAAAA;AACXF,IAAAA,OAAAA,CAAQS,IAAI,CAACP,SAAAA,CAAAA;AACbD,IAAAA,SAAAA,CAAUQ,IAAI,CAACP,SAAAA,CAAAA;IAEfQ,0BAAAA,CAA2B;QACzBC,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF,SAAA;AACAT,QAAAA,WAAAA;AACAE,QAAAA,OAAAA;AACAD,QAAAA;AACF,KAAA,CAAA;IAEA,OAAO;AACLS,QAAAA,SAAAA;QACAS,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,21 @@
1
+ import type { Modules } from '@strapi/types';
2
+ import type { McpAdminTokenAbility } from '../authentication';
3
+ import type { McpCapabilityDefinitions, McpRegistries } from './McpServerFactory';
4
+ export type CanUseMcpCapabilityParams = {
5
+ ability: McpAdminTokenAbility;
6
+ definition: Modules.MCP.McpCapabilityDefinition;
7
+ isDevMode: boolean;
8
+ };
9
+ export type SyncMcpSessionCapabilitiesParams = {
10
+ registries: McpRegistries;
11
+ definitions: McpCapabilityDefinitions;
12
+ ability: McpAdminTokenAbility;
13
+ isDevMode: boolean;
14
+ };
15
+ export type SyncMcpSessionCapabilitiesSummary = {
16
+ enabled: string[];
17
+ disabled: string[];
18
+ };
19
+ export declare const canUseMcpCapability: ({ ability, definition, isDevMode, }: CanUseMcpCapabilityParams) => boolean;
20
+ export declare const syncMcpSessionCapabilities: ({ registries, definitions, ability, isDevMode, }: SyncMcpSessionCapabilitiesParams) => SyncMcpSessionCapabilitiesSummary;
21
+ //# sourceMappingURL=syncMcpSessionCapabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncMcpSessionCapabilities.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/internal/syncMcpSessionCapabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOlF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAChD,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,UAAU,EAAE,aAAa,CAAC;IAC1B,WAAW,EAAE,wBAAwB,CAAC;IACtC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAUF,eAAO,MAAM,mBAAmB,wCAI7B,yBAAyB,KAAG,OAY9B,CAAC;AAEF,eAAO,MAAM,0BAA0B,qDAKpC,gCAAgC,KAAG,iCAoDrC,CAAC"}
@@ -0,0 +1,76 @@
1
+ 'use strict';
2
+
3
+ const canUseAuthorizedCapability = ({ ability, auth })=>auth.policies.some(({ action, subject })=>subject !== undefined ? ability.can(action, subject) : ability.can(action));
4
+ const canUseMcpCapability = ({ ability, definition, isDevMode })=>{
5
+ if (definition.devModeOnly === true) {
6
+ return isDevMode === true;
7
+ }
8
+ if (definition.auth === undefined) {
9
+ return false;
10
+ }
11
+ // Session capability availability is a coarse allowlist. Field/entity conditions must be
12
+ // enforced by capability handlers with request-specific context.
13
+ return canUseAuthorizedCapability({
14
+ ability,
15
+ auth: definition.auth
16
+ });
17
+ };
18
+ const syncMcpSessionCapabilities = ({ registries, definitions, ability, isDevMode })=>{
19
+ const summary = {
20
+ enabled: [],
21
+ disabled: []
22
+ };
23
+ definitions.tools.forEach((definition)=>{
24
+ const allowed = canUseMcpCapability({
25
+ ability,
26
+ definition,
27
+ isDevMode
28
+ });
29
+ const status = registries.tools.status(definition.name);
30
+ if (status === 'disabled' && allowed === true) {
31
+ registries.tools.enable(definition.name);
32
+ summary.enabled.push(definition.name);
33
+ }
34
+ if (status === 'enabled' && allowed === false) {
35
+ registries.tools.disable(definition.name);
36
+ summary.disabled.push(definition.name);
37
+ }
38
+ });
39
+ definitions.prompts.forEach((definition)=>{
40
+ const allowed = canUseMcpCapability({
41
+ ability,
42
+ definition,
43
+ isDevMode
44
+ });
45
+ const status = registries.prompts.status(definition.name);
46
+ if (status === 'disabled' && allowed === true) {
47
+ registries.prompts.enable(definition.name);
48
+ summary.enabled.push(definition.name);
49
+ }
50
+ if (status === 'enabled' && allowed === false) {
51
+ registries.prompts.disable(definition.name);
52
+ summary.disabled.push(definition.name);
53
+ }
54
+ });
55
+ definitions.resources.forEach((definition)=>{
56
+ const allowed = canUseMcpCapability({
57
+ ability,
58
+ definition,
59
+ isDevMode
60
+ });
61
+ const status = registries.resources.status(definition.name);
62
+ if (status === 'disabled' && allowed === true) {
63
+ registries.resources.enable(definition.name);
64
+ summary.enabled.push(definition.name);
65
+ }
66
+ if (status === 'enabled' && allowed === false) {
67
+ registries.resources.disable(definition.name);
68
+ summary.disabled.push(definition.name);
69
+ }
70
+ });
71
+ return summary;
72
+ };
73
+
74
+ exports.canUseMcpCapability = canUseMcpCapability;
75
+ exports.syncMcpSessionCapabilities = syncMcpSessionCapabilities;
76
+ //# sourceMappingURL=syncMcpSessionCapabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncMcpSessionCapabilities.js","sources":["../../../../src/services/mcp/internal/syncMcpSessionCapabilities.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\nimport type { McpAdminTokenAbility } from '../authentication';\nimport type { McpCapabilityDefinitions, McpRegistries } from './McpServerFactory';\n\ntype CanUseAuthorizedCapabilityParams = {\n ability: McpAdminTokenAbility;\n auth: Modules.MCP.McpCapabilityAuth;\n};\n\nexport type CanUseMcpCapabilityParams = {\n ability: McpAdminTokenAbility;\n definition: Modules.MCP.McpCapabilityDefinition;\n isDevMode: boolean;\n};\n\nexport type SyncMcpSessionCapabilitiesParams = {\n registries: McpRegistries;\n definitions: McpCapabilityDefinitions;\n ability: McpAdminTokenAbility;\n isDevMode: boolean;\n};\n\nexport type SyncMcpSessionCapabilitiesSummary = {\n enabled: string[];\n disabled: string[];\n};\n\nconst canUseAuthorizedCapability = ({ ability, auth }: CanUseAuthorizedCapabilityParams): boolean =>\n auth.policies.some(({ action, subject }) =>\n subject !== undefined\n ? ability.can(action, subject)\n : // @ts-expect-error ability.can expects 2 arguments, but runtime allows 1\n ability.can(action)\n );\n\nexport const canUseMcpCapability = ({\n ability,\n definition,\n isDevMode,\n}: CanUseMcpCapabilityParams): boolean => {\n if (definition.devModeOnly === true) {\n return isDevMode === true;\n }\n\n if (definition.auth === undefined) {\n return false;\n }\n\n // Session capability availability is a coarse allowlist. Field/entity conditions must be\n // enforced by capability handlers with request-specific context.\n return canUseAuthorizedCapability({ ability, auth: definition.auth });\n};\n\nexport const syncMcpSessionCapabilities = ({\n registries,\n definitions,\n ability,\n isDevMode,\n}: SyncMcpSessionCapabilitiesParams): SyncMcpSessionCapabilitiesSummary => {\n const summary: SyncMcpSessionCapabilitiesSummary = {\n enabled: [],\n disabled: [],\n };\n\n definitions.tools.forEach((definition) => {\n const allowed = canUseMcpCapability({ ability, definition, isDevMode });\n const status = registries.tools.status(definition.name);\n\n if (status === 'disabled' && allowed === true) {\n registries.tools.enable(definition.name);\n summary.enabled.push(definition.name);\n }\n\n if (status === 'enabled' && allowed === false) {\n registries.tools.disable(definition.name);\n summary.disabled.push(definition.name);\n }\n });\n\n definitions.prompts.forEach((definition) => {\n const allowed = canUseMcpCapability({ ability, definition, isDevMode });\n const status = registries.prompts.status(definition.name);\n\n if (status === 'disabled' && allowed === true) {\n registries.prompts.enable(definition.name);\n summary.enabled.push(definition.name);\n }\n\n if (status === 'enabled' && allowed === false) {\n registries.prompts.disable(definition.name);\n summary.disabled.push(definition.name);\n }\n });\n\n definitions.resources.forEach((definition) => {\n const allowed = canUseMcpCapability({ ability, definition, isDevMode });\n const status = registries.resources.status(definition.name);\n\n if (status === 'disabled' && allowed === true) {\n registries.resources.enable(definition.name);\n summary.enabled.push(definition.name);\n }\n\n if (status === 'enabled' && allowed === false) {\n registries.resources.disable(definition.name);\n summary.disabled.push(definition.name);\n }\n });\n\n return summary;\n};\n"],"names":["canUseAuthorizedCapability","ability","auth","policies","some","action","subject","undefined","can","canUseMcpCapability","definition","isDevMode","devModeOnly","syncMcpSessionCapabilities","registries","definitions","summary","enabled","disabled","tools","forEach","allowed","status","name","enable","push","disable","prompts","resources"],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ const canUseAuthorizedCapability = ({ ability, auth })=>auth.policies.some(({ action, subject })=>subject !== undefined ? ability.can(action, subject) : ability.can(action));
2
+ const canUseMcpCapability = ({ ability, definition, isDevMode })=>{
3
+ if (definition.devModeOnly === true) {
4
+ return isDevMode === true;
5
+ }
6
+ if (definition.auth === undefined) {
7
+ return false;
8
+ }
9
+ // Session capability availability is a coarse allowlist. Field/entity conditions must be
10
+ // enforced by capability handlers with request-specific context.
11
+ return canUseAuthorizedCapability({
12
+ ability,
13
+ auth: definition.auth
14
+ });
15
+ };
16
+ const syncMcpSessionCapabilities = ({ registries, definitions, ability, isDevMode })=>{
17
+ const summary = {
18
+ enabled: [],
19
+ disabled: []
20
+ };
21
+ definitions.tools.forEach((definition)=>{
22
+ const allowed = canUseMcpCapability({
23
+ ability,
24
+ definition,
25
+ isDevMode
26
+ });
27
+ const status = registries.tools.status(definition.name);
28
+ if (status === 'disabled' && allowed === true) {
29
+ registries.tools.enable(definition.name);
30
+ summary.enabled.push(definition.name);
31
+ }
32
+ if (status === 'enabled' && allowed === false) {
33
+ registries.tools.disable(definition.name);
34
+ summary.disabled.push(definition.name);
35
+ }
36
+ });
37
+ definitions.prompts.forEach((definition)=>{
38
+ const allowed = canUseMcpCapability({
39
+ ability,
40
+ definition,
41
+ isDevMode
42
+ });
43
+ const status = registries.prompts.status(definition.name);
44
+ if (status === 'disabled' && allowed === true) {
45
+ registries.prompts.enable(definition.name);
46
+ summary.enabled.push(definition.name);
47
+ }
48
+ if (status === 'enabled' && allowed === false) {
49
+ registries.prompts.disable(definition.name);
50
+ summary.disabled.push(definition.name);
51
+ }
52
+ });
53
+ definitions.resources.forEach((definition)=>{
54
+ const allowed = canUseMcpCapability({
55
+ ability,
56
+ definition,
57
+ isDevMode
58
+ });
59
+ const status = registries.resources.status(definition.name);
60
+ if (status === 'disabled' && allowed === true) {
61
+ registries.resources.enable(definition.name);
62
+ summary.enabled.push(definition.name);
63
+ }
64
+ if (status === 'enabled' && allowed === false) {
65
+ registries.resources.disable(definition.name);
66
+ summary.disabled.push(definition.name);
67
+ }
68
+ });
69
+ return summary;
70
+ };
71
+
72
+ export { canUseMcpCapability, syncMcpSessionCapabilities };
73
+ //# sourceMappingURL=syncMcpSessionCapabilities.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncMcpSessionCapabilities.mjs","sources":["../../../../src/services/mcp/internal/syncMcpSessionCapabilities.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\nimport type { McpAdminTokenAbility } from '../authentication';\nimport type { McpCapabilityDefinitions, McpRegistries } from './McpServerFactory';\n\ntype CanUseAuthorizedCapabilityParams = {\n ability: McpAdminTokenAbility;\n auth: Modules.MCP.McpCapabilityAuth;\n};\n\nexport type CanUseMcpCapabilityParams = {\n ability: McpAdminTokenAbility;\n definition: Modules.MCP.McpCapabilityDefinition;\n isDevMode: boolean;\n};\n\nexport type SyncMcpSessionCapabilitiesParams = {\n registries: McpRegistries;\n definitions: McpCapabilityDefinitions;\n ability: McpAdminTokenAbility;\n isDevMode: boolean;\n};\n\nexport type SyncMcpSessionCapabilitiesSummary = {\n enabled: string[];\n disabled: string[];\n};\n\nconst canUseAuthorizedCapability = ({ ability, auth }: CanUseAuthorizedCapabilityParams): boolean =>\n auth.policies.some(({ action, subject }) =>\n subject !== undefined\n ? ability.can(action, subject)\n : // @ts-expect-error ability.can expects 2 arguments, but runtime allows 1\n ability.can(action)\n );\n\nexport const canUseMcpCapability = ({\n ability,\n definition,\n isDevMode,\n}: CanUseMcpCapabilityParams): boolean => {\n if (definition.devModeOnly === true) {\n return isDevMode === true;\n }\n\n if (definition.auth === undefined) {\n return false;\n }\n\n // Session capability availability is a coarse allowlist. Field/entity conditions must be\n // enforced by capability handlers with request-specific context.\n return canUseAuthorizedCapability({ ability, auth: definition.auth });\n};\n\nexport const syncMcpSessionCapabilities = ({\n registries,\n definitions,\n ability,\n isDevMode,\n}: SyncMcpSessionCapabilitiesParams): SyncMcpSessionCapabilitiesSummary => {\n const summary: SyncMcpSessionCapabilitiesSummary = {\n enabled: [],\n disabled: [],\n };\n\n definitions.tools.forEach((definition) => {\n const allowed = canUseMcpCapability({ ability, definition, isDevMode });\n const status = registries.tools.status(definition.name);\n\n if (status === 'disabled' && allowed === true) {\n registries.tools.enable(definition.name);\n summary.enabled.push(definition.name);\n }\n\n if (status === 'enabled' && allowed === false) {\n registries.tools.disable(definition.name);\n summary.disabled.push(definition.name);\n }\n });\n\n definitions.prompts.forEach((definition) => {\n const allowed = canUseMcpCapability({ ability, definition, isDevMode });\n const status = registries.prompts.status(definition.name);\n\n if (status === 'disabled' && allowed === true) {\n registries.prompts.enable(definition.name);\n summary.enabled.push(definition.name);\n }\n\n if (status === 'enabled' && allowed === false) {\n registries.prompts.disable(definition.name);\n summary.disabled.push(definition.name);\n }\n });\n\n definitions.resources.forEach((definition) => {\n const allowed = canUseMcpCapability({ ability, definition, isDevMode });\n const status = registries.resources.status(definition.name);\n\n if (status === 'disabled' && allowed === true) {\n registries.resources.enable(definition.name);\n summary.enabled.push(definition.name);\n }\n\n if (status === 'enabled' && allowed === false) {\n registries.resources.disable(definition.name);\n summary.disabled.push(definition.name);\n }\n });\n\n return summary;\n};\n"],"names":["canUseAuthorizedCapability","ability","auth","policies","some","action","subject","undefined","can","canUseMcpCapability","definition","isDevMode","devModeOnly","syncMcpSessionCapabilities","registries","definitions","summary","enabled","disabled","tools","forEach","allowed","status","name","enable","push","disable","prompts","resources"],"mappings":"AA2BA,MAAMA,0BAAAA,GAA6B,CAAC,EAAEC,OAAO,EAAEC,IAAI,EAAoC,GACrFA,IAAAA,CAAKC,QAAQ,CAACC,IAAI,CAAC,CAAC,EAAEC,MAAM,EAAEC,OAAO,EAAE,GACrCA,OAAAA,KAAYC,SAAAA,GACRN,OAAAA,CAAQO,GAAG,CAACH,MAAAA,EAAQC,OAAAA,CAAAA,GAEpBL,OAAAA,CAAQO,GAAG,CAACH,MAAAA,CAAAA,CAAAA;AAGb,MAAMI,sBAAsB,CAAC,EAClCR,OAAO,EACPS,UAAU,EACVC,SAAS,EACiB,GAAA;IAC1B,IAAID,UAAAA,CAAWE,WAAW,KAAK,IAAA,EAAM;AACnC,QAAA,OAAOD,SAAAA,KAAc,IAAA;AACvB,IAAA;IAEA,IAAID,UAAAA,CAAWR,IAAI,KAAKK,SAAAA,EAAW;QACjC,OAAO,KAAA;AACT,IAAA;;;AAIA,IAAA,OAAOP,0BAAAA,CAA2B;AAAEC,QAAAA,OAAAA;AAASC,QAAAA,IAAAA,EAAMQ,WAAWR;AAAK,KAAA,CAAA;AACrE;AAEO,MAAMW,0BAAAA,GAA6B,CAAC,EACzCC,UAAU,EACVC,WAAW,EACXd,OAAO,EACPU,SAAS,EACwB,GAAA;AACjC,IAAA,MAAMK,OAAAA,GAA6C;AACjDC,QAAAA,OAAAA,EAAS,EAAE;AACXC,QAAAA,QAAAA,EAAU;AACZ,KAAA;AAEAH,IAAAA,WAAAA,CAAYI,KAAK,CAACC,OAAO,CAAC,CAACV,UAAAA,GAAAA;AACzB,QAAA,MAAMW,UAAUZ,mBAAAA,CAAoB;AAAER,YAAAA,OAAAA;AAASS,YAAAA,UAAAA;AAAYC,YAAAA;AAAU,SAAA,CAAA;AACrE,QAAA,MAAMW,SAASR,UAAAA,CAAWK,KAAK,CAACG,MAAM,CAACZ,WAAWa,IAAI,CAAA;QAEtD,IAAID,MAAAA,KAAW,UAAA,IAAcD,OAAAA,KAAY,IAAA,EAAM;AAC7CP,YAAAA,UAAAA,CAAWK,KAAK,CAACK,MAAM,CAACd,WAAWa,IAAI,CAAA;AACvCP,YAAAA,OAAAA,CAAQC,OAAO,CAACQ,IAAI,CAACf,WAAWa,IAAI,CAAA;AACtC,QAAA;QAEA,IAAID,MAAAA,KAAW,SAAA,IAAaD,OAAAA,KAAY,KAAA,EAAO;AAC7CP,YAAAA,UAAAA,CAAWK,KAAK,CAACO,OAAO,CAAChB,WAAWa,IAAI,CAAA;AACxCP,YAAAA,OAAAA,CAAQE,QAAQ,CAACO,IAAI,CAACf,WAAWa,IAAI,CAAA;AACvC,QAAA;AACF,IAAA,CAAA,CAAA;AAEAR,IAAAA,WAAAA,CAAYY,OAAO,CAACP,OAAO,CAAC,CAACV,UAAAA,GAAAA;AAC3B,QAAA,MAAMW,UAAUZ,mBAAAA,CAAoB;AAAER,YAAAA,OAAAA;AAASS,YAAAA,UAAAA;AAAYC,YAAAA;AAAU,SAAA,CAAA;AACrE,QAAA,MAAMW,SAASR,UAAAA,CAAWa,OAAO,CAACL,MAAM,CAACZ,WAAWa,IAAI,CAAA;QAExD,IAAID,MAAAA,KAAW,UAAA,IAAcD,OAAAA,KAAY,IAAA,EAAM;AAC7CP,YAAAA,UAAAA,CAAWa,OAAO,CAACH,MAAM,CAACd,WAAWa,IAAI,CAAA;AACzCP,YAAAA,OAAAA,CAAQC,OAAO,CAACQ,IAAI,CAACf,WAAWa,IAAI,CAAA;AACtC,QAAA;QAEA,IAAID,MAAAA,KAAW,SAAA,IAAaD,OAAAA,KAAY,KAAA,EAAO;AAC7CP,YAAAA,UAAAA,CAAWa,OAAO,CAACD,OAAO,CAAChB,WAAWa,IAAI,CAAA;AAC1CP,YAAAA,OAAAA,CAAQE,QAAQ,CAACO,IAAI,CAACf,WAAWa,IAAI,CAAA;AACvC,QAAA;AACF,IAAA,CAAA,CAAA;AAEAR,IAAAA,WAAAA,CAAYa,SAAS,CAACR,OAAO,CAAC,CAACV,UAAAA,GAAAA;AAC7B,QAAA,MAAMW,UAAUZ,mBAAAA,CAAoB;AAAER,YAAAA,OAAAA;AAASS,YAAAA,UAAAA;AAAYC,YAAAA;AAAU,SAAA,CAAA;AACrE,QAAA,MAAMW,SAASR,UAAAA,CAAWc,SAAS,CAACN,MAAM,CAACZ,WAAWa,IAAI,CAAA;QAE1D,IAAID,MAAAA,KAAW,UAAA,IAAcD,OAAAA,KAAY,IAAA,EAAM;AAC7CP,YAAAA,UAAAA,CAAWc,SAAS,CAACJ,MAAM,CAACd,WAAWa,IAAI,CAAA;AAC3CP,YAAAA,OAAAA,CAAQC,OAAO,CAACQ,IAAI,CAACf,WAAWa,IAAI,CAAA;AACtC,QAAA;QAEA,IAAID,MAAAA,KAAW,SAAA,IAAaD,OAAAA,KAAY,KAAA,EAAO;AAC7CP,YAAAA,UAAAA,CAAWc,SAAS,CAACF,OAAO,CAAChB,WAAWa,IAAI,CAAA;AAC5CP,YAAAA,OAAAA,CAAQE,QAAQ,CAACO,IAAI,CAACf,WAAWa,IAAI,CAAA;AACvC,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAOP,OAAAA;AACT;;;;"}
@@ -0,0 +1,29 @@
1
+ import type { Core } from '@strapi/types';
2
+ import type { McpCapabilityIdentity } from './normalizeMcpCapability';
3
+ /** Rate-limited via core telemetry `LIMITED_EVENTS`. */
4
+ export declare const MCP_LIMITED_TELEMETRY_EVENTS: {
5
+ readonly didStartMcpServer: "didStartMcpServer";
6
+ readonly didUseMcpServer: "didUseMcpServer";
7
+ readonly didNotAuthenticateMcpRequest: "didNotAuthenticateMcpRequest";
8
+ readonly didNotHandleMcpRequest: "didNotHandleMcpRequest";
9
+ };
10
+ export type McpLimitedTelemetryEvent = (typeof MCP_LIMITED_TELEMETRY_EVENTS)[keyof typeof MCP_LIMITED_TELEMETRY_EVENTS];
11
+ export type McpAuthErrorClass = 'missing_token' | 'invalid_token';
12
+ export type McpRequestErrorClass = 'timeout' | 'error';
13
+ export type McpCapabilityErrorClass = 'execution_error';
14
+ export type McpStartTelemetryProperties = {
15
+ path: string;
16
+ numberOfTools: number;
17
+ numberOfPrompts: number;
18
+ numberOfResources: number;
19
+ };
20
+ /** Resets in-memory capability metrics state (unit tests only). */
21
+ export declare const resetMcpMetricsStateForTests: () => void;
22
+ export declare const classifyMcpRequestFailure: (error: unknown) => McpRequestErrorClass;
23
+ export declare const sendDidStartMcpServer: (strapi: Core.Strapi, properties: McpStartTelemetryProperties) => void;
24
+ export declare const sendDidUseMcpServer: (strapi: Core.Strapi) => void;
25
+ export declare const sendDidNotAuthenticateMcpRequest: (strapi: Core.Strapi, errorClass: McpAuthErrorClass) => void;
26
+ export declare const sendDidNotHandleMcpRequest: (strapi: Core.Strapi, errorClass: McpRequestErrorClass) => void;
27
+ export declare const sendDidExecuteMcpCapability: (strapi: Core.Strapi, identity: McpCapabilityIdentity) => void;
28
+ export declare const sendDidNotExecuteMcpCapability: (strapi: Core.Strapi, identity: McpCapabilityIdentity, errorClass: McpCapabilityErrorClass) => void;
29
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/metrics/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEtE,wDAAwD;AACxD,eAAO,MAAM,4BAA4B;;;;;CAK/B,CAAC;AAEX,MAAM,MAAM,wBAAwB,GAClC,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,OAAO,4BAA4B,CAAC,CAAC;AAEnF,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG,eAAe,CAAC;AAClE,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,OAAO,CAAC;AACvD,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAExD,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAWF,mEAAmE;AACnE,eAAO,MAAM,4BAA4B,QAAO,IAI/C,CAAC;AAwBF,eAAO,MAAM,yBAAyB,UAAW,OAAO,KAAG,oBAM1D,CAAC;AAEF,eAAO,MAAM,qBAAqB,WACxB,KAAK,MAAM,cACP,2BAA2B,KACtC,IAWF,CAAC;AAEF,eAAO,MAAM,mBAAmB,WAAY,KAAK,MAAM,KAAG,IAEzD,CAAC;AAEF,eAAO,MAAM,gCAAgC,WACnC,KAAK,MAAM,cACP,iBAAiB,KAC5B,IAMF,CAAC;AAEF,eAAO,MAAM,0BAA0B,WAC7B,KAAK,MAAM,cACP,oBAAoB,KAC/B,IAMF,CAAC;AAEF,eAAO,MAAM,2BAA2B,WAC9B,KAAK,MAAM,YACT,qBAAqB,KAC9B,IAcF,CAAC;AAEF,eAAO,MAAM,8BAA8B,WACjC,KAAK,MAAM,YACT,qBAAqB,cACnB,uBAAuB,KAClC,IAeF,CAAC"}
@@ -0,0 +1,97 @@
1
+ 'use strict';
2
+
3
+ /** Rate-limited via core telemetry `LIMITED_EVENTS`. */ const MCP_LIMITED_TELEMETRY_EVENTS = {
4
+ didStartMcpServer: 'didStartMcpServer',
5
+ didUseMcpServer: 'didUseMcpServer',
6
+ didNotAuthenticateMcpRequest: 'didNotAuthenticateMcpRequest',
7
+ didNotHandleMcpRequest: 'didNotHandleMcpRequest'
8
+ };
9
+ const ONE_DAY_MS = 24 * 60 * 60 * 1000;
10
+ let capabilityCacheExpiresAt = Date.now() + ONE_DAY_MS;
11
+ const executedCapabilities = new Set();
12
+ const failedCapabilities = new Set();
13
+ const capabilityCacheKey = (identity, succeeded)=>`${succeeded ? 'execute' : 'notExecute'}:${identity.type}:${identity.source}:${identity.name}`;
14
+ const shouldSendCapabilityEvent = (identity, succeeded)=>{
15
+ const cache = succeeded ? executedCapabilities : failedCapabilities;
16
+ if (Date.now() > capabilityCacheExpiresAt) {
17
+ executedCapabilities.clear();
18
+ failedCapabilities.clear();
19
+ capabilityCacheExpiresAt = Date.now() + ONE_DAY_MS;
20
+ }
21
+ const key = capabilityCacheKey(identity, succeeded);
22
+ if (cache.has(key)) {
23
+ return false;
24
+ }
25
+ cache.add(key);
26
+ return true;
27
+ };
28
+ const classifyMcpRequestFailure = (error)=>{
29
+ if (error instanceof Error && error.message.includes('timed out')) {
30
+ return 'timeout';
31
+ }
32
+ return 'error';
33
+ };
34
+ const sendDidStartMcpServer = (strapi, properties)=>{
35
+ strapi.telemetry.send(MCP_LIMITED_TELEMETRY_EVENTS.didStartMcpServer, {
36
+ eventProperties: {
37
+ path: properties.path
38
+ },
39
+ groupProperties: {
40
+ numberOfTools: properties.numberOfTools,
41
+ numberOfPrompts: properties.numberOfPrompts,
42
+ numberOfResources: properties.numberOfResources
43
+ }
44
+ }).catch(()=>{});
45
+ };
46
+ const sendDidUseMcpServer = (strapi)=>{
47
+ strapi.telemetry.send(MCP_LIMITED_TELEMETRY_EVENTS.didUseMcpServer).catch(()=>{});
48
+ };
49
+ const sendDidNotAuthenticateMcpRequest = (strapi, errorClass)=>{
50
+ strapi.telemetry.send(MCP_LIMITED_TELEMETRY_EVENTS.didNotAuthenticateMcpRequest, {
51
+ eventProperties: {
52
+ errorClass
53
+ }
54
+ }).catch(()=>{});
55
+ };
56
+ const sendDidNotHandleMcpRequest = (strapi, errorClass)=>{
57
+ strapi.telemetry.send(MCP_LIMITED_TELEMETRY_EVENTS.didNotHandleMcpRequest, {
58
+ eventProperties: {
59
+ errorClass
60
+ }
61
+ }).catch(()=>{});
62
+ };
63
+ const sendDidExecuteMcpCapability = (strapi, identity)=>{
64
+ if (!shouldSendCapabilityEvent(identity, true)) {
65
+ return;
66
+ }
67
+ strapi.telemetry.send('didExecuteMcpCapability', {
68
+ eventProperties: {
69
+ type: identity.type,
70
+ source: identity.source,
71
+ name: identity.name
72
+ }
73
+ }).catch(()=>{});
74
+ };
75
+ const sendDidNotExecuteMcpCapability = (strapi, identity, errorClass)=>{
76
+ if (!shouldSendCapabilityEvent(identity, false)) {
77
+ return;
78
+ }
79
+ strapi.telemetry.send('didNotExecuteMcpCapability', {
80
+ eventProperties: {
81
+ type: identity.type,
82
+ source: identity.source,
83
+ name: identity.name,
84
+ errorClass
85
+ }
86
+ }).catch(()=>{});
87
+ };
88
+
89
+ exports.MCP_LIMITED_TELEMETRY_EVENTS = MCP_LIMITED_TELEMETRY_EVENTS;
90
+ exports.classifyMcpRequestFailure = classifyMcpRequestFailure;
91
+ exports.sendDidExecuteMcpCapability = sendDidExecuteMcpCapability;
92
+ exports.sendDidNotAuthenticateMcpRequest = sendDidNotAuthenticateMcpRequest;
93
+ exports.sendDidNotExecuteMcpCapability = sendDidNotExecuteMcpCapability;
94
+ exports.sendDidNotHandleMcpRequest = sendDidNotHandleMcpRequest;
95
+ exports.sendDidStartMcpServer = sendDidStartMcpServer;
96
+ exports.sendDidUseMcpServer = sendDidUseMcpServer;
97
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sources":["../../../../src/services/mcp/metrics/metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport type { McpCapabilityIdentity } from './normalizeMcpCapability';\n\n/** Rate-limited via core telemetry `LIMITED_EVENTS`. */\nexport const MCP_LIMITED_TELEMETRY_EVENTS = {\n didStartMcpServer: 'didStartMcpServer',\n didUseMcpServer: 'didUseMcpServer',\n didNotAuthenticateMcpRequest: 'didNotAuthenticateMcpRequest',\n didNotHandleMcpRequest: 'didNotHandleMcpRequest',\n} as const;\n\nexport type McpLimitedTelemetryEvent =\n (typeof MCP_LIMITED_TELEMETRY_EVENTS)[keyof typeof MCP_LIMITED_TELEMETRY_EVENTS];\n\nexport type McpAuthErrorClass = 'missing_token' | 'invalid_token';\nexport type McpRequestErrorClass = 'timeout' | 'error';\nexport type McpCapabilityErrorClass = 'execution_error';\n\nexport type McpStartTelemetryProperties = {\n path: string;\n numberOfTools: number;\n numberOfPrompts: number;\n numberOfResources: number;\n};\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nlet capabilityCacheExpiresAt = Date.now() + ONE_DAY_MS;\nconst executedCapabilities = new Set<string>();\nconst failedCapabilities = new Set<string>();\n\nconst capabilityCacheKey = (identity: McpCapabilityIdentity, succeeded: boolean): string =>\n `${succeeded ? 'execute' : 'notExecute'}:${identity.type}:${identity.source}:${identity.name}`;\n\n/** Resets in-memory capability metrics state (unit tests only). */\nexport const resetMcpMetricsStateForTests = (): void => {\n executedCapabilities.clear();\n failedCapabilities.clear();\n capabilityCacheExpiresAt = Date.now() + ONE_DAY_MS;\n};\n\nconst shouldSendCapabilityEvent = (\n identity: McpCapabilityIdentity,\n succeeded: boolean\n): boolean => {\n const cache = succeeded ? executedCapabilities : failedCapabilities;\n\n if (Date.now() > capabilityCacheExpiresAt) {\n executedCapabilities.clear();\n failedCapabilities.clear();\n capabilityCacheExpiresAt = Date.now() + ONE_DAY_MS;\n }\n\n const key = capabilityCacheKey(identity, succeeded);\n\n if (cache.has(key)) {\n return false;\n }\n\n cache.add(key);\n return true;\n};\n\nexport const classifyMcpRequestFailure = (error: unknown): McpRequestErrorClass => {\n if (error instanceof Error && error.message.includes('timed out')) {\n return 'timeout';\n }\n\n return 'error';\n};\n\nexport const sendDidStartMcpServer = (\n strapi: Core.Strapi,\n properties: McpStartTelemetryProperties\n): void => {\n strapi.telemetry\n .send(MCP_LIMITED_TELEMETRY_EVENTS.didStartMcpServer, {\n eventProperties: { path: properties.path },\n groupProperties: {\n numberOfTools: properties.numberOfTools,\n numberOfPrompts: properties.numberOfPrompts,\n numberOfResources: properties.numberOfResources,\n },\n })\n .catch(() => {});\n};\n\nexport const sendDidUseMcpServer = (strapi: Core.Strapi): void => {\n strapi.telemetry.send(MCP_LIMITED_TELEMETRY_EVENTS.didUseMcpServer).catch(() => {});\n};\n\nexport const sendDidNotAuthenticateMcpRequest = (\n strapi: Core.Strapi,\n errorClass: McpAuthErrorClass\n): void => {\n strapi.telemetry\n .send(MCP_LIMITED_TELEMETRY_EVENTS.didNotAuthenticateMcpRequest, {\n eventProperties: { errorClass },\n })\n .catch(() => {});\n};\n\nexport const sendDidNotHandleMcpRequest = (\n strapi: Core.Strapi,\n errorClass: McpRequestErrorClass\n): void => {\n strapi.telemetry\n .send(MCP_LIMITED_TELEMETRY_EVENTS.didNotHandleMcpRequest, {\n eventProperties: { errorClass },\n })\n .catch(() => {});\n};\n\nexport const sendDidExecuteMcpCapability = (\n strapi: Core.Strapi,\n identity: McpCapabilityIdentity\n): void => {\n if (!shouldSendCapabilityEvent(identity, true)) {\n return;\n }\n\n strapi.telemetry\n .send('didExecuteMcpCapability', {\n eventProperties: {\n type: identity.type,\n source: identity.source,\n name: identity.name,\n },\n })\n .catch(() => {});\n};\n\nexport const sendDidNotExecuteMcpCapability = (\n strapi: Core.Strapi,\n identity: McpCapabilityIdentity,\n errorClass: McpCapabilityErrorClass\n): void => {\n if (!shouldSendCapabilityEvent(identity, false)) {\n return;\n }\n\n strapi.telemetry\n .send('didNotExecuteMcpCapability', {\n eventProperties: {\n type: identity.type,\n source: identity.source,\n name: identity.name,\n errorClass,\n },\n })\n .catch(() => {});\n};\n"],"names":["MCP_LIMITED_TELEMETRY_EVENTS","didStartMcpServer","didUseMcpServer","didNotAuthenticateMcpRequest","didNotHandleMcpRequest","ONE_DAY_MS","capabilityCacheExpiresAt","Date","now","executedCapabilities","Set","failedCapabilities","capabilityCacheKey","identity","succeeded","type","source","name","shouldSendCapabilityEvent","cache","clear","key","has","add","classifyMcpRequestFailure","error","Error","message","includes","sendDidStartMcpServer","strapi","properties","telemetry","send","eventProperties","path","groupProperties","numberOfTools","numberOfPrompts","numberOfResources","catch","sendDidUseMcpServer","sendDidNotAuthenticateMcpRequest","errorClass","sendDidNotHandleMcpRequest","sendDidExecuteMcpCapability","sendDidNotExecuteMcpCapability"],"mappings":"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"}