@strapi/core 5.46.1 → 5.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/dist/core-api/routes/index.js +2 -0
  2. package/dist/core-api/routes/index.js.map +1 -1
  3. package/dist/core-api/routes/index.mjs +2 -0
  4. package/dist/core-api/routes/index.mjs.map +1 -1
  5. package/dist/core-api/routes/validation/content-type.d.ts +13 -1
  6. package/dist/core-api/routes/validation/content-type.d.ts.map +1 -1
  7. package/dist/core-api/routes/validation/content-type.js +15 -2
  8. package/dist/core-api/routes/validation/content-type.js.map +1 -1
  9. package/dist/core-api/routes/validation/content-type.mjs +15 -2
  10. package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
  11. package/dist/migrations/database/5.0.0-discard-drafts.d.ts +2 -1
  12. package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
  13. package/dist/migrations/database/5.0.0-discard-drafts.js +41 -30
  14. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  15. package/dist/migrations/database/5.0.0-discard-drafts.mjs +41 -30
  16. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  17. package/dist/package.json.js +14 -12
  18. package/dist/package.json.js.map +1 -1
  19. package/dist/package.json.mjs +14 -12
  20. package/dist/package.json.mjs.map +1 -1
  21. package/dist/providers/index.d.ts.map +1 -1
  22. package/dist/providers/index.js +3 -1
  23. package/dist/providers/index.js.map +1 -1
  24. package/dist/providers/index.mjs +3 -1
  25. package/dist/providers/index.mjs.map +1 -1
  26. package/dist/providers/mcp.d.ts +3 -0
  27. package/dist/providers/mcp.d.ts.map +1 -0
  28. package/dist/providers/mcp.js +39 -0
  29. package/dist/providers/mcp.js.map +1 -0
  30. package/dist/providers/mcp.mjs +37 -0
  31. package/dist/providers/mcp.mjs.map +1 -0
  32. package/dist/services/ai.d.ts.map +1 -1
  33. package/dist/services/ai.js +3 -0
  34. package/dist/services/ai.js.map +1 -1
  35. package/dist/services/ai.mjs +3 -0
  36. package/dist/services/ai.mjs.map +1 -1
  37. package/dist/services/document-service/draft-and-publish.d.ts +2 -16
  38. package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
  39. package/dist/services/document-service/draft-and-publish.js +0 -53
  40. package/dist/services/document-service/draft-and-publish.js.map +1 -1
  41. package/dist/services/document-service/draft-and-publish.mjs +2 -53
  42. package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
  43. package/dist/services/document-service/params.d.ts +2 -2
  44. package/dist/services/document-service/params.d.ts.map +1 -1
  45. package/dist/services/document-service/publication-filter.d.ts +6 -0
  46. package/dist/services/document-service/publication-filter.d.ts.map +1 -0
  47. package/dist/services/document-service/publication-filter.js +20 -0
  48. package/dist/services/document-service/publication-filter.js.map +1 -0
  49. package/dist/services/document-service/publication-filter.mjs +15 -0
  50. package/dist/services/document-service/publication-filter.mjs.map +1 -0
  51. package/dist/services/document-service/transform/query.d.ts +1 -1
  52. package/dist/services/document-service/transform/query.d.ts.map +1 -1
  53. package/dist/services/document-service/transform/query.js +32 -19
  54. package/dist/services/document-service/transform/query.js.map +1 -1
  55. package/dist/services/document-service/transform/query.mjs +33 -20
  56. package/dist/services/document-service/transform/query.mjs.map +1 -1
  57. package/dist/services/entity-validator/blocks-validator.js +1 -1
  58. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  59. package/dist/services/entity-validator/blocks-validator.mjs +1 -1
  60. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  61. package/dist/services/mcp/authentication.d.ts +23 -0
  62. package/dist/services/mcp/authentication.d.ts.map +1 -0
  63. package/dist/services/mcp/authentication.js +45 -0
  64. package/dist/services/mcp/authentication.js.map +1 -0
  65. package/dist/services/mcp/authentication.mjs +43 -0
  66. package/dist/services/mcp/authentication.mjs.map +1 -0
  67. package/dist/services/mcp/handlers/handlePost.d.ts +4 -0
  68. package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -0
  69. package/dist/services/mcp/handlers/handlePost.js +59 -0
  70. package/dist/services/mcp/handlers/handlePost.js.map +1 -0
  71. package/dist/services/mcp/handlers/handlePost.mjs +57 -0
  72. package/dist/services/mcp/handlers/handlePost.mjs.map +1 -0
  73. package/dist/services/mcp/handlers/types.d.ts +12 -0
  74. package/dist/services/mcp/handlers/types.d.ts.map +1 -0
  75. package/dist/services/mcp/index.d.ts +6 -0
  76. package/dist/services/mcp/index.d.ts.map +1 -0
  77. package/dist/services/mcp/index.js +101 -0
  78. package/dist/services/mcp/index.js.map +1 -0
  79. package/dist/services/mcp/index.mjs +99 -0
  80. package/dist/services/mcp/index.mjs.map +1 -0
  81. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts +13 -0
  82. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts.map +1 -0
  83. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js +53 -0
  84. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js.map +1 -0
  85. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs +51 -0
  86. package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs.map +1 -0
  87. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +43 -0
  88. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -0
  89. package/dist/services/mcp/internal/McpCapabilityRegistry.js +108 -0
  90. package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -0
  91. package/dist/services/mcp/internal/McpCapabilityRegistry.mjs +106 -0
  92. package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -0
  93. package/dist/services/mcp/internal/McpConfiguration.d.ts +11 -0
  94. package/dist/services/mcp/internal/McpConfiguration.d.ts.map +1 -0
  95. package/dist/services/mcp/internal/McpConfiguration.js +34 -0
  96. package/dist/services/mcp/internal/McpConfiguration.js.map +1 -0
  97. package/dist/services/mcp/internal/McpConfiguration.mjs +32 -0
  98. package/dist/services/mcp/internal/McpConfiguration.mjs.map +1 -0
  99. package/dist/services/mcp/internal/McpServerFactory.d.ts +37 -0
  100. package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -0
  101. package/dist/services/mcp/internal/McpServerFactory.js +71 -0
  102. package/dist/services/mcp/internal/McpServerFactory.js.map +1 -0
  103. package/dist/services/mcp/internal/McpServerFactory.mjs +69 -0
  104. package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -0
  105. package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts +21 -0
  106. package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts.map +1 -0
  107. package/dist/services/mcp/internal/syncMcpSessionCapabilities.js +76 -0
  108. package/dist/services/mcp/internal/syncMcpSessionCapabilities.js.map +1 -0
  109. package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs +73 -0
  110. package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs.map +1 -0
  111. package/dist/services/mcp/metrics/metrics.d.ts +29 -0
  112. package/dist/services/mcp/metrics/metrics.d.ts.map +1 -0
  113. package/dist/services/mcp/metrics/metrics.js +97 -0
  114. package/dist/services/mcp/metrics/metrics.js.map +1 -0
  115. package/dist/services/mcp/metrics/metrics.mjs +88 -0
  116. package/dist/services/mcp/metrics/metrics.mjs.map +1 -0
  117. package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts +11 -0
  118. package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts.map +1 -0
  119. package/dist/services/mcp/metrics/normalizeMcpCapability.js +10 -0
  120. package/dist/services/mcp/metrics/normalizeMcpCapability.js.map +1 -0
  121. package/dist/services/mcp/metrics/normalizeMcpCapability.mjs +8 -0
  122. package/dist/services/mcp/metrics/normalizeMcpCapability.mjs.map +1 -0
  123. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts +4 -0
  124. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts.map +1 -0
  125. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js +27 -0
  126. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js.map +1 -0
  127. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs +25 -0
  128. package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs.map +1 -0
  129. package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts +3 -0
  130. package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts.map +1 -0
  131. package/dist/services/mcp/middleware/oauthDiscoveryFallback.js +47 -0
  132. package/dist/services/mcp/middleware/oauthDiscoveryFallback.js.map +1 -0
  133. package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs +45 -0
  134. package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs.map +1 -0
  135. package/dist/services/mcp/prompt-registry.d.ts +16 -0
  136. package/dist/services/mcp/prompt-registry.d.ts.map +1 -0
  137. package/dist/services/mcp/prompt-registry.js +77 -0
  138. package/dist/services/mcp/prompt-registry.js.map +1 -0
  139. package/dist/services/mcp/prompt-registry.mjs +75 -0
  140. package/dist/services/mcp/prompt-registry.mjs.map +1 -0
  141. package/dist/services/mcp/resource-registry.d.ts +14 -0
  142. package/dist/services/mcp/resource-registry.d.ts.map +1 -0
  143. package/dist/services/mcp/resource-registry.js +67 -0
  144. package/dist/services/mcp/resource-registry.js.map +1 -0
  145. package/dist/services/mcp/resource-registry.mjs +65 -0
  146. package/dist/services/mcp/resource-registry.mjs.map +1 -0
  147. package/dist/services/mcp/routes.d.ts +11 -0
  148. package/dist/services/mcp/routes.d.ts.map +1 -0
  149. package/dist/services/mcp/routes.js +58 -0
  150. package/dist/services/mcp/routes.js.map +1 -0
  151. package/dist/services/mcp/routes.mjs +56 -0
  152. package/dist/services/mcp/routes.mjs.map +1 -0
  153. package/dist/services/mcp/tool-registry.d.ts +25 -0
  154. package/dist/services/mcp/tool-registry.d.ts.map +1 -0
  155. package/dist/services/mcp/tool-registry.js +102 -0
  156. package/dist/services/mcp/tool-registry.js.map +1 -0
  157. package/dist/services/mcp/tool-registry.mjs +99 -0
  158. package/dist/services/mcp/tool-registry.mjs.map +1 -0
  159. package/dist/services/mcp/tools/log.d.ts +87 -0
  160. package/dist/services/mcp/tools/log.d.ts.map +1 -0
  161. package/dist/services/mcp/tools/log.js +88 -0
  162. package/dist/services/mcp/tools/log.js.map +1 -0
  163. package/dist/services/mcp/tools/log.mjs +86 -0
  164. package/dist/services/mcp/tools/log.mjs.map +1 -0
  165. package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts +36 -0
  166. package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts.map +1 -0
  167. package/dist/services/mcp/utils/createSafeCapabilityRegistration.js +59 -0
  168. package/dist/services/mcp/utils/createSafeCapabilityRegistration.js.map +1 -0
  169. package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs +56 -0
  170. package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs.map +1 -0
  171. package/dist/services/mcp/utils/jsonRpcErrors.d.ts +22 -0
  172. package/dist/services/mcp/utils/jsonRpcErrors.d.ts.map +1 -0
  173. package/dist/services/mcp/utils/jsonRpcErrors.js +25 -0
  174. package/dist/services/mcp/utils/jsonRpcErrors.js.map +1 -0
  175. package/dist/services/mcp/utils/jsonRpcErrors.mjs +23 -0
  176. package/dist/services/mcp/utils/jsonRpcErrors.mjs.map +1 -0
  177. package/dist/services/mcp/utils/safeHandlerWrapper.d.ts +18 -0
  178. package/dist/services/mcp/utils/safeHandlerWrapper.d.ts.map +1 -0
  179. package/dist/services/mcp/utils/safeHandlerWrapper.js +29 -0
  180. package/dist/services/mcp/utils/safeHandlerWrapper.js.map +1 -0
  181. package/dist/services/mcp/utils/safeHandlerWrapper.mjs +27 -0
  182. package/dist/services/mcp/utils/safeHandlerWrapper.mjs.map +1 -0
  183. package/dist/services/mcp/utils/sendJsonRpcError.d.ts +5 -0
  184. package/dist/services/mcp/utils/sendJsonRpcError.d.ts.map +1 -0
  185. package/dist/services/mcp/utils/sendJsonRpcError.js +23 -0
  186. package/dist/services/mcp/utils/sendJsonRpcError.js.map +1 -0
  187. package/dist/services/mcp/utils/sendJsonRpcError.mjs +21 -0
  188. package/dist/services/mcp/utils/sendJsonRpcError.mjs.map +1 -0
  189. package/dist/services/mcp/utils/withTimeout.d.ts +7 -0
  190. package/dist/services/mcp/utils/withTimeout.d.ts.map +1 -0
  191. package/dist/services/mcp/utils/withTimeout.js +23 -0
  192. package/dist/services/mcp/utils/withTimeout.js.map +1 -0
  193. package/dist/services/mcp/utils/withTimeout.mjs +21 -0
  194. package/dist/services/mcp/utils/withTimeout.mjs.map +1 -0
  195. package/dist/services/metrics/index.d.ts.map +1 -1
  196. package/dist/services/metrics/index.js +3 -1
  197. package/dist/services/metrics/index.js.map +1 -1
  198. package/dist/services/metrics/index.mjs +3 -1
  199. package/dist/services/metrics/index.mjs.map +1 -1
  200. package/package.json +14 -12
