@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,87 @@
1
+ import { z } from '@strapi/utils';
2
+ export declare const logToolDefinition: {
3
+ name: "log";
4
+ telemetry?: import("@strapi/types/dist/modules/mcp").McpCapabilityTelemetry | undefined;
5
+ } & {
6
+ devModeOnly: true;
7
+ auth?: undefined;
8
+ } & {
9
+ title: "Strapi Log";
10
+ description: "Logs a message to the Strapi logger with specified level";
11
+ resolveInputSchema?: import("@strapi/types/dist/modules/mcp").McpToolSchemaResolver<z.ZodObject<{
12
+ message: z.ZodString;
13
+ level: z.ZodDefault<z.ZodEnum<{
14
+ http: "http";
15
+ info: "info";
16
+ error: "error";
17
+ log: "log";
18
+ warn: "warn";
19
+ }>>;
20
+ }, z.core.$strip>> | undefined;
21
+ resolveOutputSchema: import("@strapi/types/dist/modules/mcp").McpToolSchemaResolver<z.ZodObject<{
22
+ status: z.ZodString;
23
+ message: z.ZodString;
24
+ level: z.ZodString;
25
+ timestamp: z.ZodString;
26
+ }, z.core.$strip>>;
27
+ createHandler: (strapi: import("@strapi/types/dist/core").Strapi, context: import("@strapi/types/dist/modules/mcp").McpHandlerContext) => import("@strapi/types/dist/modules/mcp").McpToolHandler<NoInfer<z.ZodObject<{
28
+ message: z.ZodString;
29
+ level: z.ZodDefault<z.ZodEnum<{
30
+ http: "http";
31
+ info: "info";
32
+ error: "error";
33
+ log: "log";
34
+ warn: "warn";
35
+ }>>;
36
+ }, z.core.$strip>>, NoInfer<z.ZodObject<{
37
+ status: z.ZodString;
38
+ message: z.ZodString;
39
+ level: z.ZodString;
40
+ timestamp: z.ZodString;
41
+ }, z.core.$strip>>>;
42
+ } & {
43
+ name: "log";
44
+ title: "Strapi Log";
45
+ description: "Logs a message to the Strapi logger with specified level";
46
+ resolveInputSchema: () => z.ZodObject<{
47
+ message: z.ZodString;
48
+ level: z.ZodDefault<z.ZodEnum<{
49
+ http: "http";
50
+ info: "info";
51
+ error: "error";
52
+ log: "log";
53
+ warn: "warn";
54
+ }>>;
55
+ }, z.core.$strip>;
56
+ resolveOutputSchema: () => z.ZodObject<{
57
+ status: z.ZodString;
58
+ message: z.ZodString;
59
+ level: z.ZodString;
60
+ timestamp: z.ZodString;
61
+ }, z.core.$strip>;
62
+ telemetry: {
63
+ source: string;
64
+ name: string;
65
+ };
66
+ devModeOnly: true;
67
+ createHandler: (strapi: import("@strapi/types/dist/core").Strapi) => ({ args }: {
68
+ extra: import("@modelcontextprotocol/sdk/shared/protocol").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types").ServerRequest, import("@modelcontextprotocol/sdk/types").ServerNotification>;
69
+ } & {
70
+ args: {
71
+ message: string;
72
+ level: "http" | "info" | "error" | "log" | "warn";
73
+ };
74
+ }) => Promise<{
75
+ content: {
76
+ type: "text";
77
+ text: string;
78
+ }[];
79
+ structuredContent: {
80
+ status: string;
81
+ message: string;
82
+ level: "http" | "info" | "error" | "log" | "warn";
83
+ timestamp: string;
84
+ };
85
+ }>;
86
+ };
87
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/tools/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAmBlC,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwE5B,CAAC"}
@@ -0,0 +1,88 @@
1
+ 'use strict';
2
+
3
+ var strapiUtils = require('@strapi/utils');
4
+ var toolRegistry = require('../tool-registry.js');
5
+
6
+ const inputSchema = strapiUtils.z.object({
7
+ message: strapiUtils.z.string().describe('Message to log'),
8
+ level: strapiUtils.z.enum([
9
+ 'info',
10
+ 'http',
11
+ 'warn',
12
+ 'error',
13
+ 'log'
14
+ ]).default('info').describe('Log level (default: info)')
15
+ });
16
+ const outputSchema = strapiUtils.z.object({
17
+ status: strapiUtils.z.string(),
18
+ message: strapiUtils.z.string(),
19
+ level: strapiUtils.z.string(),
20
+ timestamp: strapiUtils.z.string()
21
+ });
22
+ const logToolDefinition = toolRegistry.makeMcpToolDefinition({
23
+ name: 'log',
24
+ title: 'Strapi Log',
25
+ description: 'Logs a message to the Strapi logger with specified level',
26
+ resolveInputSchema: ()=>inputSchema,
27
+ resolveOutputSchema: ()=>outputSchema,
28
+ telemetry: {
29
+ source: 'core',
30
+ name: 'log'
31
+ },
32
+ devModeOnly: true,
33
+ createHandler: (strapi)=>async ({ args })=>{
34
+ const { message, level } = args;
35
+ // Security: Sanitize message to prevent log injection
36
+ // 1. Limit length to prevent log spam (10KB max)
37
+ const MAX_MESSAGE_LENGTH = 10 * 1024;
38
+ let sanitizedMessage = message.length > MAX_MESSAGE_LENGTH ? `${message.substring(0, MAX_MESSAGE_LENGTH)}...[truncated]` : message;
39
+ // 2. Remove control characters (including ANSI escape codes)
40
+ // This regex matches: \x00-\x1F (C0 controls), \x7F (DEL), \x80-\x9F (C1 controls)
41
+ // and ANSI escape sequences (\x1B[ followed by parameters and command)
42
+ sanitizedMessage = sanitizedMessage// eslint-disable-next-line no-control-regex
43
+ .replace(/\x1B\[[0-9;]*[A-Za-z]/g, '') // Remove ANSI escape sequences
44
+ // eslint-disable-next-line no-control-regex
45
+ .replace(/[\x00-\x1F\x7F-\x9F]/g, ''); // Remove control characters
46
+ // 3. Replace newlines with spaces to prevent fake log entry injection
47
+ sanitizedMessage = sanitizedMessage.replace(/[\r\n]+/g, ' ');
48
+ // 4. Trim whitespace
49
+ sanitizedMessage = sanitizedMessage.trim();
50
+ // Map level to appropriate logger method
51
+ switch(level){
52
+ case 'http':
53
+ strapi.log.http(`[MCP] ${sanitizedMessage}`);
54
+ break;
55
+ case 'warn':
56
+ strapi.log.warn(`[MCP] ${sanitizedMessage}`);
57
+ break;
58
+ case 'error':
59
+ strapi.log.error(`[MCP] ${sanitizedMessage}`);
60
+ break;
61
+ case 'log':
62
+ strapi.log.info(`[MCP] ${sanitizedMessage}`);
63
+ break;
64
+ case 'info':
65
+ default:
66
+ strapi.log.info(`[MCP] ${sanitizedMessage}`);
67
+ break;
68
+ }
69
+ const result = {
70
+ status: 'logged',
71
+ message: sanitizedMessage,
72
+ level,
73
+ timestamp: new Date().toISOString()
74
+ };
75
+ return {
76
+ content: [
77
+ {
78
+ type: 'text',
79
+ text: JSON.stringify(result, null, 2)
80
+ }
81
+ ],
82
+ structuredContent: result
83
+ };
84
+ }
85
+ });
86
+
87
+ exports.logToolDefinition = logToolDefinition;
88
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sources":["../../../../src/services/mcp/tools/log.ts"],"sourcesContent":["import { z } from '@strapi/utils';\n\nimport { makeMcpToolDefinition } from '../tool-registry';\n\nconst inputSchema = z.object({\n message: z.string().describe('Message to log'),\n level: z\n .enum(['info', 'http', 'warn', 'error', 'log'])\n .default('info')\n .describe('Log level (default: info)'),\n});\n\nconst outputSchema = z.object({\n status: z.string(),\n message: z.string(),\n level: z.string(),\n timestamp: z.string(),\n});\n\nexport const logToolDefinition = makeMcpToolDefinition({\n name: 'log',\n title: 'Strapi Log',\n description: 'Logs a message to the Strapi logger with specified level',\n resolveInputSchema: () => inputSchema,\n resolveOutputSchema: () => outputSchema,\n telemetry: { source: 'core', name: 'log' },\n devModeOnly: true,\n createHandler:\n (strapi) =>\n async ({ args }) => {\n const { message, level } = args;\n\n // Security: Sanitize message to prevent log injection\n // 1. Limit length to prevent log spam (10KB max)\n const MAX_MESSAGE_LENGTH = 10 * 1024;\n let sanitizedMessage =\n message.length > MAX_MESSAGE_LENGTH\n ? `${message.substring(0, MAX_MESSAGE_LENGTH)}...[truncated]`\n : message;\n\n // 2. Remove control characters (including ANSI escape codes)\n // This regex matches: \\x00-\\x1F (C0 controls), \\x7F (DEL), \\x80-\\x9F (C1 controls)\n // and ANSI escape sequences (\\x1B[ followed by parameters and command)\n sanitizedMessage = sanitizedMessage\n // eslint-disable-next-line no-control-regex\n .replace(/\\x1B\\[[0-9;]*[A-Za-z]/g, '') // Remove ANSI escape sequences\n // eslint-disable-next-line no-control-regex\n .replace(/[\\x00-\\x1F\\x7F-\\x9F]/g, ''); // Remove control characters\n\n // 3. Replace newlines with spaces to prevent fake log entry injection\n sanitizedMessage = sanitizedMessage.replace(/[\\r\\n]+/g, ' ');\n\n // 4. Trim whitespace\n sanitizedMessage = sanitizedMessage.trim();\n\n // Map level to appropriate logger method\n switch (level) {\n case 'http':\n strapi.log.http(`[MCP] ${sanitizedMessage}`);\n break;\n case 'warn':\n strapi.log.warn(`[MCP] ${sanitizedMessage}`);\n break;\n case 'error':\n strapi.log.error(`[MCP] ${sanitizedMessage}`);\n break;\n case 'log':\n strapi.log.info(`[MCP] ${sanitizedMessage}`);\n break;\n case 'info':\n default:\n strapi.log.info(`[MCP] ${sanitizedMessage}`);\n break;\n }\n\n const result = {\n status: 'logged',\n message: sanitizedMessage,\n level,\n timestamp: new Date().toISOString(),\n };\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n structuredContent: result,\n };\n },\n});\n"],"names":["inputSchema","z","object","message","string","describe","level","enum","default","outputSchema","status","timestamp","logToolDefinition","makeMcpToolDefinition","name","title","description","resolveInputSchema","resolveOutputSchema","telemetry","source","devModeOnly","createHandler","strapi","args","MAX_MESSAGE_LENGTH","sanitizedMessage","length","substring","replace","trim","log","http","warn","error","info","result","Date","toISOString","content","type","text","JSON","stringify","structuredContent"],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import { z } from '@strapi/utils';
2
+ import { makeMcpToolDefinition } from '../tool-registry.mjs';
3
+
4
+ const inputSchema = z.object({
5
+ message: z.string().describe('Message to log'),
6
+ level: z.enum([
7
+ 'info',
8
+ 'http',
9
+ 'warn',
10
+ 'error',
11
+ 'log'
12
+ ]).default('info').describe('Log level (default: info)')
13
+ });
14
+ const outputSchema = z.object({
15
+ status: z.string(),
16
+ message: z.string(),
17
+ level: z.string(),
18
+ timestamp: z.string()
19
+ });
20
+ const logToolDefinition = makeMcpToolDefinition({
21
+ name: 'log',
22
+ title: 'Strapi Log',
23
+ description: 'Logs a message to the Strapi logger with specified level',
24
+ resolveInputSchema: ()=>inputSchema,
25
+ resolveOutputSchema: ()=>outputSchema,
26
+ telemetry: {
27
+ source: 'core',
28
+ name: 'log'
29
+ },
30
+ devModeOnly: true,
31
+ createHandler: (strapi)=>async ({ args })=>{
32
+ const { message, level } = args;
33
+ // Security: Sanitize message to prevent log injection
34
+ // 1. Limit length to prevent log spam (10KB max)
35
+ const MAX_MESSAGE_LENGTH = 10 * 1024;
36
+ let sanitizedMessage = message.length > MAX_MESSAGE_LENGTH ? `${message.substring(0, MAX_MESSAGE_LENGTH)}...[truncated]` : message;
37
+ // 2. Remove control characters (including ANSI escape codes)
38
+ // This regex matches: \x00-\x1F (C0 controls), \x7F (DEL), \x80-\x9F (C1 controls)
39
+ // and ANSI escape sequences (\x1B[ followed by parameters and command)
40
+ sanitizedMessage = sanitizedMessage// eslint-disable-next-line no-control-regex
41
+ .replace(/\x1B\[[0-9;]*[A-Za-z]/g, '') // Remove ANSI escape sequences
42
+ // eslint-disable-next-line no-control-regex
43
+ .replace(/[\x00-\x1F\x7F-\x9F]/g, ''); // Remove control characters
44
+ // 3. Replace newlines with spaces to prevent fake log entry injection
45
+ sanitizedMessage = sanitizedMessage.replace(/[\r\n]+/g, ' ');
46
+ // 4. Trim whitespace
47
+ sanitizedMessage = sanitizedMessage.trim();
48
+ // Map level to appropriate logger method
49
+ switch(level){
50
+ case 'http':
51
+ strapi.log.http(`[MCP] ${sanitizedMessage}`);
52
+ break;
53
+ case 'warn':
54
+ strapi.log.warn(`[MCP] ${sanitizedMessage}`);
55
+ break;
56
+ case 'error':
57
+ strapi.log.error(`[MCP] ${sanitizedMessage}`);
58
+ break;
59
+ case 'log':
60
+ strapi.log.info(`[MCP] ${sanitizedMessage}`);
61
+ break;
62
+ case 'info':
63
+ default:
64
+ strapi.log.info(`[MCP] ${sanitizedMessage}`);
65
+ break;
66
+ }
67
+ const result = {
68
+ status: 'logged',
69
+ message: sanitizedMessage,
70
+ level,
71
+ timestamp: new Date().toISOString()
72
+ };
73
+ return {
74
+ content: [
75
+ {
76
+ type: 'text',
77
+ text: JSON.stringify(result, null, 2)
78
+ }
79
+ ],
80
+ structuredContent: result
81
+ };
82
+ }
83
+ });
84
+
85
+ export { logToolDefinition };
86
+ //# sourceMappingURL=log.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.mjs","sources":["../../../../src/services/mcp/tools/log.ts"],"sourcesContent":["import { z } from '@strapi/utils';\n\nimport { makeMcpToolDefinition } from '../tool-registry';\n\nconst inputSchema = z.object({\n message: z.string().describe('Message to log'),\n level: z\n .enum(['info', 'http', 'warn', 'error', 'log'])\n .default('info')\n .describe('Log level (default: info)'),\n});\n\nconst outputSchema = z.object({\n status: z.string(),\n message: z.string(),\n level: z.string(),\n timestamp: z.string(),\n});\n\nexport const logToolDefinition = makeMcpToolDefinition({\n name: 'log',\n title: 'Strapi Log',\n description: 'Logs a message to the Strapi logger with specified level',\n resolveInputSchema: () => inputSchema,\n resolveOutputSchema: () => outputSchema,\n telemetry: { source: 'core', name: 'log' },\n devModeOnly: true,\n createHandler:\n (strapi) =>\n async ({ args }) => {\n const { message, level } = args;\n\n // Security: Sanitize message to prevent log injection\n // 1. Limit length to prevent log spam (10KB max)\n const MAX_MESSAGE_LENGTH = 10 * 1024;\n let sanitizedMessage =\n message.length > MAX_MESSAGE_LENGTH\n ? `${message.substring(0, MAX_MESSAGE_LENGTH)}...[truncated]`\n : message;\n\n // 2. Remove control characters (including ANSI escape codes)\n // This regex matches: \\x00-\\x1F (C0 controls), \\x7F (DEL), \\x80-\\x9F (C1 controls)\n // and ANSI escape sequences (\\x1B[ followed by parameters and command)\n sanitizedMessage = sanitizedMessage\n // eslint-disable-next-line no-control-regex\n .replace(/\\x1B\\[[0-9;]*[A-Za-z]/g, '') // Remove ANSI escape sequences\n // eslint-disable-next-line no-control-regex\n .replace(/[\\x00-\\x1F\\x7F-\\x9F]/g, ''); // Remove control characters\n\n // 3. Replace newlines with spaces to prevent fake log entry injection\n sanitizedMessage = sanitizedMessage.replace(/[\\r\\n]+/g, ' ');\n\n // 4. Trim whitespace\n sanitizedMessage = sanitizedMessage.trim();\n\n // Map level to appropriate logger method\n switch (level) {\n case 'http':\n strapi.log.http(`[MCP] ${sanitizedMessage}`);\n break;\n case 'warn':\n strapi.log.warn(`[MCP] ${sanitizedMessage}`);\n break;\n case 'error':\n strapi.log.error(`[MCP] ${sanitizedMessage}`);\n break;\n case 'log':\n strapi.log.info(`[MCP] ${sanitizedMessage}`);\n break;\n case 'info':\n default:\n strapi.log.info(`[MCP] ${sanitizedMessage}`);\n break;\n }\n\n const result = {\n status: 'logged',\n message: sanitizedMessage,\n level,\n timestamp: new Date().toISOString(),\n };\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n structuredContent: result,\n };\n },\n});\n"],"names":["inputSchema","z","object","message","string","describe","level","enum","default","outputSchema","status","timestamp","logToolDefinition","makeMcpToolDefinition","name","title","description","resolveInputSchema","resolveOutputSchema","telemetry","source","devModeOnly","createHandler","strapi","args","MAX_MESSAGE_LENGTH","sanitizedMessage","length","substring","replace","trim","log","http","warn","error","info","result","Date","toISOString","content","type","text","JSON","stringify","structuredContent"],"mappings":";;;AAIA,MAAMA,WAAAA,GAAcC,CAAAA,CAAEC,MAAM,CAAC;AAC3BC,IAAAA,OAAAA,EAASF,CAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ,CAAC,gBAAA,CAAA;IAC7BC,KAAAA,EAAOL,CAAAA,CACJM,IAAI,CAAC;AAAC,QAAA,MAAA;AAAQ,QAAA,MAAA;AAAQ,QAAA,MAAA;AAAQ,QAAA,OAAA;AAAS,QAAA;AAAM,KAAA,CAAA,CAC7CC,OAAO,CAAC,MAAA,CAAA,CACRH,QAAQ,CAAC,2BAAA;AACd,CAAA,CAAA;AAEA,MAAMI,YAAAA,GAAeR,CAAAA,CAAEC,MAAM,CAAC;AAC5BQ,IAAAA,MAAAA,EAAQT,EAAEG,MAAM,EAAA;AAChBD,IAAAA,OAAAA,EAASF,EAAEG,MAAM,EAAA;AACjBE,IAAAA,KAAAA,EAAOL,EAAEG,MAAM,EAAA;AACfO,IAAAA,SAAAA,EAAWV,EAAEG,MAAM;AACrB,CAAA,CAAA;AAEO,MAAMQ,oBAAoBC,qBAAAA,CAAsB;IACrDC,IAAAA,EAAM,KAAA;IACNC,KAAAA,EAAO,YAAA;IACPC,WAAAA,EAAa,0DAAA;AACbC,IAAAA,kBAAAA,EAAoB,IAAMjB,WAAAA;AAC1BkB,IAAAA,mBAAAA,EAAqB,IAAMT,YAAAA;IAC3BU,SAAAA,EAAW;QAAEC,MAAAA,EAAQ,MAAA;QAAQN,IAAAA,EAAM;AAAM,KAAA;IACzCO,WAAAA,EAAa,IAAA;AACbC,IAAAA,aAAAA,EACE,CAACC,MAAAA,GACD,OAAO,EAAEC,IAAI,EAAE,GAAA;AACb,YAAA,MAAM,EAAErB,OAAO,EAAEG,KAAK,EAAE,GAAGkB,IAAAA;;;AAI3B,YAAA,MAAMC,qBAAqB,EAAA,GAAK,IAAA;AAChC,YAAA,IAAIC,gBAAAA,GACFvB,OAAAA,CAAQwB,MAAM,GAAGF,kBAAAA,GACb,CAAA,EAAGtB,OAAAA,CAAQyB,SAAS,CAAC,CAAA,EAAGH,kBAAAA,CAAAA,CAAoB,cAAc,CAAC,GAC3DtB,OAAAA;;;;AAKNuB,YAAAA,gBAAAA,GAAmBA,gBACjB;aACCG,OAAO,CAAC,wBAAA,EAA0B,EAAA,CAAA;;aAElCA,OAAO,CAAC,uBAAA,EAAyB,EAAA,CAAA,CAAA;;YAGpCH,gBAAAA,GAAmBA,gBAAAA,CAAiBG,OAAO,CAAC,UAAA,EAAY,GAAA,CAAA;;AAGxDH,YAAAA,gBAAAA,GAAmBA,iBAAiBI,IAAI,EAAA;;YAGxC,OAAQxB,KAAAA;gBACN,KAAK,MAAA;AACHiB,oBAAAA,MAAAA,CAAOQ,GAAG,CAACC,IAAI,CAAC,CAAC,MAAM,EAAEN,gBAAAA,CAAAA,CAAkB,CAAA;AAC3C,oBAAA;gBACF,KAAK,MAAA;AACHH,oBAAAA,MAAAA,CAAOQ,GAAG,CAACE,IAAI,CAAC,CAAC,MAAM,EAAEP,gBAAAA,CAAAA,CAAkB,CAAA;AAC3C,oBAAA;gBACF,KAAK,OAAA;AACHH,oBAAAA,MAAAA,CAAOQ,GAAG,CAACG,KAAK,CAAC,CAAC,MAAM,EAAER,gBAAAA,CAAAA,CAAkB,CAAA;AAC5C,oBAAA;gBACF,KAAK,KAAA;AACHH,oBAAAA,MAAAA,CAAOQ,GAAG,CAACI,IAAI,CAAC,CAAC,MAAM,EAAET,gBAAAA,CAAAA,CAAkB,CAAA;AAC3C,oBAAA;gBACF,KAAK,MAAA;AACL,gBAAA;AACEH,oBAAAA,MAAAA,CAAOQ,GAAG,CAACI,IAAI,CAAC,CAAC,MAAM,EAAET,gBAAAA,CAAAA,CAAkB,CAAA;AAC3C,oBAAA;AACJ;AAEA,YAAA,MAAMU,MAAAA,GAAS;gBACb1B,MAAAA,EAAQ,QAAA;gBACRP,OAAAA,EAASuB,gBAAAA;AACTpB,gBAAAA,KAAAA;gBACAK,SAAAA,EAAW,IAAI0B,OAAOC,WAAW;AACnC,aAAA;YACA,OAAO;gBACLC,OAAAA,EAAS;AACP,oBAAA;wBACEC,IAAAA,EAAM,MAAA;AACNC,wBAAAA,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAACP,MAAAA,EAAQ,IAAA,EAAM,CAAA;AACrC;AACD,iBAAA;gBACDQ,iBAAAA,EAAmBR;AACrB,aAAA;AACF,QAAA;AACJ,CAAA;;;;"}
@@ -0,0 +1,36 @@
1
+ import type { Core } from '@strapi/types';
2
+ import type { RegisteredCapability } from '../internal/McpCapabilityRegistry';
3
+ /**
4
+ * A no-op registered capability used as fallback when SDK registration fails.
5
+ *
6
+ * This prevents one broken capability from aborting the entire registration loop.
7
+ * The capability will appear as "disabled" and cannot be enabled.
8
+ */
9
+ export declare const FAILED_REGISTERED_CAPABILITY: RegisteredCapability;
10
+ /**
11
+ * Configuration for creating a safe capability registration
12
+ */
13
+ export type SafeCapabilityRegistrationConfig<THandler, TErrorResult, TRegistered> = {
14
+ strapi: Core.Strapi;
15
+ capabilityType: string;
16
+ name: string;
17
+ createHandler: (strapi: Core.Strapi) => THandler;
18
+ createFallbackHandler: (errorMessage: string) => NoInfer<THandler>;
19
+ createErrorResult: (error: Error, args: unknown[]) => TErrorResult;
20
+ registerWithSdk: (safeHandler: THandler) => TRegistered;
21
+ };
22
+ /**
23
+ * Creates a safe capability registration that protects Strapi core from user callback errors
24
+ * at three levels:
25
+ *
26
+ * - Level 1: Catch factory invocation errors (createHandler throws)
27
+ * - Level 2: Catch runtime execution errors (handler throws during invocation)
28
+ * - Level 3: Catch MCP SDK registration errors (SDK rejects the registration)
29
+ *
30
+ * This prevents one broken capability from:
31
+ * - Aborting the entire registration loop
32
+ * - Crashing the MCP server
33
+ * - Leaking unhandled errors to the user
34
+ */
35
+ export declare const createSafeCapabilityRegistration: <THandler, TErrorResult, TRegistered>(config: SafeCapabilityRegistrationConfig<THandler, TErrorResult, TRegistered>) => TRegistered;
36
+ //# sourceMappingURL=createSafeCapabilityRegistration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSafeCapabilityRegistration.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/utils/createSafeCapabilityRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAG9E;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,EAAE,oBAKzC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,gCAAgC,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,IAAI;IAClF,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC;IACjD,qBAAqB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnE,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,YAAY,CAAC;IACnE,eAAe,EAAE,CAAC,WAAW,EAAE,QAAQ,KAAK,WAAW,CAAC;CACzD,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gCAAgC,gDACnC,iCAAiC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,KAC5E,WA4CF,CAAC"}
@@ -0,0 +1,59 @@
1
+ 'use strict';
2
+
3
+ var safeHandlerWrapper = require('./safeHandlerWrapper.js');
4
+
5
+ /**
6
+ * A no-op registered capability used as fallback when SDK registration fails.
7
+ *
8
+ * This prevents one broken capability from aborting the entire registration loop.
9
+ * The capability will appear as "disabled" and cannot be enabled.
10
+ */ const FAILED_REGISTERED_CAPABILITY = Object.freeze({
11
+ enabled: false,
12
+ enable () {},
13
+ disable () {},
14
+ remove () {}
15
+ });
16
+ /**
17
+ * Creates a safe capability registration that protects Strapi core from user callback errors
18
+ * at three levels:
19
+ *
20
+ * - Level 1: Catch factory invocation errors (createHandler throws)
21
+ * - Level 2: Catch runtime execution errors (handler throws during invocation)
22
+ * - Level 3: Catch MCP SDK registration errors (SDK rejects the registration)
23
+ *
24
+ * This prevents one broken capability from:
25
+ * - Aborting the entire registration loop
26
+ * - Crashing the MCP server
27
+ * - Leaking unhandled errors to the user
28
+ */ const createSafeCapabilityRegistration = (config)=>{
29
+ const { strapi, capabilityType, name, createHandler, createFallbackHandler, createErrorResult, registerWithSdk } = config;
30
+ try {
31
+ // Level 1: Safe factory invocation — catch errors from user's createHandler
32
+ let rawHandler;
33
+ try {
34
+ rawHandler = createHandler(strapi);
35
+ } catch (error) {
36
+ const message = error instanceof Error ? error.message : String(error);
37
+ strapi.log.error(`[MCP] ${capabilityType} "${name}" handler factory threw during initialization: ${message}`);
38
+ // Substitute a fallback handler that always returns an error to the MCP client
39
+ rawHandler = createFallbackHandler(message);
40
+ }
41
+ // Level 2: Safe runtime wrapping — catch errors from user's handler during execution
42
+ const safeHandler = safeHandlerWrapper.wrapSafeHandler(rawHandler, {
43
+ strapi,
44
+ capabilityType,
45
+ name,
46
+ createErrorResult
47
+ });
48
+ return registerWithSdk(safeHandler);
49
+ } catch (error) {
50
+ // Level 3: Catch MCP SDK registration errors — prevent one broken capability from aborting all others
51
+ const message = error instanceof Error ? error.message : String(error);
52
+ strapi.log.error(`[MCP] Failed to register ${capabilityType.toLowerCase()} "${name}" with MCP server: ${message}`);
53
+ return FAILED_REGISTERED_CAPABILITY;
54
+ }
55
+ };
56
+
57
+ exports.FAILED_REGISTERED_CAPABILITY = FAILED_REGISTERED_CAPABILITY;
58
+ exports.createSafeCapabilityRegistration = createSafeCapabilityRegistration;
59
+ //# sourceMappingURL=createSafeCapabilityRegistration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSafeCapabilityRegistration.js","sources":["../../../../src/services/mcp/utils/createSafeCapabilityRegistration.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { RegisteredCapability } from '../internal/McpCapabilityRegistry';\nimport { wrapSafeHandler } from './safeHandlerWrapper';\n\n/**\n * A no-op registered capability used as fallback when SDK registration fails.\n *\n * This prevents one broken capability from aborting the entire registration loop.\n * The capability will appear as \"disabled\" and cannot be enabled.\n */\nexport const FAILED_REGISTERED_CAPABILITY: RegisteredCapability = Object.freeze({\n enabled: false,\n enable() {},\n disable() {},\n remove() {},\n});\n\n/**\n * Configuration for creating a safe capability registration\n */\nexport type SafeCapabilityRegistrationConfig<THandler, TErrorResult, TRegistered> = {\n strapi: Core.Strapi;\n capabilityType: string;\n name: string;\n createHandler: (strapi: Core.Strapi) => THandler;\n createFallbackHandler: (errorMessage: string) => NoInfer<THandler>;\n createErrorResult: (error: Error, args: unknown[]) => TErrorResult;\n registerWithSdk: (safeHandler: THandler) => TRegistered;\n};\n\n/**\n * Creates a safe capability registration that protects Strapi core from user callback errors\n * at three levels:\n *\n * - Level 1: Catch factory invocation errors (createHandler throws)\n * - Level 2: Catch runtime execution errors (handler throws during invocation)\n * - Level 3: Catch MCP SDK registration errors (SDK rejects the registration)\n *\n * This prevents one broken capability from:\n * - Aborting the entire registration loop\n * - Crashing the MCP server\n * - Leaking unhandled errors to the user\n */\nexport const createSafeCapabilityRegistration = <THandler, TErrorResult, TRegistered>(\n config: SafeCapabilityRegistrationConfig<THandler, TErrorResult, TRegistered>\n): TRegistered => {\n const {\n strapi,\n capabilityType,\n name,\n createHandler,\n createFallbackHandler,\n createErrorResult,\n registerWithSdk,\n } = config;\n\n try {\n // Level 1: Safe factory invocation — catch errors from user's createHandler\n let rawHandler: THandler;\n\n try {\n rawHandler = createHandler(strapi);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n strapi.log.error(\n `[MCP] ${capabilityType} \"${name}\" handler factory threw during initialization: ${message}`\n );\n\n // Substitute a fallback handler that always returns an error to the MCP client\n rawHandler = createFallbackHandler(message);\n }\n\n // Level 2: Safe runtime wrapping — catch errors from user's handler during execution\n const safeHandler = wrapSafeHandler(rawHandler as (...args: unknown[]) => Promise<unknown>, {\n strapi,\n capabilityType,\n name,\n createErrorResult,\n });\n\n return registerWithSdk(safeHandler as THandler);\n } catch (error) {\n // Level 3: Catch MCP SDK registration errors — prevent one broken capability from aborting all others\n const message = error instanceof Error ? error.message : String(error);\n strapi.log.error(\n `[MCP] Failed to register ${capabilityType.toLowerCase()} \"${name}\" with MCP server: ${message}`\n );\n return FAILED_REGISTERED_CAPABILITY as unknown as TRegistered;\n }\n};\n"],"names":["FAILED_REGISTERED_CAPABILITY","Object","freeze","enabled","enable","disable","remove","createSafeCapabilityRegistration","config","strapi","capabilityType","name","createHandler","createFallbackHandler","createErrorResult","registerWithSdk","rawHandler","error","message","Error","String","log","safeHandler","wrapSafeHandler","toLowerCase"],"mappings":";;;;AAIA;;;;;AAKC,IACM,MAAMA,4BAAAA,GAAqDC,MAAAA,CAAOC,MAAM,CAAC;IAC9EC,OAAAA,EAAS,KAAA;IACTC,MAAAA,CAAAA,GAAAA,CAAU,CAAA;IACVC,OAAAA,CAAAA,GAAAA,CAAW,CAAA;IACXC,MAAAA,CAAAA,GAAAA,CAAU;AACZ,CAAA;AAeA;;;;;;;;;;;;IAaO,MAAMC,gCAAAA,GAAmC,CAC9CC,MAAAA,GAAAA;AAEA,IAAA,MAAM,EACJC,MAAM,EACNC,cAAc,EACdC,IAAI,EACJC,aAAa,EACbC,qBAAqB,EACrBC,iBAAiB,EACjBC,eAAe,EAChB,GAAGP,MAAAA;IAEJ,IAAI;;QAEF,IAAIQ,UAAAA;QAEJ,IAAI;AACFA,YAAAA,UAAAA,GAAaJ,aAAAA,CAAcH,MAAAA,CAAAA;AAC7B,QAAA,CAAA,CAAE,OAAOQ,KAAAA,EAAO;AACd,YAAA,MAAMC,UAAUD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMC,OAAO,GAAGE,MAAAA,CAAOH,KAAAA,CAAAA;AAChER,YAAAA,MAAAA,CAAOY,GAAG,CAACJ,KAAK,CACd,CAAC,MAAM,EAAEP,cAAAA,CAAe,EAAE,EAAEC,IAAAA,CAAK,+CAA+C,EAAEO,OAAAA,CAAAA,CAAS,CAAA;;AAI7FF,YAAAA,UAAAA,GAAaH,qBAAAA,CAAsBK,OAAAA,CAAAA;AACrC,QAAA;;QAGA,MAAMI,WAAAA,GAAcC,mCAAgBP,UAAAA,EAAwD;AAC1FP,YAAAA,MAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,IAAAA;AACAG,YAAAA;AACF,SAAA,CAAA;AAEA,QAAA,OAAOC,eAAAA,CAAgBO,WAAAA,CAAAA;AACzB,IAAA,CAAA,CAAE,OAAOL,KAAAA,EAAO;;AAEd,QAAA,MAAMC,UAAUD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMC,OAAO,GAAGE,MAAAA,CAAOH,KAAAA,CAAAA;AAChER,QAAAA,MAAAA,CAAOY,GAAG,CAACJ,KAAK,CACd,CAAC,yBAAyB,EAAEP,cAAAA,CAAec,WAAW,GAAG,EAAE,EAAEb,IAAAA,CAAK,mBAAmB,EAAEO,OAAAA,CAAAA,CAAS,CAAA;QAElG,OAAOlB,4BAAAA;AACT,IAAA;AACF;;;;;"}
@@ -0,0 +1,56 @@
1
+ import { wrapSafeHandler } from './safeHandlerWrapper.mjs';
2
+
3
+ /**
4
+ * A no-op registered capability used as fallback when SDK registration fails.
5
+ *
6
+ * This prevents one broken capability from aborting the entire registration loop.
7
+ * The capability will appear as "disabled" and cannot be enabled.
8
+ */ const FAILED_REGISTERED_CAPABILITY = Object.freeze({
9
+ enabled: false,
10
+ enable () {},
11
+ disable () {},
12
+ remove () {}
13
+ });
14
+ /**
15
+ * Creates a safe capability registration that protects Strapi core from user callback errors
16
+ * at three levels:
17
+ *
18
+ * - Level 1: Catch factory invocation errors (createHandler throws)
19
+ * - Level 2: Catch runtime execution errors (handler throws during invocation)
20
+ * - Level 3: Catch MCP SDK registration errors (SDK rejects the registration)
21
+ *
22
+ * This prevents one broken capability from:
23
+ * - Aborting the entire registration loop
24
+ * - Crashing the MCP server
25
+ * - Leaking unhandled errors to the user
26
+ */ const createSafeCapabilityRegistration = (config)=>{
27
+ const { strapi, capabilityType, name, createHandler, createFallbackHandler, createErrorResult, registerWithSdk } = config;
28
+ try {
29
+ // Level 1: Safe factory invocation — catch errors from user's createHandler
30
+ let rawHandler;
31
+ try {
32
+ rawHandler = createHandler(strapi);
33
+ } catch (error) {
34
+ const message = error instanceof Error ? error.message : String(error);
35
+ strapi.log.error(`[MCP] ${capabilityType} "${name}" handler factory threw during initialization: ${message}`);
36
+ // Substitute a fallback handler that always returns an error to the MCP client
37
+ rawHandler = createFallbackHandler(message);
38
+ }
39
+ // Level 2: Safe runtime wrapping — catch errors from user's handler during execution
40
+ const safeHandler = wrapSafeHandler(rawHandler, {
41
+ strapi,
42
+ capabilityType,
43
+ name,
44
+ createErrorResult
45
+ });
46
+ return registerWithSdk(safeHandler);
47
+ } catch (error) {
48
+ // Level 3: Catch MCP SDK registration errors — prevent one broken capability from aborting all others
49
+ const message = error instanceof Error ? error.message : String(error);
50
+ strapi.log.error(`[MCP] Failed to register ${capabilityType.toLowerCase()} "${name}" with MCP server: ${message}`);
51
+ return FAILED_REGISTERED_CAPABILITY;
52
+ }
53
+ };
54
+
55
+ export { FAILED_REGISTERED_CAPABILITY, createSafeCapabilityRegistration };
56
+ //# sourceMappingURL=createSafeCapabilityRegistration.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSafeCapabilityRegistration.mjs","sources":["../../../../src/services/mcp/utils/createSafeCapabilityRegistration.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { RegisteredCapability } from '../internal/McpCapabilityRegistry';\nimport { wrapSafeHandler } from './safeHandlerWrapper';\n\n/**\n * A no-op registered capability used as fallback when SDK registration fails.\n *\n * This prevents one broken capability from aborting the entire registration loop.\n * The capability will appear as \"disabled\" and cannot be enabled.\n */\nexport const FAILED_REGISTERED_CAPABILITY: RegisteredCapability = Object.freeze({\n enabled: false,\n enable() {},\n disable() {},\n remove() {},\n});\n\n/**\n * Configuration for creating a safe capability registration\n */\nexport type SafeCapabilityRegistrationConfig<THandler, TErrorResult, TRegistered> = {\n strapi: Core.Strapi;\n capabilityType: string;\n name: string;\n createHandler: (strapi: Core.Strapi) => THandler;\n createFallbackHandler: (errorMessage: string) => NoInfer<THandler>;\n createErrorResult: (error: Error, args: unknown[]) => TErrorResult;\n registerWithSdk: (safeHandler: THandler) => TRegistered;\n};\n\n/**\n * Creates a safe capability registration that protects Strapi core from user callback errors\n * at three levels:\n *\n * - Level 1: Catch factory invocation errors (createHandler throws)\n * - Level 2: Catch runtime execution errors (handler throws during invocation)\n * - Level 3: Catch MCP SDK registration errors (SDK rejects the registration)\n *\n * This prevents one broken capability from:\n * - Aborting the entire registration loop\n * - Crashing the MCP server\n * - Leaking unhandled errors to the user\n */\nexport const createSafeCapabilityRegistration = <THandler, TErrorResult, TRegistered>(\n config: SafeCapabilityRegistrationConfig<THandler, TErrorResult, TRegistered>\n): TRegistered => {\n const {\n strapi,\n capabilityType,\n name,\n createHandler,\n createFallbackHandler,\n createErrorResult,\n registerWithSdk,\n } = config;\n\n try {\n // Level 1: Safe factory invocation — catch errors from user's createHandler\n let rawHandler: THandler;\n\n try {\n rawHandler = createHandler(strapi);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n strapi.log.error(\n `[MCP] ${capabilityType} \"${name}\" handler factory threw during initialization: ${message}`\n );\n\n // Substitute a fallback handler that always returns an error to the MCP client\n rawHandler = createFallbackHandler(message);\n }\n\n // Level 2: Safe runtime wrapping — catch errors from user's handler during execution\n const safeHandler = wrapSafeHandler(rawHandler as (...args: unknown[]) => Promise<unknown>, {\n strapi,\n capabilityType,\n name,\n createErrorResult,\n });\n\n return registerWithSdk(safeHandler as THandler);\n } catch (error) {\n // Level 3: Catch MCP SDK registration errors — prevent one broken capability from aborting all others\n const message = error instanceof Error ? error.message : String(error);\n strapi.log.error(\n `[MCP] Failed to register ${capabilityType.toLowerCase()} \"${name}\" with MCP server: ${message}`\n );\n return FAILED_REGISTERED_CAPABILITY as unknown as TRegistered;\n }\n};\n"],"names":["FAILED_REGISTERED_CAPABILITY","Object","freeze","enabled","enable","disable","remove","createSafeCapabilityRegistration","config","strapi","capabilityType","name","createHandler","createFallbackHandler","createErrorResult","registerWithSdk","rawHandler","error","message","Error","String","log","safeHandler","wrapSafeHandler","toLowerCase"],"mappings":";;AAIA;;;;;AAKC,IACM,MAAMA,4BAAAA,GAAqDC,MAAAA,CAAOC,MAAM,CAAC;IAC9EC,OAAAA,EAAS,KAAA;IACTC,MAAAA,CAAAA,GAAAA,CAAU,CAAA;IACVC,OAAAA,CAAAA,GAAAA,CAAW,CAAA;IACXC,MAAAA,CAAAA,GAAAA,CAAU;AACZ,CAAA;AAeA;;;;;;;;;;;;IAaO,MAAMC,gCAAAA,GAAmC,CAC9CC,MAAAA,GAAAA;AAEA,IAAA,MAAM,EACJC,MAAM,EACNC,cAAc,EACdC,IAAI,EACJC,aAAa,EACbC,qBAAqB,EACrBC,iBAAiB,EACjBC,eAAe,EAChB,GAAGP,MAAAA;IAEJ,IAAI;;QAEF,IAAIQ,UAAAA;QAEJ,IAAI;AACFA,YAAAA,UAAAA,GAAaJ,aAAAA,CAAcH,MAAAA,CAAAA;AAC7B,QAAA,CAAA,CAAE,OAAOQ,KAAAA,EAAO;AACd,YAAA,MAAMC,UAAUD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMC,OAAO,GAAGE,MAAAA,CAAOH,KAAAA,CAAAA;AAChER,YAAAA,MAAAA,CAAOY,GAAG,CAACJ,KAAK,CACd,CAAC,MAAM,EAAEP,cAAAA,CAAe,EAAE,EAAEC,IAAAA,CAAK,+CAA+C,EAAEO,OAAAA,CAAAA,CAAS,CAAA;;AAI7FF,YAAAA,UAAAA,GAAaH,qBAAAA,CAAsBK,OAAAA,CAAAA;AACrC,QAAA;;QAGA,MAAMI,WAAAA,GAAcC,gBAAgBP,UAAAA,EAAwD;AAC1FP,YAAAA,MAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,IAAAA;AACAG,YAAAA;AACF,SAAA,CAAA;AAEA,QAAA,OAAOC,eAAAA,CAAgBO,WAAAA,CAAAA;AACzB,IAAA,CAAA,CAAE,OAAOL,KAAAA,EAAO;;AAEd,QAAA,MAAMC,UAAUD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMC,OAAO,GAAGE,MAAAA,CAAOH,KAAAA,CAAAA;AAChER,QAAAA,MAAAA,CAAOY,GAAG,CAACJ,KAAK,CACd,CAAC,yBAAyB,EAAEP,cAAAA,CAAec,WAAW,GAAG,EAAE,EAAEb,IAAAA,CAAK,mBAAmB,EAAEO,OAAAA,CAAAA,CAAS,CAAA;QAElG,OAAOlB,4BAAAA;AACT,IAAA;AACF;;;;"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * JSON-RPC error codes and messages
3
+ * @see https://json-rpc.dev/docs/reference/error-codes
4
+ */
5
+ export declare const JSON_RPC_ERRORS: {
6
+ readonly INTERNAL_ERROR: {
7
+ readonly code: -32603;
8
+ readonly message: "Internal error";
9
+ readonly httpStatus: 500;
10
+ };
11
+ readonly AUTHENTICATION_REQUIRED: {
12
+ readonly code: -32000;
13
+ readonly message: "Authentication required";
14
+ readonly httpStatus: 401;
15
+ };
16
+ readonly METHOD_NOT_ALLOWED: {
17
+ readonly code: -32601;
18
+ readonly message: "Method not allowed";
19
+ readonly httpStatus: 405;
20
+ };
21
+ };
22
+ //# sourceMappingURL=jsonRpcErrors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonRpcErrors.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/utils/jsonRpcErrors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;CAgBlB,CAAC"}
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * JSON-RPC error codes and messages
5
+ * @see https://json-rpc.dev/docs/reference/error-codes
6
+ */ const JSON_RPC_ERRORS = {
7
+ INTERNAL_ERROR: {
8
+ code: -32603,
9
+ message: 'Internal error',
10
+ httpStatus: 500
11
+ },
12
+ AUTHENTICATION_REQUIRED: {
13
+ code: -32e3,
14
+ message: 'Authentication required',
15
+ httpStatus: 401
16
+ },
17
+ METHOD_NOT_ALLOWED: {
18
+ code: -32601,
19
+ message: 'Method not allowed',
20
+ httpStatus: 405
21
+ }
22
+ };
23
+
24
+ exports.JSON_RPC_ERRORS = JSON_RPC_ERRORS;
25
+ //# sourceMappingURL=jsonRpcErrors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonRpcErrors.js","sources":["../../../../src/services/mcp/utils/jsonRpcErrors.ts"],"sourcesContent":["/**\n * JSON-RPC error codes and messages\n * @see https://json-rpc.dev/docs/reference/error-codes\n */\nexport const JSON_RPC_ERRORS = {\n INTERNAL_ERROR: {\n code: -32603, // \tInternal error\n message: 'Internal error',\n httpStatus: 500,\n },\n AUTHENTICATION_REQUIRED: {\n code: -32000, // Server error\n message: 'Authentication required',\n httpStatus: 401,\n },\n METHOD_NOT_ALLOWED: {\n code: -32601, // Method not found\n message: 'Method not allowed',\n httpStatus: 405,\n },\n} as const;\n"],"names":["JSON_RPC_ERRORS","INTERNAL_ERROR","code","message","httpStatus","AUTHENTICATION_REQUIRED","METHOD_NOT_ALLOWED"],"mappings":";;AAAA;;;UAIaA,eAAAA,GAAkB;IAC7BC,cAAAA,EAAgB;AACdC,QAAAA,IAAAA,EAAM,MAAC;QACPC,OAAAA,EAAS,gBAAA;QACTC,UAAAA,EAAY;AACd,KAAA;IACAC,uBAAAA,EAAyB;AACvBH,QAAAA,IAAAA,EAAM,KAAC;QACPC,OAAAA,EAAS,yBAAA;QACTC,UAAAA,EAAY;AACd,KAAA;IACAE,kBAAAA,EAAoB;AAClBJ,QAAAA,IAAAA,EAAM,MAAC;QACPC,OAAAA,EAAS,oBAAA;QACTC,UAAAA,EAAY;AACd;AACF;;;;"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * JSON-RPC error codes and messages
3
+ * @see https://json-rpc.dev/docs/reference/error-codes
4
+ */ const JSON_RPC_ERRORS = {
5
+ INTERNAL_ERROR: {
6
+ code: -32603,
7
+ message: 'Internal error',
8
+ httpStatus: 500
9
+ },
10
+ AUTHENTICATION_REQUIRED: {
11
+ code: -32e3,
12
+ message: 'Authentication required',
13
+ httpStatus: 401
14
+ },
15
+ METHOD_NOT_ALLOWED: {
16
+ code: -32601,
17
+ message: 'Method not allowed',
18
+ httpStatus: 405
19
+ }
20
+ };
21
+
22
+ export { JSON_RPC_ERRORS };
23
+ //# sourceMappingURL=jsonRpcErrors.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonRpcErrors.mjs","sources":["../../../../src/services/mcp/utils/jsonRpcErrors.ts"],"sourcesContent":["/**\n * JSON-RPC error codes and messages\n * @see https://json-rpc.dev/docs/reference/error-codes\n */\nexport const JSON_RPC_ERRORS = {\n INTERNAL_ERROR: {\n code: -32603, // \tInternal error\n message: 'Internal error',\n httpStatus: 500,\n },\n AUTHENTICATION_REQUIRED: {\n code: -32000, // Server error\n message: 'Authentication required',\n httpStatus: 401,\n },\n METHOD_NOT_ALLOWED: {\n code: -32601, // Method not found\n message: 'Method not allowed',\n httpStatus: 405,\n },\n} as const;\n"],"names":["JSON_RPC_ERRORS","INTERNAL_ERROR","code","message","httpStatus","AUTHENTICATION_REQUIRED","METHOD_NOT_ALLOWED"],"mappings":"AAAA;;;UAIaA,eAAAA,GAAkB;IAC7BC,cAAAA,EAAgB;AACdC,QAAAA,IAAAA,EAAM,MAAC;QACPC,OAAAA,EAAS,gBAAA;QACTC,UAAAA,EAAY;AACd,KAAA;IACAC,uBAAAA,EAAyB;AACvBH,QAAAA,IAAAA,EAAM,KAAC;QACPC,OAAAA,EAAS,yBAAA;QACTC,UAAAA,EAAY;AACd,KAAA;IACAE,kBAAAA,EAAoB;AAClBJ,QAAAA,IAAAA,EAAM,MAAC;QACPC,OAAAA,EAAS,oBAAA;QACTC,UAAAA,EAAY;AACd;AACF;;;;"}
@@ -0,0 +1,18 @@
1
+ import type { Core } from '@strapi/types';
2
+ /**
3
+ * Wraps an MCP capability handler to catch and log errors from user-provided callbacks.
4
+ *
5
+ * This prevents externally-registered capabilities (from plugin developers)
6
+ * from crashing Strapi core when they throw during execution.
7
+ *
8
+ * Errors are:
9
+ * - Logged with full detail (message + stack) via Strapi's logger
10
+ * - Returned to the MCP client as a safe error response (no stack trace leak)
11
+ */
12
+ export declare const wrapSafeHandler: <TArgs extends unknown[], TResult>(handler: (...args: TArgs) => Promise<TResult>, options: {
13
+ strapi: Core.Strapi;
14
+ capabilityType: string;
15
+ name: string;
16
+ createErrorResult: (error: Error, args: TArgs) => TResult;
17
+ }) => ((...args: TArgs) => Promise<TResult>);
18
+ //# sourceMappingURL=safeHandlerWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeHandlerWrapper.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/utils/safeHandlerWrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,8CACjB,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,QAAQ,OAAO,CAAC,WACpC;IACP,MAAM,EAAE,KAAK,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC;CAC3D,KACA,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,QAAQ,OAAO,CAAC,CAoBvC,CAAC"}
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Wraps an MCP capability handler to catch and log errors from user-provided callbacks.
5
+ *
6
+ * This prevents externally-registered capabilities (from plugin developers)
7
+ * from crashing Strapi core when they throw during execution.
8
+ *
9
+ * Errors are:
10
+ * - Logged with full detail (message + stack) via Strapi's logger
11
+ * - Returned to the MCP client as a safe error response (no stack trace leak)
12
+ */ const wrapSafeHandler = (handler, options)=>{
13
+ const { strapi, capabilityType, name, createErrorResult } = options;
14
+ return async (...args)=>{
15
+ try {
16
+ return await handler(...args);
17
+ } catch (error) {
18
+ const normalized = error instanceof Error ? error : new Error(String(error));
19
+ strapi.log.error(`[MCP] ${capabilityType} "${name}" threw an error during execution: ${normalized.message}`, {
20
+ error: normalized.message,
21
+ stack: normalized.stack
22
+ });
23
+ return createErrorResult(normalized, args);
24
+ }
25
+ };
26
+ };
27
+
28
+ exports.wrapSafeHandler = wrapSafeHandler;
29
+ //# sourceMappingURL=safeHandlerWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeHandlerWrapper.js","sources":["../../../../src/services/mcp/utils/safeHandlerWrapper.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\n/**\n * Wraps an MCP capability handler to catch and log errors from user-provided callbacks.\n *\n * This prevents externally-registered capabilities (from plugin developers)\n * from crashing Strapi core when they throw during execution.\n *\n * Errors are:\n * - Logged with full detail (message + stack) via Strapi's logger\n * - Returned to the MCP client as a safe error response (no stack trace leak)\n */\nexport const wrapSafeHandler = <TArgs extends unknown[], TResult>(\n handler: (...args: TArgs) => Promise<TResult>,\n options: {\n strapi: Core.Strapi;\n capabilityType: string;\n name: string;\n createErrorResult: (error: Error, args: TArgs) => TResult;\n }\n): ((...args: TArgs) => Promise<TResult>) => {\n const { strapi, capabilityType, name, createErrorResult } = options;\n\n return async (...args: TArgs): Promise<TResult> => {\n try {\n return await handler(...args);\n } catch (error) {\n const normalized = error instanceof Error ? error : new Error(String(error));\n\n strapi.log.error(\n `[MCP] ${capabilityType} \"${name}\" threw an error during execution: ${normalized.message}`,\n {\n error: normalized.message,\n stack: normalized.stack,\n }\n );\n\n return createErrorResult(normalized, args);\n }\n };\n};\n"],"names":["wrapSafeHandler","handler","options","strapi","capabilityType","name","createErrorResult","args","error","normalized","Error","String","log","message","stack"],"mappings":";;AAEA;;;;;;;;;AASC,IACM,MAAMA,eAAAA,GAAkB,CAC7BC,OAAAA,EACAC,OAAAA,GAAAA;IAOA,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAEC,IAAI,EAAEC,iBAAiB,EAAE,GAAGJ,OAAAA;AAE5D,IAAA,OAAO,OAAO,GAAGK,IAAAA,GAAAA;QACf,IAAI;AACF,YAAA,OAAO,MAAMN,OAAAA,CAAAA,GAAWM,IAAAA,CAAAA;AAC1B,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACd,YAAA,MAAMC,aAAaD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,GAAQ,IAAIE,MAAMC,MAAAA,CAAOH,KAAAA,CAAAA,CAAAA;AAErEL,YAAAA,MAAAA,CAAOS,GAAG,CAACJ,KAAK,CACd,CAAC,MAAM,EAAEJ,cAAAA,CAAe,EAAE,EAAEC,KAAK,mCAAmC,EAAEI,UAAAA,CAAWI,OAAO,EAAE,EAC1F;AACEL,gBAAAA,KAAAA,EAAOC,WAAWI,OAAO;AACzBC,gBAAAA,KAAAA,EAAOL,WAAWK;AACpB,aAAA,CAAA;AAGF,YAAA,OAAOR,kBAAkBG,UAAAA,EAAYF,IAAAA,CAAAA;AACvC,QAAA;AACF,IAAA,CAAA;AACF;;;;"}