@strapi/core 5.52.2 → 5.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/container.d.ts +1 -0
  2. package/dist/container.d.ts.map +1 -1
  3. package/dist/container.js +3 -0
  4. package/dist/container.js.map +1 -1
  5. package/dist/container.mjs +3 -0
  6. package/dist/container.mjs.map +1 -1
  7. package/dist/core-api/controller/single-type.d.ts.map +1 -1
  8. package/dist/core-api/controller/single-type.js +7 -4
  9. package/dist/core-api/controller/single-type.js.map +1 -1
  10. package/dist/core-api/controller/single-type.mjs +7 -4
  11. package/dist/core-api/controller/single-type.mjs.map +1 -1
  12. package/dist/package.json.js +19 -15
  13. package/dist/package.json.js.map +1 -1
  14. package/dist/package.json.mjs +19 -15
  15. package/dist/package.json.mjs.map +1 -1
  16. package/dist/services/document-service/transform/query.d.ts.map +1 -1
  17. package/dist/services/document-service/transform/query.js +4 -2
  18. package/dist/services/document-service/transform/query.js.map +1 -1
  19. package/dist/services/document-service/transform/query.mjs +4 -2
  20. package/dist/services/document-service/transform/query.mjs.map +1 -1
  21. package/dist/services/entity-validator/blocks-validator.d.ts.map +1 -1
  22. package/dist/services/entity-validator/blocks-validator.js +9 -3
  23. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  24. package/dist/services/entity-validator/blocks-validator.mjs +9 -3
  25. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  26. package/dist/services/fs.js +1 -1
  27. package/dist/services/fs.js.map +1 -1
  28. package/dist/services/fs.mjs +1 -1
  29. package/dist/services/fs.mjs.map +1 -1
  30. package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -1
  31. package/dist/services/mcp/handlers/handlePost.js +2 -3
  32. package/dist/services/mcp/handlers/handlePost.js.map +1 -1
  33. package/dist/services/mcp/handlers/handlePost.mjs +2 -3
  34. package/dist/services/mcp/handlers/handlePost.mjs.map +1 -1
  35. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +1 -1
  36. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -1
  37. package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -1
  38. package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -1
  39. package/dist/services/mcp/internal/McpServerFactory.d.ts +1 -1
  40. package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -1
  41. package/dist/services/mcp/internal/McpServerFactory.js +2 -3
  42. package/dist/services/mcp/internal/McpServerFactory.js.map +1 -1
  43. package/dist/services/mcp/internal/McpServerFactory.mjs +1 -2
  44. package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -1
  45. package/dist/services/mcp/prompt-registry.d.ts +1 -1
  46. package/dist/services/mcp/prompt-registry.d.ts.map +1 -1
  47. package/dist/services/mcp/prompt-registry.js +18 -4
  48. package/dist/services/mcp/prompt-registry.js.map +1 -1
  49. package/dist/services/mcp/prompt-registry.mjs +18 -4
  50. package/dist/services/mcp/prompt-registry.mjs.map +1 -1
  51. package/dist/services/mcp/resource-registry.d.ts +1 -1
  52. package/dist/services/mcp/resource-registry.d.ts.map +1 -1
  53. package/dist/services/mcp/resource-registry.js +4 -2
  54. package/dist/services/mcp/resource-registry.js.map +1 -1
  55. package/dist/services/mcp/resource-registry.mjs +4 -2
  56. package/dist/services/mcp/resource-registry.mjs.map +1 -1
  57. package/dist/services/mcp/tool-registry.d.ts +1 -1
  58. package/dist/services/mcp/tool-registry.d.ts.map +1 -1
  59. package/dist/services/mcp/tool-registry.js +18 -11
  60. package/dist/services/mcp/tool-registry.js.map +1 -1
  61. package/dist/services/mcp/tool-registry.mjs +18 -11
  62. package/dist/services/mcp/tool-registry.mjs.map +1 -1
  63. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.d.ts +7 -0
  64. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.d.ts.map +1 -0
  65. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.js +29 -0
  66. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.js.map +1 -0
  67. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.mjs +27 -0
  68. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.mjs.map +1 -0
  69. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.d.ts +18 -0
  70. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.d.ts.map +1 -0
  71. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.js +137 -0
  72. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.js.map +1 -0
  73. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.mjs +131 -0
  74. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.mjs.map +1 -0
  75. package/dist/services/session-manager.d.ts.map +1 -1
  76. package/dist/services/session-manager.js +5 -0
  77. package/dist/services/session-manager.js.map +1 -1
  78. package/dist/services/session-manager.mjs +5 -0
  79. package/dist/services/session-manager.mjs.map +1 -1
  80. package/package.json +19 -15
