@strapi/content-manager 5.48.0 → 5.49.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 (331) hide show
  1. package/dist/admin/components/ActionsDrawer.js +3 -2
  2. package/dist/admin/components/ActionsDrawer.js.map +1 -1
  3. package/dist/admin/components/ComponentIcon.js +4 -3
  4. package/dist/admin/components/ComponentIcon.js.map +1 -1
  5. package/dist/admin/components/ConfigurationForm/EditFieldForm.js +3 -2
  6. package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -1
  7. package/dist/admin/components/ConfigurationForm/Fields.js +3 -2
  8. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  9. package/dist/admin/components/ConfigurationForm/Form.js +7 -3
  10. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  11. package/dist/admin/components/LeftMenu.js +3 -2
  12. package/dist/admin/components/LeftMenu.js.map +1 -1
  13. package/dist/admin/components/RelativeTime.js +3 -2
  14. package/dist/admin/components/RelativeTime.js.map +1 -1
  15. package/dist/admin/components/Widgets.js +3 -2
  16. package/dist/admin/components/Widgets.js.map +1 -1
  17. package/dist/admin/features/DocumentRBAC.js +12 -3
  18. package/dist/admin/features/DocumentRBAC.js.map +1 -1
  19. package/dist/admin/features/DocumentRBAC.mjs +9 -1
  20. package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
  21. package/dist/admin/history/components/VersionContent.js +7 -3
  22. package/dist/admin/history/components/VersionContent.js.map +1 -1
  23. package/dist/admin/history/components/VersionHeader.js +3 -2
  24. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  25. package/dist/admin/history/components/VersionInputRenderer.js +3 -2
  26. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  27. package/dist/admin/history/pages/History.js +3 -2
  28. package/dist/admin/history/pages/History.js.map +1 -1
  29. package/dist/admin/history/routes.js +3 -2
  30. package/dist/admin/history/routes.js.map +1 -1
  31. package/dist/admin/hooks/useContentTypeSchema.js +40 -19
  32. package/dist/admin/hooks/useContentTypeSchema.js.map +1 -1
  33. package/dist/admin/hooks/useContentTypeSchema.mjs +37 -17
  34. package/dist/admin/hooks/useContentTypeSchema.mjs.map +1 -1
  35. package/dist/admin/hooks/useDocument.js +3 -2
  36. package/dist/admin/hooks/useDocument.js.map +1 -1
  37. package/dist/admin/hooks/useDocumentActions.js +3 -2
  38. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  39. package/dist/admin/hooks/useDocumentContext.js +3 -2
  40. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  41. package/dist/admin/hooks/useDocumentLayout.js +46 -6
  42. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  43. package/dist/admin/hooks/useDocumentLayout.mjs +43 -4
  44. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
  45. package/dist/admin/hooks/useDragAndDrop.js +3 -2
  46. package/dist/admin/hooks/useDragAndDrop.js.map +1 -1
  47. package/dist/admin/hooks/useKeyboardDragAndDrop.js +3 -2
  48. package/dist/admin/hooks/useKeyboardDragAndDrop.js.map +1 -1
  49. package/dist/admin/hooks/useOnce.js +3 -2
  50. package/dist/admin/hooks/useOnce.js.map +1 -1
  51. package/dist/admin/hooks/usePersistentQueryParams.js +7 -2
  52. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  53. package/dist/admin/pages/ComponentConfigurationPage.js +9 -5
  54. package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
  55. package/dist/admin/pages/ComponentConfigurationPage.mjs +6 -3
  56. package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
  57. package/dist/admin/pages/EditConfigurationPage.js +3 -2
  58. package/dist/admin/pages/EditConfigurationPage.js.map +1 -1
  59. package/dist/admin/pages/EditView/EditViewPage.js +3 -2
  60. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  61. package/dist/admin/pages/EditView/components/DocumentActions.js +80 -39
  62. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/DocumentActions.mjs +67 -33
  64. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js +3 -2
  66. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +4 -3
  68. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +3 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +3 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +8 -4
  74. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +5 -2
  76. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +3 -2
  78. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js +3 -2
  80. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js.map +1 -1
  81. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +4 -3
  82. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +3 -2
  84. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +3 -2
  86. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +3 -2
  88. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +14 -4
  90. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +11 -2
  92. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +16 -7
  94. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +9 -4
  96. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +3 -2
  98. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +7 -3
  100. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/UID.js +3 -2
  102. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +8 -4
  104. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js +3 -2
  106. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js +5 -28
  108. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
  109. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs +2 -26
  110. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs.map +1 -1
  111. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js +5 -1
  112. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js.map +1 -1
  113. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js +15 -2
  114. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js.map +1 -1
  115. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js +76 -0
  116. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js.map +1 -0
  117. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs +70 -0
  118. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs.map +1 -0
  119. package/dist/admin/pages/EditView/components/FormLayout.js +3 -2
  120. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  121. package/dist/admin/pages/EditView/components/Header.js +3 -2
  122. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  123. package/dist/admin/pages/EditView/components/InputRenderer.js +3 -2
  124. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  125. package/dist/admin/pages/EditView/components/Panels.js +3 -2
  126. package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
  127. package/dist/admin/pages/EditView/utils/data.js +5 -1
  128. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  129. package/dist/admin/pages/EditView/utils/keyboardShortcuts.js +35 -0
  130. package/dist/admin/pages/EditView/utils/keyboardShortcuts.js.map +1 -0
  131. package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs +33 -0
  132. package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs.map +1 -0
  133. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +7 -10
  134. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  135. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +5 -9
  136. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  137. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +3 -2
  138. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  139. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +3 -2
  140. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
  141. package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -2
  142. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
  143. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +9 -12
  144. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
  145. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +6 -10
  146. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
  147. package/dist/admin/pages/ListView/ListViewPage.js +3 -2
  148. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  149. package/dist/admin/pages/ListView/components/BulkActions/Actions.js +3 -2
  150. package/dist/admin/pages/ListView/components/BulkActions/Actions.js.map +1 -1
  151. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +3 -2
  152. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  153. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +3 -2
  154. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  155. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  156. package/dist/admin/pages/ListView/components/Filters.js +10 -11
  157. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  158. package/dist/admin/pages/ListView/components/Filters.mjs +7 -9
  159. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  160. package/dist/admin/pages/ListView/components/TableActions.js +3 -2
  161. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  162. package/dist/admin/pages/ListView/components/TableCells/CellContent.js +7 -3
  163. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
  164. package/dist/admin/pages/ListView/components/TableCells/CellValue.js +7 -2
  165. package/dist/admin/pages/ListView/components/TableCells/CellValue.js.map +1 -1
  166. package/dist/admin/pages/ListView/components/TableCells/Media.js +5 -4
  167. package/dist/admin/pages/ListView/components/TableCells/Media.js.map +1 -1
  168. package/dist/admin/pages/ListView/components/TableCells/Media.mjs +5 -4
  169. package/dist/admin/pages/ListView/components/TableCells/Media.mjs.map +1 -1
  170. package/dist/admin/pages/ListView/components/TableCells/Relations.js +3 -2
  171. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  172. package/dist/admin/pages/formatComponentConfigurationEditLayout.js +15 -9
  173. package/dist/admin/pages/formatComponentConfigurationEditLayout.js.map +1 -1
  174. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs +15 -9
  175. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs.map +1 -1
  176. package/dist/admin/preview/components/InputPopover.js +3 -2
  177. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  178. package/dist/admin/preview/hooks/usePreviewInputManager.js +3 -2
  179. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
  180. package/dist/admin/preview/pages/Preview.js +3 -2
  181. package/dist/admin/preview/pages/Preview.js.map +1 -1
  182. package/dist/admin/preview/routes.js +3 -2
  183. package/dist/admin/preview/routes.js.map +1 -1
  184. package/dist/admin/services/components.js +3 -2
  185. package/dist/admin/services/components.js.map +1 -1
  186. package/dist/admin/services/components.mjs +3 -2
  187. package/dist/admin/services/components.mjs.map +1 -1
  188. package/dist/admin/services/contentTypes.js +4 -3
  189. package/dist/admin/services/contentTypes.js.map +1 -1
  190. package/dist/admin/services/contentTypes.mjs +4 -3
  191. package/dist/admin/services/contentTypes.mjs.map +1 -1
  192. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +1 -1
  193. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.d.ts +2 -0
  194. package/dist/admin/src/pages/EditView/utils/keyboardShortcuts.d.ts +18 -0
  195. package/dist/admin/src/pages/ListConfiguration/components/SortDisplayedFields.d.ts +2 -2
  196. package/dist/admin/src/pages/ListView/components/TableCells/Media.d.ts +2 -2
  197. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +3 -1
  198. package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +24 -0
  199. package/dist/admin/translations/cs.json.js +2 -1
  200. package/dist/admin/translations/cs.json.js.map +1 -1
  201. package/dist/admin/translations/cs.json.mjs +2 -1
  202. package/dist/admin/translations/cs.json.mjs.map +1 -1
  203. package/dist/admin/translations/de.json.js +2 -1
  204. package/dist/admin/translations/de.json.js.map +1 -1
  205. package/dist/admin/translations/de.json.mjs +2 -1
  206. package/dist/admin/translations/de.json.mjs.map +1 -1
  207. package/dist/admin/translations/en.json.js +3 -1
  208. package/dist/admin/translations/en.json.js.map +1 -1
  209. package/dist/admin/translations/en.json.mjs +3 -1
  210. package/dist/admin/translations/en.json.mjs.map +1 -1
  211. package/dist/admin/translations/es.json.js +2 -1
  212. package/dist/admin/translations/es.json.js.map +1 -1
  213. package/dist/admin/translations/es.json.mjs +2 -1
  214. package/dist/admin/translations/es.json.mjs.map +1 -1
  215. package/dist/admin/translations/fr.json.js +2 -1
  216. package/dist/admin/translations/fr.json.js.map +1 -1
  217. package/dist/admin/translations/fr.json.mjs +2 -1
  218. package/dist/admin/translations/fr.json.mjs.map +1 -1
  219. package/dist/admin/translations/nl.json.js +2 -1
  220. package/dist/admin/translations/nl.json.js.map +1 -1
  221. package/dist/admin/translations/nl.json.mjs +2 -1
  222. package/dist/admin/translations/nl.json.mjs.map +1 -1
  223. package/dist/admin/translations/pl.json.js +2 -1
  224. package/dist/admin/translations/pl.json.js.map +1 -1
  225. package/dist/admin/translations/pl.json.mjs +2 -1
  226. package/dist/admin/translations/pl.json.mjs.map +1 -1
  227. package/dist/admin/translations/sk.json.js +2 -1
  228. package/dist/admin/translations/sk.json.js.map +1 -1
  229. package/dist/admin/translations/sk.json.mjs +2 -1
  230. package/dist/admin/translations/sk.json.mjs.map +1 -1
  231. package/dist/admin/utils/attributes.js +17 -2
  232. package/dist/admin/utils/attributes.js.map +1 -1
  233. package/dist/admin/utils/attributes.mjs +17 -2
  234. package/dist/admin/utils/attributes.mjs.map +1 -1
  235. package/dist/admin/utils/layouts/normalizeContentManagerLayout.js +329 -0
  236. package/dist/admin/utils/layouts/normalizeContentManagerLayout.js.map +1 -0
  237. package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs +321 -0
  238. package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs.map +1 -0
  239. package/dist/admin/utils/objects.js +9 -4
  240. package/dist/admin/utils/objects.js.map +1 -1
  241. package/dist/admin/utils/validation.js +7 -3
  242. package/dist/admin/utils/validation.js.map +1 -1
  243. package/dist/server/controllers/collection-types.js +7 -2
  244. package/dist/server/controllers/collection-types.js.map +1 -1
  245. package/dist/server/controllers/collection-types.mjs +7 -2
  246. package/dist/server/controllers/collection-types.mjs.map +1 -1
  247. package/dist/server/controllers/utils/clone.js +5 -1
  248. package/dist/server/controllers/utils/clone.js.map +1 -1
  249. package/dist/server/controllers/utils/clone.mjs.map +1 -1
  250. package/dist/server/controllers/validation/index.js +6 -2
  251. package/dist/server/controllers/validation/index.js.map +1 -1
  252. package/dist/server/homepage/services/homepage.js +6 -1
  253. package/dist/server/homepage/services/homepage.js.map +1 -1
  254. package/dist/server/homepage/services/homepage.mjs +6 -1
  255. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  256. package/dist/server/mcp/handlers/collection-handlers.js +15 -18
  257. package/dist/server/mcp/handlers/collection-handlers.js.map +1 -1
  258. package/dist/server/mcp/handlers/collection-handlers.mjs +16 -19
  259. package/dist/server/mcp/handlers/collection-handlers.mjs.map +1 -1
  260. package/dist/server/mcp/handlers/single-type-handlers.js +12 -12
  261. package/dist/server/mcp/handlers/single-type-handlers.js.map +1 -1
  262. package/dist/server/mcp/handlers/single-type-handlers.mjs +13 -13
  263. package/dist/server/mcp/handlers/single-type-handlers.mjs.map +1 -1
  264. package/dist/server/mcp/register-content-manager-mcp-tools.js +4 -1
  265. package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -1
  266. package/dist/server/mcp/register-content-manager-mcp-tools.mjs +4 -1
  267. package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -1
  268. package/dist/server/mcp/sanitizers/shape-relations.js +108 -0
  269. package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -0
  270. package/dist/server/mcp/sanitizers/shape-relations.mjs +103 -0
  271. package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -0
  272. package/dist/server/mcp/schemas/data-schema.js +0 -3
  273. package/dist/server/mcp/schemas/data-schema.js.map +1 -1
  274. package/dist/server/mcp/schemas/data-schema.mjs +0 -3
  275. package/dist/server/mcp/schemas/data-schema.mjs.map +1 -1
  276. package/dist/server/mcp/schemas/output-schemas.js +30 -4
  277. package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
  278. package/dist/server/mcp/schemas/output-schemas.mjs +30 -4
  279. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
  280. package/dist/server/mcp/utils.js +30 -3
  281. package/dist/server/mcp/utils.js.map +1 -1
  282. package/dist/server/mcp/utils.mjs +30 -4
  283. package/dist/server/mcp/utils.mjs.map +1 -1
  284. package/dist/server/middlewares/routing.js +5 -1
  285. package/dist/server/middlewares/routing.js.map +1 -1
  286. package/dist/server/services/populate-builder.js.map +1 -1
  287. package/dist/server/services/populate-builder.mjs.map +1 -1
  288. package/dist/server/services/uid.js +9 -4
  289. package/dist/server/services/uid.js.map +1 -1
  290. package/dist/server/services/utils/configuration/attributes.js +14 -10
  291. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  292. package/dist/server/services/utils/configuration/layouts.js +8 -4
  293. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  294. package/dist/server/services/utils/configuration/metadatas.js +19 -15
  295. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  296. package/dist/server/services/utils/configuration/settings.js +5 -1
  297. package/dist/server/services/utils/configuration/settings.js.map +1 -1
  298. package/dist/server/services/utils/draft.js +5 -1
  299. package/dist/server/services/utils/draft.js.map +1 -1
  300. package/dist/server/services/utils/populate.js +8 -4
  301. package/dist/server/services/utils/populate.js.map +1 -1
  302. package/dist/server/services/utils/populate.mjs.map +1 -1
  303. package/dist/server/services/utils/store.js +9 -5
  304. package/dist/server/services/utils/store.js.map +1 -1
  305. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  306. package/dist/server/src/controllers/utils/clone.d.ts +1 -1
  307. package/dist/server/src/controllers/utils/clone.d.ts.map +1 -1
  308. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  309. package/dist/server/src/index.d.ts +3 -1
  310. package/dist/server/src/index.d.ts.map +1 -1
  311. package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -1
  312. package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -1
  313. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +2 -1
  314. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  315. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts +38 -0
  316. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -0
  317. package/dist/server/src/mcp/schemas/data-schema.d.ts +0 -3
  318. package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
  319. package/dist/server/src/mcp/schemas/output-schemas.d.ts +2 -2
  320. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  321. package/dist/server/src/mcp/types.d.ts +2 -2
  322. package/dist/server/src/mcp/types.d.ts.map +1 -1
  323. package/dist/server/src/mcp/utils.d.ts +19 -1
  324. package/dist/server/src/mcp/utils.d.ts.map +1 -1
  325. package/dist/server/src/services/index.d.ts +3 -1
  326. package/dist/server/src/services/index.d.ts.map +1 -1
  327. package/dist/server/src/services/populate-builder.d.ts +3 -1
  328. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  329. package/dist/server/src/services/utils/populate.d.ts +3 -1
  330. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  331. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"data-schema.js","sources":["../../../../server/src/mcp/schemas/data-schema.ts"],"sourcesContent":["import { contentTypes, z } from '@strapi/utils';\nimport type { Core, Schema, Struct } from '@strapi/types';\n\nimport { buildBlocksInputSchema } from './blocks-schema';\nimport type { ContentManagerModelForMcp } from '../types';\n\ntype CustomFieldAttribute = {\n type: 'customField';\n customField: string;\n [key: string]: unknown;\n};\n\nconst isCustomFieldAttribute = (attr: unknown): attr is CustomFieldAttribute =>\n typeof attr === 'object' &&\n attr !== null &&\n (attr as Record<string, unknown>).type === 'customField' &&\n typeof (attr as Record<string, unknown>).customField === 'string';\n\n/**\n * Builds a structured Zod object schema for a Strapi component UID.\n * Declared as a regular function so it is hoisted above `attributeToInputSchema`\n * — the two functions are mutually recursive (component attrs recurse into\n * attributeToInputSchema; attributeToInputSchema calls this for 'component' cases).\n *\n * @param strapi - Strapi instance (components registry available post-load).\n * @param componentUid - e.g. \"common.seo\".\n * @param visited - cycle-guard; prevents infinite recursion on self-referencing components.\n */\nexport function buildComponentInputSchema(\n strapi: Core.Strapi,\n componentUid: string,\n visited: Set<string> = new Set()\n): z.ZodTypeAny {\n if (visited.has(componentUid) === true) {\n // Circular reference — fall back to permissive but non-empty JSON Schema\n return z.record(z.string(), z.unknown());\n }\n\n type ComponentEntry = { attributes: Record<string, Schema.Attribute.AnyAttribute> };\n const componentsMap = strapi.components as unknown as Record<string, ComponentEntry | undefined>;\n const component = componentsMap[componentUid];\n if (component === undefined) {\n return z.record(z.string(), z.unknown());\n }\n\n visited.add(componentUid);\n\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const [key, attr] of Object.entries(component.attributes)) {\n if (key === 'id') {\n // eslint-disable-next-line no-continue\n continue;\n }\n shape[key] = attributeToInputSchema(strapi, attr, visited);\n }\n\n visited.delete(componentUid);\n\n return z.object(shape).strict();\n}\n\n/**\n * Maps a single Strapi attribute to a Zod input schema, carrying constraints\n * (min, max, minLength, maxLength, required, enum values, etc.).\n *\n * Mirrors the `mapAttributeToInputSchema` logic from\n * `packages/core/core/src/core-api/routes/validation/mappers.ts` — kept inline\n * here to avoid a cross-package import from @strapi/content-manager into\n * @strapi/core (which is not a listed dependency).\n *\n * TODO — custom fields call `strapi.get('custom-fields')` at schema-build\n * time; confirm with an integration test that the registry is populated when MCP\n * tools are registered (post-bootstrap).\n */\nexport const attributeToInputSchema = (\n strapi: Core.Strapi,\n attr: Schema.Attribute.AnyAttribute,\n visited: Set<string> = new Set()\n): z.ZodTypeAny => {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'password': {\n const { required, minLength, maxLength } = attr as Schema.Attribute.String;\n let s: z.ZodString = z.string();\n if (minLength !== undefined) s = s.min(minLength);\n if (maxLength !== undefined) s = s.max(maxLength);\n return required === true ? s : s.optional();\n }\n case 'email': {\n const { required } = attr as Schema.Attribute.Email;\n const s = z.string().email();\n return required === true ? s : s.optional();\n }\n case 'uid': {\n const { required } = attr as Schema.Attribute.UID;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'integer': {\n const { required, min, max } = attr as Schema.Attribute.Integer;\n let s = z.number().int();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'biginteger': {\n const { required } = attr as Schema.Attribute.BigInteger;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'decimal':\n case 'float': {\n const { required, min, max } = attr as Schema.Attribute.Decimal;\n let s = z.number();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'boolean': {\n const { required } = attr as Schema.Attribute.Boolean;\n const s = z.boolean();\n return required === true ? s : s.optional();\n }\n case 'date':\n case 'datetime':\n case 'time':\n case 'timestamp': {\n const { required } = attr as Schema.Attribute.Date;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'enumeration': {\n const { required, enum: values } = attr as Schema.Attribute.Enumeration<string[]>;\n if (Array.isArray(values) && values.length > 0) {\n const s = z.enum(values as [string, ...string[]]);\n return required === true ? s : s.optional();\n }\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'json': {\n const { required } = attr as Schema.Attribute.JSON;\n const s = z.any();\n return required === true ? s : s.optional();\n }\n case 'blocks': {\n const { required } = attr as Schema.Attribute.Blocks;\n const s = buildBlocksInputSchema();\n return required === true ? s : s.optional();\n }\n case 'component': {\n // Cast to a plain record to avoid generic defaults on `repeatable` (Constants.False)\n const componentAttr = attr as unknown as {\n required?: boolean;\n repeatable?: boolean;\n component?: string;\n min?: number;\n max?: number;\n };\n const componentUid = componentAttr.component;\n const componentSchema: z.ZodTypeAny =\n componentUid !== undefined\n ? buildComponentInputSchema(strapi, componentUid, visited)\n : z.record(z.string(), z.unknown());\n\n let s: z.ZodTypeAny =\n componentAttr.repeatable === true ? z.array(componentSchema) : componentSchema;\n if (componentAttr.repeatable === true && componentAttr.min !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).min(componentAttr.min);\n }\n if (componentAttr.repeatable === true && componentAttr.max !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).max(componentAttr.max);\n }\n return componentAttr.required === true ? s : s.optional();\n }\n case 'dynamiczone': {\n const dzAttr = attr as unknown as { required?: boolean; min?: number; max?: number };\n let s = z.array(z.any());\n if (dzAttr.min !== undefined) s = (s as z.ZodArray<z.ZodAny>).min(dzAttr.min);\n if (dzAttr.max !== undefined) s = (s as z.ZodArray<z.ZodAny>).max(dzAttr.max);\n return dzAttr.required === true ? s : s.optional();\n }\n case 'media': {\n const mediaAttr = attr as unknown as { required?: boolean; multiple?: boolean };\n const s = mediaAttr.multiple === true ? z.array(z.any()) : z.any();\n return mediaAttr.required === true ? s : s.optional();\n }\n case 'relation': {\n const relAttr = attr as Schema.Attribute.Relation;\n const isToMany = relAttr.relation?.endsWith('ToMany') === true;\n\n const relDocumentId = z\n .string()\n .min(1)\n .describe('Strapi document ID (e.g. \"z7v8zma53x01r6oceimv922b\").');\n\n const relLongHand = z\n .object({\n documentId: relDocumentId,\n locale: z\n .string()\n .optional()\n .describe('Target locale. Defaults to source document locale.'),\n status: z\n .enum(['draft', 'published'])\n .optional()\n .describe('Target version status. Defaults based on draftAndPublish config.'),\n })\n .strict();\n\n let s: z.ZodTypeAny;\n\n if (isToMany === true) {\n const relEntry = z.union([relDocumentId, relLongHand]);\n\n const relConnectPosition = z\n .object({\n before: z.string().optional().describe('Document ID to insert before.'),\n after: z.string().optional().describe('Document ID to insert after.'),\n start: z.boolean().optional().describe('Insert at start of list.'),\n end: z.boolean().optional().describe('Insert at end of list (default).'),\n })\n .strict();\n\n const relConnectEntry = z\n .object({\n documentId: relDocumentId,\n locale: z.string().optional(),\n status: z.enum(['draft', 'published']).optional(),\n position: relConnectPosition\n .optional()\n .describe('Ordering hint. Default: { end: true }.'),\n })\n .strict();\n\n s = z\n .object({\n connect: z\n .array(z.union([relDocumentId, relConnectEntry]))\n .optional()\n .describe(\n 'Add relations. Each entry: documentId string, or { documentId, locale?, status?, position? }.'\n ),\n disconnect: z\n .array(relEntry)\n .optional()\n .describe(\n 'Remove relations. Each entry: documentId string, or { documentId, locale?, status? }.'\n ),\n set: z\n .union([z.array(relEntry), z.null()])\n .optional()\n .describe(\n 'Replace all relations. Array replaces existing; null clears all. Mutually exclusive with connect/disconnect.'\n ),\n })\n .strict();\n } else {\n s = z.union([\n relDocumentId,\n relLongHand,\n z.null().describe('Set to null to clear the relation.'),\n ]);\n }\n\n return relAttr.required === true ? s : s.optional();\n }\n default: {\n const unknownAttr: unknown = attr;\n if (isCustomFieldAttribute(unknownAttr)) {\n const customField = strapi.get('custom-fields').get(unknownAttr.customField);\n if (customField !== undefined) {\n return attributeToInputSchema(\n strapi,\n {\n ...unknownAttr,\n type: customField.type,\n } as unknown as Schema.Attribute.AnyAttribute,\n visited\n );\n }\n }\n return z.unknown();\n }\n }\n};\n\n/**\n * Derives a per-content-type `data` Zod schema from the model's writable attributes.\n * Uses `contentTypes.isWritableAttribute` to filter system-managed keys\n * (id, documentId, timestamps, createdBy, updatedBy, localizations, locale, etc.).\n * Unknown keys are rejected (strict mode) — invalid field names fail at the MCP boundary.\n */\nexport const buildDataSchema = (\n strapi: Core.Strapi,\n schema: Struct.ContentTypeSchema | ContentManagerModelForMcp,\n attributes: Struct.SchemaAttributes,\n permittedFields?: Set<string> | null\n): z.ZodTypeAny => {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, attr] of Object.entries(attributes)) {\n const isPermitted =\n permittedFields === null ||\n permittedFields === undefined ||\n permittedFields.has(key) === true;\n\n if (\n isPermitted === true &&\n contentTypes.isWritableAttribute(schema as Struct.ContentTypeSchema, key) === true &&\n contentTypes.isPrivateAttribute(schema as Struct.ContentTypeSchema, key) !== true\n ) {\n shape[key] = attributeToInputSchema(strapi, attr);\n }\n }\n\n return z.object(shape).strict().describe('Document field values to write.');\n};\n"],"names":["isCustomFieldAttribute","attr","type","customField","buildComponentInputSchema","strapi","componentUid","visited","Set","has","z","record","string","unknown","componentsMap","components","component","undefined","add","shape","key","Object","entries","attributes","attributeToInputSchema","delete","object","strict","required","minLength","maxLength","s","min","max","optional","email","number","int","boolean","enum","values","Array","isArray","length","any","buildBlocksInputSchema","componentAttr","componentSchema","repeatable","array","dzAttr","mediaAttr","multiple","relAttr","isToMany","relation","endsWith","relDocumentId","describe","relLongHand","documentId","locale","status","relEntry","union","relConnectPosition","before","after","start","end","relConnectEntry","position","connect","disconnect","set","null","unknownAttr","get","buildDataSchema","schema","permittedFields","isPermitted","contentTypes","isWritableAttribute","isPrivateAttribute"],"mappings":"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"}
