@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,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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthDiscoveryFallback.js","sources":["../../../../src/services/mcp/middleware/oauthDiscoveryFallback.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\n/**\n * OAuth discovery paths probed by MCP SDK clients during the authentication\n * fallback flow (RFC 8414 § 3, RFC 7591, OpenID Connect Discovery).\n *\n * Strapi is a resource server, not an authorization server, so these paths\n * have no real handler. Without this middleware, Koa returns plain-text\n * 404/405 responses that crash clients expecting JSON (e.g. Claude Code).\n *\n * The middleware only fires when downstream already returned 404 or 405,\n * so user-defined routes on these paths are never shadowed.\n */\nconst OAUTH_DISCOVERY_PROBES: ReadonlyArray<{ method: string; path: string }> = [\n { method: 'GET', path: '/.well-known/oauth-authorization-server' },\n { method: 'GET', path: '/.well-known/openid-configuration' },\n { method: 'POST', path: '/register' },\n];\n\nexport const createOAuthDiscoveryFallbackMiddleware = (): Core.MiddlewareHandler => {\n return async (ctx, next) => {\n await next();\n\n if (ctx.status !== 404 && ctx.status !== 405) {\n return;\n }\n\n const isOAuthProbe = OAUTH_DISCOVERY_PROBES.some(\n (probe) => ctx.method === probe.method && ctx.path === probe.path\n );\n\n if (isOAuthProbe === false) {\n return;\n }\n\n ctx.status = 404;\n ctx.set('Content-Type', 'application/json');\n ctx.body = { error: 'not_found', error_description: 'OAuth is not supported' };\n };\n};\n"],"names":["OAUTH_DISCOVERY_PROBES","method","path","createOAuthDiscoveryFallbackMiddleware","ctx","next","status","isOAuthProbe","some","probe","set","body","error","error_description"],"mappings":";;AAEA;;;;;;;;;;AAUC,IACD,MAAMA,sBAAAA,GAA0E;AAC9E,IAAA;QAAEC,MAAAA,EAAQ,KAAA;QAAOC,IAAAA,EAAM;AAA0C,KAAA;AACjE,IAAA;QAAED,MAAAA,EAAQ,KAAA;QAAOC,IAAAA,EAAM;AAAoC,KAAA;AAC3D,IAAA;QAAED,MAAAA,EAAQ,MAAA;QAAQC,IAAAA,EAAM;AAAY;AACrC,CAAA;MAEYC,sCAAAA,GAAyC,IAAA;AACpD,IAAA,OAAO,OAAOC,GAAAA,EAAKC,IAAAA,GAAAA;QACjB,MAAMA,IAAAA,EAAAA;AAEN,QAAA,IAAID,IAAIE,MAAM,KAAK,OAAOF,GAAAA,CAAIE,MAAM,KAAK,GAAA,EAAK;AAC5C,YAAA;AACF,QAAA;AAEA,QAAA,MAAMC,eAAeP,sBAAAA,CAAuBQ,IAAI,CAC9C,CAACC,QAAUL,GAAAA,CAAIH,MAAM,KAAKQ,KAAAA,CAAMR,MAAM,IAAIG,GAAAA,CAAIF,IAAI,KAAKO,MAAMP,IAAI,CAAA;AAGnE,QAAA,IAAIK,iBAAiB,KAAA,EAAO;AAC1B,YAAA;AACF,QAAA;AAEAH,QAAAA,GAAAA,CAAIE,MAAM,GAAG,GAAA;QACbF,GAAAA,CAAIM,GAAG,CAAC,cAAA,EAAgB,kBAAA,CAAA;AACxBN,QAAAA,GAAAA,CAAIO,IAAI,GAAG;YAAEC,KAAAA,EAAO,WAAA;YAAaC,iBAAAA,EAAmB;AAAyB,SAAA;AAC/E,IAAA,CAAA;AACF;;;;"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * OAuth discovery paths probed by MCP SDK clients during the authentication
3
+ * fallback flow (RFC 8414 § 3, RFC 7591, OpenID Connect Discovery).
4
+ *
5
+ * Strapi is a resource server, not an authorization server, so these paths
6
+ * have no real handler. Without this middleware, Koa returns plain-text
7
+ * 404/405 responses that crash clients expecting JSON (e.g. Claude Code).
8
+ *
9
+ * The middleware only fires when downstream already returned 404 or 405,
10
+ * so user-defined routes on these paths are never shadowed.
11
+ */ const OAUTH_DISCOVERY_PROBES = [
12
+ {
13
+ method: 'GET',
14
+ path: '/.well-known/oauth-authorization-server'
15
+ },
16
+ {
17
+ method: 'GET',
18
+ path: '/.well-known/openid-configuration'
19
+ },
20
+ {
21
+ method: 'POST',
22
+ path: '/register'
23
+ }
24
+ ];
25
+ const createOAuthDiscoveryFallbackMiddleware = ()=>{
26
+ return async (ctx, next)=>{
27
+ await next();
28
+ if (ctx.status !== 404 && ctx.status !== 405) {
29
+ return;
30
+ }
31
+ const isOAuthProbe = OAUTH_DISCOVERY_PROBES.some((probe)=>ctx.method === probe.method && ctx.path === probe.path);
32
+ if (isOAuthProbe === false) {
33
+ return;
34
+ }
35
+ ctx.status = 404;
36
+ ctx.set('Content-Type', 'application/json');
37
+ ctx.body = {
38
+ error: 'not_found',
39
+ error_description: 'OAuth is not supported'
40
+ };
41
+ };
42
+ };
43
+
44
+ export { createOAuthDiscoveryFallbackMiddleware };
45
+ //# sourceMappingURL=oauthDiscoveryFallback.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthDiscoveryFallback.mjs","sources":["../../../../src/services/mcp/middleware/oauthDiscoveryFallback.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\n/**\n * OAuth discovery paths probed by MCP SDK clients during the authentication\n * fallback flow (RFC 8414 § 3, RFC 7591, OpenID Connect Discovery).\n *\n * Strapi is a resource server, not an authorization server, so these paths\n * have no real handler. Without this middleware, Koa returns plain-text\n * 404/405 responses that crash clients expecting JSON (e.g. Claude Code).\n *\n * The middleware only fires when downstream already returned 404 or 405,\n * so user-defined routes on these paths are never shadowed.\n */\nconst OAUTH_DISCOVERY_PROBES: ReadonlyArray<{ method: string; path: string }> = [\n { method: 'GET', path: '/.well-known/oauth-authorization-server' },\n { method: 'GET', path: '/.well-known/openid-configuration' },\n { method: 'POST', path: '/register' },\n];\n\nexport const createOAuthDiscoveryFallbackMiddleware = (): Core.MiddlewareHandler => {\n return async (ctx, next) => {\n await next();\n\n if (ctx.status !== 404 && ctx.status !== 405) {\n return;\n }\n\n const isOAuthProbe = OAUTH_DISCOVERY_PROBES.some(\n (probe) => ctx.method === probe.method && ctx.path === probe.path\n );\n\n if (isOAuthProbe === false) {\n return;\n }\n\n ctx.status = 404;\n ctx.set('Content-Type', 'application/json');\n ctx.body = { error: 'not_found', error_description: 'OAuth is not supported' };\n };\n};\n"],"names":["OAUTH_DISCOVERY_PROBES","method","path","createOAuthDiscoveryFallbackMiddleware","ctx","next","status","isOAuthProbe","some","probe","set","body","error","error_description"],"mappings":"AAEA;;;;;;;;;;AAUC,IACD,MAAMA,sBAAAA,GAA0E;AAC9E,IAAA;QAAEC,MAAAA,EAAQ,KAAA;QAAOC,IAAAA,EAAM;AAA0C,KAAA;AACjE,IAAA;QAAED,MAAAA,EAAQ,KAAA;QAAOC,IAAAA,EAAM;AAAoC,KAAA;AAC3D,IAAA;QAAED,MAAAA,EAAQ,MAAA;QAAQC,IAAAA,EAAM;AAAY;AACrC,CAAA;MAEYC,sCAAAA,GAAyC,IAAA;AACpD,IAAA,OAAO,OAAOC,GAAAA,EAAKC,IAAAA,GAAAA;QACjB,MAAMA,IAAAA,EAAAA;AAEN,QAAA,IAAID,IAAIE,MAAM,KAAK,OAAOF,GAAAA,CAAIE,MAAM,KAAK,GAAA,EAAK;AAC5C,YAAA;AACF,QAAA;AAEA,QAAA,MAAMC,eAAeP,sBAAAA,CAAuBQ,IAAI,CAC9C,CAACC,QAAUL,GAAAA,CAAIH,MAAM,KAAKQ,KAAAA,CAAMR,MAAM,IAAIG,GAAAA,CAAIF,IAAI,KAAKO,MAAMP,IAAI,CAAA;AAGnE,QAAA,IAAIK,iBAAiB,KAAA,EAAO;AAC1B,YAAA;AACF,QAAA;AAEAH,QAAAA,GAAAA,CAAIE,MAAM,GAAG,GAAA;QACbF,GAAAA,CAAIM,GAAG,CAAC,cAAA,EAAgB,kBAAA,CAAA;AACxBN,QAAAA,GAAAA,CAAIO,IAAI,GAAG;YAAEC,KAAAA,EAAO,WAAA;YAAaC,iBAAAA,EAAmB;AAAyB,SAAA;AAC/E,IAAA,CAAA;AACF;;;;"}
@@ -0,0 +1,16 @@
1
+ import type { McpServer, RegisteredPrompt } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Core, Modules } from '@strapi/types';
3
+ import { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';
4
+ import { type McpCapabilityRegistry, McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry';
5
+ export declare const makeMcpPromptDefinition: <Definition extends Modules.MCP.McpPromptDefinition<string, import("zod/v4").ZodObject<Readonly<{
6
+ [k: string]: import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
7
+ }>, import("zod/v4/core").$strip> | undefined, string, string>>(prompt: Definition) => Definition;
8
+ export declare class McpPromptRegistry extends McpCapabilityRegistryBase<'prompt', Modules.MCP.McpPromptDefinition, RegisteredPrompt> implements McpCapabilityRegistry {
9
+ #private;
10
+ constructor(ctx: {
11
+ strapi: Core.Strapi;
12
+ definitions: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;
13
+ });
14
+ bind(mcpServer: McpServer): void;
15
+ }
16
+ //# sourceMappingURL=prompt-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-registry.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/prompt-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3F,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EACL,KAAK,qBAAqB,EAC1B,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;AAI1C,eAAO,MAAM,uBAAuB;;wEAC1B,UAAU,KACjB,UAAoB,CAAC;AAExB,qBAAa,iBACX,SAAQ,yBAAyB,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,CAC7F,YAAW,qBAAqB;;gBAIpB,GAAG,EAAE;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,+BAA+B,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;KACzF;IAKD,IAAI,CAAC,SAAS,EAAE,SAAS;CA4D1B"}
@@ -0,0 +1,77 @@
1
+ 'use strict';
2
+
3
+ var McpCapabilityRegistry = require('./internal/McpCapabilityRegistry.js');
4
+ var createSafeCapabilityRegistration = require('./utils/createSafeCapabilityRegistration.js');
5
+ var wrapCapabilityHandlerForMetrics = require('./metrics/wrapCapabilityHandlerForMetrics.js');
6
+
7
+ // eslint-disable-next-line import/extensions
8
+ function _class_private_field_loose_base(receiver, privateKey) {
9
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
10
+ throw new TypeError("attempted to use private field on non-instance");
11
+ }
12
+ return receiver;
13
+ }
14
+ var id = 0;
15
+ function _class_private_field_loose_key(name) {
16
+ return "__private_" + id++ + "_" + name;
17
+ }
18
+ var _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi");
19
+ class McpPromptRegistry extends McpCapabilityRegistry.McpCapabilityRegistryBase {
20
+ bind(mcpServer) {
21
+ const strapi = _class_private_field_loose_base(this, _strapi)[_strapi];
22
+ super.register((definition)=>{
23
+ const { name, title, description, argsSchema, createHandler } = definition;
24
+ return createSafeCapabilityRegistration.createSafeCapabilityRegistration({
25
+ strapi,
26
+ capabilityType: 'Prompt',
27
+ name,
28
+ createHandler,
29
+ createFallbackHandler (errorMessage) {
30
+ return async ()=>({
31
+ messages: [
32
+ {
33
+ role: 'user',
34
+ content: {
35
+ type: 'text',
36
+ text: `Prompt "${name}" failed to initialize: ${errorMessage}`
37
+ }
38
+ }
39
+ ]
40
+ });
41
+ },
42
+ createErrorResult (error) {
43
+ return {
44
+ messages: [
45
+ {
46
+ role: 'user',
47
+ content: {
48
+ type: 'text',
49
+ text: `Prompt "${name}" execution failed: ${error.message}`
50
+ }
51
+ }
52
+ ]
53
+ };
54
+ },
55
+ registerWithSdk (safeHandler) {
56
+ const sdkHandler = wrapCapabilityHandlerForMetrics.wrapCapabilityHandlerForMetrics(strapi, 'prompt', name, definition.telemetry, safeHandler);
57
+ return mcpServer.registerPrompt(name, {
58
+ title,
59
+ description,
60
+ // @ts-expect-error - Internal handler type mismatch due to optional argsSchema
61
+ argsSchema
62
+ }, sdkHandler);
63
+ }
64
+ });
65
+ });
66
+ }
67
+ constructor(ctx){
68
+ super(ctx.definitions), Object.defineProperty(this, _strapi, {
69
+ writable: true,
70
+ value: void 0
71
+ });
72
+ _class_private_field_loose_base(this, _strapi)[_strapi] = ctx.strapi;
73
+ }
74
+ }
75
+
76
+ exports.McpPromptRegistry = McpPromptRegistry;
77
+ //# sourceMappingURL=prompt-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-registry.js","sources":["../../../src/services/mcp/prompt-registry.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport type { McpServer, RegisteredPrompt } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\n\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\n\nexport const makeMcpPromptDefinition = <Definition extends Modules.MCP.McpPromptDefinition>(\n prompt: Definition\n): Definition => prompt;\n\nexport class McpPromptRegistry\n extends McpCapabilityRegistryBase<'prompt', Modules.MCP.McpPromptDefinition, RegisteredPrompt>\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, title, description, argsSchema, createHandler } = definition;\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Prompt',\n name,\n createHandler,\n createFallbackHandler(errorMessage) {\n return async () => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Prompt \"${name}\" failed to initialize: ${errorMessage}`,\n },\n },\n ],\n });\n },\n createErrorResult(error) {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Prompt \"${name}\" execution failed: ${error.message}`,\n },\n },\n ],\n };\n },\n registerWithSdk(safeHandler) {\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'prompt',\n name,\n definition.telemetry,\n safeHandler\n );\n\n return mcpServer.registerPrompt(\n name,\n {\n title,\n description,\n // @ts-expect-error - Internal handler type mismatch due to optional argsSchema\n argsSchema,\n },\n sdkHandler\n );\n },\n });\n });\n }\n}\n"],"names":["McpPromptRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","definition","name","title","description","argsSchema","createHandler","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","messages","role","content","type","text","createErrorResult","error","message","registerWithSdk","safeHandler","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","registerPrompt","ctx","definitions"],"mappings":";;;;;;AAAA;;;;;;;;;;;AAoBE,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AAJK,MAAMA,iBAAAA,SACHC,+CAAAA,CAAAA;AAaRC,IAAAA,IAAAA,CAAKC,SAAoB,EAAE;AACzB,QAAA,MAAMC,MAAAA,GAAS,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA;QAEpB,KAAK,CAACC,SAAS,CAACC,UAAAA,GAAAA;YACd,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEC,WAAW,EAAEC,UAAU,EAAEC,aAAa,EAAE,GAAGL,UAAAA;AAEhE,YAAA,OAAOM,iEAAAA,CAAiC;AACtCR,gBAAAA,MAAAA;gBACAS,cAAAA,EAAgB,QAAA;AAChBN,gBAAAA,IAAAA;AACAI,gBAAAA,aAAAA;AACAG,gBAAAA,qBAAAA,CAAAA,CAAsBC,YAAY,EAAA;AAChC,oBAAA,OAAO,WAAa;4BAClBC,QAAAA,EAAU;AACR,gCAAA;oCACEC,IAAAA,EAAM,MAAA;oCACNC,OAAAA,EAAS;wCACPC,IAAAA,EAAM,MAAA;AACNC,wCAAAA,IAAAA,EAAM,CAAC,QAAQ,EAAEb,IAAAA,CAAK,wBAAwB,EAAEQ,YAAAA,CAAAA;AAClD;AACF;AACD;yBACH,CAAA;AACF,gBAAA,CAAA;AACAM,gBAAAA,iBAAAA,CAAAA,CAAkBC,KAAK,EAAA;oBACrB,OAAO;wBACLN,QAAAA,EAAU;AACR,4BAAA;gCACEC,IAAAA,EAAM,MAAA;gCACNC,OAAAA,EAAS;oCACPC,IAAAA,EAAM,MAAA;oCACNC,IAAAA,EAAM,CAAC,QAAQ,EAAEb,IAAAA,CAAK,oBAAoB,EAAEe,KAAAA,CAAMC,OAAO,CAAA;AAC3D;AACF;AACD;AACH,qBAAA;AACF,gBAAA,CAAA;AACAC,gBAAAA,eAAAA,CAAAA,CAAgBC,WAAW,EAAA;AACzB,oBAAA,MAAMC,aAAaC,+DAAAA,CACjBvB,MAAAA,EACA,UACAG,IAAAA,EACAD,UAAAA,CAAWsB,SAAS,EACpBH,WAAAA,CAAAA;oBAGF,OAAOtB,SAAAA,CAAU0B,cAAc,CAC7BtB,IAAAA,EACA;AACEC,wBAAAA,KAAAA;AACAC,wBAAAA,WAAAA;;AAEAC,wBAAAA;qBACF,EACAgB,UAAAA,CAAAA;AAEJ,gBAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AAnEA,IAAA,WAAA,CAAYI,GAGX,CAAE;AACD,QAAA,KAAK,CAACA,GAAAA,CAAIC,WAAW,CAAA,EANvB,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;mBAAA;;AAOE,QAAA,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,GAAUD,IAAI1B,MAAM;AAC3B,IAAA;AA8DF;;;;"}
@@ -0,0 +1,75 @@
1
+ import { McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry.mjs';
2
+ import { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration.mjs';
3
+ import { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics.mjs';
4
+
5
+ // eslint-disable-next-line import/extensions
6
+ function _class_private_field_loose_base(receiver, privateKey) {
7
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
8
+ throw new TypeError("attempted to use private field on non-instance");
9
+ }
10
+ return receiver;
11
+ }
12
+ var id = 0;
13
+ function _class_private_field_loose_key(name) {
14
+ return "__private_" + id++ + "_" + name;
15
+ }
16
+ var _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi");
17
+ class McpPromptRegistry extends McpCapabilityRegistryBase {
18
+ bind(mcpServer) {
19
+ const strapi = _class_private_field_loose_base(this, _strapi)[_strapi];
20
+ super.register((definition)=>{
21
+ const { name, title, description, argsSchema, createHandler } = definition;
22
+ return createSafeCapabilityRegistration({
23
+ strapi,
24
+ capabilityType: 'Prompt',
25
+ name,
26
+ createHandler,
27
+ createFallbackHandler (errorMessage) {
28
+ return async ()=>({
29
+ messages: [
30
+ {
31
+ role: 'user',
32
+ content: {
33
+ type: 'text',
34
+ text: `Prompt "${name}" failed to initialize: ${errorMessage}`
35
+ }
36
+ }
37
+ ]
38
+ });
39
+ },
40
+ createErrorResult (error) {
41
+ return {
42
+ messages: [
43
+ {
44
+ role: 'user',
45
+ content: {
46
+ type: 'text',
47
+ text: `Prompt "${name}" execution failed: ${error.message}`
48
+ }
49
+ }
50
+ ]
51
+ };
52
+ },
53
+ registerWithSdk (safeHandler) {
54
+ const sdkHandler = wrapCapabilityHandlerForMetrics(strapi, 'prompt', name, definition.telemetry, safeHandler);
55
+ return mcpServer.registerPrompt(name, {
56
+ title,
57
+ description,
58
+ // @ts-expect-error - Internal handler type mismatch due to optional argsSchema
59
+ argsSchema
60
+ }, sdkHandler);
61
+ }
62
+ });
63
+ });
64
+ }
65
+ constructor(ctx){
66
+ super(ctx.definitions), Object.defineProperty(this, _strapi, {
67
+ writable: true,
68
+ value: void 0
69
+ });
70
+ _class_private_field_loose_base(this, _strapi)[_strapi] = ctx.strapi;
71
+ }
72
+ }
73
+
74
+ export { McpPromptRegistry };
75
+ //# sourceMappingURL=prompt-registry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-registry.mjs","sources":["../../../src/services/mcp/prompt-registry.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport type { McpServer, RegisteredPrompt } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\n\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\n\nexport const makeMcpPromptDefinition = <Definition extends Modules.MCP.McpPromptDefinition>(\n prompt: Definition\n): Definition => prompt;\n\nexport class McpPromptRegistry\n extends McpCapabilityRegistryBase<'prompt', Modules.MCP.McpPromptDefinition, RegisteredPrompt>\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, title, description, argsSchema, createHandler } = definition;\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Prompt',\n name,\n createHandler,\n createFallbackHandler(errorMessage) {\n return async () => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Prompt \"${name}\" failed to initialize: ${errorMessage}`,\n },\n },\n ],\n });\n },\n createErrorResult(error) {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Prompt \"${name}\" execution failed: ${error.message}`,\n },\n },\n ],\n };\n },\n registerWithSdk(safeHandler) {\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'prompt',\n name,\n definition.telemetry,\n safeHandler\n );\n\n return mcpServer.registerPrompt(\n name,\n {\n title,\n description,\n // @ts-expect-error - Internal handler type mismatch due to optional argsSchema\n argsSchema,\n },\n sdkHandler\n );\n },\n });\n });\n }\n}\n"],"names":["McpPromptRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","definition","name","title","description","argsSchema","createHandler","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","messages","role","content","type","text","createErrorResult","error","message","registerWithSdk","safeHandler","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","registerPrompt","ctx","definitions"],"mappings":";;;;AAAA;;;;;;;;;;;AAoBE,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AAJK,MAAMA,iBAAAA,SACHC,yBAAAA,CAAAA;AAaRC,IAAAA,IAAAA,CAAKC,SAAoB,EAAE;AACzB,QAAA,MAAMC,MAAAA,GAAS,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA;QAEpB,KAAK,CAACC,SAAS,CAACC,UAAAA,GAAAA;YACd,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEC,WAAW,EAAEC,UAAU,EAAEC,aAAa,EAAE,GAAGL,UAAAA;AAEhE,YAAA,OAAOM,gCAAAA,CAAiC;AACtCR,gBAAAA,MAAAA;gBACAS,cAAAA,EAAgB,QAAA;AAChBN,gBAAAA,IAAAA;AACAI,gBAAAA,aAAAA;AACAG,gBAAAA,qBAAAA,CAAAA,CAAsBC,YAAY,EAAA;AAChC,oBAAA,OAAO,WAAa;4BAClBC,QAAAA,EAAU;AACR,gCAAA;oCACEC,IAAAA,EAAM,MAAA;oCACNC,OAAAA,EAAS;wCACPC,IAAAA,EAAM,MAAA;AACNC,wCAAAA,IAAAA,EAAM,CAAC,QAAQ,EAAEb,IAAAA,CAAK,wBAAwB,EAAEQ,YAAAA,CAAAA;AAClD;AACF;AACD;yBACH,CAAA;AACF,gBAAA,CAAA;AACAM,gBAAAA,iBAAAA,CAAAA,CAAkBC,KAAK,EAAA;oBACrB,OAAO;wBACLN,QAAAA,EAAU;AACR,4BAAA;gCACEC,IAAAA,EAAM,MAAA;gCACNC,OAAAA,EAAS;oCACPC,IAAAA,EAAM,MAAA;oCACNC,IAAAA,EAAM,CAAC,QAAQ,EAAEb,IAAAA,CAAK,oBAAoB,EAAEe,KAAAA,CAAMC,OAAO,CAAA;AAC3D;AACF;AACD;AACH,qBAAA;AACF,gBAAA,CAAA;AACAC,gBAAAA,eAAAA,CAAAA,CAAgBC,WAAW,EAAA;AACzB,oBAAA,MAAMC,aAAaC,+BAAAA,CACjBvB,MAAAA,EACA,UACAG,IAAAA,EACAD,UAAAA,CAAWsB,SAAS,EACpBH,WAAAA,CAAAA;oBAGF,OAAOtB,SAAAA,CAAU0B,cAAc,CAC7BtB,IAAAA,EACA;AACEC,wBAAAA,KAAAA;AACAC,wBAAAA,WAAAA;;AAEAC,wBAAAA;qBACF,EACAgB,UAAAA,CAAAA;AAEJ,gBAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AAnEA,IAAA,WAAA,CAAYI,GAGX,CAAE;AACD,QAAA,KAAK,CAACA,GAAAA,CAAIC,WAAW,CAAA,EANvB,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;mBAAA;;AAOE,QAAA,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,GAAUD,IAAI1B,MAAM;AAC3B,IAAA;AA8DF;;;;"}
@@ -0,0 +1,14 @@
1
+ import type { McpServer, RegisteredResource } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Core, Modules } from '@strapi/types';
3
+ import { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';
4
+ import { type McpCapabilityRegistry, McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry';
5
+ export declare const makeMcpResourceDefinition: <Definition extends Modules.MCP.McpResourceDefinition<string>>(resource: Definition) => Definition;
6
+ export declare class McpResourceRegistry extends McpCapabilityRegistryBase<'resource', Modules.MCP.McpResourceDefinition, RegisteredResource> implements McpCapabilityRegistry {
7
+ #private;
8
+ constructor(ctx: {
9
+ strapi: Core.Strapi;
10
+ definitions: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;
11
+ });
12
+ bind(mcpServer: McpServer): void;
13
+ }
14
+ //# sourceMappingURL=resource-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-registry.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/resource-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,kBAAkB,EAEnB,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EACL,KAAK,qBAAqB,EAC1B,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;AAI1C,eAAO,MAAM,yBAAyB,2EAC1B,UAAU,KACnB,UAAsB,CAAC;AAE1B,qBAAa,mBACX,SAAQ,yBAAyB,CAC/B,UAAU,EACV,OAAO,CAAC,GAAG,CAAC,qBAAqB,EACjC,kBAAkB,CAEpB,YAAW,qBAAqB;;gBAIpB,GAAG,EAAE;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,+BAA+B,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;KAC7F;IAKD,IAAI,CAAC,SAAS,EAAE,SAAS;CA+C1B"}