@@ -1 +1 @@
1
- {"version":3,"file":"blocks-validator.mjs","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n language: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","language","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":";;AAEA,MAAMA,iBAAAA,GAAoBC,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC3CC,IAAAA,IAAAA,EAAMH,GAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAO,KAAA,CAAA,CAAEC,QAAQ,EAAA;AAC5CC,IAAAA,IAAAA,EAAMP,IACHI,MAAM,EAAA,CACNI,IAAI,CACH,eAAA,EACA,sDACA,CAACD,IAAAA,GAAAA;QACC,OAAO,OAAOA,IAAAA,KAAS,QAAA,IAAYA,IAAAA,KAAS,EAAA;AAC9C,IAAA,CAAA,CAAA;AAEJE,IAAAA,IAAAA,EAAMT,IAAIU,OAAO,EAAA;AACjBC,IAAAA,MAAAA,EAAQX,IAAIU,OAAO,EAAA;AACnBE,IAAAA,SAAAA,EAAWZ,IAAIU,OAAO,EAAA;AACtBG,IAAAA,aAAAA,EAAeb,IAAIU,OAAO,EAAA;AAC1BI,IAAAA,IAAAA,EAAMd,IAAIU,OAAO;AACnB,CAAA,CAAA;AAEA,MAAMK,iBAAiB,CAACC,IAAAA,GAAAA;IACtB,IAAI;;QAEF,IAAIC,GAAAA,CAAID,KAAKE,UAAU,CAAC,OAAO,CAAC,iBAAiB,EAAEF,IAAAA,CAAAA,CAAM,GAAGA,IAAAA,CAAAA;AAC9D,IAAA,CAAA,CAAE,OAAM;QACN,OAAO,KAAA;AACT,IAAA;IACA,OAAO,IAAA;AACT,CAAA;AAEA,MAAMG,iBAAAA,GAAoBnB,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC3CC,IAAAA,IAAAA,EAAMH,GAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAO,KAAA,CAAA,CAAEC,QAAQ,EAAA;IAC5Cc,GAAAA,EAAKpB,GAAAA,CACFI,MAAM,EAAA,CACNI,IAAI,CAAC,eAAe,8BAAA,EAAgC,CAACa,KAAAA,GAAUN,cAAAA,CAAeM,KAAAA,IAAS,EAAA,CAAA,CAAA;AAC1FC,IAAAA,QAAAA,EAAUtB,IAAIuB,KAAK,EAAA,CAAGC,EAAE,CAACzB,mBAAmBO,QAAQ;AACtD,CAAA,CAAA;AAEA;AACA,MAAMmB,mBAAAA,GAA2BzB,GAAAA,CAAI0B,IAAI,CAAC,CAACL,KAAAA,GAAAA;AACzC,IAAA,OAAQA,MAAMlB,IAAI;QAChB,KAAK,MAAA;YACH,OAAOJ,iBAAAA;QACT,KAAK,MAAA;YACH,OAAOoB,iBAAAA;AACT,QAAA;AACE,YAAA,OAAOnB,IAAI2B,KAAK,EAAA,CAAGnB,IAAI,CAAC,gBAAgB,kCAAA,EAAoC,IAAA;gBAC1E,OAAO,KAAA;AACT,YAAA,CAAA,CAAA;AACJ;AACF,CAAA,CAAA;AAEA,MAAMoB,sBAAAA,GAAyB5B,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAChDC,IAAAA,IAAAA,EAAMH,GAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAY,KAAA,CAAA,CAAEC,QAAQ,EAAA;IACjDgB,QAAAA,EAAUtB,GAAAA,CACPuB,KAAK,EAAA,CACLC,EAAE,CAACC,qBACHI,GAAG,CAAC,CAAA,EAAG,kEAAA,CAAA,CACPvB,QAAQ;AACb,CAAA,CAAA;AAEA,MAAMwB,oBAAAA,GAAuB9B,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC9CC,IAAAA,IAAAA,EAAMH,GAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAU,KAAA,CAAA,CAAEC,QAAQ,EAAA;AAC/CyB,IAAAA,KAAAA,EAAO/B,GAAAA,CAAIgC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAAC,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA,CAAA,CAAE3B,QAAQ,EAAA;IACtDgB,QAAAA,EAAUtB,GAAAA,CACPuB,KAAK,EAAA,CACLC,EAAE,CAACC,qBACHI,GAAG,CAAC,CAAA,EAAG,gEAAA,CAAA,CACPvB,QAAQ;AACb,CAAA,CAAA;AAEA,MAAM4B,kBAAAA,GAAqBlC,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC5CC,IAAAA,IAAAA,EAAMH,GAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAQ,KAAA,CAAA,CAAEC,QAAQ,EAAA;IAC7CgB,QAAAA,EAAUtB,GAAAA,CACPuB,KAAK,EAAA,CACLC,EAAE,CAACC,qBACHI,GAAG,CAAC,CAAA,EAAG,8DAAA,CAAA,CACPvB,QAAQ;AACb,CAAA,CAAA;AAEA,MAAM6B,kBAAAA,GAAqBnC,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC5CC,IAAAA,IAAAA,EAAMH,GAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAO,KAAA,CAAA,CAAEC,QAAQ,EAAA;IAC5C8B,QAAAA,EAAUpC,GAAAA,CAAII,MAAM,EAAA,CAAGiC,QAAQ,EAAA;IAC/Bf,QAAAA,EAAUtB,GAAAA,CACPuB,KAAK,EAAA,CACLC,EAAE,CAACzB,mBACH8B,GAAG,CAAC,CAAA,EAAG,8DAAA,CAAA,CACPvB,QAAQ;AACb,CAAA,CAAA;AAEA,MAAMgC,YAAAA,GAAetC,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACtCC,IAAAA,IAAAA,EAAMH,GAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAY,KAAA,CAAA,CAAEC,QAAQ,EAAA;AACjDgB,IAAAA,QAAAA,EAAUtB,IAAIuB,KAAK,EAAA,CAAGC,EAAE,CAACC,qBAAqBnB,QAAQ;AACxD,CAAA,CAAA;AAEA;AACA;AACA,MAAMiC,qBAAAA,GAAwBvC,GAAAA,CAAI0B,IAAI,CAAC,CAACL,KAAAA,GAAAA;AACtC,IAAA,OAAQA,MAAMlB,IAAI;QAChB,KAAK,MAAA;YACH,OAAOqC,iBAAAA;QACT,KAAK,WAAA;YACH,OAAOF,YAAAA;AACT,QAAA;AACE,YAAA,OAAOtC,IAAI2B,KAAK,EAAA,CAAGnB,IAAI,CAAC,gBAAgB,uCAAA,EAAyC,IAAA;gBAC/E,OAAO,KAAA;AACT,YAAA,CAAA,CAAA;AACJ;AACF,CAAA,CAAA;AAEA;AACA,MAAMgC,iBAAAA,GAAoBxC,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC3CC,IAAAA,IAAAA,EAAMH,GAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAO,KAAA,CAAA,CAAEC,QAAQ,EAAA;AAC5CmC,IAAAA,MAAAA,EAAQzC,GAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA,SAAA;AAAW,QAAA;AAAY,KAAA,CAAA,CAAEC,QAAQ,EAAA;IAC9DgB,QAAAA,EAAUtB,GAAAA,CACPuB,KAAK,EAAA,CACLC,EAAE,CAACe,uBACHV,GAAG,CAAC,CAAA,EAAG,gEAAA,CAAA,CACPvB,QAAQ;AACb,CAAA,CAAA;AAEA,MAAMoC,kBAAAA,GAAqB1C,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC5CC,IAAAA,IAAAA,EAAMH,GAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA;AAAQ,KAAA,CAAA,CAAEC,QAAQ,EAAA;AAC7CqC,IAAAA,KAAAA,EAAO3C,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;QACxB0C,IAAAA,EAAM5C,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC3BuC,eAAAA,EAAiB7C,GAAAA,CAAII,MAAM,EAAA,CAAGiC,QAAQ,EAAA;QACtCjB,GAAAA,EAAKpB,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC1BwC,OAAAA,EAAS9C,GAAAA,CAAII,MAAM,EAAA,CAAGiC,QAAQ,EAAA;QAC9BU,KAAAA,EAAO/C,GAAAA,CAAIgC,MAAM,EAAA,CAAG1B,QAAQ,EAAA;QAC5B0C,MAAAA,EAAQhD,GAAAA,CAAIgC,MAAM,EAAA,CAAG1B,QAAQ,EAAA;QAC7B2C,OAAAA,EAASjD,GAAAA,CAAIC,MAAM,EAAA,CAAGoC,QAAQ,EAAA;QAC9Ba,IAAAA,EAAMlD,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC3B6C,GAAAA,EAAKnD,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC1B8C,IAAAA,EAAMpD,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC3B+C,IAAAA,EAAMrD,GAAAA,CAAIgC,MAAM,EAAA,CAAG1B,QAAQ,EAAA;QAC3BgD,UAAAA,EAAYtD,GAAAA,CAAII,MAAM,EAAA,CAAGiC,QAAQ,EAAA;QACjCkB,QAAAA,EAAUvD,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC/BkD,iBAAAA,EAAmBxD,GAAAA,CAAI2B,KAAK,EAAA,CAAGU,QAAQ,EAAA;QACvCoB,SAAAA,EAAWzD,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAChCoD,SAAAA,EAAW1D,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ;AAClC,KAAA,CAAA;AACAgB,IAAAA,QAAAA,EAAUtB,IAAIuB,KAAK,EAAA,CAAGC,EAAE,CAACC,qBAAqBnB,QAAQ;AACxD,CAAA,CAAA;AAEA;AACA,MAAMqD,kBAAAA,GAA0B3D,GAAAA,CAAI0B,IAAI,CAAC,CAACL,KAAAA,GAAAA;AACxC,IAAA,OAAQA,MAAMlB,IAAI;QAChB,KAAK,WAAA;YACH,OAAOyB,sBAAAA;QACT,KAAK,SAAA;YACH,OAAOE,oBAAAA;QACT,KAAK,OAAA;YACH,OAAOI,kBAAAA;QACT,KAAK,MAAA;YACH,OAAOM,iBAAAA;QACT,KAAK,OAAA;YACH,OAAOE,kBAAAA;QACT,KAAK,MAAA;YACH,OAAOP,kBAAAA;AACT,QAAA;AACE,YAAA,OAAOnC,IAAI2B,KAAK,EAAA,CAAGnB,IAAI,CAAC,gBAAgB,+BAAA,EAAiC,IAAA;gBACvE,OAAO,KAAA;AACT,YAAA,CAAA,CAAA;AACJ;AACF,CAAA,CAAA;AAEA,MAAMoD,qBAAAA,GAAwB5D,GAAAA,CAAIuB,KAAK,EAAA,CAAGC,EAAE,CAACmC,kBAAAA,CAAAA;AAEtC,MAAME,eAAAA,GAAkB,IAAMD;;;;"}
1
+ {"version":3,"file":"blocks-validator.mjs","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst ALLOWED_LINK_PROTOCOLS = new Set(['http:', 'https:', 'ftp:', 'mailto:', 'tel:']);\n\nconst checkValidLink = (link: string) => {\n try {\n const url = new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n\n return ALLOWED_LINK_PROTOCOLS.has(url.protocol);\n } catch {\n return false;\n }\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n language: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","ALLOWED_LINK_PROTOCOLS","Set","checkValidLink","link","url","URL","startsWith","has","protocol","linkNodeValidator","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","language","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
@@ -13,7 +13,7 @@ var fse__default = /*#__PURE__*/_interopDefault(fse);
13
13
  */ var createStrapiFs = ((strapi)=>{
14
14
  function normalizePath(optPath) {
15
15
  const filePath = Array.isArray(optPath) ? optPath.join('/') : optPath;
16
- const normalizedPath = path__default.default.normalize(filePath).replace(/^\/?(\.\/|\.\.\/)+/, '');
16
+ const normalizedPath = path__default.default.posix.normalize(filePath).replace(/^\/?(\.\/|\.\.\/)+/, '');
17
17
  return path__default.default.resolve(strapi.dirs.app.root, normalizedPath);
18
18
  }
19
19
  const strapiFS = {
@@ -1 +1 @@
1
- {"version":3,"file":"fs.js","sources":["../../src/services/fs.ts"],"sourcesContent":["import path from 'path';\nimport fse from 'fs-extra';\n\nimport type { Core } from '@strapi/types';\n\ninterface StrapiFS {\n writeAppFile(optPath: string | string[], data: string): Promise<void>;\n writePluginFile(plugin: string, optPath: string | string[], data: string): Promise<void>;\n removeAppFile(optPath: string | string[]): Promise<void>;\n appendFile(optPath: string | string[], data: string): void;\n}\n\n/**\n * create strapi fs layer\n */\nexport default (strapi: Core.Strapi) => {\n function normalizePath(optPath: string | string[]) {\n const filePath = Array.isArray(optPath) ? optPath.join('/') : optPath;\n\n const normalizedPath = path.normalize(filePath).replace(/^\\/?(\\.\\/|\\.\\.\\/)+/, '');\n\n return path.resolve(strapi.dirs.app.root, normalizedPath);\n }\n\n const strapiFS: StrapiFS = {\n /**\n * Writes a file in a strapi app\n * @param {Array|string} optPath - file path\n * @param {string} data - content\n */\n writeAppFile(optPath, data) {\n const writePath = normalizePath(optPath);\n return fse.ensureFile(writePath).then(() => fse.writeFile(writePath, data));\n },\n\n /**\n * Writes a file in a plugin extensions folder\n * @param {string} plugin - plugin name\n * @param {Array|string} optPath - path to file\n * @param {string} data - content\n */\n writePluginFile(plugin, optPath, data) {\n const newPath = ['extensions', plugin].concat(optPath).join('/');\n return strapiFS.writeAppFile(newPath, data);\n },\n\n /**\n * Removes a file in strapi app\n */\n removeAppFile(optPath) {\n const removePath = normalizePath(optPath);\n return fse.remove(removePath);\n },\n\n /**\n * Appends a file in strapi app\n */\n appendFile(optPath, data) {\n const writePath = normalizePath(optPath);\n return fse.appendFileSync(writePath, data);\n },\n };\n\n return strapiFS;\n};\n"],"names":["strapi","normalizePath","optPath","filePath","Array","isArray","join","normalizedPath","path","normalize","replace","resolve","dirs","app","root","strapiFS","writeAppFile","data","writePath","fse","ensureFile","then","writeFile","writePluginFile","plugin","newPath","concat","removeAppFile","removePath","remove","appendFile","appendFileSync"],"mappings":";;;;;;;;;;AAYA;;IAGA,qBAAe,CAAA,CAACA,MAAAA,GAAAA;AACd,IAAA,SAASC,cAAcC,OAA0B,EAAA;QAC/C,MAAMC,QAAAA,GAAWC,MAAMC,OAAO,CAACH,WAAWA,OAAAA,CAAQI,IAAI,CAAC,GAAA,CAAA,GAAOJ,OAAAA;AAE9D,QAAA,MAAMK,iBAAiBC,qBAAAA,CAAKC,SAAS,CAACN,QAAAA,CAAAA,CAAUO,OAAO,CAAC,oBAAA,EAAsB,EAAA,CAAA;QAE9E,OAAOF,qBAAAA,CAAKG,OAAO,CAACX,MAAAA,CAAOY,IAAI,CAACC,GAAG,CAACC,IAAI,EAAEP,cAAAA,CAAAA;AAC5C,IAAA;AAEA,IAAA,MAAMQ,QAAAA,GAAqB;AACzB;;;;QAKAC,YAAAA,CAAAA,CAAad,OAAO,EAAEe,IAAI,EAAA;AACxB,YAAA,MAAMC,YAAYjB,aAAAA,CAAcC,OAAAA,CAAAA;YAChC,OAAOiB,oBAAAA,CAAIC,UAAU,CAACF,SAAAA,CAAAA,CAAWG,IAAI,CAAC,IAAMF,oBAAAA,CAAIG,SAAS,CAACJ,SAAAA,EAAWD,IAAAA,CAAAA,CAAAA;AACvE,QAAA,CAAA;AAEA;;;;;AAKC,QACDM,eAAAA,CAAAA,CAAgBC,MAAM,EAAEtB,OAAO,EAAEe,IAAI,EAAA;AACnC,YAAA,MAAMQ,OAAAA,GAAU;AAAC,gBAAA,YAAA;AAAcD,gBAAAA;AAAO,aAAA,CAACE,MAAM,CAACxB,OAAAA,CAAAA,CAASI,IAAI,CAAC,GAAA,CAAA;YAC5D,OAAOS,QAAAA,CAASC,YAAY,CAACS,OAAAA,EAASR,IAAAA,CAAAA;AACxC,QAAA,CAAA;AAEA;;AAEC,QACDU,eAAczB,OAAO,EAAA;AACnB,YAAA,MAAM0B,aAAa3B,aAAAA,CAAcC,OAAAA,CAAAA;YACjC,OAAOiB,oBAAAA,CAAIU,MAAM,CAACD,UAAAA,CAAAA;AACpB,QAAA,CAAA;AAEA;;QAGAE,UAAAA,CAAAA,CAAW5B,OAAO,EAAEe,IAAI,EAAA;AACtB,YAAA,MAAMC,YAAYjB,aAAAA,CAAcC,OAAAA,CAAAA;YAChC,OAAOiB,oBAAAA,CAAIY,cAAc,CAACb,SAAAA,EAAWD,IAAAA,CAAAA;AACvC,QAAA;AACF,KAAA;IAEA,OAAOF,QAAAA;AACT,CAAA;;;;"}
1
+ {"version":3,"file":"fs.js","sources":["../../src/services/fs.ts"],"sourcesContent":["import path from 'path';\nimport fse from 'fs-extra';\n\nimport type { Core } from '@strapi/types';\n\ninterface StrapiFS {\n writeAppFile(optPath: string | string[], data: string): Promise<void>;\n writePluginFile(plugin: string, optPath: string | string[], data: string): Promise<void>;\n removeAppFile(optPath: string | string[]): Promise<void>;\n appendFile(optPath: string | string[], data: string): void;\n}\n\n/**\n * create strapi fs layer\n */\nexport default (strapi: Core.Strapi) => {\n function normalizePath(optPath: string | string[]) {\n const filePath = Array.isArray(optPath) ? optPath.join('/') : optPath;\n\n const normalizedPath = path.posix.normalize(filePath).replace(/^\\/?(\\.\\/|\\.\\.\\/)+/, '');\n\n return path.resolve(strapi.dirs.app.root, normalizedPath);\n }\n\n const strapiFS: StrapiFS = {\n /**\n * Writes a file in a strapi app\n * @param {Array|string} optPath - file path\n * @param {string} data - content\n */\n writeAppFile(optPath, data) {\n const writePath = normalizePath(optPath);\n return fse.ensureFile(writePath).then(() => fse.writeFile(writePath, data));\n },\n\n /**\n * Writes a file in a plugin extensions folder\n * @param {string} plugin - plugin name\n * @param {Array|string} optPath - path to file\n * @param {string} data - content\n */\n writePluginFile(plugin, optPath, data) {\n const newPath = ['extensions', plugin].concat(optPath).join('/');\n return strapiFS.writeAppFile(newPath, data);\n },\n\n /**\n * Removes a file in strapi app\n */\n removeAppFile(optPath) {\n const removePath = normalizePath(optPath);\n return fse.remove(removePath);\n },\n\n /**\n * Appends a file in strapi app\n */\n appendFile(optPath, data) {\n const writePath = normalizePath(optPath);\n return fse.appendFileSync(writePath, data);\n },\n };\n\n return strapiFS;\n};\n"],"names":["strapi","normalizePath","optPath","filePath","Array","isArray","join","normalizedPath","path","posix","normalize","replace","resolve","dirs","app","root","strapiFS","writeAppFile","data","writePath","fse","ensureFile","then","writeFile","writePluginFile","plugin","newPath","concat","removeAppFile","removePath","remove","appendFile","appendFileSync"],"mappings":";;;;;;;;;;AAYA;;IAGA,qBAAe,CAAA,CAACA,MAAAA,GAAAA;AACd,IAAA,SAASC,cAAcC,OAA0B,EAAA;QAC/C,MAAMC,QAAAA,GAAWC,MAAMC,OAAO,CAACH,WAAWA,OAAAA,CAAQI,IAAI,CAAC,GAAA,CAAA,GAAOJ,OAAAA;QAE9D,MAAMK,cAAAA,GAAiBC,sBAAKC,KAAK,CAACC,SAAS,CAACP,QAAAA,CAAAA,CAAUQ,OAAO,CAAC,oBAAA,EAAsB,EAAA,CAAA;QAEpF,OAAOH,qBAAAA,CAAKI,OAAO,CAACZ,MAAAA,CAAOa,IAAI,CAACC,GAAG,CAACC,IAAI,EAAER,cAAAA,CAAAA;AAC5C,IAAA;AAEA,IAAA,MAAMS,QAAAA,GAAqB;AACzB;;;;QAKAC,YAAAA,CAAAA,CAAaf,OAAO,EAAEgB,IAAI,EAAA;AACxB,YAAA,MAAMC,YAAYlB,aAAAA,CAAcC,OAAAA,CAAAA;YAChC,OAAOkB,oBAAAA,CAAIC,UAAU,CAACF,SAAAA,CAAAA,CAAWG,IAAI,CAAC,IAAMF,oBAAAA,CAAIG,SAAS,CAACJ,SAAAA,EAAWD,IAAAA,CAAAA,CAAAA;AACvE,QAAA,CAAA;AAEA;;;;;AAKC,QACDM,eAAAA,CAAAA,CAAgBC,MAAM,EAAEvB,OAAO,EAAEgB,IAAI,EAAA;AACnC,YAAA,MAAMQ,OAAAA,GAAU;AAAC,gBAAA,YAAA;AAAcD,gBAAAA;AAAO,aAAA,CAACE,MAAM,CAACzB,OAAAA,CAAAA,CAASI,IAAI,CAAC,GAAA,CAAA;YAC5D,OAAOU,QAAAA,CAASC,YAAY,CAACS,OAAAA,EAASR,IAAAA,CAAAA;AACxC,QAAA,CAAA;AAEA;;AAEC,QACDU,eAAc1B,OAAO,EAAA;AACnB,YAAA,MAAM2B,aAAa5B,aAAAA,CAAcC,OAAAA,CAAAA;YACjC,OAAOkB,oBAAAA,CAAIU,MAAM,CAACD,UAAAA,CAAAA;AACpB,QAAA,CAAA;AAEA;;QAGAE,UAAAA,CAAAA,CAAW7B,OAAO,EAAEgB,IAAI,EAAA;AACtB,YAAA,MAAMC,YAAYlB,aAAAA,CAAcC,OAAAA,CAAAA;YAChC,OAAOkB,oBAAAA,CAAIY,cAAc,CAACb,SAAAA,EAAWD,IAAAA,CAAAA;AACvC,QAAA;AACF,KAAA;IAEA,OAAOF,QAAAA;AACT,CAAA;;;;"}
@@ -6,7 +6,7 @@ import fse from 'fs-extra';
6
6
  */ var createStrapiFs = ((strapi)=>{
7
7
  function normalizePath(optPath) {
8
8
  const filePath = Array.isArray(optPath) ? optPath.join('/') : optPath;
9
- const normalizedPath = path.normalize(filePath).replace(/^\/?(\.\/|\.\.\/)+/, '');
9
+ const normalizedPath = path.posix.normalize(filePath).replace(/^\/?(\.\/|\.\.\/)+/, '');
10
10
  return path.resolve(strapi.dirs.app.root, normalizedPath);
11
11
  }
12
12
  const strapiFS = {
@@ -1 +1 @@
1
- {"version":3,"file":"fs.mjs","sources":["../../src/services/fs.ts"],"sourcesContent":["import path from 'path';\nimport fse from 'fs-extra';\n\nimport type { Core } from '@strapi/types';\n\ninterface StrapiFS {\n writeAppFile(optPath: string | string[], data: string): Promise<void>;\n writePluginFile(plugin: string, optPath: string | string[], data: string): Promise<void>;\n removeAppFile(optPath: string | string[]): Promise<void>;\n appendFile(optPath: string | string[], data: string): void;\n}\n\n/**\n * create strapi fs layer\n */\nexport default (strapi: Core.Strapi) => {\n function normalizePath(optPath: string | string[]) {\n const filePath = Array.isArray(optPath) ? optPath.join('/') : optPath;\n\n const normalizedPath = path.normalize(filePath).replace(/^\\/?(\\.\\/|\\.\\.\\/)+/, '');\n\n return path.resolve(strapi.dirs.app.root, normalizedPath);\n }\n\n const strapiFS: StrapiFS = {\n /**\n * Writes a file in a strapi app\n * @param {Array|string} optPath - file path\n * @param {string} data - content\n */\n writeAppFile(optPath, data) {\n const writePath = normalizePath(optPath);\n return fse.ensureFile(writePath).then(() => fse.writeFile(writePath, data));\n },\n\n /**\n * Writes a file in a plugin extensions folder\n * @param {string} plugin - plugin name\n * @param {Array|string} optPath - path to file\n * @param {string} data - content\n */\n writePluginFile(plugin, optPath, data) {\n const newPath = ['extensions', plugin].concat(optPath).join('/');\n return strapiFS.writeAppFile(newPath, data);\n },\n\n /**\n * Removes a file in strapi app\n */\n removeAppFile(optPath) {\n const removePath = normalizePath(optPath);\n return fse.remove(removePath);\n },\n\n /**\n * Appends a file in strapi app\n */\n appendFile(optPath, data) {\n const writePath = normalizePath(optPath);\n return fse.appendFileSync(writePath, data);\n },\n };\n\n return strapiFS;\n};\n"],"names":["strapi","normalizePath","optPath","filePath","Array","isArray","join","normalizedPath","path","normalize","replace","resolve","dirs","app","root","strapiFS","writeAppFile","data","writePath","fse","ensureFile","then","writeFile","writePluginFile","plugin","newPath","concat","removeAppFile","removePath","remove","appendFile","appendFileSync"],"mappings":";;;AAYA;;IAGA,qBAAe,CAAA,CAACA,MAAAA,GAAAA;AACd,IAAA,SAASC,cAAcC,OAA0B,EAAA;QAC/C,MAAMC,QAAAA,GAAWC,MAAMC,OAAO,CAACH,WAAWA,OAAAA,CAAQI,IAAI,CAAC,GAAA,CAAA,GAAOJ,OAAAA;AAE9D,QAAA,MAAMK,iBAAiBC,IAAAA,CAAKC,SAAS,CAACN,QAAAA,CAAAA,CAAUO,OAAO,CAAC,oBAAA,EAAsB,EAAA,CAAA;QAE9E,OAAOF,IAAAA,CAAKG,OAAO,CAACX,MAAAA,CAAOY,IAAI,CAACC,GAAG,CAACC,IAAI,EAAEP,cAAAA,CAAAA;AAC5C,IAAA;AAEA,IAAA,MAAMQ,QAAAA,GAAqB;AACzB;;;;QAKAC,YAAAA,CAAAA,CAAad,OAAO,EAAEe,IAAI,EAAA;AACxB,YAAA,MAAMC,YAAYjB,aAAAA,CAAcC,OAAAA,CAAAA;YAChC,OAAOiB,GAAAA,CAAIC,UAAU,CAACF,SAAAA,CAAAA,CAAWG,IAAI,CAAC,IAAMF,GAAAA,CAAIG,SAAS,CAACJ,SAAAA,EAAWD,IAAAA,CAAAA,CAAAA;AACvE,QAAA,CAAA;AAEA;;;;;AAKC,QACDM,eAAAA,CAAAA,CAAgBC,MAAM,EAAEtB,OAAO,EAAEe,IAAI,EAAA;AACnC,YAAA,MAAMQ,OAAAA,GAAU;AAAC,gBAAA,YAAA;AAAcD,gBAAAA;AAAO,aAAA,CAACE,MAAM,CAACxB,OAAAA,CAAAA,CAASI,IAAI,CAAC,GAAA,CAAA;YAC5D,OAAOS,QAAAA,CAASC,YAAY,CAACS,OAAAA,EAASR,IAAAA,CAAAA;AACxC,QAAA,CAAA;AAEA;;AAEC,QACDU,eAAczB,OAAO,EAAA;AACnB,YAAA,MAAM0B,aAAa3B,aAAAA,CAAcC,OAAAA,CAAAA;YACjC,OAAOiB,GAAAA,CAAIU,MAAM,CAACD,UAAAA,CAAAA;AACpB,QAAA,CAAA;AAEA;;QAGAE,UAAAA,CAAAA,CAAW5B,OAAO,EAAEe,IAAI,EAAA;AACtB,YAAA,MAAMC,YAAYjB,aAAAA,CAAcC,OAAAA,CAAAA;YAChC,OAAOiB,GAAAA,CAAIY,cAAc,CAACb,SAAAA,EAAWD,IAAAA,CAAAA;AACvC,QAAA;AACF,KAAA;IAEA,OAAOF,QAAAA;AACT,CAAA;;;;"}
1
+ {"version":3,"file":"fs.mjs","sources":["../../src/services/fs.ts"],"sourcesContent":["import path from 'path';\nimport fse from 'fs-extra';\n\nimport type { Core } from '@strapi/types';\n\ninterface StrapiFS {\n writeAppFile(optPath: string | string[], data: string): Promise<void>;\n writePluginFile(plugin: string, optPath: string | string[], data: string): Promise<void>;\n removeAppFile(optPath: string | string[]): Promise<void>;\n appendFile(optPath: string | string[], data: string): void;\n}\n\n/**\n * create strapi fs layer\n */\nexport default (strapi: Core.Strapi) => {\n function normalizePath(optPath: string | string[]) {\n const filePath = Array.isArray(optPath) ? optPath.join('/') : optPath;\n\n const normalizedPath = path.posix.normalize(filePath).replace(/^\\/?(\\.\\/|\\.\\.\\/)+/, '');\n\n return path.resolve(strapi.dirs.app.root, normalizedPath);\n }\n\n const strapiFS: StrapiFS = {\n /**\n * Writes a file in a strapi app\n * @param {Array|string} optPath - file path\n * @param {string} data - content\n */\n writeAppFile(optPath, data) {\n const writePath = normalizePath(optPath);\n return fse.ensureFile(writePath).then(() => fse.writeFile(writePath, data));\n },\n\n /**\n * Writes a file in a plugin extensions folder\n * @param {string} plugin - plugin name\n * @param {Array|string} optPath - path to file\n * @param {string} data - content\n */\n writePluginFile(plugin, optPath, data) {\n const newPath = ['extensions', plugin].concat(optPath).join('/');\n return strapiFS.writeAppFile(newPath, data);\n },\n\n /**\n * Removes a file in strapi app\n */\n removeAppFile(optPath) {\n const removePath = normalizePath(optPath);\n return fse.remove(removePath);\n },\n\n /**\n * Appends a file in strapi app\n */\n appendFile(optPath, data) {\n const writePath = normalizePath(optPath);\n return fse.appendFileSync(writePath, data);\n },\n };\n\n return strapiFS;\n};\n"],"names":["strapi","normalizePath","optPath","filePath","Array","isArray","join","normalizedPath","path","posix","normalize","replace","resolve","dirs","app","root","strapiFS","writeAppFile","data","writePath","fse","ensureFile","then","writeFile","writePluginFile","plugin","newPath","concat","removeAppFile","removePath","remove","appendFile","appendFileSync"],"mappings":";;;AAYA;;IAGA,qBAAe,CAAA,CAACA,MAAAA,GAAAA;AACd,IAAA,SAASC,cAAcC,OAA0B,EAAA;QAC/C,MAAMC,QAAAA,GAAWC,MAAMC,OAAO,CAACH,WAAWA,OAAAA,CAAQI,IAAI,CAAC,GAAA,CAAA,GAAOJ,OAAAA;QAE9D,MAAMK,cAAAA,GAAiBC,KAAKC,KAAK,CAACC,SAAS,CAACP,QAAAA,CAAAA,CAAUQ,OAAO,CAAC,oBAAA,EAAsB,EAAA,CAAA;QAEpF,OAAOH,IAAAA,CAAKI,OAAO,CAACZ,MAAAA,CAAOa,IAAI,CAACC,GAAG,CAACC,IAAI,EAAER,cAAAA,CAAAA;AAC5C,IAAA;AAEA,IAAA,MAAMS,QAAAA,GAAqB;AACzB;;;;QAKAC,YAAAA,CAAAA,CAAaf,OAAO,EAAEgB,IAAI,EAAA;AACxB,YAAA,MAAMC,YAAYlB,aAAAA,CAAcC,OAAAA,CAAAA;YAChC,OAAOkB,GAAAA,CAAIC,UAAU,CAACF,SAAAA,CAAAA,CAAWG,IAAI,CAAC,IAAMF,GAAAA,CAAIG,SAAS,CAACJ,SAAAA,EAAWD,IAAAA,CAAAA,CAAAA;AACvE,QAAA,CAAA;AAEA;;;;;AAKC,QACDM,eAAAA,CAAAA,CAAgBC,MAAM,EAAEvB,OAAO,EAAEgB,IAAI,EAAA;AACnC,YAAA,MAAMQ,OAAAA,GAAU;AAAC,gBAAA,YAAA;AAAcD,gBAAAA;AAAO,aAAA,CAACE,MAAM,CAACzB,OAAAA,CAAAA,CAASI,IAAI,CAAC,GAAA,CAAA;YAC5D,OAAOU,QAAAA,CAASC,YAAY,CAACS,OAAAA,EAASR,IAAAA,CAAAA;AACxC,QAAA,CAAA;AAEA;;AAEC,QACDU,eAAc1B,OAAO,EAAA;AACnB,YAAA,MAAM2B,aAAa5B,aAAAA,CAAcC,OAAAA,CAAAA;YACjC,OAAOkB,GAAAA,CAAIU,MAAM,CAACD,UAAAA,CAAAA;AACpB,QAAA,CAAA;AAEA;;QAGAE,UAAAA,CAAAA,CAAW7B,OAAO,EAAEgB,IAAI,EAAA;AACtB,YAAA,MAAMC,YAAYlB,aAAAA,CAAcC,OAAAA,CAAAA;YAChC,OAAOkB,GAAAA,CAAIY,cAAc,CAACb,SAAAA,EAAWD,IAAAA,CAAAA;AACvC,QAAA;AACF,KAAA;IAEA,OAAOF,QAAAA;AACT,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"handlePost.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/handlers/handlePost.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAS1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD,eAAO,MAAM,iBAAiB,GAAI,MAAM,sBAAsB,KAAG,IAAI,CAAC,iBA2ErE,CAAC"}
1
+ {"version":3,"file":"handlePost.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/handlers/handlePost.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAS1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD,eAAO,MAAM,iBAAiB,GAAI,MAAM,sBAAsB,KAAG,IAAI,CAAC,iBA2ErE,CAAC"}
@@ -1,11 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var streamableHttp_js = require('@modelcontextprotocol/sdk/server/streamableHttp.js');
3
+ var node = require('@modelcontextprotocol/node');
4
4
  var metrics = require('../metrics/metrics.js');
5
5
  var sendJsonRpcError = require('../utils/sendJsonRpcError.js');
6
6
  var withTimeout = require('../utils/withTimeout.js');
7
7
 
8
- // eslint-disable-next-line import/extensions
9
8
  const createPostHandler = (deps)=>{
10
9
  const { strapi, authenticationStrategy, config, createServerWithRegistries, capabilityDefinitions } = deps;
11
10
  return async (ctx)=>{
@@ -35,7 +34,7 @@ const createPostHandler = (deps)=>{
35
34
  ability: authResult.ability,
36
35
  user: authResult.user
37
36
  });
38
- const transport = new streamableHttp_js.StreamableHTTPServerTransport({
37
+ const transport = new node.NodeStreamableHTTPServerTransport({
39
38
  sessionIdGenerator: undefined
40
39
  });
41
40
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"handlePost.js","sources":["../../../../src/services/mcp/handlers/handlePost.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport type { Core } from '@strapi/types';\nimport {\n classifyMcpRequestFailure,\n sendDidNotAuthenticateMcpRequest,\n sendDidNotHandleMcpRequest,\n sendDidUseMcpServer,\n} from '../metrics/metrics';\nimport { sendJsonRpcError } from '../utils/sendJsonRpcError';\nimport { withTimeout } from '../utils/withTimeout';\nimport type { McpHandlerDependencies } from './types';\n\nexport const createPostHandler = (deps: McpHandlerDependencies): Core.MiddlewareHandler => {\n const {\n strapi,\n authenticationStrategy,\n config,\n createServerWithRegistries,\n capabilityDefinitions,\n } = deps;\n\n return async (ctx) => {\n // Opt out of Koa's response phase — the MCP SDK writes directly to ctx.res\n // (via res.writeHead / res.end / SSE streaming). Without this, Koa's respond()\n // would also try to write ctx.body to the socket after the handler returns.\n ctx.respond = false;\n const req = ctx.req;\n const res = ctx.res;\n\n let hadAuthenticatedMcpRequest = false;\n\n try {\n const authResult = await authenticationStrategy.authenticate(ctx);\n if (authResult.authenticated === false) {\n sendDidNotAuthenticateMcpRequest(strapi, authResult.reason);\n sendJsonRpcError(res, 'AUTHENTICATION_REQUIRED');\n return;\n }\n\n hadAuthenticatedMcpRequest = true;\n sendDidUseMcpServer(strapi);\n\n // Let audit logs pick up MCP actions and tag their origin.\n ctx.state.user = authResult.user;\n ctx.state.auditSource = 'mcp';\n\n const { mcpServer } = createServerWithRegistries({\n strapi,\n definitions: capabilityDefinitions,\n isDevMode: config.isDevMode(),\n ability: authResult.ability,\n user: authResult.user,\n });\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n\n try {\n await withTimeout(\n mcpServer.connect(transport),\n config.connectTimeoutMs,\n 'mcpServer.connect'\n );\n\n const requestBody = ctx.request.body ?? null;\n await withTimeout(\n transport.handleRequest(req, res, requestBody),\n config.requestTimeoutMs,\n 'transport.handleRequest'\n );\n } finally {\n await mcpServer.close();\n }\n } catch (error) {\n strapi.log.error('[MCP] Error handling POST request', {\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined,\n });\n\n sendJsonRpcError(res, 'INTERNAL_ERROR');\n\n if (hadAuthenticatedMcpRequest) {\n sendDidNotHandleMcpRequest(strapi, classifyMcpRequestFailure(error));\n }\n }\n };\n};\n"],"names":["createPostHandler","deps","strapi","authenticationStrategy","config","createServerWithRegistries","capabilityDefinitions","ctx","respond","req","res","hadAuthenticatedMcpRequest","authResult","authenticate","authenticated","sendDidNotAuthenticateMcpRequest","reason","sendJsonRpcError","sendDidUseMcpServer","state","user","auditSource","mcpServer","definitions","isDevMode","ability","transport","StreamableHTTPServerTransport","sessionIdGenerator","undefined","withTimeout","connect","connectTimeoutMs","requestBody","request","body","handleRequest","requestTimeoutMs","close","error","log","Error","message","stack","sendDidNotHandleMcpRequest","classifyMcpRequestFailure"],"mappings":";;;;;;;AAAA;AAaO,MAAMA,oBAAoB,CAACC,IAAAA,GAAAA;IAChC,MAAM,EACJC,MAAM,EACNC,sBAAsB,EACtBC,MAAM,EACNC,0BAA0B,EAC1BC,qBAAqB,EACtB,GAAGL,IAAAA;AAEJ,IAAA,OAAO,OAAOM,GAAAA,GAAAA;;;;AAIZA,QAAAA,GAAAA,CAAIC,OAAO,GAAG,KAAA;QACd,MAAMC,GAAAA,GAAMF,IAAIE,GAAG;QACnB,MAAMC,GAAAA,GAAMH,IAAIG,GAAG;AAEnB,QAAA,IAAIC,0BAAAA,GAA6B,KAAA;QAEjC,IAAI;AACF,YAAA,MAAMC,UAAAA,GAAa,MAAMT,sBAAAA,CAAuBU,YAAY,CAACN,GAAAA,CAAAA;YAC7D,IAAIK,UAAAA,CAAWE,aAAa,KAAK,KAAA,EAAO;gBACtCC,wCAAAA,CAAiCb,MAAAA,EAAQU,WAAWI,MAAM,CAAA;AAC1DC,gBAAAA,iCAAAA,CAAiBP,GAAAA,EAAK,yBAAA,CAAA;AACtB,gBAAA;AACF,YAAA;YAEAC,0BAAAA,GAA6B,IAAA;YAC7BO,2BAAAA,CAAoBhB,MAAAA,CAAAA;;AAGpBK,YAAAA,GAAAA,CAAIY,KAAK,CAACC,IAAI,GAAGR,WAAWQ,IAAI;YAChCb,GAAAA,CAAIY,KAAK,CAACE,WAAW,GAAG,KAAA;AAExB,YAAA,MAAM,EAAEC,SAAS,EAAE,GAAGjB,0BAAAA,CAA2B;AAC/CH,gBAAAA,MAAAA;gBACAqB,WAAAA,EAAajB,qBAAAA;AACbkB,gBAAAA,SAAAA,EAAWpB,OAAOoB,SAAS,EAAA;AAC3BC,gBAAAA,OAAAA,EAASb,WAAWa,OAAO;AAC3BL,gBAAAA,IAAAA,EAAMR,WAAWQ;AACnB,aAAA,CAAA;YAEA,MAAMM,SAAAA,GAAY,IAAIC,+CAAAA,CAA8B;gBAClDC,kBAAAA,EAAoBC;AACtB,aAAA,CAAA;YAEA,IAAI;AACF,gBAAA,MAAMC,wBACJR,SAAAA,CAAUS,OAAO,CAACL,SAAAA,CAAAA,EAClBtB,MAAAA,CAAO4B,gBAAgB,EACvB,mBAAA,CAAA;AAGF,gBAAA,MAAMC,WAAAA,GAAc1B,GAAAA,CAAI2B,OAAO,CAACC,IAAI,IAAI,IAAA;gBACxC,MAAML,uBAAAA,CACJJ,UAAUU,aAAa,CAAC3B,KAAKC,GAAAA,EAAKuB,WAAAA,CAAAA,EAClC7B,MAAAA,CAAOiC,gBAAgB,EACvB,yBAAA,CAAA;YAEJ,CAAA,QAAU;AACR,gBAAA,MAAMf,UAAUgB,KAAK,EAAA;AACvB,YAAA;AACF,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACdrC,YAAAA,MAAAA,CAAOsC,GAAG,CAACD,KAAK,CAAC,mCAAA,EAAqC;AACpDA,gBAAAA,KAAAA,EAAOA,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMG,OAAO,GAAG,eAAA;AAChDC,gBAAAA,KAAAA,EAAOJ,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMI,KAAK,GAAGd;AAChD,aAAA,CAAA;AAEAZ,YAAAA,iCAAAA,CAAiBP,GAAAA,EAAK,gBAAA,CAAA;AAEtB,YAAA,IAAIC,0BAAAA,EAA4B;AAC9BiC,gBAAAA,kCAAAA,CAA2B1C,QAAQ2C,iCAAAA,CAA0BN,KAAAA,CAAAA,CAAAA;AAC/D,YAAA;AACF,QAAA;AACF,IAAA,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"handlePost.js","sources":["../../../../src/services/mcp/handlers/handlePost.ts"],"sourcesContent":["import { NodeStreamableHTTPServerTransport } from '@modelcontextprotocol/node';\nimport type { Core } from '@strapi/types';\nimport {\n classifyMcpRequestFailure,\n sendDidNotAuthenticateMcpRequest,\n sendDidNotHandleMcpRequest,\n sendDidUseMcpServer,\n} from '../metrics/metrics';\nimport { sendJsonRpcError } from '../utils/sendJsonRpcError';\nimport { withTimeout } from '../utils/withTimeout';\nimport type { McpHandlerDependencies } from './types';\n\nexport const createPostHandler = (deps: McpHandlerDependencies): Core.MiddlewareHandler => {\n const {\n strapi,\n authenticationStrategy,\n config,\n createServerWithRegistries,\n capabilityDefinitions,\n } = deps;\n\n return async (ctx) => {\n // Opt out of Koa's response phase — the MCP SDK writes directly to ctx.res\n // (via res.writeHead / res.end / SSE streaming). Without this, Koa's respond()\n // would also try to write ctx.body to the socket after the handler returns.\n ctx.respond = false;\n const req = ctx.req;\n const res = ctx.res;\n\n let hadAuthenticatedMcpRequest = false;\n\n try {\n const authResult = await authenticationStrategy.authenticate(ctx);\n if (authResult.authenticated === false) {\n sendDidNotAuthenticateMcpRequest(strapi, authResult.reason);\n sendJsonRpcError(res, 'AUTHENTICATION_REQUIRED');\n return;\n }\n\n hadAuthenticatedMcpRequest = true;\n sendDidUseMcpServer(strapi);\n\n // Let audit logs pick up MCP actions and tag their origin.\n ctx.state.user = authResult.user;\n ctx.state.auditSource = 'mcp';\n\n const { mcpServer } = createServerWithRegistries({\n strapi,\n definitions: capabilityDefinitions,\n isDevMode: config.isDevMode(),\n ability: authResult.ability,\n user: authResult.user,\n });\n\n const transport = new NodeStreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n\n try {\n await withTimeout(\n mcpServer.connect(transport),\n config.connectTimeoutMs,\n 'mcpServer.connect'\n );\n\n const requestBody = ctx.request.body ?? null;\n await withTimeout(\n transport.handleRequest(req, res, requestBody),\n config.requestTimeoutMs,\n 'transport.handleRequest'\n );\n } finally {\n await mcpServer.close();\n }\n } catch (error) {\n strapi.log.error('[MCP] Error handling POST request', {\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined,\n });\n\n sendJsonRpcError(res, 'INTERNAL_ERROR');\n\n if (hadAuthenticatedMcpRequest) {\n sendDidNotHandleMcpRequest(strapi, classifyMcpRequestFailure(error));\n }\n }\n };\n};\n"],"names":["createPostHandler","deps","strapi","authenticationStrategy","config","createServerWithRegistries","capabilityDefinitions","ctx","respond","req","res","hadAuthenticatedMcpRequest","authResult","authenticate","authenticated","sendDidNotAuthenticateMcpRequest","reason","sendJsonRpcError","sendDidUseMcpServer","state","user","auditSource","mcpServer","definitions","isDevMode","ability","transport","NodeStreamableHTTPServerTransport","sessionIdGenerator","undefined","withTimeout","connect","connectTimeoutMs","requestBody","request","body","handleRequest","requestTimeoutMs","close","error","log","Error","message","stack","sendDidNotHandleMcpRequest","classifyMcpRequestFailure"],"mappings":";;;;;;;AAYO,MAAMA,oBAAoB,CAACC,IAAAA,GAAAA;IAChC,MAAM,EACJC,MAAM,EACNC,sBAAsB,EACtBC,MAAM,EACNC,0BAA0B,EAC1BC,qBAAqB,EACtB,GAAGL,IAAAA;AAEJ,IAAA,OAAO,OAAOM,GAAAA,GAAAA;;;;AAIZA,QAAAA,GAAAA,CAAIC,OAAO,GAAG,KAAA;QACd,MAAMC,GAAAA,GAAMF,IAAIE,GAAG;QACnB,MAAMC,GAAAA,GAAMH,IAAIG,GAAG;AAEnB,QAAA,IAAIC,0BAAAA,GAA6B,KAAA;QAEjC,IAAI;AACF,YAAA,MAAMC,UAAAA,GAAa,MAAMT,sBAAAA,CAAuBU,YAAY,CAACN,GAAAA,CAAAA;YAC7D,IAAIK,UAAAA,CAAWE,aAAa,KAAK,KAAA,EAAO;gBACtCC,wCAAAA,CAAiCb,MAAAA,EAAQU,WAAWI,MAAM,CAAA;AAC1DC,gBAAAA,iCAAAA,CAAiBP,GAAAA,EAAK,yBAAA,CAAA;AACtB,gBAAA;AACF,YAAA;YAEAC,0BAAAA,GAA6B,IAAA;YAC7BO,2BAAAA,CAAoBhB,MAAAA,CAAAA;;AAGpBK,YAAAA,GAAAA,CAAIY,KAAK,CAACC,IAAI,GAAGR,WAAWQ,IAAI;YAChCb,GAAAA,CAAIY,KAAK,CAACE,WAAW,GAAG,KAAA;AAExB,YAAA,MAAM,EAAEC,SAAS,EAAE,GAAGjB,0BAAAA,CAA2B;AAC/CH,gBAAAA,MAAAA;gBACAqB,WAAAA,EAAajB,qBAAAA;AACbkB,gBAAAA,SAAAA,EAAWpB,OAAOoB,SAAS,EAAA;AAC3BC,gBAAAA,OAAAA,EAASb,WAAWa,OAAO;AAC3BL,gBAAAA,IAAAA,EAAMR,WAAWQ;AACnB,aAAA,CAAA;YAEA,MAAMM,SAAAA,GAAY,IAAIC,sCAAAA,CAAkC;gBACtDC,kBAAAA,EAAoBC;AACtB,aAAA,CAAA;YAEA,IAAI;AACF,gBAAA,MAAMC,wBACJR,SAAAA,CAAUS,OAAO,CAACL,SAAAA,CAAAA,EAClBtB,MAAAA,CAAO4B,gBAAgB,EACvB,mBAAA,CAAA;AAGF,gBAAA,MAAMC,WAAAA,GAAc1B,GAAAA,CAAI2B,OAAO,CAACC,IAAI,IAAI,IAAA;gBACxC,MAAML,uBAAAA,CACJJ,UAAUU,aAAa,CAAC3B,KAAKC,GAAAA,EAAKuB,WAAAA,CAAAA,EAClC7B,MAAAA,CAAOiC,gBAAgB,EACvB,yBAAA,CAAA;YAEJ,CAAA,QAAU;AACR,gBAAA,MAAMf,UAAUgB,KAAK,EAAA;AACvB,YAAA;AACF,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACdrC,YAAAA,MAAAA,CAAOsC,GAAG,CAACD,KAAK,CAAC,mCAAA,EAAqC;AACpDA,gBAAAA,KAAAA,EAAOA,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMG,OAAO,GAAG,eAAA;AAChDC,gBAAAA,KAAAA,EAAOJ,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMI,KAAK,GAAGd;AAChD,aAAA,CAAA;AAEAZ,YAAAA,iCAAAA,CAAiBP,GAAAA,EAAK,gBAAA,CAAA;AAEtB,YAAA,IAAIC,0BAAAA,EAA4B;AAC9BiC,gBAAAA,kCAAAA,CAA2B1C,QAAQ2C,iCAAAA,CAA0BN,KAAAA,CAAAA,CAAAA;AAC/D,YAAA;AACF,QAAA;AACF,IAAA,CAAA;AACF;;;;"}
@@ -1,9 +1,8 @@
1
- import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
1
+ import { NodeStreamableHTTPServerTransport } from '@modelcontextprotocol/node';
2
2
  import { sendDidNotAuthenticateMcpRequest, sendDidUseMcpServer, sendDidNotHandleMcpRequest, classifyMcpRequestFailure } from '../metrics/metrics.mjs';
3
3
  import { sendJsonRpcError } from '../utils/sendJsonRpcError.mjs';
4
4
  import { withTimeout } from '../utils/withTimeout.mjs';
5
5
 
6
- // eslint-disable-next-line import/extensions
7
6
  const createPostHandler = (deps)=>{
8
7
  const { strapi, authenticationStrategy, config, createServerWithRegistries, capabilityDefinitions } = deps;
9
8
  return async (ctx)=>{
@@ -33,7 +32,7 @@ const createPostHandler = (deps)=>{
33
32
  ability: authResult.ability,
34
33
  user: authResult.user
35
34
  });
36
- const transport = new StreamableHTTPServerTransport({
35
+ const transport = new NodeStreamableHTTPServerTransport({
37
36
  sessionIdGenerator: undefined
38
37
  });
39
38
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"handlePost.mjs","sources":["../../../../src/services/mcp/handlers/handlePost.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport type { Core } from '@strapi/types';\nimport {\n classifyMcpRequestFailure,\n sendDidNotAuthenticateMcpRequest,\n sendDidNotHandleMcpRequest,\n sendDidUseMcpServer,\n} from '../metrics/metrics';\nimport { sendJsonRpcError } from '../utils/sendJsonRpcError';\nimport { withTimeout } from '../utils/withTimeout';\nimport type { McpHandlerDependencies } from './types';\n\nexport const createPostHandler = (deps: McpHandlerDependencies): Core.MiddlewareHandler => {\n const {\n strapi,\n authenticationStrategy,\n config,\n createServerWithRegistries,\n capabilityDefinitions,\n } = deps;\n\n return async (ctx) => {\n // Opt out of Koa's response phase — the MCP SDK writes directly to ctx.res\n // (via res.writeHead / res.end / SSE streaming). Without this, Koa's respond()\n // would also try to write ctx.body to the socket after the handler returns.\n ctx.respond = false;\n const req = ctx.req;\n const res = ctx.res;\n\n let hadAuthenticatedMcpRequest = false;\n\n try {\n const authResult = await authenticationStrategy.authenticate(ctx);\n if (authResult.authenticated === false) {\n sendDidNotAuthenticateMcpRequest(strapi, authResult.reason);\n sendJsonRpcError(res, 'AUTHENTICATION_REQUIRED');\n return;\n }\n\n hadAuthenticatedMcpRequest = true;\n sendDidUseMcpServer(strapi);\n\n // Let audit logs pick up MCP actions and tag their origin.\n ctx.state.user = authResult.user;\n ctx.state.auditSource = 'mcp';\n\n const { mcpServer } = createServerWithRegistries({\n strapi,\n definitions: capabilityDefinitions,\n isDevMode: config.isDevMode(),\n ability: authResult.ability,\n user: authResult.user,\n });\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n\n try {\n await withTimeout(\n mcpServer.connect(transport),\n config.connectTimeoutMs,\n 'mcpServer.connect'\n );\n\n const requestBody = ctx.request.body ?? null;\n await withTimeout(\n transport.handleRequest(req, res, requestBody),\n config.requestTimeoutMs,\n 'transport.handleRequest'\n );\n } finally {\n await mcpServer.close();\n }\n } catch (error) {\n strapi.log.error('[MCP] Error handling POST request', {\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined,\n });\n\n sendJsonRpcError(res, 'INTERNAL_ERROR');\n\n if (hadAuthenticatedMcpRequest) {\n sendDidNotHandleMcpRequest(strapi, classifyMcpRequestFailure(error));\n }\n }\n };\n};\n"],"names":["createPostHandler","deps","strapi","authenticationStrategy","config","createServerWithRegistries","capabilityDefinitions","ctx","respond","req","res","hadAuthenticatedMcpRequest","authResult","authenticate","authenticated","sendDidNotAuthenticateMcpRequest","reason","sendJsonRpcError","sendDidUseMcpServer","state","user","auditSource","mcpServer","definitions","isDevMode","ability","transport","StreamableHTTPServerTransport","sessionIdGenerator","undefined","withTimeout","connect","connectTimeoutMs","requestBody","request","body","handleRequest","requestTimeoutMs","close","error","log","Error","message","stack","sendDidNotHandleMcpRequest","classifyMcpRequestFailure"],"mappings":";;;;;AAAA;AAaO,MAAMA,oBAAoB,CAACC,IAAAA,GAAAA;IAChC,MAAM,EACJC,MAAM,EACNC,sBAAsB,EACtBC,MAAM,EACNC,0BAA0B,EAC1BC,qBAAqB,EACtB,GAAGL,IAAAA;AAEJ,IAAA,OAAO,OAAOM,GAAAA,GAAAA;;;;AAIZA,QAAAA,GAAAA,CAAIC,OAAO,GAAG,KAAA;QACd,MAAMC,GAAAA,GAAMF,IAAIE,GAAG;QACnB,MAAMC,GAAAA,GAAMH,IAAIG,GAAG;AAEnB,QAAA,IAAIC,0BAAAA,GAA6B,KAAA;QAEjC,IAAI;AACF,YAAA,MAAMC,UAAAA,GAAa,MAAMT,sBAAAA,CAAuBU,YAAY,CAACN,GAAAA,CAAAA;YAC7D,IAAIK,UAAAA,CAAWE,aAAa,KAAK,KAAA,EAAO;gBACtCC,gCAAAA,CAAiCb,MAAAA,EAAQU,WAAWI,MAAM,CAAA;AAC1DC,gBAAAA,gBAAAA,CAAiBP,GAAAA,EAAK,yBAAA,CAAA;AACtB,gBAAA;AACF,YAAA;YAEAC,0BAAAA,GAA6B,IAAA;YAC7BO,mBAAAA,CAAoBhB,MAAAA,CAAAA;;AAGpBK,YAAAA,GAAAA,CAAIY,KAAK,CAACC,IAAI,GAAGR,WAAWQ,IAAI;YAChCb,GAAAA,CAAIY,KAAK,CAACE,WAAW,GAAG,KAAA;AAExB,YAAA,MAAM,EAAEC,SAAS,EAAE,GAAGjB,0BAAAA,CAA2B;AAC/CH,gBAAAA,MAAAA;gBACAqB,WAAAA,EAAajB,qBAAAA;AACbkB,gBAAAA,SAAAA,EAAWpB,OAAOoB,SAAS,EAAA;AAC3BC,gBAAAA,OAAAA,EAASb,WAAWa,OAAO;AAC3BL,gBAAAA,IAAAA,EAAMR,WAAWQ;AACnB,aAAA,CAAA;YAEA,MAAMM,SAAAA,GAAY,IAAIC,6BAAAA,CAA8B;gBAClDC,kBAAAA,EAAoBC;AACtB,aAAA,CAAA;YAEA,IAAI;AACF,gBAAA,MAAMC,YACJR,SAAAA,CAAUS,OAAO,CAACL,SAAAA,CAAAA,EAClBtB,MAAAA,CAAO4B,gBAAgB,EACvB,mBAAA,CAAA;AAGF,gBAAA,MAAMC,WAAAA,GAAc1B,GAAAA,CAAI2B,OAAO,CAACC,IAAI,IAAI,IAAA;gBACxC,MAAML,WAAAA,CACJJ,UAAUU,aAAa,CAAC3B,KAAKC,GAAAA,EAAKuB,WAAAA,CAAAA,EAClC7B,MAAAA,CAAOiC,gBAAgB,EACvB,yBAAA,CAAA;YAEJ,CAAA,QAAU;AACR,gBAAA,MAAMf,UAAUgB,KAAK,EAAA;AACvB,YAAA;AACF,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACdrC,YAAAA,MAAAA,CAAOsC,GAAG,CAACD,KAAK,CAAC,mCAAA,EAAqC;AACpDA,gBAAAA,KAAAA,EAAOA,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMG,OAAO,GAAG,eAAA;AAChDC,gBAAAA,KAAAA,EAAOJ,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMI,KAAK,GAAGd;AAChD,aAAA,CAAA;AAEAZ,YAAAA,gBAAAA,CAAiBP,GAAAA,EAAK,gBAAA,CAAA;AAEtB,YAAA,IAAIC,0BAAAA,EAA4B;AAC9BiC,gBAAAA,0BAAAA,CAA2B1C,QAAQ2C,yBAAAA,CAA0BN,KAAAA,CAAAA,CAAAA;AAC/D,YAAA;AACF,QAAA;AACF,IAAA,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"handlePost.mjs","sources":["../../../../src/services/mcp/handlers/handlePost.ts"],"sourcesContent":["import { NodeStreamableHTTPServerTransport } from '@modelcontextprotocol/node';\nimport type { Core } from '@strapi/types';\nimport {\n classifyMcpRequestFailure,\n sendDidNotAuthenticateMcpRequest,\n sendDidNotHandleMcpRequest,\n sendDidUseMcpServer,\n} from '../metrics/metrics';\nimport { sendJsonRpcError } from '../utils/sendJsonRpcError';\nimport { withTimeout } from '../utils/withTimeout';\nimport type { McpHandlerDependencies } from './types';\n\nexport const createPostHandler = (deps: McpHandlerDependencies): Core.MiddlewareHandler => {\n const {\n strapi,\n authenticationStrategy,\n config,\n createServerWithRegistries,\n capabilityDefinitions,\n } = deps;\n\n return async (ctx) => {\n // Opt out of Koa's response phase — the MCP SDK writes directly to ctx.res\n // (via res.writeHead / res.end / SSE streaming). Without this, Koa's respond()\n // would also try to write ctx.body to the socket after the handler returns.\n ctx.respond = false;\n const req = ctx.req;\n const res = ctx.res;\n\n let hadAuthenticatedMcpRequest = false;\n\n try {\n const authResult = await authenticationStrategy.authenticate(ctx);\n if (authResult.authenticated === false) {\n sendDidNotAuthenticateMcpRequest(strapi, authResult.reason);\n sendJsonRpcError(res, 'AUTHENTICATION_REQUIRED');\n return;\n }\n\n hadAuthenticatedMcpRequest = true;\n sendDidUseMcpServer(strapi);\n\n // Let audit logs pick up MCP actions and tag their origin.\n ctx.state.user = authResult.user;\n ctx.state.auditSource = 'mcp';\n\n const { mcpServer } = createServerWithRegistries({\n strapi,\n definitions: capabilityDefinitions,\n isDevMode: config.isDevMode(),\n ability: authResult.ability,\n user: authResult.user,\n });\n\n const transport = new NodeStreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n\n try {\n await withTimeout(\n mcpServer.connect(transport),\n config.connectTimeoutMs,\n 'mcpServer.connect'\n );\n\n const requestBody = ctx.request.body ?? null;\n await withTimeout(\n transport.handleRequest(req, res, requestBody),\n config.requestTimeoutMs,\n 'transport.handleRequest'\n );\n } finally {\n await mcpServer.close();\n }\n } catch (error) {\n strapi.log.error('[MCP] Error handling POST request', {\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined,\n });\n\n sendJsonRpcError(res, 'INTERNAL_ERROR');\n\n if (hadAuthenticatedMcpRequest) {\n sendDidNotHandleMcpRequest(strapi, classifyMcpRequestFailure(error));\n }\n }\n };\n};\n"],"names":["createPostHandler","deps","strapi","authenticationStrategy","config","createServerWithRegistries","capabilityDefinitions","ctx","respond","req","res","hadAuthenticatedMcpRequest","authResult","authenticate","authenticated","sendDidNotAuthenticateMcpRequest","reason","sendJsonRpcError","sendDidUseMcpServer","state","user","auditSource","mcpServer","definitions","isDevMode","ability","transport","NodeStreamableHTTPServerTransport","sessionIdGenerator","undefined","withTimeout","connect","connectTimeoutMs","requestBody","request","body","handleRequest","requestTimeoutMs","close","error","log","Error","message","stack","sendDidNotHandleMcpRequest","classifyMcpRequestFailure"],"mappings":";;;;;AAYO,MAAMA,oBAAoB,CAACC,IAAAA,GAAAA;IAChC,MAAM,EACJC,MAAM,EACNC,sBAAsB,EACtBC,MAAM,EACNC,0BAA0B,EAC1BC,qBAAqB,EACtB,GAAGL,IAAAA;AAEJ,IAAA,OAAO,OAAOM,GAAAA,GAAAA;;;;AAIZA,QAAAA,GAAAA,CAAIC,OAAO,GAAG,KAAA;QACd,MAAMC,GAAAA,GAAMF,IAAIE,GAAG;QACnB,MAAMC,GAAAA,GAAMH,IAAIG,GAAG;AAEnB,QAAA,IAAIC,0BAAAA,GAA6B,KAAA;QAEjC,IAAI;AACF,YAAA,MAAMC,UAAAA,GAAa,MAAMT,sBAAAA,CAAuBU,YAAY,CAACN,GAAAA,CAAAA;YAC7D,IAAIK,UAAAA,CAAWE,aAAa,KAAK,KAAA,EAAO;gBACtCC,gCAAAA,CAAiCb,MAAAA,EAAQU,WAAWI,MAAM,CAAA;AAC1DC,gBAAAA,gBAAAA,CAAiBP,GAAAA,EAAK,yBAAA,CAAA;AACtB,gBAAA;AACF,YAAA;YAEAC,0BAAAA,GAA6B,IAAA;YAC7BO,mBAAAA,CAAoBhB,MAAAA,CAAAA;;AAGpBK,YAAAA,GAAAA,CAAIY,KAAK,CAACC,IAAI,GAAGR,WAAWQ,IAAI;YAChCb,GAAAA,CAAIY,KAAK,CAACE,WAAW,GAAG,KAAA;AAExB,YAAA,MAAM,EAAEC,SAAS,EAAE,GAAGjB,0BAAAA,CAA2B;AAC/CH,gBAAAA,MAAAA;gBACAqB,WAAAA,EAAajB,qBAAAA;AACbkB,gBAAAA,SAAAA,EAAWpB,OAAOoB,SAAS,EAAA;AAC3BC,gBAAAA,OAAAA,EAASb,WAAWa,OAAO;AAC3BL,gBAAAA,IAAAA,EAAMR,WAAWQ;AACnB,aAAA,CAAA;YAEA,MAAMM,SAAAA,GAAY,IAAIC,iCAAAA,CAAkC;gBACtDC,kBAAAA,EAAoBC;AACtB,aAAA,CAAA;YAEA,IAAI;AACF,gBAAA,MAAMC,YACJR,SAAAA,CAAUS,OAAO,CAACL,SAAAA,CAAAA,EAClBtB,MAAAA,CAAO4B,gBAAgB,EACvB,mBAAA,CAAA;AAGF,gBAAA,MAAMC,WAAAA,GAAc1B,GAAAA,CAAI2B,OAAO,CAACC,IAAI,IAAI,IAAA;gBACxC,MAAML,WAAAA,CACJJ,UAAUU,aAAa,CAAC3B,KAAKC,GAAAA,EAAKuB,WAAAA,CAAAA,EAClC7B,MAAAA,CAAOiC,gBAAgB,EACvB,yBAAA,CAAA;YAEJ,CAAA,QAAU;AACR,gBAAA,MAAMf,UAAUgB,KAAK,EAAA;AACvB,YAAA;AACF,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACdrC,YAAAA,MAAAA,CAAOsC,GAAG,CAACD,KAAK,CAAC,mCAAA,EAAqC;AACpDA,gBAAAA,KAAAA,EAAOA,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMG,OAAO,GAAG,eAAA;AAChDC,gBAAAA,KAAAA,EAAOJ,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMI,KAAK,GAAGd;AAChD,aAAA,CAAA;AAEAZ,YAAAA,gBAAAA,CAAiBP,GAAAA,EAAK,gBAAA,CAAA;AAEtB,YAAA,IAAIC,0BAAAA,EAA4B;AAC9BiC,gBAAAA,0BAAAA,CAA2B1C,QAAQ2C,yBAAAA,CAA0BN,KAAAA,CAAAA,CAAAA;AAC/D,YAAA;AACF,QAAA;AACF,IAAA,CAAA;AACF;;;;"}
@@ -1,5 +1,5 @@
1
1
  import type { Modules } from '@strapi/types';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { McpServer } from '@modelcontextprotocol/server';
3
3
  import { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';
4
4
  export interface McpCapabilityRegistry {
5
5
  bind: (mcpServer: McpServer) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"McpCapabilityRegistry.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/internal/McpCapabilityRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CACtC;AAED,6EAA6E;AAC7E,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAC9C,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,EAC5F,MAAM,GAAG,QAAQ,CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;IAChB,MAAM,IAAI,IAAI,CAAC;CAChB,CAAC;AAEF,qBAAa,yBAAyB,CACpC,cAAc,SAAS,MAAM,GAAG,QAAQ,GAAG,UAAU,EACrD,UAAU,SAAS,OAAO,CAAC,GAAG,CAAC,uBAAuB,EACtD,UAAU,SAAS,oBAAoB;;gBAM3B,WAAW,EAAE,+BAA+B,CAAC,cAAc,EAAE,UAAU,CAAC;IAIpF,SAAS,CAAC,QAAQ,CAAC,iBAAiB,SAAS,UAAU,EACrD,UAAU,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,iBAAiB;IAoB3D,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,MAAM,CAAC,EAAE;YACP,MAAM,CAAC,EAAE,CAAC,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC;SAC/D,CAAC;KACH;cAIW,MAAM;gBACJ,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW;qBAC3C,OAAO;cACd,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS;;IAY1C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW;IAYtE,yFAAyF;IACzF,MAAM,CAAC,IAAI,EAAE,MAAM;IAUnB,yFAAyF;IACzF,SAAS;IAMT,yFAAyF;IACzF,OAAO,CAAC,IAAI,EAAE,MAAM;IAUpB,yFAAyF;IACzF,UAAU;IAMV,yFAAyF;IACzF,MAAM,CAAC,IAAI,EAAE,MAAM;IAWnB,yFAAyF;IACzF,SAAS;CAMV"}
1
+ {"version":3,"file":"McpCapabilityRegistry.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/internal/McpCapabilityRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CACtC;AAED,6EAA6E;AAC7E,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAC9C,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,EAC5F,MAAM,GAAG,QAAQ,CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;IAChB,MAAM,IAAI,IAAI,CAAC;CAChB,CAAC;AAEF,qBAAa,yBAAyB,CACpC,cAAc,SAAS,MAAM,GAAG,QAAQ,GAAG,UAAU,EACrD,UAAU,SAAS,OAAO,CAAC,GAAG,CAAC,uBAAuB,EACtD,UAAU,SAAS,oBAAoB;;gBAM3B,WAAW,EAAE,+BAA+B,CAAC,cAAc,EAAE,UAAU,CAAC;IAIpF,SAAS,CAAC,QAAQ,CAAC,iBAAiB,SAAS,UAAU,EACrD,UAAU,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,iBAAiB;IAoB3D,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,MAAM,CAAC,EAAE;YACP,MAAM,CAAC,EAAE,CAAC,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC;SAC/D,CAAC;KACH;cAIW,MAAM;gBACJ,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW;qBAC3C,OAAO;cACd,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS;;IAY1C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW;IAYtE,yFAAyF;IACzF,MAAM,CAAC,IAAI,EAAE,MAAM;IAUnB,yFAAyF;IACzF,SAAS;IAMT,yFAAyF;IACzF,OAAO,CAAC,IAAI,EAAE,MAAM;IAUpB,yFAAyF;IACzF,UAAU;IAMV,yFAAyF;IACzF,MAAM,CAAC,IAAI,EAAE,MAAM;IAWnB,yFAAyF;IACzF,SAAS;CAMV"}
@@ -1 +1 @@
1
- {"version":3,"file":"McpCapabilityRegistry.js","sources":["../../../../src/services/mcp/internal/McpCapabilityRegistry.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\n// eslint-disable-next-line import/extensions\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\n\nexport interface McpCapabilityRegistry {\n bind: (mcpServer: McpServer) => void;\n}\n\n/** Read-only registry surface for external consumers (plugins, handlers). */\nexport type McpCapabilityRegistryReadonly = Pick<\n McpCapabilityRegistryBase<'tool', Modules.MCP.McpCapabilityDefinition, RegisteredCapability>,\n 'list' | 'status'\n>;\n\nexport type RegisteredCapability = {\n enabled: boolean;\n enable(): void;\n disable(): void;\n remove(): void;\n};\n\nexport class McpCapabilityRegistryBase<\n CapabilityName extends 'tool' | 'prompt' | 'resource',\n Definition extends Modules.MCP.McpCapabilityDefinition,\n Registered extends RegisteredCapability,\n> {\n #definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>;\n\n #registered = new Map<string, Registered>();\n\n constructor(definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>) {\n this.#definitions = definitions;\n }\n\n protected register<LocallyRegistered extends Registered>(\n registerFn: (definition: Definition) => LocallyRegistered\n ) {\n this.#definitions.forEach((definition) => {\n // Defence: register() must be called at most once per registry instance (double-bind protection).\n const existing = this.#registered.get(definition.name);\n if (existing !== undefined) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${definition.name}\" is already registered. Names must be unique.`\n );\n }\n\n const registered = registerFn(definition);\n\n // Disable the capability until explicitly enabled depending on devModeOnly and authorization\n registered.disable();\n\n this.#registered.set(definition.name, registered);\n });\n }\n\n list(ctx?: {\n filter?: {\n status?: ('enabled' | 'disabled' | 'defined' | 'undefined')[];\n };\n }) {\n const { filter } = ctx ?? {};\n return this.#definitions.getAll().reduce<\n {\n name: string;\n status: 'enabled' | 'disabled' | 'defined' | 'undefined';\n devModeOnly: boolean;\n auth: Definition['auth'] | undefined;\n }[]\n >((acc, curr) => {\n const status = this.status(curr.name);\n if (filter?.status !== undefined && !filter.status.includes(status)) {\n return acc;\n }\n acc.push({ name: curr.name, status, devModeOnly: !!curr.devModeOnly, auth: curr.auth });\n return acc;\n }, []);\n }\n\n status(name: string): 'enabled' | 'disabled' | 'defined' | 'undefined' {\n const registered = this.#registered.get(name);\n if (registered !== undefined) {\n return registered.enabled === true ? 'enabled' : 'disabled';\n }\n const definition = this.#definitions.get(name);\n if (definition !== undefined) {\n return 'defined';\n }\n return 'undefined';\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.enable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enableAll() {\n for (const registered of this.#registered.values()) {\n registered.enable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.disable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disableAll() {\n for (const registered of this.#registered.values()) {\n registered.disable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n remove(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.remove();\n this.#registered.delete(name);\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n removeAll() {\n for (const registered of this.#registered.values()) {\n registered.remove();\n }\n this.#registered.clear();\n }\n}\n"],"names":["McpCapabilityRegistryBase","register","registerFn","forEach","definition","existing","get","name","undefined","Error","capability","registered","disable","set","list","ctx","filter","getAll","reduce","acc","curr","status","includes","push","devModeOnly","auth","enabled","enable","enableAll","values","disableAll","remove","delete","removeAll","clear","definitions","Map"],"mappings":"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"}
1
+ {"version":3,"file":"McpCapabilityRegistry.js","sources":["../../../../src/services/mcp/internal/McpCapabilityRegistry.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\nimport type { McpServer } from '@modelcontextprotocol/server';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\n\nexport interface McpCapabilityRegistry {\n bind: (mcpServer: McpServer) => void;\n}\n\n/** Read-only registry surface for external consumers (plugins, handlers). */\nexport type McpCapabilityRegistryReadonly = Pick<\n McpCapabilityRegistryBase<'tool', Modules.MCP.McpCapabilityDefinition, RegisteredCapability>,\n 'list' | 'status'\n>;\n\nexport type RegisteredCapability = {\n enabled: boolean;\n enable(): void;\n disable(): void;\n remove(): void;\n};\n\nexport class McpCapabilityRegistryBase<\n CapabilityName extends 'tool' | 'prompt' | 'resource',\n Definition extends Modules.MCP.McpCapabilityDefinition,\n Registered extends RegisteredCapability,\n> {\n #definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>;\n\n #registered = new Map<string, Registered>();\n\n constructor(definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>) {\n this.#definitions = definitions;\n }\n\n protected register<LocallyRegistered extends Registered>(\n registerFn: (definition: Definition) => LocallyRegistered\n ) {\n this.#definitions.forEach((definition) => {\n // Defence: register() must be called at most once per registry instance (double-bind protection).\n const existing = this.#registered.get(definition.name);\n if (existing !== undefined) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${definition.name}\" is already registered. Names must be unique.`\n );\n }\n\n const registered = registerFn(definition);\n\n // Disable the capability until explicitly enabled depending on devModeOnly and authorization\n registered.disable();\n\n this.#registered.set(definition.name, registered);\n });\n }\n\n list(ctx?: {\n filter?: {\n status?: ('enabled' | 'disabled' | 'defined' | 'undefined')[];\n };\n }) {\n const { filter } = ctx ?? {};\n return this.#definitions.getAll().reduce<\n {\n name: string;\n status: 'enabled' | 'disabled' | 'defined' | 'undefined';\n devModeOnly: boolean;\n auth: Definition['auth'] | undefined;\n }[]\n >((acc, curr) => {\n const status = this.status(curr.name);\n if (filter?.status !== undefined && !filter.status.includes(status)) {\n return acc;\n }\n acc.push({ name: curr.name, status, devModeOnly: !!curr.devModeOnly, auth: curr.auth });\n return acc;\n }, []);\n }\n\n status(name: string): 'enabled' | 'disabled' | 'defined' | 'undefined' {\n const registered = this.#registered.get(name);\n if (registered !== undefined) {\n return registered.enabled === true ? 'enabled' : 'disabled';\n }\n const definition = this.#definitions.get(name);\n if (definition !== undefined) {\n return 'defined';\n }\n return 'undefined';\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.enable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enableAll() {\n for (const registered of this.#registered.values()) {\n registered.enable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.disable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disableAll() {\n for (const registered of this.#registered.values()) {\n registered.disable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n remove(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.remove();\n this.#registered.delete(name);\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n removeAll() {\n for (const registered of this.#registered.values()) {\n registered.remove();\n }\n this.#registered.clear();\n }\n}\n"],"names":["McpCapabilityRegistryBase","register","registerFn","forEach","definition","existing","get","name","undefined","Error","capability","registered","disable","set","list","ctx","filter","getAll","reduce","acc","curr","status","includes","push","devModeOnly","auth","enabled","enable","enableAll","values","disableAll","remove","delete","removeAll","clear","definitions","Map"],"mappings":";;;;;;;;;;;;IA0BE,YAAA,iBAAA,8BAAA,CAAA,cAAA,CAAA,EAEA,WAAA,iBAAA,8BAAA,CAAA,aAAA,CAAA;AAPK,MAAMA,yBAAAA,CAAAA;AAaDC,IAAAA,QAAAA,CACRC,UAAyD,EACzD;AACA,QAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaC,OAAO,CAAC,CAACC,UAAAA,GAAAA;;YAEzB,MAAMC,QAAAA,GAAW,gCAAA,IAAI,EAAC,aAAA,WAAA,CAAA,CAAYC,GAAG,CAACF,UAAAA,CAAWG,IAAI,CAAA;AACrD,YAAA,IAAIF,aAAaG,SAAAA,EAAW;AAC1B,gBAAA,MAAM,IAAIC,KAAAA,CACR,CAAC,MAAM,EAAE,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaC,UAAU,CAAC,YAAY,EAAEN,WAAWG,IAAI,CAAC,8CAA8C,CAAC,CAAA;AAEvH,YAAA;AAEA,YAAA,MAAMI,aAAaT,UAAAA,CAAWE,UAAAA,CAAAA;;AAG9BO,YAAAA,UAAAA,CAAWC,OAAO,EAAA;YAElB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAYC,GAAG,CAACT,UAAAA,CAAWG,IAAI,EAAEI,UAAAA,CAAAA;AACxC,QAAA,CAAA,CAAA;AACF,IAAA;AAEAG,IAAAA,IAAAA,CAAKC,GAIJ,EAAE;AACD,QAAA,MAAM,EAAEC,MAAM,EAAE,GAAGD,OAAO,EAAC;QAC3B,OAAO,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaE,MAAM,EAAA,CAAGC,MAAM,CAOtC,CAACC,GAAAA,EAAKC,IAAAA,GAAAA;AACN,YAAA,MAAMC,SAAS,IAAI,CAACA,MAAM,CAACD,KAAKb,IAAI,CAAA;YACpC,IAAIS,MAAAA,EAAQK,WAAWb,SAAAA,IAAa,CAACQ,OAAOK,MAAM,CAACC,QAAQ,CAACD,MAAAA,CAAAA,EAAS;gBACnE,OAAOF,GAAAA;AACT,YAAA;AACAA,YAAAA,GAAAA,CAAII,IAAI,CAAC;AAAEhB,gBAAAA,IAAAA,EAAMa,KAAKb,IAAI;AAAEc,gBAAAA,MAAAA;gBAAQG,WAAAA,EAAa,CAAC,CAACJ,IAAAA,CAAKI,WAAW;AAAEC,gBAAAA,IAAAA,EAAML,KAAKK;AAAK,aAAA,CAAA;YACrF,OAAON,GAAAA;AACT,QAAA,CAAA,EAAG,EAAE,CAAA;AACP,IAAA;AAEAE,IAAAA,MAAAA,CAAOd,IAAY,EAAoD;AACrE,QAAA,MAAMI,aAAa,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAYL,GAAG,CAACC,IAAAA,CAAAA;AACxC,QAAA,IAAII,eAAeH,SAAAA,EAAW;AAC5B,YAAA,OAAOG,UAAAA,CAAWe,OAAO,KAAK,IAAA,GAAO,SAAA,GAAY,UAAA;AACnD,QAAA;AACA,QAAA,MAAMtB,aAAa,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaE,GAAG,CAACC,IAAAA,CAAAA;AACzC,QAAA,IAAIH,eAAeI,SAAAA,EAAW;YAC5B,OAAO,SAAA;AACT,QAAA;QACA,OAAO,WAAA;AACT,IAAA;8FAGAmB,MAAAA,CAAOpB,IAAY,EAAE;AACnB,QAAA,MAAMI,aAAa,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAYL,GAAG,CAACC,IAAAA,CAAAA;AACxC,QAAA,IAAI,CAACI,UAAAA,EAAY;AACf,YAAA,MAAM,IAAIF,KAAAA,CACR,CAAC,MAAM,EAAE,gCAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaC,UAAU,CAAC,YAAY,EAAEH,IAAAA,CAAK,oBAAoB,CAAC,CAAA;AAElF,QAAA;AACAI,QAAAA,UAAAA,CAAWgB,MAAM,EAAA;AACnB,IAAA;AAEA,8FACAC,SAAAA,GAAY;QACV,KAAK,MAAMjB,cAAc,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAYkB,MAAM,EAAA,CAAI;AAClDlB,YAAAA,UAAAA,CAAWgB,MAAM,EAAA;AACnB,QAAA;AACF,IAAA;8FAGAf,OAAAA,CAAQL,IAAY,EAAE;AACpB,QAAA,MAAMI,aAAa,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAYL,GAAG,CAACC,IAAAA,CAAAA;AACxC,QAAA,IAAI,CAACI,UAAAA,EAAY;AACf,YAAA,MAAM,IAAIF,KAAAA,CACR,CAAC,MAAM,EAAE,gCAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaC,UAAU,CAAC,YAAY,EAAEH,IAAAA,CAAK,oBAAoB,CAAC,CAAA;AAElF,QAAA;AACAI,QAAAA,UAAAA,CAAWC,OAAO,EAAA;AACpB,IAAA;AAEA,8FACAkB,UAAAA,GAAa;QACX,KAAK,MAAMnB,cAAc,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAYkB,MAAM,EAAA,CAAI;AAClDlB,YAAAA,UAAAA,CAAWC,OAAO,EAAA;AACpB,QAAA;AACF,IAAA;8FAGAmB,MAAAA,CAAOxB,IAAY,EAAE;AACnB,QAAA,MAAMI,aAAa,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAYL,GAAG,CAACC,IAAAA,CAAAA;AACxC,QAAA,IAAI,CAACI,UAAAA,EAAY;AACf,YAAA,MAAM,IAAIF,KAAAA,CACR,CAAC,MAAM,EAAE,gCAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaC,UAAU,CAAC,YAAY,EAAEH,IAAAA,CAAK,oBAAoB,CAAC,CAAA;AAElF,QAAA;AACAI,QAAAA,UAAAA,CAAWoB,MAAM,EAAA;AACjB,QAAA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAYC,MAAM,CAACzB,IAAAA,CAAAA;AAC1B,IAAA;AAEA,8FACA0B,SAAAA,GAAY;QACV,KAAK,MAAMtB,cAAc,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAYkB,MAAM,EAAA,CAAI;AAClDlB,YAAAA,UAAAA,CAAWoB,MAAM,EAAA;AACnB,QAAA;AACA,QAAA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAYG,KAAK,EAAA;AACxB,IAAA;AAlHA,IAAA,WAAA,CAAYC,WAAwE,CAAE;QAJtF,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;mBAAA;;QAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;;mBAAA;;AAAA,QAAA,+BAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA,eAAc,IAAIC,GAAAA,EAAAA;QAGhB,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,GAAeD,WAAAA;AACtB,IAAA;AAiHF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"McpCapabilityRegistry.mjs","sources":["../../../../src/services/mcp/internal/McpCapabilityRegistry.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\n// eslint-disable-next-line import/extensions\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\n\nexport interface McpCapabilityRegistry {\n bind: (mcpServer: McpServer) => void;\n}\n\n/** Read-only registry surface for external consumers (plugins, handlers). */\nexport type McpCapabilityRegistryReadonly = Pick<\n McpCapabilityRegistryBase<'tool', Modules.MCP.McpCapabilityDefinition, RegisteredCapability>,\n 'list' | 'status'\n>;\n\nexport type RegisteredCapability = {\n enabled: boolean;\n enable(): void;\n disable(): void;\n remove(): void;\n};\n\nexport class McpCapabilityRegistryBase<\n CapabilityName extends 'tool' | 'prompt' | 'resource',\n Definition extends Modules.MCP.McpCapabilityDefinition,\n Registered extends RegisteredCapability,\n> {\n #definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>;\n\n #registered = new Map<string, Registered>();\n\n constructor(definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>) {\n this.#definitions = definitions;\n }\n\n protected register<LocallyRegistered extends Registered>(\n registerFn: (definition: Definition) => LocallyRegistered\n ) {\n this.#definitions.forEach((definition) => {\n // Defence: register() must be called at most once per registry instance (double-bind protection).\n const existing = this.#registered.get(definition.name);\n if (existing !== undefined) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${definition.name}\" is already registered. Names must be unique.`\n );\n }\n\n const registered = registerFn(definition);\n\n // Disable the capability until explicitly enabled depending on devModeOnly and authorization\n registered.disable();\n\n this.#registered.set(definition.name, registered);\n });\n }\n\n list(ctx?: {\n filter?: {\n status?: ('enabled' | 'disabled' | 'defined' | 'undefined')[];\n };\n }) {\n const { filter } = ctx ?? {};\n return this.#definitions.getAll().reduce<\n {\n name: string;\n status: 'enabled' | 'disabled' | 'defined' | 'undefined';\n devModeOnly: boolean;\n auth: Definition['auth'] | undefined;\n }[]\n >((acc, curr) => {\n const status = this.status(curr.name);\n if (filter?.status !== undefined && !filter.status.includes(status)) {\n return acc;\n }\n acc.push({ name: curr.name, status, devModeOnly: !!curr.devModeOnly, auth: curr.auth });\n return acc;\n }, []);\n }\n\n status(name: string): 'enabled' | 'disabled' | 'defined' | 'undefined' {\n const registered = this.#registered.get(name);\n if (registered !== undefined) {\n return registered.enabled === true ? 'enabled' : 'disabled';\n }\n const definition = this.#definitions.get(name);\n if (definition !== undefined) {\n return 'defined';\n }\n return 'undefined';\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.enable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enableAll() {\n for (const registered of this.#registered.values()) {\n registered.enable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.disable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disableAll() {\n for (const registered of this.#registered.values()) {\n registered.disable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n remove(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.remove();\n this.#registered.delete(name);\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n removeAll() {\n for (const registered of this.#registered.values()) {\n registered.remove();\n }\n this.#registered.clear();\n }\n}\n"],"names":["McpCapabilityRegistryBase","register","registerFn","forEach","definition","existing","get","name","undefined","Error","capability","registered","disable","set","list","ctx","filter","getAll","reduce","acc","curr","status","includes","push","devModeOnly","auth","enabled","enable","enableAll","values","disableAll","remove","delete","removeAll","clear","definitions","Map"],"mappings":"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"}
1
+ {"version":3,"file":"McpCapabilityRegistry.mjs","sources":["../../../../src/services/mcp/internal/McpCapabilityRegistry.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\nimport type { McpServer } from '@modelcontextprotocol/server';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\n\nexport interface McpCapabilityRegistry {\n bind: (mcpServer: McpServer) => void;\n}\n\n/** Read-only registry surface for external consumers (plugins, handlers). */\nexport type McpCapabilityRegistryReadonly = Pick<\n McpCapabilityRegistryBase<'tool', Modules.MCP.McpCapabilityDefinition, RegisteredCapability>,\n 'list' | 'status'\n>;\n\nexport type RegisteredCapability = {\n enabled: boolean;\n enable(): void;\n disable(): void;\n remove(): void;\n};\n\nexport class McpCapabilityRegistryBase<\n CapabilityName extends 'tool' | 'prompt' | 'resource',\n Definition extends Modules.MCP.McpCapabilityDefinition,\n Registered extends RegisteredCapability,\n> {\n #definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>;\n\n #registered = new Map<string, Registered>();\n\n constructor(definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>) {\n this.#definitions = definitions;\n }\n\n protected register<LocallyRegistered extends Registered>(\n registerFn: (definition: Definition) => LocallyRegistered\n ) {\n this.#definitions.forEach((definition) => {\n // Defence: register() must be called at most once per registry instance (double-bind protection).\n const existing = this.#registered.get(definition.name);\n if (existing !== undefined) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${definition.name}\" is already registered. Names must be unique.`\n );\n }\n\n const registered = registerFn(definition);\n\n // Disable the capability until explicitly enabled depending on devModeOnly and authorization\n registered.disable();\n\n this.#registered.set(definition.name, registered);\n });\n }\n\n list(ctx?: {\n filter?: {\n status?: ('enabled' | 'disabled' | 'defined' | 'undefined')[];\n };\n }) {\n const { filter } = ctx ?? {};\n return this.#definitions.getAll().reduce<\n {\n name: string;\n status: 'enabled' | 'disabled' | 'defined' | 'undefined';\n devModeOnly: boolean;\n auth: Definition['auth'] | undefined;\n }[]\n >((acc, curr) => {\n const status = this.status(curr.name);\n if (filter?.status !== undefined && !filter.status.includes(status)) {\n return acc;\n }\n acc.push({ name: curr.name, status, devModeOnly: !!curr.devModeOnly, auth: curr.auth });\n return acc;\n }, []);\n }\n\n status(name: string): 'enabled' | 'disabled' | 'defined' | 'undefined' {\n const registered = this.#registered.get(name);\n if (registered !== undefined) {\n return registered.enabled === true ? 'enabled' : 'disabled';\n }\n const definition = this.#definitions.get(name);\n if (definition !== undefined) {\n return 'defined';\n }\n return 'undefined';\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.enable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enableAll() {\n for (const registered of this.#registered.values()) {\n registered.enable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.disable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disableAll() {\n for (const registered of this.#registered.values()) {\n registered.disable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n remove(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.remove();\n this.#registered.delete(name);\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n removeAll() {\n for (const registered of this.#registered.values()) {\n registered.remove();\n }\n this.#registered.clear();\n }\n}\n"],"names":["McpCapabilityRegistryBase","register","registerFn","forEach","definition","existing","get","name","undefined","Error","capability","registered","disable","set","list","ctx","filter","getAll","reduce","acc","curr","status","includes","push","devModeOnly","auth","enabled","enable","enableAll","values","disableAll","remove","delete","removeAll","clear","definitions","Map"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
1
+ import { McpServer } from '@modelcontextprotocol/server';
2
2
  import type { Core, Modules } from '@strapi/types';
3
3
  import { McpPromptRegistry } from '../prompt-registry';
4
4
  import { McpResourceRegistry } from '../resource-registry';
@@ -1 +1 @@
1
- {"version":3,"file":"McpServerFactory.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAG7E,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,+BAA+B,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9E,OAAO,EAAE,+BAA+B,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACpF,SAAS,EAAE,+BAA+B,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;CAC3F,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,mBAAmB,CAAC;CAChC,CAAC;AAEF,qEAAqE;AACrE,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,6BAA6B,CAAC;IACrC,OAAO,EAAE,6BAA6B,CAAC;IACvC,SAAS,EAAE,6BAA6B,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,qBAAqB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,WAAW,EAAE,wBAAwB,CAAC;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAI,oDAM3C,mCAAmC,KAAG,uBAuExC,CAAC"}
1
+ {"version":3,"file":"McpServerFactory.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA2B,MAAM,8BAA8B,CAAC;AAClF,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAG7E,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,+BAA+B,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9E,OAAO,EAAE,+BAA+B,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACpF,SAAS,EAAE,+BAA+B,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;CAC3F,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,mBAAmB,CAAC;CAChC,CAAC;AAEF,qEAAqE;AACrE,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,6BAA6B,CAAC;IACrC,OAAO,EAAE,6BAA6B,CAAC;IACvC,SAAS,EAAE,6BAA6B,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,qBAAqB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,WAAW,EAAE,wBAAwB,CAAC;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAI,oDAM3C,mCAAmC,KAAG,uBAkExC,CAAC"}
@@ -1,12 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
3
+ var server = require('@modelcontextprotocol/server');
4
4
  var promptRegistry = require('../prompt-registry.js');
5
5
  var resourceRegistry = require('../resource-registry.js');
6
6
  var toolRegistry = require('../tool-registry.js');
7
7
  var syncMcpSessionCapabilities = require('./syncMcpSessionCapabilities.js');
8
8
 
9
- // eslint-disable-next-line import/extensions
10
9
  const createMcpServerWithRegistries = ({ strapi, definitions, isDevMode, ability, user })=>{
11
10
  const capabilities = {
12
11
  logging: {}
@@ -22,7 +21,7 @@ const createMcpServerWithRegistries = ({ strapi, definitions, isDevMode, ability
22
21
  if (definitions.resources.size > 0) {
23
22
  capabilities.resources = {};
24
23
  }
25
- const mcpServer = new mcp_js.McpServer({
24
+ const mcpServer = new server.McpServer({
26
25
  name: 'strapi-mcp-server',
27
26
  version: '1.0.0'
28
27
  }, {
@@ -1 +1 @@
1
- {"version":3,"file":"McpServerFactory.js","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpPromptRegistry } from '../prompt-registry';\nimport { McpResourceRegistry } from '../resource-registry';\nimport { McpToolRegistry } from '../tool-registry';\nimport type { McpAdminTokenAbility } from '../authentication';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\nimport type { McpCapabilityRegistryReadonly } from './McpCapabilityRegistry';\nimport { syncMcpSessionCapabilities } from './syncMcpSessionCapabilities';\n\nexport type McpCapabilityDefinitions = {\n tools: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n prompts: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n resources: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n};\n\nexport type McpRegistries = {\n tools: McpToolRegistry;\n prompts: McpPromptRegistry;\n resources: McpResourceRegistry;\n};\n\n/** Read-only registry surface exposed on McpServerWithRegistries. */\nexport type McpRegistriesReadonly = {\n tools: McpCapabilityRegistryReadonly;\n prompts: McpCapabilityRegistryReadonly;\n resources: McpCapabilityRegistryReadonly;\n};\n\nexport type McpServerWithRegistries = {\n mcpServer: McpServer;\n registries: McpRegistriesReadonly;\n};\n\nexport type CreateMcpServerWithRegistriesParams = {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitions;\n isDevMode: boolean;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n};\n\nexport const createMcpServerWithRegistries = ({\n strapi,\n definitions,\n isDevMode,\n ability,\n user,\n}: CreateMcpServerWithRegistriesParams): McpServerWithRegistries => {\n const capabilities: {\n logging?: Record<string, unknown>;\n tools?: Record<string, unknown>;\n prompts?: Record<string, unknown>;\n resources?: Record<string, unknown>;\n } = {\n logging: {},\n };\n // Advertise capability categories when definitions exist (server-level), not per-user enabled\n // count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.\n if (definitions.tools.size > 0) {\n capabilities.tools = {};\n }\n if (definitions.prompts.size > 0) {\n capabilities.prompts = {};\n }\n if (definitions.resources.size > 0) {\n capabilities.resources = {};\n }\n\n const mcpServer = new McpServer(\n {\n name: 'strapi-mcp-server',\n version: '1.0.0',\n },\n {\n capabilities,\n }\n );\n\n // Bootstrap registries with current definitions\n const tools = new McpToolRegistry({\n strapi,\n definitions: definitions.tools,\n ability,\n user,\n });\n const prompts = new McpPromptRegistry({\n strapi,\n definitions: definitions.prompts,\n });\n const resources = new McpResourceRegistry({\n strapi,\n definitions: definitions.resources,\n });\n\n // Register capabilities (disabled by default)\n tools.bind(mcpServer);\n prompts.bind(mcpServer);\n resources.bind(mcpServer);\n\n syncMcpSessionCapabilities({\n registries: {\n tools,\n prompts,\n resources,\n },\n definitions,\n ability,\n isDevMode,\n });\n\n return {\n mcpServer,\n registries: {\n tools,\n prompts,\n resources,\n },\n };\n};\n"],"names":["createMcpServerWithRegistries","strapi","definitions","isDevMode","ability","user","capabilities","logging","tools","size","prompts","resources","mcpServer","McpServer","name","version","McpToolRegistry","McpPromptRegistry","McpResourceRegistry","bind","syncMcpSessionCapabilities","registries"],"mappings":";;;;;;;;AAAA;AA2CO,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,MAAM,EACNC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,IAAI,EACgC,GAAA;AACpC,IAAA,MAAMC,YAAAA,GAKF;AACFC,QAAAA,OAAAA,EAAS;AACX,KAAA;;;AAGA,IAAA,IAAIL,WAAAA,CAAYM,KAAK,CAACC,IAAI,GAAG,CAAA,EAAG;QAC9BH,YAAAA,CAAaE,KAAK,GAAG,EAAC;AACxB,IAAA;AACA,IAAA,IAAIN,WAAAA,CAAYQ,OAAO,CAACD,IAAI,GAAG,CAAA,EAAG;QAChCH,YAAAA,CAAaI,OAAO,GAAG,EAAC;AAC1B,IAAA;AACA,IAAA,IAAIR,WAAAA,CAAYS,SAAS,CAACF,IAAI,GAAG,CAAA,EAAG;QAClCH,YAAAA,CAAaK,SAAS,GAAG,EAAC;AAC5B,IAAA;IAEA,MAAMC,SAAAA,GAAY,IAAIC,gBAAAA,CACpB;QACEC,IAAAA,EAAM,mBAAA;QACNC,OAAAA,EAAS;KACX,EACA;AACET,QAAAA;AACF,KAAA,CAAA;;IAIF,MAAME,KAAAA,GAAQ,IAAIQ,4BAAAA,CAAgB;AAChCf,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYM,KAAK;AAC9BJ,QAAAA,OAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IACA,MAAMK,OAAAA,GAAU,IAAIO,gCAAAA,CAAkB;AACpChB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYQ;AAC3B,KAAA,CAAA;IACA,MAAMC,SAAAA,GAAY,IAAIO,oCAAAA,CAAoB;AACxCjB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYS;AAC3B,KAAA,CAAA;;AAGAH,IAAAA,KAAAA,CAAMW,IAAI,CAACP,SAAAA,CAAAA;AACXF,IAAAA,OAAAA,CAAQS,IAAI,CAACP,SAAAA,CAAAA;AACbD,IAAAA,SAAAA,CAAUQ,IAAI,CAACP,SAAAA,CAAAA;IAEfQ,qDAAAA,CAA2B;QACzBC,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF,SAAA;AACAT,QAAAA,WAAAA;AACAE,QAAAA,OAAAA;AACAD,QAAAA;AACF,KAAA,CAAA;IAEA,OAAO;AACLS,QAAAA,SAAAA;QACAS,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"McpServerFactory.js","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"sourcesContent":["import { McpServer, type ServerCapabilities } from '@modelcontextprotocol/server';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpPromptRegistry } from '../prompt-registry';\nimport { McpResourceRegistry } from '../resource-registry';\nimport { McpToolRegistry } from '../tool-registry';\nimport type { McpAdminTokenAbility } from '../authentication';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\nimport type { McpCapabilityRegistryReadonly } from './McpCapabilityRegistry';\nimport { syncMcpSessionCapabilities } from './syncMcpSessionCapabilities';\n\nexport type McpCapabilityDefinitions = {\n tools: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n prompts: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n resources: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n};\n\nexport type McpRegistries = {\n tools: McpToolRegistry;\n prompts: McpPromptRegistry;\n resources: McpResourceRegistry;\n};\n\n/** Read-only registry surface exposed on McpServerWithRegistries. */\nexport type McpRegistriesReadonly = {\n tools: McpCapabilityRegistryReadonly;\n prompts: McpCapabilityRegistryReadonly;\n resources: McpCapabilityRegistryReadonly;\n};\n\nexport type McpServerWithRegistries = {\n mcpServer: McpServer;\n registries: McpRegistriesReadonly;\n};\n\nexport type CreateMcpServerWithRegistriesParams = {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitions;\n isDevMode: boolean;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n};\n\nexport const createMcpServerWithRegistries = ({\n strapi,\n definitions,\n isDevMode,\n ability,\n user,\n}: CreateMcpServerWithRegistriesParams): McpServerWithRegistries => {\n const capabilities: ServerCapabilities = {\n logging: {},\n };\n // Advertise capability categories when definitions exist (server-level), not per-user enabled\n // count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.\n if (definitions.tools.size > 0) {\n capabilities.tools = {};\n }\n if (definitions.prompts.size > 0) {\n capabilities.prompts = {};\n }\n if (definitions.resources.size > 0) {\n capabilities.resources = {};\n }\n\n const mcpServer = new McpServer(\n {\n name: 'strapi-mcp-server',\n version: '1.0.0',\n },\n {\n capabilities,\n }\n );\n\n // Bootstrap registries with current definitions\n const tools = new McpToolRegistry({\n strapi,\n definitions: definitions.tools,\n ability,\n user,\n });\n const prompts = new McpPromptRegistry({\n strapi,\n definitions: definitions.prompts,\n });\n const resources = new McpResourceRegistry({\n strapi,\n definitions: definitions.resources,\n });\n\n // Register capabilities (disabled by default)\n tools.bind(mcpServer);\n prompts.bind(mcpServer);\n resources.bind(mcpServer);\n\n syncMcpSessionCapabilities({\n registries: {\n tools,\n prompts,\n resources,\n },\n definitions,\n ability,\n isDevMode,\n });\n\n return {\n mcpServer,\n registries: {\n tools,\n prompts,\n resources,\n },\n };\n};\n"],"names":["createMcpServerWithRegistries","strapi","definitions","isDevMode","ability","user","capabilities","logging","tools","size","prompts","resources","mcpServer","McpServer","name","version","McpToolRegistry","McpPromptRegistry","McpResourceRegistry","bind","syncMcpSessionCapabilities","registries"],"mappings":";;;;;;;;AA0CO,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,MAAM,EACNC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,IAAI,EACgC,GAAA;AACpC,IAAA,MAAMC,YAAAA,GAAmC;AACvCC,QAAAA,OAAAA,EAAS;AACX,KAAA;;;AAGA,IAAA,IAAIL,WAAAA,CAAYM,KAAK,CAACC,IAAI,GAAG,CAAA,EAAG;QAC9BH,YAAAA,CAAaE,KAAK,GAAG,EAAC;AACxB,IAAA;AACA,IAAA,IAAIN,WAAAA,CAAYQ,OAAO,CAACD,IAAI,GAAG,CAAA,EAAG;QAChCH,YAAAA,CAAaI,OAAO,GAAG,EAAC;AAC1B,IAAA;AACA,IAAA,IAAIR,WAAAA,CAAYS,SAAS,CAACF,IAAI,GAAG,CAAA,EAAG;QAClCH,YAAAA,CAAaK,SAAS,GAAG,EAAC;AAC5B,IAAA;IAEA,MAAMC,SAAAA,GAAY,IAAIC,gBAAAA,CACpB;QACEC,IAAAA,EAAM,mBAAA;QACNC,OAAAA,EAAS;KACX,EACA;AACET,QAAAA;AACF,KAAA,CAAA;;IAIF,MAAME,KAAAA,GAAQ,IAAIQ,4BAAAA,CAAgB;AAChCf,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYM,KAAK;AAC9BJ,QAAAA,OAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IACA,MAAMK,OAAAA,GAAU,IAAIO,gCAAAA,CAAkB;AACpChB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYQ;AAC3B,KAAA,CAAA;IACA,MAAMC,SAAAA,GAAY,IAAIO,oCAAAA,CAAoB;AACxCjB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYS;AAC3B,KAAA,CAAA;;AAGAH,IAAAA,KAAAA,CAAMW,IAAI,CAACP,SAAAA,CAAAA;AACXF,IAAAA,OAAAA,CAAQS,IAAI,CAACP,SAAAA,CAAAA;AACbD,IAAAA,SAAAA,CAAUQ,IAAI,CAACP,SAAAA,CAAAA;IAEfQ,qDAAAA,CAA2B;QACzBC,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF,SAAA;AACAT,QAAAA,WAAAA;AACAE,QAAAA,OAAAA;AACAD,QAAAA;AACF,KAAA,CAAA;IAEA,OAAO;AACLS,QAAAA,SAAAA;QACAS,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
@@ -1,10 +1,9 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
1
+ import { McpServer } from '@modelcontextprotocol/server';
2
2
  import { McpPromptRegistry } from '../prompt-registry.mjs';
3
3
  import { McpResourceRegistry } from '../resource-registry.mjs';
4
4
  import { McpToolRegistry } from '../tool-registry.mjs';
5
5
  import { syncMcpSessionCapabilities } from './syncMcpSessionCapabilities.mjs';
6
6
 
7
- // eslint-disable-next-line import/extensions
8
7
  const createMcpServerWithRegistries = ({ strapi, definitions, isDevMode, ability, user })=>{
9
8
  const capabilities = {
10
9
  logging: {}
@@ -1 +1 @@
1
- {"version":3,"file":"McpServerFactory.mjs","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpPromptRegistry } from '../prompt-registry';\nimport { McpResourceRegistry } from '../resource-registry';\nimport { McpToolRegistry } from '../tool-registry';\nimport type { McpAdminTokenAbility } from '../authentication';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\nimport type { McpCapabilityRegistryReadonly } from './McpCapabilityRegistry';\nimport { syncMcpSessionCapabilities } from './syncMcpSessionCapabilities';\n\nexport type McpCapabilityDefinitions = {\n tools: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n prompts: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n resources: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n};\n\nexport type McpRegistries = {\n tools: McpToolRegistry;\n prompts: McpPromptRegistry;\n resources: McpResourceRegistry;\n};\n\n/** Read-only registry surface exposed on McpServerWithRegistries. */\nexport type McpRegistriesReadonly = {\n tools: McpCapabilityRegistryReadonly;\n prompts: McpCapabilityRegistryReadonly;\n resources: McpCapabilityRegistryReadonly;\n};\n\nexport type McpServerWithRegistries = {\n mcpServer: McpServer;\n registries: McpRegistriesReadonly;\n};\n\nexport type CreateMcpServerWithRegistriesParams = {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitions;\n isDevMode: boolean;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n};\n\nexport const createMcpServerWithRegistries = ({\n strapi,\n definitions,\n isDevMode,\n ability,\n user,\n}: CreateMcpServerWithRegistriesParams): McpServerWithRegistries => {\n const capabilities: {\n logging?: Record<string, unknown>;\n tools?: Record<string, unknown>;\n prompts?: Record<string, unknown>;\n resources?: Record<string, unknown>;\n } = {\n logging: {},\n };\n // Advertise capability categories when definitions exist (server-level), not per-user enabled\n // count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.\n if (definitions.tools.size > 0) {\n capabilities.tools = {};\n }\n if (definitions.prompts.size > 0) {\n capabilities.prompts = {};\n }\n if (definitions.resources.size > 0) {\n capabilities.resources = {};\n }\n\n const mcpServer = new McpServer(\n {\n name: 'strapi-mcp-server',\n version: '1.0.0',\n },\n {\n capabilities,\n }\n );\n\n // Bootstrap registries with current definitions\n const tools = new McpToolRegistry({\n strapi,\n definitions: definitions.tools,\n ability,\n user,\n });\n const prompts = new McpPromptRegistry({\n strapi,\n definitions: definitions.prompts,\n });\n const resources = new McpResourceRegistry({\n strapi,\n definitions: definitions.resources,\n });\n\n // Register capabilities (disabled by default)\n tools.bind(mcpServer);\n prompts.bind(mcpServer);\n resources.bind(mcpServer);\n\n syncMcpSessionCapabilities({\n registries: {\n tools,\n prompts,\n resources,\n },\n definitions,\n ability,\n isDevMode,\n });\n\n return {\n mcpServer,\n registries: {\n tools,\n prompts,\n resources,\n },\n };\n};\n"],"names":["createMcpServerWithRegistries","strapi","definitions","isDevMode","ability","user","capabilities","logging","tools","size","prompts","resources","mcpServer","McpServer","name","version","McpToolRegistry","McpPromptRegistry","McpResourceRegistry","bind","syncMcpSessionCapabilities","registries"],"mappings":";;;;;;AAAA;AA2CO,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,MAAM,EACNC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,IAAI,EACgC,GAAA;AACpC,IAAA,MAAMC,YAAAA,GAKF;AACFC,QAAAA,OAAAA,EAAS;AACX,KAAA;;;AAGA,IAAA,IAAIL,WAAAA,CAAYM,KAAK,CAACC,IAAI,GAAG,CAAA,EAAG;QAC9BH,YAAAA,CAAaE,KAAK,GAAG,EAAC;AACxB,IAAA;AACA,IAAA,IAAIN,WAAAA,CAAYQ,OAAO,CAACD,IAAI,GAAG,CAAA,EAAG;QAChCH,YAAAA,CAAaI,OAAO,GAAG,EAAC;AAC1B,IAAA;AACA,IAAA,IAAIR,WAAAA,CAAYS,SAAS,CAACF,IAAI,GAAG,CAAA,EAAG;QAClCH,YAAAA,CAAaK,SAAS,GAAG,EAAC;AAC5B,IAAA;IAEA,MAAMC,SAAAA,GAAY,IAAIC,SAAAA,CACpB;QACEC,IAAAA,EAAM,mBAAA;QACNC,OAAAA,EAAS;KACX,EACA;AACET,QAAAA;AACF,KAAA,CAAA;;IAIF,MAAME,KAAAA,GAAQ,IAAIQ,eAAAA,CAAgB;AAChCf,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYM,KAAK;AAC9BJ,QAAAA,OAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IACA,MAAMK,OAAAA,GAAU,IAAIO,iBAAAA,CAAkB;AACpChB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYQ;AAC3B,KAAA,CAAA;IACA,MAAMC,SAAAA,GAAY,IAAIO,mBAAAA,CAAoB;AACxCjB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYS;AAC3B,KAAA,CAAA;;AAGAH,IAAAA,KAAAA,CAAMW,IAAI,CAACP,SAAAA,CAAAA;AACXF,IAAAA,OAAAA,CAAQS,IAAI,CAACP,SAAAA,CAAAA;AACbD,IAAAA,SAAAA,CAAUQ,IAAI,CAACP,SAAAA,CAAAA;IAEfQ,0BAAAA,CAA2B;QACzBC,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF,SAAA;AACAT,QAAAA,WAAAA;AACAE,QAAAA,OAAAA;AACAD,QAAAA;AACF,KAAA,CAAA;IAEA,OAAO;AACLS,QAAAA,SAAAA;QACAS,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"McpServerFactory.mjs","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"sourcesContent":["import { McpServer, type ServerCapabilities } from '@modelcontextprotocol/server';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpPromptRegistry } from '../prompt-registry';\nimport { McpResourceRegistry } from '../resource-registry';\nimport { McpToolRegistry } from '../tool-registry';\nimport type { McpAdminTokenAbility } from '../authentication';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\nimport type { McpCapabilityRegistryReadonly } from './McpCapabilityRegistry';\nimport { syncMcpSessionCapabilities } from './syncMcpSessionCapabilities';\n\nexport type McpCapabilityDefinitions = {\n tools: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n prompts: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n resources: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n};\n\nexport type McpRegistries = {\n tools: McpToolRegistry;\n prompts: McpPromptRegistry;\n resources: McpResourceRegistry;\n};\n\n/** Read-only registry surface exposed on McpServerWithRegistries. */\nexport type McpRegistriesReadonly = {\n tools: McpCapabilityRegistryReadonly;\n prompts: McpCapabilityRegistryReadonly;\n resources: McpCapabilityRegistryReadonly;\n};\n\nexport type McpServerWithRegistries = {\n mcpServer: McpServer;\n registries: McpRegistriesReadonly;\n};\n\nexport type CreateMcpServerWithRegistriesParams = {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitions;\n isDevMode: boolean;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n};\n\nexport const createMcpServerWithRegistries = ({\n strapi,\n definitions,\n isDevMode,\n ability,\n user,\n}: CreateMcpServerWithRegistriesParams): McpServerWithRegistries => {\n const capabilities: ServerCapabilities = {\n logging: {},\n };\n // Advertise capability categories when definitions exist (server-level), not per-user enabled\n // count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.\n if (definitions.tools.size > 0) {\n capabilities.tools = {};\n }\n if (definitions.prompts.size > 0) {\n capabilities.prompts = {};\n }\n if (definitions.resources.size > 0) {\n capabilities.resources = {};\n }\n\n const mcpServer = new McpServer(\n {\n name: 'strapi-mcp-server',\n version: '1.0.0',\n },\n {\n capabilities,\n }\n );\n\n // Bootstrap registries with current definitions\n const tools = new McpToolRegistry({\n strapi,\n definitions: definitions.tools,\n ability,\n user,\n });\n const prompts = new McpPromptRegistry({\n strapi,\n definitions: definitions.prompts,\n });\n const resources = new McpResourceRegistry({\n strapi,\n definitions: definitions.resources,\n });\n\n // Register capabilities (disabled by default)\n tools.bind(mcpServer);\n prompts.bind(mcpServer);\n resources.bind(mcpServer);\n\n syncMcpSessionCapabilities({\n registries: {\n tools,\n prompts,\n resources,\n },\n definitions,\n ability,\n isDevMode,\n });\n\n return {\n mcpServer,\n registries: {\n tools,\n prompts,\n resources,\n },\n };\n};\n"],"names":["createMcpServerWithRegistries","strapi","definitions","isDevMode","ability","user","capabilities","logging","tools","size","prompts","resources","mcpServer","McpServer","name","version","McpToolRegistry","McpPromptRegistry","McpResourceRegistry","bind","syncMcpSessionCapabilities","registries"],"mappings":";;;;;;AA0CO,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,MAAM,EACNC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,IAAI,EACgC,GAAA;AACpC,IAAA,MAAMC,YAAAA,GAAmC;AACvCC,QAAAA,OAAAA,EAAS;AACX,KAAA;;;AAGA,IAAA,IAAIL,WAAAA,CAAYM,KAAK,CAACC,IAAI,GAAG,CAAA,EAAG;QAC9BH,YAAAA,CAAaE,KAAK,GAAG,EAAC;AACxB,IAAA;AACA,IAAA,IAAIN,WAAAA,CAAYQ,OAAO,CAACD,IAAI,GAAG,CAAA,EAAG;QAChCH,YAAAA,CAAaI,OAAO,GAAG,EAAC;AAC1B,IAAA;AACA,IAAA,IAAIR,WAAAA,CAAYS,SAAS,CAACF,IAAI,GAAG,CAAA,EAAG;QAClCH,YAAAA,CAAaK,SAAS,GAAG,EAAC;AAC5B,IAAA;IAEA,MAAMC,SAAAA,GAAY,IAAIC,SAAAA,CACpB;QACEC,IAAAA,EAAM,mBAAA;QACNC,OAAAA,EAAS;KACX,EACA;AACET,QAAAA;AACF,KAAA,CAAA;;IAIF,MAAME,KAAAA,GAAQ,IAAIQ,eAAAA,CAAgB;AAChCf,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYM,KAAK;AAC9BJ,QAAAA,OAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IACA,MAAMK,OAAAA,GAAU,IAAIO,iBAAAA,CAAkB;AACpChB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYQ;AAC3B,KAAA,CAAA;IACA,MAAMC,SAAAA,GAAY,IAAIO,mBAAAA,CAAoB;AACxCjB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYS;AAC3B,KAAA,CAAA;;AAGAH,IAAAA,KAAAA,CAAMW,IAAI,CAACP,SAAAA,CAAAA;AACXF,IAAAA,OAAAA,CAAQS,IAAI,CAACP,SAAAA,CAAAA;AACbD,IAAAA,SAAAA,CAAUQ,IAAI,CAACP,SAAAA,CAAAA;IAEfQ,0BAAAA,CAA2B;QACzBC,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF,SAAA;AACAT,QAAAA,WAAAA;AACAE,QAAAA,OAAAA;AACAD,QAAAA;AACF,KAAA,CAAA;IAEA,OAAO;AACLS,QAAAA,SAAAA;QACAS,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
@@ -1,4 +1,4 @@
1
- import type { McpServer, RegisteredPrompt } from '@modelcontextprotocol/sdk/server/mcp.js';
1
+ import type { McpServer, RegisteredPrompt } from '@modelcontextprotocol/server';
2
2
  import type { Core, Modules } from '@strapi/types';
3
3
  import { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';
4
4
  import { type McpCapabilityRegistry, McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry';
@@ -1 +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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,uBAAuB,EACR,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAEzD,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"}
1
+ {"version":3,"file":"prompt-registry.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/prompt-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAiB,MAAM,8BAA8B,CAAC;AAC/F,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;AAM1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,uBAAuB,EACR,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAEzD,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;CAoF1B"}
@@ -3,8 +3,9 @@
3
3
  var McpCapabilityRegistry = require('./internal/McpCapabilityRegistry.js');
4
4
  var createSafeCapabilityRegistration = require('./utils/createSafeCapabilityRegistration.js');
5
5
  var wrapCapabilityHandlerForMetrics = require('./metrics/wrapCapabilityHandlerForMetrics.js');
6
+ var createMcpCapabilityHandlerContext = require('./utils/createMcpCapabilityHandlerContext.js');
7
+ var toSdkMcpCapabilityResult = require('./utils/toSdkMcpCapabilityResult.js');
6
8
 
7
- // eslint-disable-next-line import/extensions
8
9
  function _class_private_field_loose_base(receiver, privateKey) {
9
10
  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
10
11
  throw new TypeError("attempted to use private field on non-instance");
@@ -83,13 +84,26 @@ class McpPromptRegistry extends McpCapabilityRegistry.McpCapabilityRegistryBase
83
84
  };
84
85
  },
85
86
  registerWithSdk (safeHandler) {
86
- const sdkHandler = wrapCapabilityHandlerForMetrics.wrapCapabilityHandlerForMetrics(strapi, 'prompt', name, definition.telemetry, safeHandler);
87
+ if (argsSchema === undefined) {
88
+ const handler = safeHandler;
89
+ const sdkHandler = wrapCapabilityHandlerForMetrics.wrapCapabilityHandlerForMetrics(strapi, 'prompt', name, definition.telemetry, async (context)=>toSdkMcpCapabilityResult.toSdkPromptResult(await handler(context)));
90
+ return mcpServer.registerPrompt(name, {
91
+ title,
92
+ description
93
+ }, (argsOrContext, context)=>{
94
+ // The SDK types omit the no-schema callback overload, but the runtime passes only
95
+ // ServerContext when argsSchema is absent.
96
+ const sdkContext = context ?? argsOrContext;
97
+ return sdkHandler(createMcpCapabilityHandlerContext.createMcpCapabilityHandlerContext(sdkContext));
98
+ });
99
+ }
100
+ const handler = safeHandler;
101
+ const sdkHandler = wrapCapabilityHandlerForMetrics.wrapCapabilityHandlerForMetrics(strapi, 'prompt', name, definition.telemetry, async (args, context)=>toSdkMcpCapabilityResult.toSdkPromptResult(await handler(args, context)));
87
102
  return mcpServer.registerPrompt(name, {
88
103
  title,
89
104
  description,
90
- // @ts-expect-error - Internal handler type mismatch due to optional argsSchema
91
105
  argsSchema
92
- }, sdkHandler);
106
+ }, (args, context)=>sdkHandler(args, createMcpCapabilityHandlerContext.createMcpCapabilityHandlerContext(context)));
93
107
  }
94
108
  });
95
109
  });
@@ -1 +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\n/**\n * Defines a Strapi MCP prompt with full type inference, ready to pass to\n * `strapi.ai.mcp.registerPrompt()`. Exposed publicly as `ai.mcp.definePrompt`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name`/`argsSchema` and narrow the access variant (`devModeOnly` vs\n * `auth`) so the result is directly assignable to `registerPrompt`.\n *\n * @param prompt - The prompt definition. Provide either `devModeOnly: true`\n * (dev-only, no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n *\n * const context = ai.mcp.definePrompt({\n * name: 'app-context',\n * title: 'App Context',\n * description: 'Provides context about the app',\n * devModeOnly: true,\n * createHandler: (strapi) => async () => ({\n * messages: [{ role: 'user', content: { type: 'text', text: 'You are connected to Strapi.' } }],\n * }),\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerPrompt(context);\n * ```\n */\nexport const makeMcpPromptDefinition = ((definition: Modules.MCP.McpPromptDefinition) =>\n definition) as unknown as Modules.MCP.McpPromptBuilder;\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":["makeMcpPromptDefinition","definition","McpPromptRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","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;;;;;;;;;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BC,IACM,MAAMA,uBAAAA,GAA2B,CAACC,aACvCA;AAMA,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AAJK,MAAMC,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,CAACN,UAAAA,GAAAA;YACd,MAAM,EAAEO,IAAI,EAAEC,KAAK,EAAEC,WAAW,EAAEC,UAAU,EAAEC,aAAa,EAAE,GAAGX,UAAAA;AAEhE,YAAA,OAAOY,iEAAAA,CAAiC;AACtCP,gBAAAA,MAAAA;gBACAQ,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,CACjBtB,MAAAA,EACA,UACAE,IAAAA,EACAP,UAAAA,CAAW4B,SAAS,EACpBH,WAAAA,CAAAA;oBAGF,OAAOrB,SAAAA,CAAUyB,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,IAAIzB,MAAM;AAC3B,IAAA;AA8DF;;;;;"}
1
+ {"version":3,"file":"prompt-registry.js","sources":["../../../src/services/mcp/prompt-registry.ts"],"sourcesContent":["import type { McpServer, RegisteredPrompt, ServerContext } from '@modelcontextprotocol/server';\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';\nimport { createMcpCapabilityHandlerContext } from './utils/createMcpCapabilityHandlerContext';\nimport { toSdkPromptResult } from './utils/toSdkMcpCapabilityResult';\n\n/**\n * Defines a Strapi MCP prompt with full type inference, ready to pass to\n * `strapi.ai.mcp.registerPrompt()`. Exposed publicly as `ai.mcp.definePrompt`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name`/`argsSchema` and narrow the access variant (`devModeOnly` vs\n * `auth`) so the result is directly assignable to `registerPrompt`.\n *\n * @param prompt - The prompt definition. Provide either `devModeOnly: true`\n * (dev-only, no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n *\n * const context = ai.mcp.definePrompt({\n * name: 'app-context',\n * title: 'App Context',\n * description: 'Provides context about the app',\n * devModeOnly: true,\n * createHandler: (strapi) => async () => ({\n * messages: [{ role: 'user', content: { type: 'text', text: 'You are connected to Strapi.' } }],\n * }),\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerPrompt(context);\n * ```\n */\nexport const makeMcpPromptDefinition = ((definition: Modules.MCP.McpPromptDefinition) =>\n definition) as unknown as Modules.MCP.McpPromptBuilder;\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 if (argsSchema === undefined) {\n const handler = safeHandler as unknown as Modules.MCP.McpPromptCallback<undefined>;\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'prompt',\n name,\n definition.telemetry,\n async (context: Modules.MCP.McpCapabilityHandlerContext) =>\n toSdkPromptResult(await handler(context))\n );\n\n return mcpServer.registerPrompt(\n name,\n { title, description },\n (argsOrContext: unknown, context?: ServerContext) => {\n // The SDK types omit the no-schema callback overload, but the runtime passes only\n // ServerContext when argsSchema is absent.\n const sdkContext = context ?? (argsOrContext as ServerContext);\n return sdkHandler(createMcpCapabilityHandlerContext(sdkContext));\n }\n );\n }\n\n const handler = safeHandler as unknown as Modules.MCP.McpPromptCallback<\n typeof argsSchema\n >;\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'prompt',\n name,\n definition.telemetry,\n async (\n args: Parameters<typeof handler>[0],\n context: Modules.MCP.McpCapabilityHandlerContext\n ) => toSdkPromptResult(await handler(args, context))\n );\n\n return mcpServer.registerPrompt(\n name,\n { title, description, argsSchema },\n (args, context) => sdkHandler(args, createMcpCapabilityHandlerContext(context))\n );\n },\n });\n });\n }\n}\n"],"names":["makeMcpPromptDefinition","definition","McpPromptRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","title","description","argsSchema","createHandler","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","messages","role","content","type","text","createErrorResult","error","message","registerWithSdk","safeHandler","undefined","handler","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","context","toSdkPromptResult","registerPrompt","argsOrContext","sdkContext","createMcpCapabilityHandlerContext","args","ctx","definitions"],"mappings":"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"}