@@ -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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"}
@@ -0,0 +1,88 @@
1
+ /** Rate-limited via core telemetry `LIMITED_EVENTS`. */ const MCP_LIMITED_TELEMETRY_EVENTS = {
2
+ didStartMcpServer: 'didStartMcpServer',
3
+ didUseMcpServer: 'didUseMcpServer',
4
+ didNotAuthenticateMcpRequest: 'didNotAuthenticateMcpRequest',
5
+ didNotHandleMcpRequest: 'didNotHandleMcpRequest'
6
+ };
7
+ const ONE_DAY_MS = 24 * 60 * 60 * 1000;
8
+ let capabilityCacheExpiresAt = Date.now() + ONE_DAY_MS;
9
+ const executedCapabilities = new Set();
10
+ const failedCapabilities = new Set();
11
+ const capabilityCacheKey = (identity, succeeded)=>`${succeeded ? 'execute' : 'notExecute'}:${identity.type}:${identity.source}:${identity.name}`;
12
+ const shouldSendCapabilityEvent = (identity, succeeded)=>{
13
+ const cache = succeeded ? executedCapabilities : failedCapabilities;
14
+ if (Date.now() > capabilityCacheExpiresAt) {
15
+ executedCapabilities.clear();
16
+ failedCapabilities.clear();
17
+ capabilityCacheExpiresAt = Date.now() + ONE_DAY_MS;
18
+ }
19
+ const key = capabilityCacheKey(identity, succeeded);
20
+ if (cache.has(key)) {
21
+ return false;
22
+ }
23
+ cache.add(key);
24
+ return true;
25
+ };
26
+ const classifyMcpRequestFailure = (error)=>{
27
+ if (error instanceof Error && error.message.includes('timed out')) {
28
+ return 'timeout';
29
+ }
30
+ return 'error';
31
+ };
32
+ const sendDidStartMcpServer = (strapi, properties)=>{
33
+ strapi.telemetry.send(MCP_LIMITED_TELEMETRY_EVENTS.didStartMcpServer, {
34
+ eventProperties: {
35
+ path: properties.path
36
+ },
37
+ groupProperties: {
38
+ numberOfTools: properties.numberOfTools,
39
+ numberOfPrompts: properties.numberOfPrompts,
40
+ numberOfResources: properties.numberOfResources
41
+ }
42
+ }).catch(()=>{});
43
+ };
44
+ const sendDidUseMcpServer = (strapi)=>{
45
+ strapi.telemetry.send(MCP_LIMITED_TELEMETRY_EVENTS.didUseMcpServer).catch(()=>{});
46
+ };
47
+ const sendDidNotAuthenticateMcpRequest = (strapi, errorClass)=>{
48
+ strapi.telemetry.send(MCP_LIMITED_TELEMETRY_EVENTS.didNotAuthenticateMcpRequest, {
49
+ eventProperties: {
50
+ errorClass
51
+ }
52
+ }).catch(()=>{});
53
+ };
54
+ const sendDidNotHandleMcpRequest = (strapi, errorClass)=>{
55
+ strapi.telemetry.send(MCP_LIMITED_TELEMETRY_EVENTS.didNotHandleMcpRequest, {
56
+ eventProperties: {
57
+ errorClass
58
+ }
59
+ }).catch(()=>{});
60
+ };
61
+ const sendDidExecuteMcpCapability = (strapi, identity)=>{
62
+ if (!shouldSendCapabilityEvent(identity, true)) {
63
+ return;
64
+ }
65
+ strapi.telemetry.send('didExecuteMcpCapability', {
66
+ eventProperties: {
67
+ type: identity.type,
68
+ source: identity.source,
69
+ name: identity.name
70
+ }
71
+ }).catch(()=>{});
72
+ };
73
+ const sendDidNotExecuteMcpCapability = (strapi, identity, errorClass)=>{
74
+ if (!shouldSendCapabilityEvent(identity, false)) {
75
+ return;
76
+ }
77
+ strapi.telemetry.send('didNotExecuteMcpCapability', {
78
+ eventProperties: {
79
+ type: identity.type,
80
+ source: identity.source,
81
+ name: identity.name,
82
+ errorClass
83
+ }
84
+ }).catch(()=>{});
85
+ };
86
+
87
+ export { MCP_LIMITED_TELEMETRY_EVENTS, classifyMcpRequestFailure, sendDidExecuteMcpCapability, sendDidNotAuthenticateMcpRequest, sendDidNotExecuteMcpCapability, sendDidNotHandleMcpRequest, sendDidStartMcpServer, sendDidUseMcpServer };
88
+ //# sourceMappingURL=metrics.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.mjs","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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"}
@@ -0,0 +1,11 @@
1
+ export type McpCapabilityType = 'tool' | 'prompt' | 'resource';
2
+ export type McpCapabilityIdentity = {
3
+ type: McpCapabilityType;
4
+ source: string;
5
+ name: string;
6
+ };
7
+ export declare const normalizeMcpCapability: (type: McpCapabilityType, rawName: string, telemetry?: {
8
+ source?: string;
9
+ name?: string;
10
+ }) => McpCapabilityIdentity;
11
+ //# sourceMappingURL=normalizeMcpCapability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeMcpCapability.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/metrics/normalizeMcpCapability.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/D,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,sBAAsB,SAC3B,iBAAiB,WACd,MAAM,cACH;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAC7C,qBAID,CAAC"}
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ const normalizeMcpCapability = (type, rawName, telemetry)=>({
4
+ type,
5
+ source: telemetry?.source ?? 'unknown',
6
+ name: telemetry?.name ?? rawName
7
+ });
8
+
9
+ exports.normalizeMcpCapability = normalizeMcpCapability;
10
+ //# sourceMappingURL=normalizeMcpCapability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeMcpCapability.js","sources":["../../../../src/services/mcp/metrics/normalizeMcpCapability.ts"],"sourcesContent":["export type McpCapabilityType = 'tool' | 'prompt' | 'resource';\n\nexport type McpCapabilityIdentity = {\n type: McpCapabilityType;\n source: string;\n name: string;\n};\n\nexport const normalizeMcpCapability = (\n type: McpCapabilityType,\n rawName: string,\n telemetry?: { source?: string; name?: string }\n): McpCapabilityIdentity => ({\n type,\n source: telemetry?.source ?? 'unknown',\n name: telemetry?.name ?? rawName,\n});\n"],"names":["normalizeMcpCapability","type","rawName","telemetry","source","name"],"mappings":";;MAQaA,sBAAAA,GAAyB,CACpCC,IAAAA,EACAC,OAAAA,EACAC,aAC2B;AAC3BF,QAAAA,IAAAA;AACAG,QAAAA,MAAAA,EAAQD,WAAWC,MAAAA,IAAU,SAAA;AAC7BC,QAAAA,IAAAA,EAAMF,WAAWE,IAAAA,IAAQH;AAC3B,KAAA;;;;"}
@@ -0,0 +1,8 @@
1
+ const normalizeMcpCapability = (type, rawName, telemetry)=>({
2
+ type,
3
+ source: telemetry?.source ?? 'unknown',
4
+ name: telemetry?.name ?? rawName
5
+ });
6
+
7
+ export { normalizeMcpCapability };
8
+ //# sourceMappingURL=normalizeMcpCapability.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeMcpCapability.mjs","sources":["../../../../src/services/mcp/metrics/normalizeMcpCapability.ts"],"sourcesContent":["export type McpCapabilityType = 'tool' | 'prompt' | 'resource';\n\nexport type McpCapabilityIdentity = {\n type: McpCapabilityType;\n source: string;\n name: string;\n};\n\nexport const normalizeMcpCapability = (\n type: McpCapabilityType,\n rawName: string,\n telemetry?: { source?: string; name?: string }\n): McpCapabilityIdentity => ({\n type,\n source: telemetry?.source ?? 'unknown',\n name: telemetry?.name ?? rawName,\n});\n"],"names":["normalizeMcpCapability","type","rawName","telemetry","source","name"],"mappings":"MAQaA,sBAAAA,GAAyB,CACpCC,IAAAA,EACAC,OAAAA,EACAC,aAC2B;AAC3BF,QAAAA,IAAAA;AACAG,QAAAA,MAAAA,EAAQD,WAAWC,MAAAA,IAAU,SAAA;AAC7BC,QAAAA,IAAAA,EAAMF,WAAWE,IAAAA,IAAQH;AAC3B,KAAA;;;;"}
@@ -0,0 +1,4 @@
1
+ import type { Core, Modules } from '@strapi/types';
2
+ import { type McpCapabilityType } from './normalizeMcpCapability';
3
+ export declare const wrapCapabilityHandlerForMetrics: <THandler extends (...args: never[]) => Promise<unknown>>(strapi: Core.Strapi, type: McpCapabilityType, capabilityName: string, telemetry: Modules.MCP.McpCapabilityTelemetry | undefined, handler: THandler) => THandler;
4
+ //# sourceMappingURL=wrapCapabilityHandlerForMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapCapabilityHandlerForMetrics.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/metrics/wrapCapabilityHandlerForMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAA0B,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAW1F,eAAO,MAAM,+BAA+B,8BACf,KAAK,EAAE,KAAK,QAAQ,OAAO,CAAC,UAE/C,KAAK,MAAM,QACb,iBAAiB,kBACP,MAAM,aACX,QAAQ,GAAG,CAAC,sBAAsB,GAAG,SAAS,WAChD,QAAQ,KAChB,QAeF,CAAC"}
@@ -0,0 +1,27 @@
1
+ 'use strict';
2
+
3
+ var normalizeMcpCapability = require('./normalizeMcpCapability.js');
4
+ var metrics = require('./metrics.js');
5
+
6
+ const isCapabilityFailure = (result)=>{
7
+ if (result === null || typeof result !== 'object') {
8
+ return false;
9
+ }
10
+ return 'isError' in result && result.isError === true;
11
+ };
12
+ const wrapCapabilityHandlerForMetrics = (strapi, type, capabilityName, telemetry, handler)=>{
13
+ const wrapped = async (...args)=>{
14
+ const result = await handler(...args);
15
+ const identity = normalizeMcpCapability.normalizeMcpCapability(type, capabilityName, telemetry);
16
+ if (isCapabilityFailure(result)) {
17
+ metrics.sendDidNotExecuteMcpCapability(strapi, identity, 'execution_error');
18
+ } else {
19
+ metrics.sendDidExecuteMcpCapability(strapi, identity);
20
+ }
21
+ return result;
22
+ };
23
+ return wrapped;
24
+ };
25
+
26
+ exports.wrapCapabilityHandlerForMetrics = wrapCapabilityHandlerForMetrics;
27
+ //# sourceMappingURL=wrapCapabilityHandlerForMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapCapabilityHandlerForMetrics.js","sources":["../../../../src/services/mcp/metrics/wrapCapabilityHandlerForMetrics.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\n\nimport { normalizeMcpCapability, type McpCapabilityType } from './normalizeMcpCapability';\nimport { sendDidExecuteMcpCapability, sendDidNotExecuteMcpCapability } from './metrics';\n\nconst isCapabilityFailure = (result: unknown): boolean => {\n if (result === null || typeof result !== 'object') {\n return false;\n }\n\n return 'isError' in result && result.isError === true;\n};\n\nexport const wrapCapabilityHandlerForMetrics = <\n THandler extends (...args: never[]) => Promise<unknown>,\n>(\n strapi: Core.Strapi,\n type: McpCapabilityType,\n capabilityName: string,\n telemetry: Modules.MCP.McpCapabilityTelemetry | undefined,\n handler: THandler\n): THandler => {\n const wrapped = async (...args: Parameters<THandler>) => {\n const result = await handler(...args);\n const identity = normalizeMcpCapability(type, capabilityName, telemetry);\n\n if (isCapabilityFailure(result)) {\n sendDidNotExecuteMcpCapability(strapi, identity, 'execution_error');\n } else {\n sendDidExecuteMcpCapability(strapi, identity);\n }\n\n return result;\n };\n\n return wrapped as THandler;\n};\n"],"names":["isCapabilityFailure","result","isError","wrapCapabilityHandlerForMetrics","strapi","type","capabilityName","telemetry","handler","wrapped","args","identity","normalizeMcpCapability","sendDidNotExecuteMcpCapability","sendDidExecuteMcpCapability"],"mappings":";;;;;AAKA,MAAMA,sBAAsB,CAACC,MAAAA,GAAAA;AAC3B,IAAA,IAAIA,MAAAA,KAAW,IAAA,IAAQ,OAAOA,MAAAA,KAAW,QAAA,EAAU;QACjD,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,OAAO,SAAA,IAAaA,MAAAA,IAAUA,MAAAA,CAAOC,OAAO,KAAK,IAAA;AACnD,CAAA;MAEaC,+BAAAA,GAAkC,CAG7CC,MAAAA,EACAC,IAAAA,EACAC,gBACAC,SAAAA,EACAC,OAAAA,GAAAA;IAEA,MAAMC,OAAAA,GAAU,OAAO,GAAGC,IAAAA,GAAAA;QACxB,MAAMT,MAAAA,GAAS,MAAMO,OAAAA,CAAAA,GAAWE,IAAAA,CAAAA;QAChC,MAAMC,QAAAA,GAAWC,6CAAAA,CAAuBP,IAAAA,EAAMC,cAAAA,EAAgBC,SAAAA,CAAAA;AAE9D,QAAA,IAAIP,oBAAoBC,MAAAA,CAAAA,EAAS;AAC/BY,YAAAA,sCAAAA,CAA+BT,QAAQO,QAAAA,EAAU,iBAAA,CAAA;QACnD,CAAA,MAAO;AACLG,YAAAA,mCAAAA,CAA4BV,MAAAA,EAAQO,QAAAA,CAAAA;AACtC,QAAA;QAEA,OAAOV,MAAAA;AACT,IAAA,CAAA;IAEA,OAAOQ,OAAAA;AACT;;;;"}
@@ -0,0 +1,25 @@
1
+ import { normalizeMcpCapability } from './normalizeMcpCapability.mjs';
2
+ import { sendDidNotExecuteMcpCapability, sendDidExecuteMcpCapability } from './metrics.mjs';
3
+
4
+ const isCapabilityFailure = (result)=>{
5
+ if (result === null || typeof result !== 'object') {
6
+ return false;
7
+ }
8
+ return 'isError' in result && result.isError === true;
9
+ };
10
+ const wrapCapabilityHandlerForMetrics = (strapi, type, capabilityName, telemetry, handler)=>{
11
+ const wrapped = async (...args)=>{
12
+ const result = await handler(...args);
13
+ const identity = normalizeMcpCapability(type, capabilityName, telemetry);
14
+ if (isCapabilityFailure(result)) {
15
+ sendDidNotExecuteMcpCapability(strapi, identity, 'execution_error');
16
+ } else {
17
+ sendDidExecuteMcpCapability(strapi, identity);
18
+ }
19
+ return result;
20
+ };
21
+ return wrapped;
22
+ };
23
+
24
+ export { wrapCapabilityHandlerForMetrics };
25
+ //# sourceMappingURL=wrapCapabilityHandlerForMetrics.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapCapabilityHandlerForMetrics.mjs","sources":["../../../../src/services/mcp/metrics/wrapCapabilityHandlerForMetrics.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\n\nimport { normalizeMcpCapability, type McpCapabilityType } from './normalizeMcpCapability';\nimport { sendDidExecuteMcpCapability, sendDidNotExecuteMcpCapability } from './metrics';\n\nconst isCapabilityFailure = (result: unknown): boolean => {\n if (result === null || typeof result !== 'object') {\n return false;\n }\n\n return 'isError' in result && result.isError === true;\n};\n\nexport const wrapCapabilityHandlerForMetrics = <\n THandler extends (...args: never[]) => Promise<unknown>,\n>(\n strapi: Core.Strapi,\n type: McpCapabilityType,\n capabilityName: string,\n telemetry: Modules.MCP.McpCapabilityTelemetry | undefined,\n handler: THandler\n): THandler => {\n const wrapped = async (...args: Parameters<THandler>) => {\n const result = await handler(...args);\n const identity = normalizeMcpCapability(type, capabilityName, telemetry);\n\n if (isCapabilityFailure(result)) {\n sendDidNotExecuteMcpCapability(strapi, identity, 'execution_error');\n } else {\n sendDidExecuteMcpCapability(strapi, identity);\n }\n\n return result;\n };\n\n return wrapped as THandler;\n};\n"],"names":["isCapabilityFailure","result","isError","wrapCapabilityHandlerForMetrics","strapi","type","capabilityName","telemetry","handler","wrapped","args","identity","normalizeMcpCapability","sendDidNotExecuteMcpCapability","sendDidExecuteMcpCapability"],"mappings":";;;AAKA,MAAMA,sBAAsB,CAACC,MAAAA,GAAAA;AAC3B,IAAA,IAAIA,MAAAA,KAAW,IAAA,IAAQ,OAAOA,MAAAA,KAAW,QAAA,EAAU;QACjD,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,OAAO,SAAA,IAAaA,MAAAA,IAAUA,MAAAA,CAAOC,OAAO,KAAK,IAAA;AACnD,CAAA;MAEaC,+BAAAA,GAAkC,CAG7CC,MAAAA,EACAC,IAAAA,EACAC,gBACAC,SAAAA,EACAC,OAAAA,GAAAA;IAEA,MAAMC,OAAAA,GAAU,OAAO,GAAGC,IAAAA,GAAAA;QACxB,MAAMT,MAAAA,GAAS,MAAMO,OAAAA,CAAAA,GAAWE,IAAAA,CAAAA;QAChC,MAAMC,QAAAA,GAAWC,sBAAAA,CAAuBP,IAAAA,EAAMC,cAAAA,EAAgBC,SAAAA,CAAAA;AAE9D,QAAA,IAAIP,oBAAoBC,MAAAA,CAAAA,EAAS;AAC/BY,YAAAA,8BAAAA,CAA+BT,QAAQO,QAAAA,EAAU,iBAAA,CAAA;QACnD,CAAA,MAAO;AACLG,YAAAA,2BAAAA,CAA4BV,MAAAA,EAAQO,QAAAA,CAAAA;AACtC,QAAA;QAEA,OAAOV,MAAAA;AACT,IAAA,CAAA;IAEA,OAAOQ,OAAAA;AACT;;;;"}
@@ -0,0 +1,3 @@
1
+ import type { Core } from '@strapi/types';
2
+ export declare const createOAuthDiscoveryFallbackMiddleware: () => Core.MiddlewareHandler;
3
+ //# sourceMappingURL=oauthDiscoveryFallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthDiscoveryFallback.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/middleware/oauthDiscoveryFallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAmB1C,eAAO,MAAM,sCAAsC,QAAO,KAAK,iBAoB9D,CAAC"}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * OAuth discovery paths probed by MCP SDK clients during the authentication
5
+ * fallback flow (RFC 8414 § 3, RFC 7591, OpenID Connect Discovery).
6
+ *
7
+ * Strapi is a resource server, not an authorization server, so these paths
8
+ * have no real handler. Without this middleware, Koa returns plain-text
9
+ * 404/405 responses that crash clients expecting JSON (e.g. Claude Code).
10
+ *
11
+ * The middleware only fires when downstream already returned 404 or 405,
12
+ * so user-defined routes on these paths are never shadowed.
13
+ */ const OAUTH_DISCOVERY_PROBES = [
14
+ {
15
+ method: 'GET',
16
+ path: '/.well-known/oauth-authorization-server'
17
+ },
18
+ {
19
+ method: 'GET',
20
+ path: '/.well-known/openid-configuration'
21
+ },
22
+ {
23
+ method: 'POST',
24
+ path: '/register'
25
+ }
26
+ ];
27
+ const createOAuthDiscoveryFallbackMiddleware = ()=>{
28
+ return async (ctx, next)=>{
29
+ await next();
30
+ if (ctx.status !== 404 && ctx.status !== 405) {
31
+ return;
32
+ }
33
+ const isOAuthProbe = OAUTH_DISCOVERY_PROBES.some((probe)=>ctx.method === probe.method && ctx.path === probe.path);
34
+ if (isOAuthProbe === false) {
35
+ return;
36
+ }
37
+ ctx.status = 404;
38
+ ctx.set('Content-Type', 'application/json');
39
+ ctx.body = {
40
+ error: 'not_found',
41
+ error_description: 'OAuth is not supported'
42
+ };
43
+ };
44
+ };
45
+
46
+ exports.createOAuthDiscoveryFallbackMiddleware = createOAuthDiscoveryFallbackMiddleware;
47
+ //# sourceMappingURL=oauthDiscoveryFallback.js.map