@strapi/core 5.52.3 → 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.
- package/dist/container.d.ts +1 -0
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +3 -0
- package/dist/container.js.map +1 -1
- package/dist/container.mjs +3 -0
- package/dist/container.mjs.map +1 -1
- package/dist/core-api/controller/single-type.d.ts.map +1 -1
- package/dist/core-api/controller/single-type.js +7 -4
- package/dist/core-api/controller/single-type.js.map +1 -1
- package/dist/core-api/controller/single-type.mjs +7 -4
- package/dist/core-api/controller/single-type.mjs.map +1 -1
- package/dist/package.json.js +19 -15
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +19 -15
- package/dist/package.json.mjs.map +1 -1
- package/dist/services/document-service/transform/query.d.ts.map +1 -1
- package/dist/services/document-service/transform/query.js +4 -2
- package/dist/services/document-service/transform/query.js.map +1 -1
- package/dist/services/document-service/transform/query.mjs +4 -2
- package/dist/services/document-service/transform/query.mjs.map +1 -1
- package/dist/services/entity-validator/blocks-validator.d.ts.map +1 -1
- package/dist/services/entity-validator/blocks-validator.js +9 -3
- package/dist/services/entity-validator/blocks-validator.js.map +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs +9 -3
- package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
- package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -1
- package/dist/services/mcp/handlers/handlePost.js +2 -3
- package/dist/services/mcp/handlers/handlePost.js.map +1 -1
- package/dist/services/mcp/handlers/handlePost.mjs +2 -3
- package/dist/services/mcp/handlers/handlePost.mjs.map +1 -1
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +1 -1
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -1
- package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -1
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -1
- package/dist/services/mcp/internal/McpServerFactory.d.ts +1 -1
- package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -1
- package/dist/services/mcp/internal/McpServerFactory.js +2 -3
- package/dist/services/mcp/internal/McpServerFactory.js.map +1 -1
- package/dist/services/mcp/internal/McpServerFactory.mjs +1 -2
- package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -1
- package/dist/services/mcp/prompt-registry.d.ts +1 -1
- package/dist/services/mcp/prompt-registry.d.ts.map +1 -1
- package/dist/services/mcp/prompt-registry.js +18 -4
- package/dist/services/mcp/prompt-registry.js.map +1 -1
- package/dist/services/mcp/prompt-registry.mjs +18 -4
- package/dist/services/mcp/prompt-registry.mjs.map +1 -1
- package/dist/services/mcp/resource-registry.d.ts +1 -1
- package/dist/services/mcp/resource-registry.d.ts.map +1 -1
- package/dist/services/mcp/resource-registry.js +4 -2
- package/dist/services/mcp/resource-registry.js.map +1 -1
- package/dist/services/mcp/resource-registry.mjs +4 -2
- package/dist/services/mcp/resource-registry.mjs.map +1 -1
- package/dist/services/mcp/tool-registry.d.ts +1 -1
- package/dist/services/mcp/tool-registry.d.ts.map +1 -1
- package/dist/services/mcp/tool-registry.js +18 -11
- package/dist/services/mcp/tool-registry.js.map +1 -1
- package/dist/services/mcp/tool-registry.mjs +18 -11
- package/dist/services/mcp/tool-registry.mjs.map +1 -1
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.d.ts +7 -0
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.d.ts.map +1 -0
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.js +29 -0
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.js.map +1 -0
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.mjs +27 -0
- package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.mjs.map +1 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.d.ts +18 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.d.ts.map +1 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.js +137 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.js.map +1 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.mjs +131 -0
- package/dist/services/mcp/utils/toSdkMcpCapabilityResult.mjs.map +1 -0
- package/dist/services/session-manager.d.ts.map +1 -1
- package/dist/services/session-manager.js +5 -0
- package/dist/services/session-manager.js.map +1 -1
- package/dist/services/session-manager.mjs +5 -0
- package/dist/services/session-manager.mjs.map +1 -1
- 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":"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"}
|
|
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":";;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,sBAAAA,GAAyB,IAAIC,GAAAA,CAAI;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,SAAA;AAAW,IAAA;AAAO,CAAA,CAAA;AAErF,MAAMC,iBAAiB,CAACC,IAAAA,GAAAA;IACtB,IAAI;QACF,MAAMC,GAAAA,GAAM,IAAIC,GAAAA,CAAIF,IAAAA,CAAKG,UAAU,CAAC,GAAA,CAAA,GAAO,CAAC,iBAAiB,EAAEH,IAAAA,CAAAA,CAAM,GAAGA,IAAAA,CAAAA;AAExE,QAAA,OAAOH,sBAAAA,CAAuBO,GAAG,CAACH,GAAAA,CAAII,QAAQ,CAAA;AAChD,IAAA,CAAA,CAAE,OAAM;QACN,OAAO,KAAA;AACT,IAAA;AACF,CAAA;AAEA,MAAMC,iBAAAA,GAAoBxB,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;IAC5Ca,GAAAA,EAAKnB,GAAAA,CACFI,MAAM,EAAA,CACNI,IAAI,CAAC,eAAe,8BAAA,EAAgC,CAACiB,KAAAA,GAAUR,cAAAA,CAAeQ,KAAAA,IAAS,EAAA,CAAA,CAAA;AAC1FC,IAAAA,QAAAA,EAAU1B,IAAI2B,KAAK,EAAA,CAAGC,EAAE,CAAC7B,mBAAmBO,QAAQ;AACtD,CAAA,CAAA;AAEA;AACA,MAAMuB,mBAAAA,GAA2B7B,GAAAA,CAAI8B,IAAI,CAAC,CAACL,KAAAA,GAAAA;AACzC,IAAA,OAAQA,MAAMtB,IAAI;QAChB,KAAK,MAAA;YACH,OAAOJ,iBAAAA;QACT,KAAK,MAAA;YACH,OAAOyB,iBAAAA;AACT,QAAA;AACE,YAAA,OAAOxB,IAAI+B,KAAK,EAAA,CAAGvB,IAAI,CAAC,gBAAgB,kCAAA,EAAoC,IAAA;gBAC1E,OAAO,KAAA;AACT,YAAA,CAAA,CAAA;AACJ;AACF,CAAA,CAAA;AAEA,MAAMwB,sBAAAA,GAAyBhC,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;IACjDoB,QAAAA,EAAU1B,GAAAA,CACP2B,KAAK,EAAA,CACLC,EAAE,CAACC,qBACHI,GAAG,CAAC,CAAA,EAAG,kEAAA,CAAA,CACP3B,QAAQ;AACb,CAAA,CAAA;AAEA,MAAM4B,oBAAAA,GAAuBlC,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/C6B,IAAAA,KAAAA,EAAOnC,GAAAA,CAAIoC,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,CAAE/B,QAAQ,EAAA;IACtDoB,QAAAA,EAAU1B,GAAAA,CACP2B,KAAK,EAAA,CACLC,EAAE,CAACC,qBACHI,GAAG,CAAC,CAAA,EAAG,gEAAA,CAAA,CACP3B,QAAQ;AACb,CAAA,CAAA;AAEA,MAAMgC,kBAAAA,GAAqBtC,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;IAC7CoB,QAAAA,EAAU1B,GAAAA,CACP2B,KAAK,EAAA,CACLC,EAAE,CAACC,qBACHI,GAAG,CAAC,CAAA,EAAG,8DAAA,CAAA,CACP3B,QAAQ;AACb,CAAA,CAAA;AAEA,MAAMiC,kBAAAA,GAAqBvC,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;IAC5CkC,QAAAA,EAAUxC,GAAAA,CAAII,MAAM,EAAA,CAAGqC,QAAQ,EAAA;IAC/Bf,QAAAA,EAAU1B,GAAAA,CACP2B,KAAK,EAAA,CACLC,EAAE,CAAC7B,mBACHkC,GAAG,CAAC,CAAA,EAAG,8DAAA,CAAA,CACP3B,QAAQ;AACb,CAAA,CAAA;AAEA,MAAMoC,YAAAA,GAAe1C,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;AACjDoB,IAAAA,QAAAA,EAAU1B,IAAI2B,KAAK,EAAA,CAAGC,EAAE,CAACC,qBAAqBvB,QAAQ;AACxD,CAAA,CAAA;AAEA;AACA;AACA,MAAMqC,qBAAAA,GAAwB3C,GAAAA,CAAI8B,IAAI,CAAC,CAACL,KAAAA,GAAAA;AACtC,IAAA,OAAQA,MAAMtB,IAAI;QAChB,KAAK,MAAA;YACH,OAAOyC,iBAAAA;QACT,KAAK,WAAA;YACH,OAAOF,YAAAA;AACT,QAAA;AACE,YAAA,OAAO1C,IAAI+B,KAAK,EAAA,CAAGvB,IAAI,CAAC,gBAAgB,uCAAA,EAAyC,IAAA;gBAC/E,OAAO,KAAA;AACT,YAAA,CAAA,CAAA;AACJ;AACF,CAAA,CAAA;AAEA;AACA,MAAMoC,iBAAAA,GAAoB5C,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;AAC5CuC,IAAAA,MAAAA,EAAQ7C,GAAAA,CAAII,MAAM,EAAA,CAAGC,MAAM,CAAC;AAAC,QAAA,SAAA;AAAW,QAAA;AAAY,KAAA,CAAA,CAAEC,QAAQ,EAAA;IAC9DoB,QAAAA,EAAU1B,GAAAA,CACP2B,KAAK,EAAA,CACLC,EAAE,CAACe,uBACHV,GAAG,CAAC,CAAA,EAAG,gEAAA,CAAA,CACP3B,QAAQ;AACb,CAAA,CAAA;AAEA,MAAMwC,kBAAAA,GAAqB9C,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;AAC7CyC,IAAAA,KAAAA,EAAO/C,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;QACxB8C,IAAAA,EAAMhD,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC3B2C,eAAAA,EAAiBjD,GAAAA,CAAII,MAAM,EAAA,CAAGqC,QAAQ,EAAA;QACtCtB,GAAAA,EAAKnB,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC1B4C,OAAAA,EAASlD,GAAAA,CAAII,MAAM,EAAA,CAAGqC,QAAQ,EAAA;QAC9BU,KAAAA,EAAOnD,GAAAA,CAAIoC,MAAM,EAAA,CAAG9B,QAAQ,EAAA;QAC5B8C,MAAAA,EAAQpD,GAAAA,CAAIoC,MAAM,EAAA,CAAG9B,QAAQ,EAAA;QAC7B+C,OAAAA,EAASrD,GAAAA,CAAIC,MAAM,EAAA,CAAGwC,QAAQ,EAAA;QAC9Ba,IAAAA,EAAMtD,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC3BiD,GAAAA,EAAKvD,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC1BkD,IAAAA,EAAMxD,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC3BmD,IAAAA,EAAMzD,GAAAA,CAAIoC,MAAM,EAAA,CAAG9B,QAAQ,EAAA;QAC3BoD,UAAAA,EAAY1D,GAAAA,CAAII,MAAM,EAAA,CAAGqC,QAAQ,EAAA;QACjCkB,QAAAA,EAAU3D,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAC/BsD,iBAAAA,EAAmB5D,GAAAA,CAAI+B,KAAK,EAAA,CAAGU,QAAQ,EAAA;QACvCoB,SAAAA,EAAW7D,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ,EAAA;QAChCwD,SAAAA,EAAW9D,GAAAA,CAAII,MAAM,EAAA,CAAGE,QAAQ;AAClC,KAAA,CAAA;AACAoB,IAAAA,QAAAA,EAAU1B,IAAI2B,KAAK,EAAA,CAAGC,EAAE,CAACC,qBAAqBvB,QAAQ;AACxD,CAAA,CAAA;AAEA;AACA,MAAMyD,kBAAAA,GAA0B/D,GAAAA,CAAI8B,IAAI,CAAC,CAACL,KAAAA,GAAAA;AACxC,IAAA,OAAQA,MAAMtB,IAAI;QAChB,KAAK,WAAA;YACH,OAAO6B,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,OAAOvC,IAAI+B,KAAK,EAAA,CAAGvB,IAAI,CAAC,gBAAgB,+BAAA,EAAiC,IAAA;gBACvE,OAAO,KAAA;AACT,YAAA,CAAA,CAAA;AACJ;AACF,CAAA,CAAA;AAEA,MAAMwD,qBAAAA,GAAwBhE,GAAAA,CAAI2B,KAAK,EAAA,CAAGC,EAAE,CAACmC,kBAAAA,CAAAA;AAEtC,MAAME,eAAAA,GAAkB,IAAMD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePost.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/handlers/handlePost.ts"],"names":[],"mappings":"
|
|
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
|
|
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
|
|
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":["
|
|
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 {
|
|
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
|
|
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":["
|
|
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/
|
|
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;
|
|
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';\
|
|
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';\
|
|
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":";;;;;;;;;;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,4 +1,4 @@
|
|
|
1
|
-
import { McpServer } from '@modelcontextprotocol/
|
|
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":"
|
|
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
|
|
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
|
|
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":["
|
|
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/
|
|
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":["
|
|
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/
|
|
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":"
|
|
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
|
-
|
|
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":["
|
|
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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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry.mjs';
|
|
2
2
|
import { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration.mjs';
|
|
3
3
|
import { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics.mjs';
|
|
4
|
+
import { createMcpCapabilityHandlerContext } from './utils/createMcpCapabilityHandlerContext.mjs';
|
|
5
|
+
import { toSdkPromptResult } from './utils/toSdkMcpCapabilityResult.mjs';
|
|
4
6
|
|
|
5
|
-
// eslint-disable-next-line import/extensions
|
|
6
7
|
function _class_private_field_loose_base(receiver, privateKey) {
|
|
7
8
|
if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
|
|
8
9
|
throw new TypeError("attempted to use private field on non-instance");
|
|
@@ -81,13 +82,26 @@ class McpPromptRegistry extends McpCapabilityRegistryBase {
|
|
|
81
82
|
};
|
|
82
83
|
},
|
|
83
84
|
registerWithSdk (safeHandler) {
|
|
84
|
-
|
|
85
|
+
if (argsSchema === undefined) {
|
|
86
|
+
const handler = safeHandler;
|
|
87
|
+
const sdkHandler = wrapCapabilityHandlerForMetrics(strapi, 'prompt', name, definition.telemetry, async (context)=>toSdkPromptResult(await handler(context)));
|
|
88
|
+
return mcpServer.registerPrompt(name, {
|
|
89
|
+
title,
|
|
90
|
+
description
|
|
91
|
+
}, (argsOrContext, context)=>{
|
|
92
|
+
// The SDK types omit the no-schema callback overload, but the runtime passes only
|
|
93
|
+
// ServerContext when argsSchema is absent.
|
|
94
|
+
const sdkContext = context ?? argsOrContext;
|
|
95
|
+
return sdkHandler(createMcpCapabilityHandlerContext(sdkContext));
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const handler = safeHandler;
|
|
99
|
+
const sdkHandler = wrapCapabilityHandlerForMetrics(strapi, 'prompt', name, definition.telemetry, async (args, context)=>toSdkPromptResult(await handler(args, context)));
|
|
85
100
|
return mcpServer.registerPrompt(name, {
|
|
86
101
|
title,
|
|
87
102
|
description,
|
|
88
|
-
// @ts-expect-error - Internal handler type mismatch due to optional argsSchema
|
|
89
103
|
argsSchema
|
|
90
|
-
}, sdkHandler);
|
|
104
|
+
}, (args, context)=>sdkHandler(args, createMcpCapabilityHandlerContext(context)));
|
|
91
105
|
}
|
|
92
106
|
});
|
|
93
107
|
});
|