1
+ {"version":3,"file":"data-schema.js","sources":["../../../../server/src/mcp/schemas/data-schema.ts"],"sourcesContent":["import { contentTypes, z } from '@strapi/utils';\nimport type { Core, Schema, Struct } from '@strapi/types';\n\nimport { buildBlocksInputSchema } from './blocks-schema';\nimport type { ContentManagerModelForMcp } from '../types';\n\ntype CustomFieldAttribute = {\n type: 'customField';\n customField: string;\n [key: string]: unknown;\n};\n\nconst isCustomFieldAttribute = (attr: unknown): attr is CustomFieldAttribute =>\n typeof attr === 'object' &&\n attr !== null &&\n (attr as Record<string, unknown>).type === 'customField' &&\n typeof (attr as Record<string, unknown>).customField === 'string';\n\n/**\n * Builds a structured Zod object schema for a Strapi component UID.\n * Declared as a regular function so it is hoisted above `attributeToInputSchema`\n * — the two functions are mutually recursive (component attrs recurse into\n * attributeToInputSchema; attributeToInputSchema calls this for 'component' cases).\n *\n * @param strapi - Strapi instance (components registry available post-load).\n * @param componentUid - e.g. \"common.seo\".\n * @param visited - cycle-guard; prevents infinite recursion on self-referencing components.\n */\nexport function buildComponentInputSchema(\n strapi: Core.Strapi,\n componentUid: string,\n visited: Set<string> = new Set()\n): z.ZodTypeAny {\n if (visited.has(componentUid) === true) {\n // Circular reference — fall back to permissive but non-empty JSON Schema\n return z.record(z.string(), z.unknown());\n }\n\n type ComponentEntry = { attributes: Record<string, Schema.Attribute.AnyAttribute> };\n const componentsMap = strapi.components as unknown as Record<string, ComponentEntry | undefined>;\n const component = componentsMap[componentUid];\n if (component === undefined) {\n return z.record(z.string(), z.unknown());\n }\n\n visited.add(componentUid);\n\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const [key, attr] of Object.entries(component.attributes)) {\n if (key === 'id') {\n // eslint-disable-next-line no-continue\n continue;\n }\n shape[key] = attributeToInputSchema(strapi, attr, visited);\n }\n\n visited.delete(componentUid);\n\n return z.object(shape).strict();\n}\n\n/**\n * Maps a single Strapi attribute to a Zod input schema, carrying constraints\n * (min, max, minLength, maxLength, required, enum values, etc.).\n *\n * Mirrors the `mapAttributeToInputSchema` logic from\n * `packages/core/core/src/core-api/routes/validation/mappers.ts` — kept inline\n * here to avoid a cross-package import from @strapi/content-manager into\n * @strapi/core (which is not a listed dependency).\n *\n */\nexport const attributeToInputSchema = (\n strapi: Core.Strapi,\n attr: Schema.Attribute.AnyAttribute,\n visited: Set<string> = new Set()\n): z.ZodTypeAny => {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'password': {\n const { required, minLength, maxLength } = attr as Schema.Attribute.String;\n let s: z.ZodString = z.string();\n if (minLength !== undefined) s = s.min(minLength);\n if (maxLength !== undefined) s = s.max(maxLength);\n return required === true ? s : s.optional();\n }\n case 'email': {\n const { required } = attr as Schema.Attribute.Email;\n const s = z.string().email();\n return required === true ? s : s.optional();\n }\n case 'uid': {\n const { required } = attr as Schema.Attribute.UID;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'integer': {\n const { required, min, max } = attr as Schema.Attribute.Integer;\n let s = z.number().int();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'biginteger': {\n const { required } = attr as Schema.Attribute.BigInteger;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'decimal':\n case 'float': {\n const { required, min, max } = attr as Schema.Attribute.Decimal;\n let s = z.number();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'boolean': {\n const { required } = attr as Schema.Attribute.Boolean;\n const s = z.boolean();\n return required === true ? s : s.optional();\n }\n case 'date':\n case 'datetime':\n case 'time':\n case 'timestamp': {\n const { required } = attr as Schema.Attribute.Date;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'enumeration': {\n const { required, enum: values } = attr as Schema.Attribute.Enumeration<string[]>;\n if (Array.isArray(values) && values.length > 0) {\n const s = z.enum(values as [string, ...string[]]);\n return required === true ? s : s.optional();\n }\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'json': {\n const { required } = attr as Schema.Attribute.JSON;\n const s = z.any();\n return required === true ? s : s.optional();\n }\n case 'blocks': {\n const { required } = attr as Schema.Attribute.Blocks;\n const s = buildBlocksInputSchema();\n return required === true ? s : s.optional();\n }\n case 'component': {\n // Cast to a plain record to avoid generic defaults on `repeatable` (Constants.False)\n const componentAttr = attr as unknown as {\n required?: boolean;\n repeatable?: boolean;\n component?: string;\n min?: number;\n max?: number;\n };\n const componentUid = componentAttr.component;\n const componentSchema: z.ZodTypeAny =\n componentUid !== undefined\n ? buildComponentInputSchema(strapi, componentUid, visited)\n : z.record(z.string(), z.unknown());\n\n let s: z.ZodTypeAny =\n componentAttr.repeatable === true ? z.array(componentSchema) : componentSchema;\n if (componentAttr.repeatable === true && componentAttr.min !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).min(componentAttr.min);\n }\n if (componentAttr.repeatable === true && componentAttr.max !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).max(componentAttr.max);\n }\n return componentAttr.required === true ? s : s.optional();\n }\n case 'dynamiczone': {\n const dzAttr = attr as unknown as { required?: boolean; min?: number; max?: number };\n let s = z.array(z.any());\n if (dzAttr.min !== undefined) s = (s as z.ZodArray<z.ZodAny>).min(dzAttr.min);\n if (dzAttr.max !== undefined) s = (s as z.ZodArray<z.ZodAny>).max(dzAttr.max);\n return dzAttr.required === true ? s : s.optional();\n }\n case 'media': {\n const mediaAttr = attr as unknown as { required?: boolean; multiple?: boolean };\n const s = mediaAttr.multiple === true ? z.array(z.any()) : z.any();\n return mediaAttr.required === true ? s : s.optional();\n }\n case 'relation': {\n const relAttr = attr as Schema.Attribute.Relation;\n const isToMany = relAttr.relation?.endsWith('ToMany') === true;\n\n const relDocumentId = z\n .string()\n .min(1)\n .describe('Strapi document ID (e.g. \"z7v8zma53x01r6oceimv922b\").');\n\n const relLongHand = z\n .object({\n documentId: relDocumentId,\n locale: z\n .string()\n .optional()\n .describe('Target locale. Defaults to source document locale.'),\n status: z\n .enum(['draft', 'published'])\n .optional()\n .describe('Target version status. Defaults based on draftAndPublish config.'),\n })\n .strict();\n\n let s: z.ZodTypeAny;\n\n if (isToMany === true) {\n const relEntry = z.union([relDocumentId, relLongHand]);\n\n const relConnectPosition = z\n .object({\n before: z.string().optional().describe('Document ID to insert before.'),\n after: z.string().optional().describe('Document ID to insert after.'),\n start: z.boolean().optional().describe('Insert at start of list.'),\n end: z.boolean().optional().describe('Insert at end of list (default).'),\n })\n .strict();\n\n const relConnectEntry = z\n .object({\n documentId: relDocumentId,\n locale: z.string().optional(),\n status: z.enum(['draft', 'published']).optional(),\n position: relConnectPosition\n .optional()\n .describe('Ordering hint. Default: { end: true }.'),\n })\n .strict();\n\n s = z\n .object({\n connect: z\n .array(z.union([relDocumentId, relConnectEntry]))\n .optional()\n .describe(\n 'Add relations. Each entry: documentId string, or { documentId, locale?, status?, position? }.'\n ),\n disconnect: z\n .array(relEntry)\n .optional()\n .describe(\n 'Remove relations. Each entry: documentId string, or { documentId, locale?, status? }.'\n ),\n set: z\n .union([z.array(relEntry), z.null()])\n .optional()\n .describe(\n 'Replace all relations. Array replaces existing; null clears all. Mutually exclusive with connect/disconnect.'\n ),\n })\n .strict();\n } else {\n s = z.union([\n relDocumentId,\n relLongHand,\n z.null().describe('Set to null to clear the relation.'),\n ]);\n }\n\n return relAttr.required === true ? s : s.optional();\n }\n default: {\n const unknownAttr: unknown = attr;\n if (isCustomFieldAttribute(unknownAttr)) {\n const customField = strapi.get('custom-fields').get(unknownAttr.customField);\n if (customField !== undefined) {\n return attributeToInputSchema(\n strapi,\n {\n ...unknownAttr,\n type: customField.type,\n } as unknown as Schema.Attribute.AnyAttribute,\n visited\n );\n }\n }\n return z.unknown();\n }\n }\n};\n\n/**\n * Derives a per-content-type `data` Zod schema from the model's writable attributes.\n * Uses `contentTypes.isWritableAttribute` to filter system-managed keys\n * (id, documentId, timestamps, createdBy, updatedBy, localizations, locale, etc.).\n * Unknown keys are rejected (strict mode) — invalid field names fail at the MCP boundary.\n */\nexport const buildDataSchema = (\n strapi: Core.Strapi,\n schema: Struct.ContentTypeSchema | ContentManagerModelForMcp,\n attributes: Struct.SchemaAttributes,\n permittedFields?: Set<string> | null\n): z.ZodTypeAny => {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, attr] of Object.entries(attributes)) {\n const isPermitted =\n permittedFields === null ||\n permittedFields === undefined ||\n permittedFields.has(key) === true;\n\n if (\n isPermitted === true &&\n contentTypes.isWritableAttribute(schema as Struct.ContentTypeSchema, key) === true &&\n contentTypes.isPrivateAttribute(schema as Struct.ContentTypeSchema, key) !== true\n ) {\n shape[key] = attributeToInputSchema(strapi, attr);\n }\n }\n\n return z.object(shape).strict().describe('Document field values to write.');\n};\n"],"names":["isCustomFieldAttribute","attr","type","customField","buildComponentInputSchema","strapi","componentUid","visited","Set","has","z","record","string","unknown","componentsMap","components","component","undefined","add","shape","key","Object","entries","attributes","attributeToInputSchema","delete","object","strict","required","minLength","maxLength","s","min","max","optional","email","number","int","boolean","enum","values","Array","isArray","length","any","buildBlocksInputSchema","componentAttr","componentSchema","repeatable","array","dzAttr","mediaAttr","multiple","relAttr","isToMany","relation","endsWith","relDocumentId","describe","relLongHand","documentId","locale","status","relEntry","union","relConnectPosition","before","after","start","end","relConnectEntry","position","connect","disconnect","set","null","unknownAttr","get","buildDataSchema","schema","permittedFields","isPermitted","contentTypes","isWritableAttribute","isPrivateAttribute"],"mappings":";;;;;AAYA,MAAMA,yBAAyB,CAACC,IAAAA,GAC9B,OAAOA,IAAAA,KAAS,YAChBA,IAAAA,KAAS,IAAA,IACT,IAACA,CAAiCC,IAAI,KAAK,aAAA,IAC3C,OAAO,IAACD,CAAiCE,WAAW,KAAK,QAAA;AAE3D;;;;;;;;;IAUO,SAASC,yBAAAA,CACdC,MAAmB,EACnBC,YAAoB,EACpBC,OAAAA,GAAuB,IAAIC,GAAAA,EAAK,EAAA;AAEhC,IAAA,IAAID,OAAAA,CAAQE,GAAG,CAACH,YAAAA,CAAAA,KAAkB,IAAA,EAAM;;AAEtC,QAAA,OAAOI,cAAEC,MAAM,CAACD,cAAEE,MAAM,EAAA,EAAIF,cAAEG,OAAO,EAAA,CAAA;AACvC,IAAA;IAGA,MAAMC,aAAAA,GAAgBT,OAAOU,UAAU;IACvC,MAAMC,SAAAA,GAAYF,aAAa,CAACR,YAAAA,CAAa;AAC7C,IAAA,IAAIU,cAAcC,SAAAA,EAAW;AAC3B,QAAA,OAAOP,cAAEC,MAAM,CAACD,cAAEE,MAAM,EAAA,EAAIF,cAAEG,OAAO,EAAA,CAAA;AACvC,IAAA;AAEAN,IAAAA,OAAAA,CAAQW,GAAG,CAACZ,YAAAA,CAAAA;AAEZ,IAAA,MAAMa,QAAsC,EAAC;IAC7C,KAAK,MAAM,CAACC,GAAAA,EAAKnB,IAAAA,CAAK,IAAIoB,OAAOC,OAAO,CAACN,SAAAA,CAAUO,UAAU,CAAA,CAAG;AAC9D,QAAA,IAAIH,QAAQ,IAAA,EAAM;AAEhB,YAAA;AACF,QAAA;AACAD,QAAAA,KAAK,CAACC,GAAAA,CAAI,GAAGI,sBAAAA,CAAuBnB,QAAQJ,IAAAA,EAAMM,OAAAA,CAAAA;AACpD,IAAA;AAEAA,IAAAA,OAAAA,CAAQkB,MAAM,CAACnB,YAAAA,CAAAA;AAEf,IAAA,OAAOI,aAAAA,CAAEgB,MAAM,CAACP,KAAAA,CAAAA,CAAOQ,MAAM,EAAA;AAC/B;AAEA;;;;;;;;;UAUaH,sBAAAA,GAAyB,CACpCnB,QACAJ,IAAAA,EACAM,OAAAA,GAAuB,IAAIC,GAAAA,EAAK,GAAA;AAEhC,IAAA,OAAQP,KAAKC,IAAI;QACf,KAAK,QAAA;QACL,KAAK,MAAA;QACL,KAAK,UAAA;QACL,KAAK,UAAA;AAAY,YAAA;AACf,gBAAA,MAAM,EAAE0B,QAAQ,EAAEC,SAAS,EAAEC,SAAS,EAAE,GAAG7B,IAAAA;gBAC3C,IAAI8B,CAAAA,GAAiBrB,cAAEE,MAAM,EAAA;AAC7B,gBAAA,IAAIiB,SAAAA,KAAcZ,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEC,GAAG,CAACH,SAAAA,CAAAA;AACvC,gBAAA,IAAIC,SAAAA,KAAcb,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEE,GAAG,CAACH,SAAAA,CAAAA;AACvC,gBAAA,OAAOF,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,OAAA;AAAS,YAAA;gBACZ,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;AACrB,gBAAA,MAAM8B,CAAAA,GAAIrB,aAAAA,CAAEE,MAAM,EAAA,CAAGuB,KAAK,EAAA;AAC1B,gBAAA,OAAOP,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,KAAA;AAAO,YAAA;gBACV,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;gBACrB,MAAM8B,CAAAA,GAAIrB,cAAEE,MAAM,EAAA;AAClB,gBAAA,OAAOgB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,SAAA;AAAW,YAAA;AACd,gBAAA,MAAM,EAAEN,QAAQ,EAAEI,GAAG,EAAEC,GAAG,EAAE,GAAGhC,IAAAA;AAC/B,gBAAA,IAAI8B,CAAAA,GAAIrB,aAAAA,CAAE0B,MAAM,EAAA,CAAGC,GAAG,EAAA;AACtB,gBAAA,IAAIL,GAAAA,KAAQf,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEC,GAAG,CAACA,GAAAA,CAAAA;AACjC,gBAAA,IAAIC,GAAAA,KAAQhB,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEE,GAAG,CAACA,GAAAA,CAAAA;AACjC,gBAAA,OAAOL,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,YAAA;AAAc,YAAA;gBACjB,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;gBACrB,MAAM8B,CAAAA,GAAIrB,cAAEE,MAAM,EAAA;AAClB,gBAAA,OAAOgB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,SAAA;QACL,KAAK,OAAA;AAAS,YAAA;AACZ,gBAAA,MAAM,EAAEN,QAAQ,EAAEI,GAAG,EAAEC,GAAG,EAAE,GAAGhC,IAAAA;gBAC/B,IAAI8B,CAAAA,GAAIrB,cAAE0B,MAAM,EAAA;AAChB,gBAAA,IAAIJ,GAAAA,KAAQf,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEC,GAAG,CAACA,GAAAA,CAAAA;AACjC,gBAAA,IAAIC,GAAAA,KAAQhB,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEE,GAAG,CAACA,GAAAA,CAAAA;AACjC,gBAAA,OAAOL,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,SAAA;AAAW,YAAA;gBACd,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;gBACrB,MAAM8B,CAAAA,GAAIrB,cAAE4B,OAAO,EAAA;AACnB,gBAAA,OAAOV,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,MAAA;QACL,KAAK,UAAA;QACL,KAAK,MAAA;QACL,KAAK,WAAA;AAAa,YAAA;gBAChB,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;gBACrB,MAAM8B,CAAAA,GAAIrB,cAAEE,MAAM,EAAA;AAClB,gBAAA,OAAOgB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,aAAA;AAAe,YAAA;AAClB,gBAAA,MAAM,EAAEN,QAAQ,EAAEW,IAAAA,EAAMC,MAAM,EAAE,GAAGvC,IAAAA;AACnC,gBAAA,IAAIwC,MAAMC,OAAO,CAACF,WAAWA,MAAAA,CAAOG,MAAM,GAAG,CAAA,EAAG;oBAC9C,MAAMZ,CAAAA,GAAIrB,aAAAA,CAAE6B,IAAI,CAACC,MAAAA,CAAAA;AACjB,oBAAA,OAAOZ,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,gBAAA;gBACA,MAAMH,CAAAA,GAAIrB,cAAEE,MAAM,EAAA;AAClB,gBAAA,OAAOgB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,MAAA;AAAQ,YAAA;gBACX,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;gBACrB,MAAM8B,CAAAA,GAAIrB,cAAEkC,GAAG,EAAA;AACf,gBAAA,OAAOhB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,QAAA;AAAU,YAAA;gBACb,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;AACrB,gBAAA,MAAM8B,CAAAA,GAAIc,mCAAAA,EAAAA;AACV,gBAAA,OAAOjB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,WAAA;AAAa,YAAA;;AAEhB,gBAAA,MAAMY,aAAAA,GAAgB7C,IAAAA;gBAOtB,MAAMK,YAAAA,GAAewC,cAAc9B,SAAS;AAC5C,gBAAA,MAAM+B,eAAAA,GACJzC,YAAAA,KAAiBW,SAAAA,GACbb,yBAAAA,CAA0BC,QAAQC,YAAAA,EAAcC,OAAAA,CAAAA,GAChDG,aAAAA,CAAEC,MAAM,CAACD,aAAAA,CAAEE,MAAM,EAAA,EAAIF,cAAEG,OAAO,EAAA,CAAA;gBAEpC,IAAIkB,CAAAA,GACFe,cAAcE,UAAU,KAAK,OAAOtC,aAAAA,CAAEuC,KAAK,CAACF,eAAAA,CAAAA,GAAmBA,eAAAA;AACjE,gBAAA,IAAID,cAAcE,UAAU,KAAK,QAAQF,aAAAA,CAAcd,GAAG,KAAKf,SAAAA,EAAW;AACxEc,oBAAAA,CAAAA,GAAI,CAACA,CAA+BC,GAAG,CAACc,cAAcd,GAAG,CAAA;AAC3D,gBAAA;AACA,gBAAA,IAAIc,cAAcE,UAAU,KAAK,QAAQF,aAAAA,CAAcb,GAAG,KAAKhB,SAAAA,EAAW;AACxEc,oBAAAA,CAAAA,GAAI,CAACA,CAA+BE,GAAG,CAACa,cAAcb,GAAG,CAAA;AAC3D,gBAAA;AACA,gBAAA,OAAOa,cAAclB,QAAQ,KAAK,IAAA,GAAOG,CAAAA,GAAIA,EAAEG,QAAQ,EAAA;AACzD,YAAA;QACA,KAAK,aAAA;AAAe,YAAA;AAClB,gBAAA,MAAMgB,MAAAA,GAASjD,IAAAA;AACf,gBAAA,IAAI8B,CAAAA,GAAIrB,aAAAA,CAAEuC,KAAK,CAACvC,cAAEkC,GAAG,EAAA,CAAA;gBACrB,IAAIM,MAAAA,CAAOlB,GAAG,KAAKf,SAAAA,EAAWc,CAAAA,GAAI,CAACA,CAA2BC,GAAG,CAACkB,MAAAA,CAAOlB,GAAG,CAAA;gBAC5E,IAAIkB,MAAAA,CAAOjB,GAAG,KAAKhB,SAAAA,EAAWc,CAAAA,GAAI,CAACA,CAA2BE,GAAG,CAACiB,MAAAA,CAAOjB,GAAG,CAAA;AAC5E,gBAAA,OAAOiB,OAAOtB,QAAQ,KAAK,IAAA,GAAOG,CAAAA,GAAIA,EAAEG,QAAQ,EAAA;AAClD,YAAA;QACA,KAAK,OAAA;AAAS,YAAA;AACZ,gBAAA,MAAMiB,SAAAA,GAAYlD,IAAAA;AAClB,gBAAA,MAAM8B,CAAAA,GAAIoB,SAAAA,CAAUC,QAAQ,KAAK,IAAA,GAAO1C,aAAAA,CAAEuC,KAAK,CAACvC,aAAAA,CAAEkC,GAAG,EAAA,CAAA,GAAMlC,aAAAA,CAAEkC,GAAG,EAAA;AAChE,gBAAA,OAAOO,UAAUvB,QAAQ,KAAK,IAAA,GAAOG,CAAAA,GAAIA,EAAEG,QAAQ,EAAA;AACrD,YAAA;QACA,KAAK,UAAA;AAAY,YAAA;AACf,gBAAA,MAAMmB,OAAAA,GAAUpD,IAAAA;AAChB,gBAAA,MAAMqD,QAAAA,GAAWD,OAAAA,CAAQE,QAAQ,EAAEC,SAAS,QAAA,CAAA,KAAc,IAAA;gBAE1D,MAAMC,aAAAA,GAAgB/C,cACnBE,MAAM,EAAA,CACNoB,GAAG,CAAC,CAAA,CAAA,CACJ0B,QAAQ,CAAC,uDAAA,CAAA;gBAEZ,MAAMC,WAAAA,GAAcjD,aAAAA,CACjBgB,MAAM,CAAC;oBACNkC,UAAAA,EAAYH,aAAAA;AACZI,oBAAAA,MAAAA,EAAQnD,cACLE,MAAM,EAAA,CACNsB,QAAQ,EAAA,CACRwB,QAAQ,CAAC,oDAAA,CAAA;oBACZI,MAAAA,EAAQpD,aAAAA,CACL6B,IAAI,CAAC;AAAC,wBAAA,OAAA;AAAS,wBAAA;qBAAY,CAAA,CAC3BL,QAAQ,EAAA,CACRwB,QAAQ,CAAC,kEAAA;AACd,iBAAA,CAAA,CACC/B,MAAM,EAAA;gBAET,IAAII,CAAAA;AAEJ,gBAAA,IAAIuB,aAAa,IAAA,EAAM;oBACrB,MAAMS,QAAAA,GAAWrD,aAAAA,CAAEsD,KAAK,CAAC;AAACP,wBAAAA,aAAAA;AAAeE,wBAAAA;AAAY,qBAAA,CAAA;oBAErD,MAAMM,kBAAAA,GAAqBvD,aAAAA,CACxBgB,MAAM,CAAC;AACNwC,wBAAAA,MAAAA,EAAQxD,cAAEE,MAAM,EAAA,CAAGsB,QAAQ,EAAA,CAAGwB,QAAQ,CAAC,+BAAA,CAAA;AACvCS,wBAAAA,KAAAA,EAAOzD,cAAEE,MAAM,EAAA,CAAGsB,QAAQ,EAAA,CAAGwB,QAAQ,CAAC,8BAAA,CAAA;AACtCU,wBAAAA,KAAAA,EAAO1D,cAAE4B,OAAO,EAAA,CAAGJ,QAAQ,EAAA,CAAGwB,QAAQ,CAAC,0BAAA,CAAA;AACvCW,wBAAAA,GAAAA,EAAK3D,cAAE4B,OAAO,EAAA,CAAGJ,QAAQ,EAAA,CAAGwB,QAAQ,CAAC,kCAAA;AACvC,qBAAA,CAAA,CACC/B,MAAM,EAAA;oBAET,MAAM2C,eAAAA,GAAkB5D,aAAAA,CACrBgB,MAAM,CAAC;wBACNkC,UAAAA,EAAYH,aAAAA;wBACZI,MAAAA,EAAQnD,aAAAA,CAAEE,MAAM,EAAA,CAAGsB,QAAQ,EAAA;wBAC3B4B,MAAAA,EAAQpD,aAAAA,CAAE6B,IAAI,CAAC;AAAC,4BAAA,OAAA;AAAS,4BAAA;AAAY,yBAAA,CAAA,CAAEL,QAAQ,EAAA;AAC/CqC,wBAAAA,QAAAA,EAAUN,kBAAAA,CACP/B,QAAQ,EAAA,CACRwB,QAAQ,CAAC,wCAAA;AACd,qBAAA,CAAA,CACC/B,MAAM,EAAA;oBAETI,CAAAA,GAAIrB,aAAAA,CACDgB,MAAM,CAAC;AACN8C,wBAAAA,OAAAA,EAAS9D,aAAAA,CACNuC,KAAK,CAACvC,aAAAA,CAAEsD,KAAK,CAAC;AAACP,4BAAAA,aAAAA;AAAea,4BAAAA;yBAAgB,CAAA,CAAA,CAC9CpC,QAAQ,EAAA,CACRwB,QAAQ,CACP,+FAAA,CAAA;AAEJe,wBAAAA,UAAAA,EAAY/D,cACTuC,KAAK,CAACc,UACN7B,QAAQ,EAAA,CACRwB,QAAQ,CACP,uFAAA,CAAA;wBAEJgB,GAAAA,EAAKhE,aAAAA,CACFsD,KAAK,CAAC;AAACtD,4BAAAA,aAAAA,CAAEuC,KAAK,CAACc,QAAAA,CAAAA;AAAWrD,4BAAAA,aAAAA,CAAEiE,IAAI;yBAAG,CAAA,CACnCzC,QAAQ,EAAA,CACRwB,QAAQ,CACP,8GAAA;AAEN,qBAAA,CAAA,CACC/B,MAAM,EAAA;gBACX,CAAA,MAAO;oBACLI,CAAAA,GAAIrB,aAAAA,CAAEsD,KAAK,CAAC;AACVP,wBAAAA,aAAAA;AACAE,wBAAAA,WAAAA;wBACAjD,aAAAA,CAAEiE,IAAI,EAAA,CAAGjB,QAAQ,CAAC,oCAAA;AACnB,qBAAA,CAAA;AACH,gBAAA;AAEA,gBAAA,OAAOL,QAAQzB,QAAQ,KAAK,IAAA,GAAOG,CAAAA,GAAIA,EAAEG,QAAQ,EAAA;AACnD,YAAA;AACA,QAAA;AAAS,YAAA;AACP,gBAAA,MAAM0C,WAAAA,GAAuB3E,IAAAA;AAC7B,gBAAA,IAAID,uBAAuB4E,WAAAA,CAAAA,EAAc;oBACvC,MAAMzE,WAAAA,GAAcE,OAAOwE,GAAG,CAAC,iBAAiBA,GAAG,CAACD,YAAYzE,WAAW,CAAA;AAC3E,oBAAA,IAAIA,gBAAgBc,SAAAA,EAAW;AAC7B,wBAAA,OAAOO,uBACLnB,MAAAA,EACA;AACE,4BAAA,GAAGuE,WAAW;AACd1E,4BAAAA,IAAAA,EAAMC,YAAYD;yBACpB,EACAK,OAAAA,CAAAA;AAEJ,oBAAA;AACF,gBAAA;AACA,gBAAA,OAAOG,cAAEG,OAAO,EAAA;AAClB,YAAA;AACF;AACF;AAEA;;;;;AAKC,IACM,MAAMiE,eAAAA,GAAkB,CAC7BzE,MAAAA,EACA0E,QACAxD,UAAAA,EACAyD,eAAAA,GAAAA;AAEA,IAAA,MAAM7D,QAAsC,EAAC;IAE7C,KAAK,MAAM,CAACC,GAAAA,EAAKnB,IAAAA,CAAK,IAAIoB,MAAAA,CAAOC,OAAO,CAACC,UAAAA,CAAAA,CAAa;QACpD,MAAM0D,WAAAA,GACJD,oBAAoB,IAAA,IACpBA,eAAAA,KAAoB/D,aACpB+D,eAAAA,CAAgBvE,GAAG,CAACW,GAAAA,CAAAA,KAAS,IAAA;AAE/B,QAAA,IACE6D,WAAAA,KAAgB,IAAA,IAChBC,wBAAAA,CAAaC,mBAAmB,CAACJ,MAAAA,EAAoC3D,GAAAA,CAAAA,KAAS,IAAA,IAC9E8D,wBAAAA,CAAaE,kBAAkB,CAACL,MAAAA,EAAoC3D,SAAS,IAAA,EAC7E;AACAD,YAAAA,KAAK,CAACC,GAAAA,CAAI,GAAGI,sBAAAA,CAAuBnB,MAAAA,EAAQJ,IAAAA,CAAAA;AAC9C,QAAA;AACF,IAAA;AAEA,IAAA,OAAOS,cAAEgB,MAAM,CAACP,OAAOQ,MAAM,EAAA,CAAG+B,QAAQ,CAAC,iCAAA,CAAA;AAC3C;;;;;;"}
@@ -41,9 +41,6 @@ const isCustomFieldAttribute = (attr)=>typeof attr === 'object' && attr !== null
41
41
  * here to avoid a cross-package import from @strapi/content-manager into
42
42
  * @strapi/core (which is not a listed dependency).
43
43
  *
44
- * TODO — custom fields call `strapi.get('custom-fields')` at schema-build
45
- * time; confirm with an integration test that the registry is populated when MCP
46
- * tools are registered (post-bootstrap).
47
44
  */ const attributeToInputSchema = (strapi, attr, visited = new Set())=>{
48
45
  switch(attr.type){
49
46
  case 'string':
@@ -1 +1 @@
1
- {"version":3,"file":"data-schema.mjs","sources":["../../../../server/src/mcp/schemas/data-schema.ts"],"sourcesContent":["import { contentTypes, z } from '@strapi/utils';\nimport type { Core, Schema, Struct } from '@strapi/types';\n\nimport { buildBlocksInputSchema } from './blocks-schema';\nimport type { ContentManagerModelForMcp } from '../types';\n\ntype CustomFieldAttribute = {\n type: 'customField';\n customField: string;\n [key: string]: unknown;\n};\n\nconst isCustomFieldAttribute = (attr: unknown): attr is CustomFieldAttribute =>\n typeof attr === 'object' &&\n attr !== null &&\n (attr as Record<string, unknown>).type === 'customField' &&\n typeof (attr as Record<string, unknown>).customField === 'string';\n\n/**\n * Builds a structured Zod object schema for a Strapi component UID.\n * Declared as a regular function so it is hoisted above `attributeToInputSchema`\n * — the two functions are mutually recursive (component attrs recurse into\n * attributeToInputSchema; attributeToInputSchema calls this for 'component' cases).\n *\n * @param strapi - Strapi instance (components registry available post-load).\n * @param componentUid - e.g. \"common.seo\".\n * @param visited - cycle-guard; prevents infinite recursion on self-referencing components.\n */\nexport function buildComponentInputSchema(\n strapi: Core.Strapi,\n componentUid: string,\n visited: Set<string> = new Set()\n): z.ZodTypeAny {\n if (visited.has(componentUid) === true) {\n // Circular reference — fall back to permissive but non-empty JSON Schema\n return z.record(z.string(), z.unknown());\n }\n\n type ComponentEntry = { attributes: Record<string, Schema.Attribute.AnyAttribute> };\n const componentsMap = strapi.components as unknown as Record<string, ComponentEntry | undefined>;\n const component = componentsMap[componentUid];\n if (component === undefined) {\n return z.record(z.string(), z.unknown());\n }\n\n visited.add(componentUid);\n\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const [key, attr] of Object.entries(component.attributes)) {\n if (key === 'id') {\n // eslint-disable-next-line no-continue\n continue;\n }\n shape[key] = attributeToInputSchema(strapi, attr, visited);\n }\n\n visited.delete(componentUid);\n\n return z.object(shape).strict();\n}\n\n/**\n * Maps a single Strapi attribute to a Zod input schema, carrying constraints\n * (min, max, minLength, maxLength, required, enum values, etc.).\n *\n * Mirrors the `mapAttributeToInputSchema` logic from\n * `packages/core/core/src/core-api/routes/validation/mappers.ts` — kept inline\n * here to avoid a cross-package import from @strapi/content-manager into\n * @strapi/core (which is not a listed dependency).\n *\n * TODO — custom fields call `strapi.get('custom-fields')` at schema-build\n * time; confirm with an integration test that the registry is populated when MCP\n * tools are registered (post-bootstrap).\n */\nexport const attributeToInputSchema = (\n strapi: Core.Strapi,\n attr: Schema.Attribute.AnyAttribute,\n visited: Set<string> = new Set()\n): z.ZodTypeAny => {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'password': {\n const { required, minLength, maxLength } = attr as Schema.Attribute.String;\n let s: z.ZodString = z.string();\n if (minLength !== undefined) s = s.min(minLength);\n if (maxLength !== undefined) s = s.max(maxLength);\n return required === true ? s : s.optional();\n }\n case 'email': {\n const { required } = attr as Schema.Attribute.Email;\n const s = z.string().email();\n return required === true ? s : s.optional();\n }\n case 'uid': {\n const { required } = attr as Schema.Attribute.UID;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'integer': {\n const { required, min, max } = attr as Schema.Attribute.Integer;\n let s = z.number().int();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'biginteger': {\n const { required } = attr as Schema.Attribute.BigInteger;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'decimal':\n case 'float': {\n const { required, min, max } = attr as Schema.Attribute.Decimal;\n let s = z.number();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'boolean': {\n const { required } = attr as Schema.Attribute.Boolean;\n const s = z.boolean();\n return required === true ? s : s.optional();\n }\n case 'date':\n case 'datetime':\n case 'time':\n case 'timestamp': {\n const { required } = attr as Schema.Attribute.Date;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'enumeration': {\n const { required, enum: values } = attr as Schema.Attribute.Enumeration<string[]>;\n if (Array.isArray(values) && values.length > 0) {\n const s = z.enum(values as [string, ...string[]]);\n return required === true ? s : s.optional();\n }\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'json': {\n const { required } = attr as Schema.Attribute.JSON;\n const s = z.any();\n return required === true ? s : s.optional();\n }\n case 'blocks': {\n const { required } = attr as Schema.Attribute.Blocks;\n const s = buildBlocksInputSchema();\n return required === true ? s : s.optional();\n }\n case 'component': {\n // Cast to a plain record to avoid generic defaults on `repeatable` (Constants.False)\n const componentAttr = attr as unknown as {\n required?: boolean;\n repeatable?: boolean;\n component?: string;\n min?: number;\n max?: number;\n };\n const componentUid = componentAttr.component;\n const componentSchema: z.ZodTypeAny =\n componentUid !== undefined\n ? buildComponentInputSchema(strapi, componentUid, visited)\n : z.record(z.string(), z.unknown());\n\n let s: z.ZodTypeAny =\n componentAttr.repeatable === true ? z.array(componentSchema) : componentSchema;\n if (componentAttr.repeatable === true && componentAttr.min !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).min(componentAttr.min);\n }\n if (componentAttr.repeatable === true && componentAttr.max !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).max(componentAttr.max);\n }\n return componentAttr.required === true ? s : s.optional();\n }\n case 'dynamiczone': {\n const dzAttr = attr as unknown as { required?: boolean; min?: number; max?: number };\n let s = z.array(z.any());\n if (dzAttr.min !== undefined) s = (s as z.ZodArray<z.ZodAny>).min(dzAttr.min);\n if (dzAttr.max !== undefined) s = (s as z.ZodArray<z.ZodAny>).max(dzAttr.max);\n return dzAttr.required === true ? s : s.optional();\n }\n case 'media': {\n const mediaAttr = attr as unknown as { required?: boolean; multiple?: boolean };\n const s = mediaAttr.multiple === true ? z.array(z.any()) : z.any();\n return mediaAttr.required === true ? s : s.optional();\n }\n case 'relation': {\n const relAttr = attr as Schema.Attribute.Relation;\n const isToMany = relAttr.relation?.endsWith('ToMany') === true;\n\n const relDocumentId = z\n .string()\n .min(1)\n .describe('Strapi document ID (e.g. \"z7v8zma53x01r6oceimv922b\").');\n\n const relLongHand = z\n .object({\n documentId: relDocumentId,\n locale: z\n .string()\n .optional()\n .describe('Target locale. Defaults to source document locale.'),\n status: z\n .enum(['draft', 'published'])\n .optional()\n .describe('Target version status. Defaults based on draftAndPublish config.'),\n })\n .strict();\n\n let s: z.ZodTypeAny;\n\n if (isToMany === true) {\n const relEntry = z.union([relDocumentId, relLongHand]);\n\n const relConnectPosition = z\n .object({\n before: z.string().optional().describe('Document ID to insert before.'),\n after: z.string().optional().describe('Document ID to insert after.'),\n start: z.boolean().optional().describe('Insert at start of list.'),\n end: z.boolean().optional().describe('Insert at end of list (default).'),\n })\n .strict();\n\n const relConnectEntry = z\n .object({\n documentId: relDocumentId,\n locale: z.string().optional(),\n status: z.enum(['draft', 'published']).optional(),\n position: relConnectPosition\n .optional()\n .describe('Ordering hint. Default: { end: true }.'),\n })\n .strict();\n\n s = z\n .object({\n connect: z\n .array(z.union([relDocumentId, relConnectEntry]))\n .optional()\n .describe(\n 'Add relations. Each entry: documentId string, or { documentId, locale?, status?, position? }.'\n ),\n disconnect: z\n .array(relEntry)\n .optional()\n .describe(\n 'Remove relations. Each entry: documentId string, or { documentId, locale?, status? }.'\n ),\n set: z\n .union([z.array(relEntry), z.null()])\n .optional()\n .describe(\n 'Replace all relations. Array replaces existing; null clears all. Mutually exclusive with connect/disconnect.'\n ),\n })\n .strict();\n } else {\n s = z.union([\n relDocumentId,\n relLongHand,\n z.null().describe('Set to null to clear the relation.'),\n ]);\n }\n\n return relAttr.required === true ? s : s.optional();\n }\n default: {\n const unknownAttr: unknown = attr;\n if (isCustomFieldAttribute(unknownAttr)) {\n const customField = strapi.get('custom-fields').get(unknownAttr.customField);\n if (customField !== undefined) {\n return attributeToInputSchema(\n strapi,\n {\n ...unknownAttr,\n type: customField.type,\n } as unknown as Schema.Attribute.AnyAttribute,\n visited\n );\n }\n }\n return z.unknown();\n }\n }\n};\n\n/**\n * Derives a per-content-type `data` Zod schema from the model's writable attributes.\n * Uses `contentTypes.isWritableAttribute` to filter system-managed keys\n * (id, documentId, timestamps, createdBy, updatedBy, localizations, locale, etc.).\n * Unknown keys are rejected (strict mode) — invalid field names fail at the MCP boundary.\n */\nexport const buildDataSchema = (\n strapi: Core.Strapi,\n schema: Struct.ContentTypeSchema | ContentManagerModelForMcp,\n attributes: Struct.SchemaAttributes,\n permittedFields?: Set<string> | null\n): z.ZodTypeAny => {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, attr] of Object.entries(attributes)) {\n const isPermitted =\n permittedFields === null ||\n permittedFields === undefined ||\n permittedFields.has(key) === true;\n\n if (\n isPermitted === true &&\n contentTypes.isWritableAttribute(schema as Struct.ContentTypeSchema, key) === true &&\n contentTypes.isPrivateAttribute(schema as Struct.ContentTypeSchema, key) !== true\n ) {\n shape[key] = attributeToInputSchema(strapi, attr);\n }\n }\n\n return z.object(shape).strict().describe('Document field values to write.');\n};\n"],"names":["isCustomFieldAttribute","attr","type","customField","buildComponentInputSchema","strapi","componentUid","visited","Set","has","z","record","string","unknown","componentsMap","components","component","undefined","add","shape","key","Object","entries","attributes","attributeToInputSchema","delete","object","strict","required","minLength","maxLength","s","min","max","optional","email","number","int","boolean","enum","values","Array","isArray","length","any","buildBlocksInputSchema","componentAttr","componentSchema","repeatable","array","dzAttr","mediaAttr","multiple","relAttr","isToMany","relation","endsWith","relDocumentId","describe","relLongHand","documentId","locale","status","relEntry","union","relConnectPosition","before","after","start","end","relConnectEntry","position","connect","disconnect","set","null","unknownAttr","get","buildDataSchema","schema","permittedFields","isPermitted","contentTypes","isWritableAttribute","isPrivateAttribute"],"mappings":"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"}
1
+ {"version":3,"file":"data-schema.mjs","sources":["../../../../server/src/mcp/schemas/data-schema.ts"],"sourcesContent":["import { contentTypes, z } from '@strapi/utils';\nimport type { Core, Schema, Struct } from '@strapi/types';\n\nimport { buildBlocksInputSchema } from './blocks-schema';\nimport type { ContentManagerModelForMcp } from '../types';\n\ntype CustomFieldAttribute = {\n type: 'customField';\n customField: string;\n [key: string]: unknown;\n};\n\nconst isCustomFieldAttribute = (attr: unknown): attr is CustomFieldAttribute =>\n typeof attr === 'object' &&\n attr !== null &&\n (attr as Record<string, unknown>).type === 'customField' &&\n typeof (attr as Record<string, unknown>).customField === 'string';\n\n/**\n * Builds a structured Zod object schema for a Strapi component UID.\n * Declared as a regular function so it is hoisted above `attributeToInputSchema`\n * — the two functions are mutually recursive (component attrs recurse into\n * attributeToInputSchema; attributeToInputSchema calls this for 'component' cases).\n *\n * @param strapi - Strapi instance (components registry available post-load).\n * @param componentUid - e.g. \"common.seo\".\n * @param visited - cycle-guard; prevents infinite recursion on self-referencing components.\n */\nexport function buildComponentInputSchema(\n strapi: Core.Strapi,\n componentUid: string,\n visited: Set<string> = new Set()\n): z.ZodTypeAny {\n if (visited.has(componentUid) === true) {\n // Circular reference — fall back to permissive but non-empty JSON Schema\n return z.record(z.string(), z.unknown());\n }\n\n type ComponentEntry = { attributes: Record<string, Schema.Attribute.AnyAttribute> };\n const componentsMap = strapi.components as unknown as Record<string, ComponentEntry | undefined>;\n const component = componentsMap[componentUid];\n if (component === undefined) {\n return z.record(z.string(), z.unknown());\n }\n\n visited.add(componentUid);\n\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const [key, attr] of Object.entries(component.attributes)) {\n if (key === 'id') {\n // eslint-disable-next-line no-continue\n continue;\n }\n shape[key] = attributeToInputSchema(strapi, attr, visited);\n }\n\n visited.delete(componentUid);\n\n return z.object(shape).strict();\n}\n\n/**\n * Maps a single Strapi attribute to a Zod input schema, carrying constraints\n * (min, max, minLength, maxLength, required, enum values, etc.).\n *\n * Mirrors the `mapAttributeToInputSchema` logic from\n * `packages/core/core/src/core-api/routes/validation/mappers.ts` — kept inline\n * here to avoid a cross-package import from @strapi/content-manager into\n * @strapi/core (which is not a listed dependency).\n *\n */\nexport const attributeToInputSchema = (\n strapi: Core.Strapi,\n attr: Schema.Attribute.AnyAttribute,\n visited: Set<string> = new Set()\n): z.ZodTypeAny => {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'password': {\n const { required, minLength, maxLength } = attr as Schema.Attribute.String;\n let s: z.ZodString = z.string();\n if (minLength !== undefined) s = s.min(minLength);\n if (maxLength !== undefined) s = s.max(maxLength);\n return required === true ? s : s.optional();\n }\n case 'email': {\n const { required } = attr as Schema.Attribute.Email;\n const s = z.string().email();\n return required === true ? s : s.optional();\n }\n case 'uid': {\n const { required } = attr as Schema.Attribute.UID;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'integer': {\n const { required, min, max } = attr as Schema.Attribute.Integer;\n let s = z.number().int();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'biginteger': {\n const { required } = attr as Schema.Attribute.BigInteger;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'decimal':\n case 'float': {\n const { required, min, max } = attr as Schema.Attribute.Decimal;\n let s = z.number();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'boolean': {\n const { required } = attr as Schema.Attribute.Boolean;\n const s = z.boolean();\n return required === true ? s : s.optional();\n }\n case 'date':\n case 'datetime':\n case 'time':\n case 'timestamp': {\n const { required } = attr as Schema.Attribute.Date;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'enumeration': {\n const { required, enum: values } = attr as Schema.Attribute.Enumeration<string[]>;\n if (Array.isArray(values) && values.length > 0) {\n const s = z.enum(values as [string, ...string[]]);\n return required === true ? s : s.optional();\n }\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'json': {\n const { required } = attr as Schema.Attribute.JSON;\n const s = z.any();\n return required === true ? s : s.optional();\n }\n case 'blocks': {\n const { required } = attr as Schema.Attribute.Blocks;\n const s = buildBlocksInputSchema();\n return required === true ? s : s.optional();\n }\n case 'component': {\n // Cast to a plain record to avoid generic defaults on `repeatable` (Constants.False)\n const componentAttr = attr as unknown as {\n required?: boolean;\n repeatable?: boolean;\n component?: string;\n min?: number;\n max?: number;\n };\n const componentUid = componentAttr.component;\n const componentSchema: z.ZodTypeAny =\n componentUid !== undefined\n ? buildComponentInputSchema(strapi, componentUid, visited)\n : z.record(z.string(), z.unknown());\n\n let s: z.ZodTypeAny =\n componentAttr.repeatable === true ? z.array(componentSchema) : componentSchema;\n if (componentAttr.repeatable === true && componentAttr.min !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).min(componentAttr.min);\n }\n if (componentAttr.repeatable === true && componentAttr.max !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).max(componentAttr.max);\n }\n return componentAttr.required === true ? s : s.optional();\n }\n case 'dynamiczone': {\n const dzAttr = attr as unknown as { required?: boolean; min?: number; max?: number };\n let s = z.array(z.any());\n if (dzAttr.min !== undefined) s = (s as z.ZodArray<z.ZodAny>).min(dzAttr.min);\n if (dzAttr.max !== undefined) s = (s as z.ZodArray<z.ZodAny>).max(dzAttr.max);\n return dzAttr.required === true ? s : s.optional();\n }\n case 'media': {\n const mediaAttr = attr as unknown as { required?: boolean; multiple?: boolean };\n const s = mediaAttr.multiple === true ? z.array(z.any()) : z.any();\n return mediaAttr.required === true ? s : s.optional();\n }\n case 'relation': {\n const relAttr = attr as Schema.Attribute.Relation;\n const isToMany = relAttr.relation?.endsWith('ToMany') === true;\n\n const relDocumentId = z\n .string()\n .min(1)\n .describe('Strapi document ID (e.g. \"z7v8zma53x01r6oceimv922b\").');\n\n const relLongHand = z\n .object({\n documentId: relDocumentId,\n locale: z\n .string()\n .optional()\n .describe('Target locale. Defaults to source document locale.'),\n status: z\n .enum(['draft', 'published'])\n .optional()\n .describe('Target version status. Defaults based on draftAndPublish config.'),\n })\n .strict();\n\n let s: z.ZodTypeAny;\n\n if (isToMany === true) {\n const relEntry = z.union([relDocumentId, relLongHand]);\n\n const relConnectPosition = z\n .object({\n before: z.string().optional().describe('Document ID to insert before.'),\n after: z.string().optional().describe('Document ID to insert after.'),\n start: z.boolean().optional().describe('Insert at start of list.'),\n end: z.boolean().optional().describe('Insert at end of list (default).'),\n })\n .strict();\n\n const relConnectEntry = z\n .object({\n documentId: relDocumentId,\n locale: z.string().optional(),\n status: z.enum(['draft', 'published']).optional(),\n position: relConnectPosition\n .optional()\n .describe('Ordering hint. Default: { end: true }.'),\n })\n .strict();\n\n s = z\n .object({\n connect: z\n .array(z.union([relDocumentId, relConnectEntry]))\n .optional()\n .describe(\n 'Add relations. Each entry: documentId string, or { documentId, locale?, status?, position? }.'\n ),\n disconnect: z\n .array(relEntry)\n .optional()\n .describe(\n 'Remove relations. Each entry: documentId string, or { documentId, locale?, status? }.'\n ),\n set: z\n .union([z.array(relEntry), z.null()])\n .optional()\n .describe(\n 'Replace all relations. Array replaces existing; null clears all. Mutually exclusive with connect/disconnect.'\n ),\n })\n .strict();\n } else {\n s = z.union([\n relDocumentId,\n relLongHand,\n z.null().describe('Set to null to clear the relation.'),\n ]);\n }\n\n return relAttr.required === true ? s : s.optional();\n }\n default: {\n const unknownAttr: unknown = attr;\n if (isCustomFieldAttribute(unknownAttr)) {\n const customField = strapi.get('custom-fields').get(unknownAttr.customField);\n if (customField !== undefined) {\n return attributeToInputSchema(\n strapi,\n {\n ...unknownAttr,\n type: customField.type,\n } as unknown as Schema.Attribute.AnyAttribute,\n visited\n );\n }\n }\n return z.unknown();\n }\n }\n};\n\n/**\n * Derives a per-content-type `data` Zod schema from the model's writable attributes.\n * Uses `contentTypes.isWritableAttribute` to filter system-managed keys\n * (id, documentId, timestamps, createdBy, updatedBy, localizations, locale, etc.).\n * Unknown keys are rejected (strict mode) — invalid field names fail at the MCP boundary.\n */\nexport const buildDataSchema = (\n strapi: Core.Strapi,\n schema: Struct.ContentTypeSchema | ContentManagerModelForMcp,\n attributes: Struct.SchemaAttributes,\n permittedFields?: Set<string> | null\n): z.ZodTypeAny => {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, attr] of Object.entries(attributes)) {\n const isPermitted =\n permittedFields === null ||\n permittedFields === undefined ||\n permittedFields.has(key) === true;\n\n if (\n isPermitted === true &&\n contentTypes.isWritableAttribute(schema as Struct.ContentTypeSchema, key) === true &&\n contentTypes.isPrivateAttribute(schema as Struct.ContentTypeSchema, key) !== true\n ) {\n shape[key] = attributeToInputSchema(strapi, attr);\n }\n }\n\n return z.object(shape).strict().describe('Document field values to write.');\n};\n"],"names":["isCustomFieldAttribute","attr","type","customField","buildComponentInputSchema","strapi","componentUid","visited","Set","has","z","record","string","unknown","componentsMap","components","component","undefined","add","shape","key","Object","entries","attributes","attributeToInputSchema","delete","object","strict","required","minLength","maxLength","s","min","max","optional","email","number","int","boolean","enum","values","Array","isArray","length","any","buildBlocksInputSchema","componentAttr","componentSchema","repeatable","array","dzAttr","mediaAttr","multiple","relAttr","isToMany","relation","endsWith","relDocumentId","describe","relLongHand","documentId","locale","status","relEntry","union","relConnectPosition","before","after","start","end","relConnectEntry","position","connect","disconnect","set","null","unknownAttr","get","buildDataSchema","schema","permittedFields","isPermitted","contentTypes","isWritableAttribute","isPrivateAttribute"],"mappings":"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"}
@@ -1,7 +1,31 @@
1
1
  'use strict';
2
2
 
3
3
  var strapiUtils = require('@strapi/utils');
4
+ var shapeRelations = require('../sanitizers/shape-relations.js');
4
5
 
6
+ const relationIdentity = strapiUtils.z.object({
7
+ documentId: strapiUtils.z.string(),
8
+ locale: strapiUtils.z.string().optional(),
9
+ __type: strapiUtils.z.string().optional(),
10
+ // Computed publish status preserved on `localizations` entries (calculate, then strip).
11
+ status: strapiUtils.z.string().optional()
12
+ });
13
+ const buildAttributeSchema = (key, attributes)=>{
14
+ const attribute = attributes[key];
15
+ if (attribute?.type !== 'relation') {
16
+ return strapiUtils.z.unknown().optional();
17
+ }
18
+ // admin::user relations are out of scope — left as unknown
19
+ if (attribute.target === 'admin::user') {
20
+ return strapiUtils.z.unknown().optional();
21
+ }
22
+ // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK
23
+ // validates structuredContent against this schema, so a mismatch fails the tool call.
24
+ if (shapeRelations.isManyRelationForMcp(attribute)) {
25
+ return strapiUtils.z.array(relationIdentity).optional();
26
+ }
27
+ return relationIdentity.nullable().optional();
28
+ };
5
29
  const buildOutputDataSchema = (attributes, permittedFields)=>{
6
30
  const readableKeys = Object.keys(attributes).filter((key)=>permittedFields === null || permittedFields.has(key));
7
31
  if (readableKeys.length === 0) {
@@ -9,7 +33,7 @@ const buildOutputDataSchema = (attributes, permittedFields)=>{
9
33
  }
10
34
  const shape = Object.fromEntries(readableKeys.map((key)=>[
11
35
  key,
12
- strapiUtils.z.unknown().optional()
36
+ buildAttributeSchema(key, attributes)
13
37
  ]));
14
38
  return strapiUtils.z.object(shape).loose();
15
39
  };
@@ -37,9 +61,11 @@ const buildOutputDataSchema = (attributes, permittedFields)=>{
37
61
  }).loose();
38
62
  /**
39
63
  * Builds the MCP output schema for a delete response (`{ data }`).
40
- * Field shape is constrained to `readFields` when non-null (RBAC field filtering).
41
- */ const buildDeleteOutputSchema = (attributes, readFields)=>strapiUtils.z.object({
42
- data: buildOutputDataSchema(attributes, readFields).nullable()
64
+ * Delete handlers return an empty data object, so do not require document relation fields.
65
+ */ const buildDeleteOutputSchema = (// eslint-disable-next-line @typescript-eslint/no-unused-vars
66
+ _attributes, // eslint-disable-next-line @typescript-eslint/no-unused-vars
67
+ _readFields)=>strapiUtils.z.object({
68
+ data: strapiUtils.z.object({}).loose().nullable()
43
69
  }).loose();
44
70
 
45
71
  exports.buildDeleteOutputSchema = buildDeleteOutputSchema;
@@ -1 +1 @@
1
- {"version":3,"file":"output-schemas.js","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(readableKeys.map((key) => [key, z.unknown().optional()]));\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDeleteOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n })\n .loose();\n"],"names":["buildOutputDataSchema","attributes","permittedFields","readableKeys","Object","keys","filter","key","has","length","z","record","string","unknown","shape","fromEntries","map","optional","object","loose","buildDocumentOutputSchema","readFields","data","nullable","meta","availableLocales","array","availableStatus","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema"],"mappings":";;;;AAGA,MAAMA,qBAAAA,GAAwB,CAC5BC,UAAAA,EACAC,eAAAA,GAAAA;AAEA,IAAA,MAAMC,YAAAA,GAAeC,MAAAA,CAAOC,IAAI,CAACJ,UAAAA,CAAAA,CAAYK,MAAM,CACjD,CAACC,GAAAA,GAAQL,eAAAA,KAAoB,IAAA,IAAQA,eAAAA,CAAgBM,GAAG,CAACD,GAAAA,CAAAA,CAAAA;IAG3D,IAAIJ,YAAAA,CAAaM,MAAM,KAAK,CAAA,EAAG;AAC7B,QAAA,OAAOC,cAAEC,MAAM,CAACD,cAAEE,MAAM,EAAA,EAAIF,cAAEG,OAAO,EAAA,CAAA;AACvC,IAAA;IAEA,MAAMC,KAAAA,GAAQV,OAAOW,WAAW,CAACZ,aAAaa,GAAG,CAAC,CAACT,GAAAA,GAAQ;AAACA,YAAAA,GAAAA;YAAKG,aAAAA,CAAEG,OAAO,GAAGI,QAAQ;AAAG,SAAA,CAAA,CAAA;AAExF,IAAA,OAAOP,aAAAA,CAAEQ,MAAM,CAACJ,KAAAA,CAAAA,CAAOK,KAAK,EAAA;AAC9B,CAAA;AAEA;;;UAIaC,yBAAAA,GAA4B,CACvCnB,YACAoB,UAAAA,GAEAX,aAAAA,CACGQ,MAAM,CAAC;QACNI,IAAAA,EAAMtB,qBAAAA,CAAsBC,UAAAA,EAAYoB,UAAAA,CAAAA,CAAYE,QAAQ,EAAA;QAC5DC,IAAAA,EAAMd,aAAAA,CACHQ,MAAM,CAAC;AACNO,YAAAA,gBAAAA,EAAkBf,aAAAA,CAAEgB,KAAK,CAAChB,aAAAA,CAAEC,MAAM,CAACD,aAAAA,CAAEE,MAAM,EAAA,EAAIF,aAAAA,CAAEG,OAAO,EAAA,CAAA,CAAA,CAAKI,QAAQ,EAAA;AACrEU,YAAAA,eAAAA,EAAiBjB,aAAAA,CAAEgB,KAAK,CAAChB,aAAAA,CAAEC,MAAM,CAACD,aAAAA,CAAEE,MAAM,EAAA,EAAIF,aAAAA,CAAEG,OAAO,EAAA,CAAA,CAAA,CAAKI,QAAQ;AACtE,SAAA,CAAA,CACCA,QAAQ;AACb,KAAA,CAAA,CACCE,KAAK;AAEV;;;UAIaS,qBAAAA,GAAwB,CACnC3B,YACAoB,UAAAA,GAEAX,aAAAA,CACGQ,MAAM,CAAC;AACNW,QAAAA,OAAAA,EAASnB,aAAAA,CAAEgB,KAAK,CAAC1B,qBAAAA,CAAsBC,UAAAA,EAAYoB,UAAAA,CAAAA,CAAAA;QACnDS,UAAAA,EAAYpB,aAAAA,CAAEQ,MAAM,CAAC;AACnBa,YAAAA,IAAAA,EAAMrB,cAAEsB,MAAM,EAAA;AACdC,YAAAA,QAAAA,EAAUvB,cAAEsB,MAAM,EAAA;AAClBE,YAAAA,SAAAA,EAAWxB,cAAEsB,MAAM,EAAA;AACnBG,YAAAA,KAAAA,EAAOzB,cAAEsB,MAAM;AACjB,SAAA;AACF,KAAA,CAAA,CACCb,KAAK;AAEV;;;UAIaiB,uBAAAA,GAA0B,CACrCnC,YACAoB,UAAAA,GAEAX,aAAAA,CACGQ,MAAM,CAAC;QACNI,IAAAA,EAAMtB,qBAAAA,CAAsBC,UAAAA,EAAYoB,UAAAA,CAAAA,CAAYE,QAAQ;AAC9D,KAAA,CAAA,CACCJ,KAAK;;;;;;"}
1
+ {"version":3,"file":"output-schemas.js","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nimport { isManyRelationForMcp } from '../sanitizers/shape-relations';\n\nconst relationIdentity = z.object({\n documentId: z.string(),\n locale: z.string().optional(),\n __type: z.string().optional(),\n // Computed publish status preserved on `localizations` entries (calculate, then strip).\n status: z.string().optional(),\n});\n\nconst buildAttributeSchema = (key: string, attributes: Struct.SchemaAttributes): z.ZodTypeAny => {\n const attribute = attributes[key];\n\n if (attribute?.type !== 'relation') {\n return z.unknown().optional();\n }\n\n // admin::user relations are out of scope — left as unknown\n if ((attribute as { target?: string }).target === 'admin::user') {\n return z.unknown().optional();\n }\n\n // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK\n // validates structuredContent against this schema, so a mismatch fails the tool call.\n if (isManyRelationForMcp(attribute as { relation?: string })) {\n return z.array(relationIdentity).optional();\n }\n\n return relationIdentity.nullable().optional();\n};\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(\n readableKeys.map((key) => [key, buildAttributeSchema(key, attributes)])\n );\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Delete handlers return an empty data object, so do not require document relation fields.\n */\nexport const buildDeleteOutputSchema = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _attributes: Struct.SchemaAttributes,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: z.object({}).loose().nullable(),\n })\n .loose();\n"],"names":["relationIdentity","z","object","documentId","string","locale","optional","__type","status","buildAttributeSchema","key","attributes","attribute","type","unknown","target","isManyRelationForMcp","array","nullable","buildOutputDataSchema","permittedFields","readableKeys","Object","keys","filter","has","length","record","shape","fromEntries","map","loose","buildDocumentOutputSchema","readFields","data","meta","availableLocales","availableStatus","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema","_attributes","_readFields"],"mappings":"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"}
@@ -1,5 +1,29 @@
1
1
  import { z } from '@strapi/utils';
2
+ import { isManyRelationForMcp } from '../sanitizers/shape-relations.mjs';
2
3
 
4
+ const relationIdentity = z.object({
5
+ documentId: z.string(),
6
+ locale: z.string().optional(),
7
+ __type: z.string().optional(),
8
+ // Computed publish status preserved on `localizations` entries (calculate, then strip).
9
+ status: z.string().optional()
10
+ });
11
+ const buildAttributeSchema = (key, attributes)=>{
12
+ const attribute = attributes[key];
13
+ if (attribute?.type !== 'relation') {
14
+ return z.unknown().optional();
15
+ }
16
+ // admin::user relations are out of scope — left as unknown
17
+ if (attribute.target === 'admin::user') {
18
+ return z.unknown().optional();
19
+ }
20
+ // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK
21
+ // validates structuredContent against this schema, so a mismatch fails the tool call.
22
+ if (isManyRelationForMcp(attribute)) {
23
+ return z.array(relationIdentity).optional();
24
+ }
25
+ return relationIdentity.nullable().optional();
26
+ };
3
27
  const buildOutputDataSchema = (attributes, permittedFields)=>{
4
28
  const readableKeys = Object.keys(attributes).filter((key)=>permittedFields === null || permittedFields.has(key));
5
29
  if (readableKeys.length === 0) {
@@ -7,7 +31,7 @@ const buildOutputDataSchema = (attributes, permittedFields)=>{
7
31
  }
8
32
  const shape = Object.fromEntries(readableKeys.map((key)=>[
9
33
  key,
10
- z.unknown().optional()
34
+ buildAttributeSchema(key, attributes)
11
35
  ]));
12
36
  return z.object(shape).loose();
13
37
  };
@@ -35,9 +59,11 @@ const buildOutputDataSchema = (attributes, permittedFields)=>{
35
59
  }).loose();
36
60
  /**
37
61
  * Builds the MCP output schema for a delete response (`{ data }`).
38
- * Field shape is constrained to `readFields` when non-null (RBAC field filtering).
39
- */ const buildDeleteOutputSchema = (attributes, readFields)=>z.object({
40
- data: buildOutputDataSchema(attributes, readFields).nullable()
62
+ * Delete handlers return an empty data object, so do not require document relation fields.
63
+ */ const buildDeleteOutputSchema = (// eslint-disable-next-line @typescript-eslint/no-unused-vars
64
+ _attributes, // eslint-disable-next-line @typescript-eslint/no-unused-vars
65
+ _readFields)=>z.object({
66
+ data: z.object({}).loose().nullable()
41
67
  }).loose();
42
68
 
43
69
  export { buildDeleteOutputSchema, buildDocumentOutputSchema, buildListOutputSchema };
@@ -1 +1 @@
1
- {"version":3,"file":"output-schemas.mjs","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(readableKeys.map((key) => [key, z.unknown().optional()]));\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDeleteOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n })\n .loose();\n"],"names":["buildOutputDataSchema","attributes","permittedFields","readableKeys","Object","keys","filter","key","has","length","z","record","string","unknown","shape","fromEntries","map","optional","object","loose","buildDocumentOutputSchema","readFields","data","nullable","meta","availableLocales","array","availableStatus","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema"],"mappings":";;AAGA,MAAMA,qBAAAA,GAAwB,CAC5BC,UAAAA,EACAC,eAAAA,GAAAA;AAEA,IAAA,MAAMC,YAAAA,GAAeC,MAAAA,CAAOC,IAAI,CAACJ,UAAAA,CAAAA,CAAYK,MAAM,CACjD,CAACC,GAAAA,GAAQL,eAAAA,KAAoB,IAAA,IAAQA,eAAAA,CAAgBM,GAAG,CAACD,GAAAA,CAAAA,CAAAA;IAG3D,IAAIJ,YAAAA,CAAaM,MAAM,KAAK,CAAA,EAAG;AAC7B,QAAA,OAAOC,EAAEC,MAAM,CAACD,EAAEE,MAAM,EAAA,EAAIF,EAAEG,OAAO,EAAA,CAAA;AACvC,IAAA;IAEA,MAAMC,KAAAA,GAAQV,OAAOW,WAAW,CAACZ,aAAaa,GAAG,CAAC,CAACT,GAAAA,GAAQ;AAACA,YAAAA,GAAAA;YAAKG,CAAAA,CAAEG,OAAO,GAAGI,QAAQ;AAAG,SAAA,CAAA,CAAA;AAExF,IAAA,OAAOP,CAAAA,CAAEQ,MAAM,CAACJ,KAAAA,CAAAA,CAAOK,KAAK,EAAA;AAC9B,CAAA;AAEA;;;UAIaC,yBAAAA,GAA4B,CACvCnB,YACAoB,UAAAA,GAEAX,CAAAA,CACGQ,MAAM,CAAC;QACNI,IAAAA,EAAMtB,qBAAAA,CAAsBC,UAAAA,EAAYoB,UAAAA,CAAAA,CAAYE,QAAQ,EAAA;QAC5DC,IAAAA,EAAMd,CAAAA,CACHQ,MAAM,CAAC;AACNO,YAAAA,gBAAAA,EAAkBf,CAAAA,CAAEgB,KAAK,CAAChB,CAAAA,CAAEC,MAAM,CAACD,CAAAA,CAAEE,MAAM,EAAA,EAAIF,CAAAA,CAAEG,OAAO,EAAA,CAAA,CAAA,CAAKI,QAAQ,EAAA;AACrEU,YAAAA,eAAAA,EAAiBjB,CAAAA,CAAEgB,KAAK,CAAChB,CAAAA,CAAEC,MAAM,CAACD,CAAAA,CAAEE,MAAM,EAAA,EAAIF,CAAAA,CAAEG,OAAO,EAAA,CAAA,CAAA,CAAKI,QAAQ;AACtE,SAAA,CAAA,CACCA,QAAQ;AACb,KAAA,CAAA,CACCE,KAAK;AAEV;;;UAIaS,qBAAAA,GAAwB,CACnC3B,YACAoB,UAAAA,GAEAX,CAAAA,CACGQ,MAAM,CAAC;AACNW,QAAAA,OAAAA,EAASnB,CAAAA,CAAEgB,KAAK,CAAC1B,qBAAAA,CAAsBC,UAAAA,EAAYoB,UAAAA,CAAAA,CAAAA;QACnDS,UAAAA,EAAYpB,CAAAA,CAAEQ,MAAM,CAAC;AACnBa,YAAAA,IAAAA,EAAMrB,EAAEsB,MAAM,EAAA;AACdC,YAAAA,QAAAA,EAAUvB,EAAEsB,MAAM,EAAA;AAClBE,YAAAA,SAAAA,EAAWxB,EAAEsB,MAAM,EAAA;AACnBG,YAAAA,KAAAA,EAAOzB,EAAEsB,MAAM;AACjB,SAAA;AACF,KAAA,CAAA,CACCb,KAAK;AAEV;;;UAIaiB,uBAAAA,GAA0B,CACrCnC,YACAoB,UAAAA,GAEAX,CAAAA,CACGQ,MAAM,CAAC;QACNI,IAAAA,EAAMtB,qBAAAA,CAAsBC,UAAAA,EAAYoB,UAAAA,CAAAA,CAAYE,QAAQ;AAC9D,KAAA,CAAA,CACCJ,KAAK;;;;"}
1
+ {"version":3,"file":"output-schemas.mjs","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nimport { isManyRelationForMcp } from '../sanitizers/shape-relations';\n\nconst relationIdentity = z.object({\n documentId: z.string(),\n locale: z.string().optional(),\n __type: z.string().optional(),\n // Computed publish status preserved on `localizations` entries (calculate, then strip).\n status: z.string().optional(),\n});\n\nconst buildAttributeSchema = (key: string, attributes: Struct.SchemaAttributes): z.ZodTypeAny => {\n const attribute = attributes[key];\n\n if (attribute?.type !== 'relation') {\n return z.unknown().optional();\n }\n\n // admin::user relations are out of scope — left as unknown\n if ((attribute as { target?: string }).target === 'admin::user') {\n return z.unknown().optional();\n }\n\n // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK\n // validates structuredContent against this schema, so a mismatch fails the tool call.\n if (isManyRelationForMcp(attribute as { relation?: string })) {\n return z.array(relationIdentity).optional();\n }\n\n return relationIdentity.nullable().optional();\n};\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(\n readableKeys.map((key) => [key, buildAttributeSchema(key, attributes)])\n );\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Delete handlers return an empty data object, so do not require document relation fields.\n */\nexport const buildDeleteOutputSchema = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _attributes: Struct.SchemaAttributes,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: z.object({}).loose().nullable(),\n })\n .loose();\n"],"names":["relationIdentity","z","object","documentId","string","locale","optional","__type","status","buildAttributeSchema","key","attributes","attribute","type","unknown","target","isManyRelationForMcp","array","nullable","buildOutputDataSchema","permittedFields","readableKeys","Object","keys","filter","has","length","record","shape","fromEntries","map","loose","buildDocumentOutputSchema","readFields","data","meta","availableLocales","availableStatus","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema","_attributes","_readFields"],"mappings":"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"}
@@ -1,15 +1,41 @@
1
1
  'use strict';
2
2
 
3
+ var metadata = require('../controllers/utils/metadata.js');
4
+ var shapeRelations = require('./sanitizers/shape-relations.js');
5
+
3
6
  /**
4
7
  * Converts a Strapi content-type UID into a safe MCP tool-name segment.
5
8
  * `api::article.article` → `article`; `plugin::i18n.locale` → `plugin-i18n_locale`.
6
9
  */ const slugifyUidForMcpToolName = (uid)=>{
7
10
  const [namespace, modelName] = uid.split('::');
8
- const modelNameParts = modelName.split('.').map((part)=>part.toLowerCase());
11
+ const parts = modelName.split('.').map((part)=>part.toLowerCase());
9
12
  if (namespace === 'api') {
10
- return `${modelNameParts[0]}`;
13
+ return parts[0];
14
+ }
15
+ return `${namespace.toLowerCase()}-${parts.join('_')}`;
16
+ };
17
+ /**
18
+ * Output chokepoint for MCP handlers returning `{ data, meta }`.
19
+ * Order matters — calculate, then strip:
20
+ * 1. permission-based sanitization,
21
+ * 2. formatDocumentWithMetadata — computes `data.status` and `localizations[].status`
22
+ * from `publishedAt`/`updatedAt`, which relation shaping removes,
23
+ * 3. relation shaping on the formatted `data` (identity-only relations; the
24
+ * freshly-computed `localizations[].status` survives via RelationIdentity).
25
+ *
26
+ * Handlers that do NOT attach metadata (delete, list) compose
27
+ * `permissionChecker.sanitizeOutput` + `shapeRelationsForMcp` directly instead.
28
+ */ const sanitizeFormatShape = async (permissionChecker, uid, doc, opts)=>{
29
+ const sanitized = await permissionChecker.sanitizeOutput(doc);
30
+ const formatted = await metadata.formatDocumentWithMetadata(permissionChecker, uid, sanitized, opts);
31
+ if (formatted.data === null || formatted.data === undefined) {
32
+ return formatted;
11
33
  }
12
- return `${namespace.toLowerCase()}_${modelNameParts[0]}`;
34
+ const shapedData = await shapeRelations.shapeRelationsForMcp(uid, formatted.data);
35
+ return {
36
+ ...formatted,
37
+ data: shapedData
38
+ };
13
39
  };
14
40
  /** Wraps a plain object into the dual-representation MCP tool return value (text + structuredContent). */ const ok = (structuredContent)=>({
15
41
  content: [
@@ -39,5 +65,6 @@
39
65
 
40
66
  exports.describeTool = describeTool;
41
67
  exports.ok = ok;
68
+ exports.sanitizeFormatShape = sanitizeFormatShape;
42
69
  exports.slugifyUidForMcpToolName = slugifyUidForMcpToolName;
43
70
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../server/src/mcp/utils.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\n\n/**\n * Converts a Strapi content-type UID into a safe MCP tool-name segment.\n * `api::article.article` → `article`; `plugin::i18n.locale` → `plugin-i18n_locale`.\n */\nexport const slugifyUidForMcpToolName = (uid: string): string => {\n const [namespace, modelName] = uid.split('::');\n const modelNameParts = modelName.split('.').map((part) => part.toLowerCase());\n if (namespace === 'api') {\n return `${modelNameParts[0]}`;\n }\n return `${namespace.toLowerCase()}_${modelNameParts[0]}`;\n};\n\n/** Wraps a plain object into the dual-representation MCP tool return value (text + structuredContent). */\nexport const ok = (\n structuredContent: Record<string, unknown>\n): Modules.MCP.McpToolHandlerReturn => ({\n content: [{ type: 'text', text: JSON.stringify(structuredContent) }],\n structuredContent,\n});\n\n/**\n * Generates the `title` and `description` metadata for a derived MCP tool.\n * Appends operation-specific notes for write/publish/unpublish/discard_draft operations.\n */\nexport const describeTool = (params: {\n apiID: string;\n uid: string;\n operation: string;\n}): { title: string; description: string } => {\n const { apiID, uid, operation } = params;\n const operationNoteByType: Partial<Record<string, string>> = {\n write:\n ' Creates or updates the single-type document. If no document exists, creates one; otherwise updates the existing draft.',\n publish:\n ' Operates on an existing document by documentId and may return a different numeric id for the published version row.',\n unpublish:\n ' Operates on an existing document by documentId and may return a different numeric id for the draft version row.',\n discard_draft:\n ' Operates on an existing document by documentId; treat documentId as the stable identity.',\n };\n\n return {\n title: `Content: ${apiID} — ${operation}`,\n description: `Content-manager ${operation} for ${uid}.${operationNoteByType[operation] ?? ''}`,\n };\n};\n"],"names":["slugifyUidForMcpToolName","uid","namespace","modelName","split","modelNameParts","map","part","toLowerCase","ok","structuredContent","content","type","text","JSON","stringify","describeTool","params","apiID","operation","operationNoteByType","write","publish","unpublish","discard_draft","title","description"],"mappings":";;AAEA;;;IAIO,MAAMA,wBAAAA,GAA2B,CAACC,GAAAA,GAAAA;AACvC,IAAA,MAAM,CAACC,SAAAA,EAAWC,SAAAA,CAAU,GAAGF,GAAAA,CAAIG,KAAK,CAAC,IAAA,CAAA;IACzC,MAAMC,cAAAA,GAAiBF,SAAAA,CAAUC,KAAK,CAAC,GAAA,CAAA,CAAKE,GAAG,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,WAAW,EAAA,CAAA;AAC1E,IAAA,IAAIN,cAAc,KAAA,EAAO;AACvB,QAAA,OAAO,CAAA,EAAGG,cAAc,CAAC,CAAA,CAAE,CAAA,CAAE;AAC/B,IAAA;IACA,OAAO,CAAA,EAAGH,UAAUM,WAAW,EAAA,CAAG,CAAC,EAAEH,cAAc,CAAC,CAAA,CAAE,CAAA,CAAE;AAC1D;AAEA,2GACO,MAAMI,EAAAA,GAAK,CAChBC,qBACsC;QACtCC,OAAAA,EAAS;AAAC,YAAA;gBAAEC,IAAAA,EAAM,MAAA;gBAAQC,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAACL,iBAAAA;AAAmB;AAAE,SAAA;AACpEA,QAAAA;AACF,KAAA;AAEA;;;IAIO,MAAMM,YAAAA,GAAe,CAACC,MAAAA,GAAAA;AAK3B,IAAA,MAAM,EAAEC,KAAK,EAAEjB,GAAG,EAAEkB,SAAS,EAAE,GAAGF,MAAAA;AAClC,IAAA,MAAMG,mBAAAA,GAAuD;QAC3DC,KAAAA,EACE,yHAAA;QACFC,OAAAA,EACE,sHAAA;QACFC,SAAAA,EACE,kHAAA;QACFC,aAAAA,EACE;AACJ,KAAA;IAEA,OAAO;AACLC,QAAAA,KAAAA,EAAO,CAAC,SAAS,EAAEP,KAAAA,CAAM,GAAG,EAAEC,SAAAA,CAAAA,CAAW;AACzCO,QAAAA,WAAAA,EAAa,CAAC,gBAAgB,EAAEP,SAAAA,CAAU,KAAK,EAAElB,GAAAA,CAAI,CAAC,EAAEmB,mBAAmB,CAACD,SAAAA,CAAU,IAAI,EAAA,CAAA;AAC5F,KAAA;AACF;;;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../server/src/mcp/utils.ts"],"sourcesContent":["import type { Modules, UID } from '@strapi/types';\n\nimport { formatDocumentWithMetadata } from '../controllers/utils/metadata';\nimport type { GetMetadataOptions } from '../services/document-metadata';\nimport { shapeRelationsForMcp } from './sanitizers/shape-relations';\n\n/**\n * Converts a Strapi content-type UID into a safe MCP tool-name segment.\n * `api::article.article` → `article`; `plugin::i18n.locale` → `plugin-i18n_locale`.\n */\nexport const slugifyUidForMcpToolName = (uid: string): string => {\n const [namespace, modelName] = uid.split('::');\n const parts = modelName.split('.').map((part) => part.toLowerCase());\n\n if (namespace === 'api') {\n return parts[0];\n }\n\n return `${namespace.toLowerCase()}-${parts.join('_')}`;\n};\n\ntype McpPermissionChecker = {\n sanitizeOutput: (doc: unknown) => Promise<Record<string, unknown>>;\n};\n\n/**\n * Output chokepoint for MCP handlers returning `{ data, meta }`.\n * Order matters — calculate, then strip:\n * 1. permission-based sanitization,\n * 2. formatDocumentWithMetadata — computes `data.status` and `localizations[].status`\n * from `publishedAt`/`updatedAt`, which relation shaping removes,\n * 3. relation shaping on the formatted `data` (identity-only relations; the\n * freshly-computed `localizations[].status` survives via RelationIdentity).\n *\n * Handlers that do NOT attach metadata (delete, list) compose\n * `permissionChecker.sanitizeOutput` + `shapeRelationsForMcp` directly instead.\n */\nexport const sanitizeFormatShape = async (\n permissionChecker: McpPermissionChecker,\n uid: UID.ContentType,\n doc: unknown,\n opts?: GetMetadataOptions\n): Promise<Record<string, unknown>> => {\n const sanitized = await permissionChecker.sanitizeOutput(doc);\n const formatted = await formatDocumentWithMetadata(\n permissionChecker,\n uid,\n sanitized as unknown as Parameters<typeof formatDocumentWithMetadata>[2],\n opts\n );\n\n if (formatted.data === null || formatted.data === undefined) {\n return formatted;\n }\n\n const shapedData = await shapeRelationsForMcp(uid, formatted.data as Record<string, unknown>);\n return { ...formatted, data: shapedData };\n};\n\n/** Wraps a plain object into the dual-representation MCP tool return value (text + structuredContent). */\nexport const ok = (\n structuredContent: Record<string, unknown>\n): Modules.MCP.McpToolHandlerReturn => ({\n content: [{ type: 'text', text: JSON.stringify(structuredContent) }],\n structuredContent,\n});\n\n/**\n * Generates the `title` and `description` metadata for a derived MCP tool.\n * Appends operation-specific notes for write/publish/unpublish/discard_draft operations.\n */\nexport const describeTool = (params: {\n apiID: string;\n uid: string;\n operation: string;\n}): { title: string; description: string } => {\n const { apiID, uid, operation } = params;\n const operationNoteByType: Partial<Record<string, string>> = {\n write:\n ' Creates or updates the single-type document. If no document exists, creates one; otherwise updates the existing draft.',\n publish:\n ' Operates on an existing document by documentId and may return a different numeric id for the published version row.',\n unpublish:\n ' Operates on an existing document by documentId and may return a different numeric id for the draft version row.',\n discard_draft:\n ' Operates on an existing document by documentId; treat documentId as the stable identity.',\n };\n\n return {\n title: `Content: ${apiID} — ${operation}`,\n description: `Content-manager ${operation} for ${uid}.${operationNoteByType[operation] ?? ''}`,\n };\n};\n"],"names":["slugifyUidForMcpToolName","uid","namespace","modelName","split","parts","map","part","toLowerCase","join","sanitizeFormatShape","permissionChecker","doc","opts","sanitized","sanitizeOutput","formatted","formatDocumentWithMetadata","data","undefined","shapedData","shapeRelationsForMcp","ok","structuredContent","content","type","text","JSON","stringify","describeTool","params","apiID","operation","operationNoteByType","write","publish","unpublish","discard_draft","title","description"],"mappings":";;;;;AAMA;;;IAIO,MAAMA,wBAAAA,GAA2B,CAACC,GAAAA,GAAAA;AACvC,IAAA,MAAM,CAACC,SAAAA,EAAWC,SAAAA,CAAU,GAAGF,GAAAA,CAAIG,KAAK,CAAC,IAAA,CAAA;IACzC,MAAMC,KAAAA,GAAQF,SAAAA,CAAUC,KAAK,CAAC,GAAA,CAAA,CAAKE,GAAG,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,WAAW,EAAA,CAAA;AAEjE,IAAA,IAAIN,cAAc,KAAA,EAAO;QACvB,OAAOG,KAAK,CAAC,CAAA,CAAE;AACjB,IAAA;IAEA,OAAO,CAAA,EAAGH,UAAUM,WAAW,EAAA,CAAG,CAAC,EAAEH,KAAAA,CAAMI,IAAI,CAAC,GAAA,CAAA,CAAA,CAAM;AACxD;AAMA;;;;;;;;;;;AAWC,IACM,MAAMC,mBAAAA,GAAsB,OACjCC,iBAAAA,EACAV,KACAW,GAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAMC,SAAAA,GAAY,MAAMH,iBAAAA,CAAkBI,cAAc,CAACH,GAAAA,CAAAA;AACzD,IAAA,MAAMI,SAAAA,GAAY,MAAMC,mCAAAA,CACtBN,iBAAAA,EACAV,KACAa,SAAAA,EACAD,IAAAA,CAAAA;AAGF,IAAA,IAAIG,UAAUE,IAAI,KAAK,QAAQF,SAAAA,CAAUE,IAAI,KAAKC,SAAAA,EAAW;QAC3D,OAAOH,SAAAA;AACT,IAAA;AAEA,IAAA,MAAMI,UAAAA,GAAa,MAAMC,mCAAAA,CAAqBpB,GAAAA,EAAKe,UAAUE,IAAI,CAAA;IACjE,OAAO;AAAE,QAAA,GAAGF,SAAS;QAAEE,IAAAA,EAAME;AAAW,KAAA;AAC1C;AAEA,2GACO,MAAME,EAAAA,GAAK,CAChBC,qBACsC;QACtCC,OAAAA,EAAS;AAAC,YAAA;gBAAEC,IAAAA,EAAM,MAAA;gBAAQC,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAACL,iBAAAA;AAAmB;AAAE,SAAA;AACpEA,QAAAA;AACF,KAAA;AAEA;;;IAIO,MAAMM,YAAAA,GAAe,CAACC,MAAAA,GAAAA;AAK3B,IAAA,MAAM,EAAEC,KAAK,EAAE9B,GAAG,EAAE+B,SAAS,EAAE,GAAGF,MAAAA;AAClC,IAAA,MAAMG,mBAAAA,GAAuD;QAC3DC,KAAAA,EACE,yHAAA;QACFC,OAAAA,EACE,sHAAA;QACFC,SAAAA,EACE,kHAAA;QACFC,aAAAA,EACE;AACJ,KAAA;IAEA,OAAO;AACLC,QAAAA,KAAAA,EAAO,CAAC,SAAS,EAAEP,KAAAA,CAAM,GAAG,EAAEC,SAAAA,CAAAA,CAAW;AACzCO,QAAAA,WAAAA,EAAa,CAAC,gBAAgB,EAAEP,SAAAA,CAAU,KAAK,EAAE/B,GAAAA,CAAI,CAAC,EAAEgC,mBAAmB,CAACD,SAAAA,CAAU,IAAI,EAAA,CAAA;AAC5F,KAAA;AACF;;;;;;;"}
@@ -1,13 +1,39 @@
1
+ import { formatDocumentWithMetadata } from '../controllers/utils/metadata.mjs';
2
+ import { shapeRelationsForMcp } from './sanitizers/shape-relations.mjs';
3
+
1
4
  /**
2
5
  * Converts a Strapi content-type UID into a safe MCP tool-name segment.
3
6
  * `api::article.article` → `article`; `plugin::i18n.locale` → `plugin-i18n_locale`.
4
7
  */ const slugifyUidForMcpToolName = (uid)=>{
5
8
  const [namespace, modelName] = uid.split('::');
6
- const modelNameParts = modelName.split('.').map((part)=>part.toLowerCase());
9
+ const parts = modelName.split('.').map((part)=>part.toLowerCase());
7
10
  if (namespace === 'api') {
8
- return `${modelNameParts[0]}`;
11
+ return parts[0];
12
+ }
13
+ return `${namespace.toLowerCase()}-${parts.join('_')}`;
14
+ };
15
+ /**
16
+ * Output chokepoint for MCP handlers returning `{ data, meta }`.
17
+ * Order matters — calculate, then strip:
18
+ * 1. permission-based sanitization,
19
+ * 2. formatDocumentWithMetadata — computes `data.status` and `localizations[].status`
20
+ * from `publishedAt`/`updatedAt`, which relation shaping removes,
21
+ * 3. relation shaping on the formatted `data` (identity-only relations; the
22
+ * freshly-computed `localizations[].status` survives via RelationIdentity).
23
+ *
24
+ * Handlers that do NOT attach metadata (delete, list) compose
25
+ * `permissionChecker.sanitizeOutput` + `shapeRelationsForMcp` directly instead.
26
+ */ const sanitizeFormatShape = async (permissionChecker, uid, doc, opts)=>{
27
+ const sanitized = await permissionChecker.sanitizeOutput(doc);
28
+ const formatted = await formatDocumentWithMetadata(permissionChecker, uid, sanitized, opts);
29
+ if (formatted.data === null || formatted.data === undefined) {
30
+ return formatted;
9
31
  }
10
- return `${namespace.toLowerCase()}_${modelNameParts[0]}`;
32
+ const shapedData = await shapeRelationsForMcp(uid, formatted.data);
33
+ return {
34
+ ...formatted,
35
+ data: shapedData
36
+ };
11
37
  };
12
38
  /** Wraps a plain object into the dual-representation MCP tool return value (text + structuredContent). */ const ok = (structuredContent)=>({
13
39
  content: [
@@ -35,5 +61,5 @@
35
61
  };
36
62
  };
37
63
 
38
- export { describeTool, ok, slugifyUidForMcpToolName };
64
+ export { describeTool, ok, sanitizeFormatShape, slugifyUidForMcpToolName };
39
65
  //# sourceMappingURL=utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sources":["../../../server/src/mcp/utils.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\n\n/**\n * Converts a Strapi content-type UID into a safe MCP tool-name segment.\n * `api::article.article` → `article`; `plugin::i18n.locale` → `plugin-i18n_locale`.\n */\nexport const slugifyUidForMcpToolName = (uid: string): string => {\n const [namespace, modelName] = uid.split('::');\n const modelNameParts = modelName.split('.').map((part) => part.toLowerCase());\n if (namespace === 'api') {\n return `${modelNameParts[0]}`;\n }\n return `${namespace.toLowerCase()}_${modelNameParts[0]}`;\n};\n\n/** Wraps a plain object into the dual-representation MCP tool return value (text + structuredContent). */\nexport const ok = (\n structuredContent: Record<string, unknown>\n): Modules.MCP.McpToolHandlerReturn => ({\n content: [{ type: 'text', text: JSON.stringify(structuredContent) }],\n structuredContent,\n});\n\n/**\n * Generates the `title` and `description` metadata for a derived MCP tool.\n * Appends operation-specific notes for write/publish/unpublish/discard_draft operations.\n */\nexport const describeTool = (params: {\n apiID: string;\n uid: string;\n operation: string;\n}): { title: string; description: string } => {\n const { apiID, uid, operation } = params;\n const operationNoteByType: Partial<Record<string, string>> = {\n write:\n ' Creates or updates the single-type document. If no document exists, creates one; otherwise updates the existing draft.',\n publish:\n ' Operates on an existing document by documentId and may return a different numeric id for the published version row.',\n unpublish:\n ' Operates on an existing document by documentId and may return a different numeric id for the draft version row.',\n discard_draft:\n ' Operates on an existing document by documentId; treat documentId as the stable identity.',\n };\n\n return {\n title: `Content: ${apiID} — ${operation}`,\n description: `Content-manager ${operation} for ${uid}.${operationNoteByType[operation] ?? ''}`,\n };\n};\n"],"names":["slugifyUidForMcpToolName","uid","namespace","modelName","split","modelNameParts","map","part","toLowerCase","ok","structuredContent","content","type","text","JSON","stringify","describeTool","params","apiID","operation","operationNoteByType","write","publish","unpublish","discard_draft","title","description"],"mappings":"AAEA;;;IAIO,MAAMA,wBAAAA,GAA2B,CAACC,GAAAA,GAAAA;AACvC,IAAA,MAAM,CAACC,SAAAA,EAAWC,SAAAA,CAAU,GAAGF,GAAAA,CAAIG,KAAK,CAAC,IAAA,CAAA;IACzC,MAAMC,cAAAA,GAAiBF,SAAAA,CAAUC,KAAK,CAAC,GAAA,CAAA,CAAKE,GAAG,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,WAAW,EAAA,CAAA;AAC1E,IAAA,IAAIN,cAAc,KAAA,EAAO;AACvB,QAAA,OAAO,CAAA,EAAGG,cAAc,CAAC,CAAA,CAAE,CAAA,CAAE;AAC/B,IAAA;IACA,OAAO,CAAA,EAAGH,UAAUM,WAAW,EAAA,CAAG,CAAC,EAAEH,cAAc,CAAC,CAAA,CAAE,CAAA,CAAE;AAC1D;AAEA,2GACO,MAAMI,EAAAA,GAAK,CAChBC,qBACsC;QACtCC,OAAAA,EAAS;AAAC,YAAA;gBAAEC,IAAAA,EAAM,MAAA;gBAAQC,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAACL,iBAAAA;AAAmB;AAAE,SAAA;AACpEA,QAAAA;AACF,KAAA;AAEA;;;IAIO,MAAMM,YAAAA,GAAe,CAACC,MAAAA,GAAAA;AAK3B,IAAA,MAAM,EAAEC,KAAK,EAAEjB,GAAG,EAAEkB,SAAS,EAAE,GAAGF,MAAAA;AAClC,IAAA,MAAMG,mBAAAA,GAAuD;QAC3DC,KAAAA,EACE,yHAAA;QACFC,OAAAA,EACE,sHAAA;QACFC,SAAAA,EACE,kHAAA;QACFC,aAAAA,EACE;AACJ,KAAA;IAEA,OAAO;AACLC,QAAAA,KAAAA,EAAO,CAAC,SAAS,EAAEP,KAAAA,CAAM,GAAG,EAAEC,SAAAA,CAAAA,CAAW;AACzCO,QAAAA,WAAAA,EAAa,CAAC,gBAAgB,EAAEP,SAAAA,CAAU,KAAK,EAAElB,GAAAA,CAAI,CAAC,EAAEmB,mBAAmB,CAACD,SAAAA,CAAU,IAAI,EAAA,CAAA;AAC5F,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"utils.mjs","sources":["../../../server/src/mcp/utils.ts"],"sourcesContent":["import type { Modules, UID } from '@strapi/types';\n\nimport { formatDocumentWithMetadata } from '../controllers/utils/metadata';\nimport type { GetMetadataOptions } from '../services/document-metadata';\nimport { shapeRelationsForMcp } from './sanitizers/shape-relations';\n\n/**\n * Converts a Strapi content-type UID into a safe MCP tool-name segment.\n * `api::article.article` → `article`; `plugin::i18n.locale` → `plugin-i18n_locale`.\n */\nexport const slugifyUidForMcpToolName = (uid: string): string => {\n const [namespace, modelName] = uid.split('::');\n const parts = modelName.split('.').map((part) => part.toLowerCase());\n\n if (namespace === 'api') {\n return parts[0];\n }\n\n return `${namespace.toLowerCase()}-${parts.join('_')}`;\n};\n\ntype McpPermissionChecker = {\n sanitizeOutput: (doc: unknown) => Promise<Record<string, unknown>>;\n};\n\n/**\n * Output chokepoint for MCP handlers returning `{ data, meta }`.\n * Order matters — calculate, then strip:\n * 1. permission-based sanitization,\n * 2. formatDocumentWithMetadata — computes `data.status` and `localizations[].status`\n * from `publishedAt`/`updatedAt`, which relation shaping removes,\n * 3. relation shaping on the formatted `data` (identity-only relations; the\n * freshly-computed `localizations[].status` survives via RelationIdentity).\n *\n * Handlers that do NOT attach metadata (delete, list) compose\n * `permissionChecker.sanitizeOutput` + `shapeRelationsForMcp` directly instead.\n */\nexport const sanitizeFormatShape = async (\n permissionChecker: McpPermissionChecker,\n uid: UID.ContentType,\n doc: unknown,\n opts?: GetMetadataOptions\n): Promise<Record<string, unknown>> => {\n const sanitized = await permissionChecker.sanitizeOutput(doc);\n const formatted = await formatDocumentWithMetadata(\n permissionChecker,\n uid,\n sanitized as unknown as Parameters<typeof formatDocumentWithMetadata>[2],\n opts\n );\n\n if (formatted.data === null || formatted.data === undefined) {\n return formatted;\n }\n\n const shapedData = await shapeRelationsForMcp(uid, formatted.data as Record<string, unknown>);\n return { ...formatted, data: shapedData };\n};\n\n/** Wraps a plain object into the dual-representation MCP tool return value (text + structuredContent). */\nexport const ok = (\n structuredContent: Record<string, unknown>\n): Modules.MCP.McpToolHandlerReturn => ({\n content: [{ type: 'text', text: JSON.stringify(structuredContent) }],\n structuredContent,\n});\n\n/**\n * Generates the `title` and `description` metadata for a derived MCP tool.\n * Appends operation-specific notes for write/publish/unpublish/discard_draft operations.\n */\nexport const describeTool = (params: {\n apiID: string;\n uid: string;\n operation: string;\n}): { title: string; description: string } => {\n const { apiID, uid, operation } = params;\n const operationNoteByType: Partial<Record<string, string>> = {\n write:\n ' Creates or updates the single-type document. If no document exists, creates one; otherwise updates the existing draft.',\n publish:\n ' Operates on an existing document by documentId and may return a different numeric id for the published version row.',\n unpublish:\n ' Operates on an existing document by documentId and may return a different numeric id for the draft version row.',\n discard_draft:\n ' Operates on an existing document by documentId; treat documentId as the stable identity.',\n };\n\n return {\n title: `Content: ${apiID} — ${operation}`,\n description: `Content-manager ${operation} for ${uid}.${operationNoteByType[operation] ?? ''}`,\n };\n};\n"],"names":["slugifyUidForMcpToolName","uid","namespace","modelName","split","parts","map","part","toLowerCase","join","sanitizeFormatShape","permissionChecker","doc","opts","sanitized","sanitizeOutput","formatted","formatDocumentWithMetadata","data","undefined","shapedData","shapeRelationsForMcp","ok","structuredContent","content","type","text","JSON","stringify","describeTool","params","apiID","operation","operationNoteByType","write","publish","unpublish","discard_draft","title","description"],"mappings":";;;AAMA;;;IAIO,MAAMA,wBAAAA,GAA2B,CAACC,GAAAA,GAAAA;AACvC,IAAA,MAAM,CAACC,SAAAA,EAAWC,SAAAA,CAAU,GAAGF,GAAAA,CAAIG,KAAK,CAAC,IAAA,CAAA;IACzC,MAAMC,KAAAA,GAAQF,SAAAA,CAAUC,KAAK,CAAC,GAAA,CAAA,CAAKE,GAAG,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,WAAW,EAAA,CAAA;AAEjE,IAAA,IAAIN,cAAc,KAAA,EAAO;QACvB,OAAOG,KAAK,CAAC,CAAA,CAAE;AACjB,IAAA;IAEA,OAAO,CAAA,EAAGH,UAAUM,WAAW,EAAA,CAAG,CAAC,EAAEH,KAAAA,CAAMI,IAAI,CAAC,GAAA,CAAA,CAAA,CAAM;AACxD;AAMA;;;;;;;;;;;AAWC,IACM,MAAMC,mBAAAA,GAAsB,OACjCC,iBAAAA,EACAV,KACAW,GAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAMC,SAAAA,GAAY,MAAMH,iBAAAA,CAAkBI,cAAc,CAACH,GAAAA,CAAAA;AACzD,IAAA,MAAMI,SAAAA,GAAY,MAAMC,0BAAAA,CACtBN,iBAAAA,EACAV,KACAa,SAAAA,EACAD,IAAAA,CAAAA;AAGF,IAAA,IAAIG,UAAUE,IAAI,KAAK,QAAQF,SAAAA,CAAUE,IAAI,KAAKC,SAAAA,EAAW;QAC3D,OAAOH,SAAAA;AACT,IAAA;AAEA,IAAA,MAAMI,UAAAA,GAAa,MAAMC,oBAAAA,CAAqBpB,GAAAA,EAAKe,UAAUE,IAAI,CAAA;IACjE,OAAO;AAAE,QAAA,GAAGF,SAAS;QAAEE,IAAAA,EAAME;AAAW,KAAA;AAC1C;AAEA,2GACO,MAAME,EAAAA,GAAK,CAChBC,qBACsC;QACtCC,OAAAA,EAAS;AAAC,YAAA;gBAAEC,IAAAA,EAAM,MAAA;gBAAQC,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAACL,iBAAAA;AAAmB;AAAE,SAAA;AACpEA,QAAAA;AACF,KAAA;AAEA;;;IAIO,MAAMM,YAAAA,GAAe,CAACC,MAAAA,GAAAA;AAK3B,IAAA,MAAM,EAAEC,KAAK,EAAE9B,GAAG,EAAE+B,SAAS,EAAE,GAAGF,MAAAA;AAClC,IAAA,MAAMG,mBAAAA,GAAuD;QAC3DC,KAAAA,EACE,yHAAA;QACFC,OAAAA,EACE,sHAAA;QACFC,SAAAA,EACE,kHAAA;QACFC,aAAAA,EACE;AACJ,KAAA;IAEA,OAAO;AACLC,QAAAA,KAAAA,EAAO,CAAC,SAAS,EAAEP,KAAAA,CAAM,GAAG,EAAEC,SAAAA,CAAAA,CAAW;AACzCO,QAAAA,WAAAA,EAAa,CAAC,gBAAgB,EAAEP,SAAAA,CAAU,KAAK,EAAE/B,GAAAA,CAAI,CAAC,EAAEgC,mBAAmB,CAACD,SAAAA,CAAU,IAAI,EAAA,CAAA;AAC5F,KAAA;AACF;;;;"}
@@ -2,6 +2,10 @@
2
2
 
3
3
  var isNil = require('lodash/isNil');
4
4
 
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var isNil__default = /*#__PURE__*/_interopDefault(isNil);
8
+
5
9
  var routing = (async (ctx, next)=>{
6
10
  const { model } = ctx.params;
7
11
  const ct = strapi.contentTypes[model];
@@ -27,7 +31,7 @@ var routing = (async (ctx, next)=>{
27
31
  } else {
28
32
  actionConfig = strapi.plugin(ct.plugin).config(`layout.${ct.modelName}.actions.${action}`);
29
33
  }
30
- if (!isNil(actionConfig)) {
34
+ if (!isNil__default.default(actionConfig)) {
31
35
  const [controller, action] = actionConfig.split('.');
32
36
  if (controller && action) {
33
37
  return controllers[controller.toLowerCase()][action](ctx, next);