@payloadcms/plugin-mcp 4.0.0-internal.38b7f1d → 4.0.0-internal.4804abd

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 (419) hide show
  1. package/bin.js +39 -0
  2. package/dist/@types/assets.d.js +2 -0
  3. package/dist/@types/assets.d.js.map +1 -0
  4. package/dist/defaultAccess.d.ts +3 -0
  5. package/dist/defaultAccess.d.ts.map +1 -0
  6. package/dist/defaultAccess.js +3 -0
  7. package/dist/defaultAccess.js.map +1 -0
  8. package/dist/defineTool.d.ts +26 -0
  9. package/dist/defineTool.d.ts.map +1 -0
  10. package/dist/defineTool.js +37 -0
  11. package/dist/defineTool.js.map +1 -0
  12. package/dist/endpoint/access.d.ts +22 -0
  13. package/dist/endpoint/access.d.ts.map +1 -0
  14. package/dist/endpoint/access.js +100 -0
  15. package/dist/endpoint/access.js.map +1 -0
  16. package/dist/endpoint/index.d.ts +3 -0
  17. package/dist/endpoint/index.d.ts.map +1 -0
  18. package/dist/endpoint/index.js +47 -0
  19. package/dist/endpoint/index.js.map +1 -0
  20. package/dist/exports/client.d.ts +2 -0
  21. package/dist/exports/client.d.ts.map +1 -0
  22. package/dist/exports/client.js +4 -0
  23. package/dist/exports/client.js.map +1 -0
  24. package/dist/exports/internal.d.ts +2 -0
  25. package/dist/exports/internal.d.ts.map +1 -0
  26. package/dist/exports/internal.js +3 -0
  27. package/dist/exports/internal.js.map +1 -0
  28. package/dist/index.d.ts +4 -7
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +39 -67
  31. package/dist/index.js.map +1 -1
  32. package/dist/mcp/buildMcpServer.d.ts +19 -0
  33. package/dist/mcp/buildMcpServer.d.ts.map +1 -0
  34. package/dist/mcp/buildMcpServer.js +201 -0
  35. package/dist/mcp/buildMcpServer.js.map +1 -0
  36. package/dist/mcp/builtin/collections/authTools.d.ts +7 -0
  37. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -0
  38. package/dist/mcp/builtin/collections/authTools.js +288 -0
  39. package/dist/mcp/builtin/collections/authTools.js.map +1 -0
  40. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  41. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  42. package/dist/mcp/builtin/collections/countTool.js +69 -0
  43. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  44. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  45. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  46. package/dist/mcp/builtin/collections/countVersionsTool.js +65 -0
  47. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  48. package/dist/mcp/builtin/collections/createTool.d.ts +2 -0
  49. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -0
  50. package/dist/mcp/builtin/collections/createTool.js +87 -0
  51. package/dist/mcp/builtin/collections/createTool.js.map +1 -0
  52. package/dist/mcp/builtin/collections/deleteTool.d.ts +2 -0
  53. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -0
  54. package/dist/mcp/builtin/collections/deleteTool.js +111 -0
  55. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -0
  56. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  57. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  58. package/dist/mcp/builtin/collections/duplicateTool.js +97 -0
  59. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  60. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  61. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  62. package/dist/mcp/builtin/collections/findDistinctTool.js +93 -0
  63. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  64. package/dist/mcp/builtin/collections/findTool.d.ts +2 -0
  65. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -0
  66. package/dist/mcp/builtin/collections/findTool.js +165 -0
  67. package/dist/mcp/builtin/collections/findTool.js.map +1 -0
  68. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  69. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  70. package/dist/mcp/builtin/collections/findVersionByIDTool.js +84 -0
  71. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  72. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  73. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  74. package/dist/mcp/builtin/collections/findVersionsTool.js +99 -0
  75. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  76. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +9 -0
  77. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -0
  78. package/dist/mcp/builtin/collections/formatCollectionError.js +60 -0
  79. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -0
  80. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts +2 -0
  81. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -0
  82. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +47 -0
  83. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -0
  84. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  85. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  86. package/dist/mcp/builtin/collections/restoreVersionTool.js +82 -0
  87. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  88. package/dist/mcp/builtin/collections/updateTool.d.ts +2 -0
  89. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -0
  90. package/dist/mcp/builtin/collections/updateTool.js +192 -0
  91. package/dist/mcp/builtin/collections/updateTool.js.map +1 -0
  92. package/dist/mcp/builtin/getConfigInfoTool.d.ts +2 -0
  93. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -0
  94. package/dist/mcp/builtin/getConfigInfoTool.js +71 -0
  95. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -0
  96. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  97. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  98. package/dist/mcp/builtin/globals/countVersionsTool.js +65 -0
  99. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  100. package/dist/mcp/builtin/globals/findTool.d.ts +2 -0
  101. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -0
  102. package/dist/mcp/builtin/globals/findTool.js +73 -0
  103. package/dist/mcp/builtin/globals/findTool.js.map +1 -0
  104. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  105. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  106. package/dist/mcp/builtin/globals/findVersionByIDTool.js +80 -0
  107. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  108. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  109. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  110. package/dist/mcp/builtin/globals/findVersionsTool.js +95 -0
  111. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  112. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts +2 -0
  113. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -0
  114. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +47 -0
  115. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -0
  116. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  117. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  118. package/dist/mcp/builtin/globals/restoreVersionTool.js +78 -0
  119. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  120. package/dist/mcp/builtin/globals/updateTool.d.ts +2 -0
  121. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -0
  122. package/dist/mcp/builtin/globals/updateTool.js +87 -0
  123. package/dist/mcp/builtin/globals/updateTool.js.map +1 -0
  124. package/dist/mcp/builtin/validateEntityData.d.ts +14 -0
  125. package/dist/mcp/builtin/validateEntityData.d.ts.map +1 -0
  126. package/dist/mcp/builtin/validateEntityData.js +82 -0
  127. package/dist/mcp/builtin/validateEntityData.js.map +1 -0
  128. package/dist/mcp/builtinTools.d.ts +162 -0
  129. package/dist/mcp/builtinTools.d.ts.map +1 -0
  130. package/dist/mcp/builtinTools.js +163 -0
  131. package/dist/mcp/builtinTools.js.map +1 -0
  132. package/dist/mcp/sanitizeMCPConfig.d.ts +16 -0
  133. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -0
  134. package/dist/mcp/sanitizeMCPConfig.js +229 -0
  135. package/dist/mcp/sanitizeMCPConfig.js.map +1 -0
  136. package/dist/stdio.d.ts +9 -0
  137. package/dist/stdio.d.ts.map +1 -0
  138. package/dist/stdio.js +108 -0
  139. package/dist/stdio.js.map +1 -0
  140. package/dist/types.d.ts +222 -461
  141. package/dist/types.d.ts.map +1 -1
  142. package/dist/types.js +6 -1
  143. package/dist/types.js.map +1 -1
  144. package/dist/utils/camelCase.d.ts.map +1 -1
  145. package/dist/utils/getLogger.d.ts +10 -0
  146. package/dist/utils/getLogger.d.ts.map +1 -0
  147. package/dist/utils/getLogger.js +22 -0
  148. package/dist/utils/getLogger.js.map +1 -0
  149. package/dist/utils/getPluginConfig.d.ts +12 -0
  150. package/dist/utils/getPluginConfig.d.ts.map +1 -0
  151. package/dist/utils/getPluginConfig.js +15 -0
  152. package/dist/utils/getPluginConfig.js.map +1 -0
  153. package/dist/utils/localAPIDefaults.d.ts +20 -0
  154. package/dist/utils/localAPIDefaults.d.ts.map +1 -0
  155. package/dist/utils/localAPIDefaults.js +19 -0
  156. package/dist/utils/localAPIDefaults.js.map +1 -0
  157. package/dist/utils/resolveProjectRoot.d.ts +7 -0
  158. package/dist/utils/resolveProjectRoot.d.ts.map +1 -0
  159. package/dist/utils/resolveProjectRoot.js +15 -0
  160. package/dist/utils/resolveProjectRoot.js.map +1 -0
  161. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +11 -0
  162. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +1 -0
  163. package/dist/utils/schemaConversion/getEntityInputSchema.js +32 -0
  164. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +1 -0
  165. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +10 -0
  166. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -0
  167. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +384 -0
  168. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -0
  169. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +133 -0
  170. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -0
  171. package/dist/utils/toStandardSchema.d.ts +5 -0
  172. package/dist/utils/toStandardSchema.d.ts.map +1 -0
  173. package/dist/utils/toStandardSchema.js +4 -0
  174. package/dist/utils/toStandardSchema.js.map +1 -0
  175. package/dist/utils/whereSchema.d.ts +9 -0
  176. package/dist/utils/whereSchema.d.ts.map +1 -0
  177. package/dist/utils/whereSchema.js +13 -0
  178. package/dist/utils/whereSchema.js.map +1 -0
  179. package/package.json +32 -10
  180. package/src/@types/assets.d.ts +3 -0
  181. package/src/defaultAccess.ts +3 -0
  182. package/src/defineTool.ts +44 -0
  183. package/src/endpoint/access.ts +119 -0
  184. package/src/endpoint/index.ts +48 -0
  185. package/src/exports/client.ts +3 -0
  186. package/src/exports/internal.ts +1 -0
  187. package/src/index.ts +29 -87
  188. package/src/mcp/buildMcpServer.ts +264 -0
  189. package/src/mcp/builtin/collections/authTools.ts +269 -0
  190. package/src/mcp/builtin/collections/countTool.ts +74 -0
  191. package/src/mcp/builtin/collections/countVersionsTool.ts +70 -0
  192. package/src/mcp/builtin/collections/createTool.ts +112 -0
  193. package/src/mcp/builtin/collections/deleteTool.ts +126 -0
  194. package/src/mcp/builtin/collections/duplicateTool.ts +135 -0
  195. package/src/mcp/builtin/collections/findDistinctTool.ts +120 -0
  196. package/src/mcp/builtin/collections/findTool.ts +217 -0
  197. package/src/mcp/builtin/collections/findVersionByIDTool.ts +110 -0
  198. package/src/mcp/builtin/collections/findVersionsTool.ts +155 -0
  199. package/src/mcp/builtin/collections/formatCollectionError.ts +84 -0
  200. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +46 -0
  201. package/src/mcp/builtin/collections/restoreVersionTool.ts +108 -0
  202. package/src/mcp/builtin/collections/updateTool.ts +211 -0
  203. package/src/mcp/builtin/getConfigInfoTool.ts +69 -0
  204. package/src/mcp/builtin/globals/countVersionsTool.ts +69 -0
  205. package/src/mcp/builtin/globals/findTool.ts +105 -0
  206. package/src/mcp/builtin/globals/findVersionByIDTool.ts +104 -0
  207. package/src/mcp/builtin/globals/findVersionsTool.ts +148 -0
  208. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +41 -0
  209. package/src/mcp/builtin/globals/restoreVersionTool.ts +100 -0
  210. package/src/mcp/builtin/globals/updateTool.ts +115 -0
  211. package/src/mcp/builtin/validateEntityData.ts +132 -0
  212. package/src/mcp/builtinTools.ts +154 -0
  213. package/src/mcp/sanitizeMCPConfig.ts +277 -0
  214. package/src/stdio.ts +113 -0
  215. package/src/types.ts +263 -493
  216. package/src/utils/getLogger.ts +22 -0
  217. package/src/utils/getPluginConfig.ts +24 -0
  218. package/src/utils/localAPIDefaults.ts +22 -0
  219. package/src/utils/resolveProjectRoot.ts +17 -0
  220. package/src/utils/schemaConversion/getEntityInputSchema.ts +62 -0
  221. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +96 -0
  222. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +432 -0
  223. package/src/utils/toStandardSchema.ts +9 -0
  224. package/src/utils/whereSchema.ts +24 -0
  225. package/dist/collections/createApiKeysCollection.d.ts +0 -7
  226. package/dist/collections/createApiKeysCollection.d.ts.map +0 -1
  227. package/dist/collections/createApiKeysCollection.js +0 -317
  228. package/dist/collections/createApiKeysCollection.js.map +0 -1
  229. package/dist/defaults.d.ts +0 -4
  230. package/dist/defaults.d.ts.map +0 -1
  231. package/dist/defaults.js +0 -5
  232. package/dist/defaults.js.map +0 -1
  233. package/dist/endpoints/mcp.d.ts +0 -4
  234. package/dist/endpoints/mcp.d.ts.map +0 -1
  235. package/dist/endpoints/mcp.js +0 -71
  236. package/dist/endpoints/mcp.js.map +0 -1
  237. package/dist/mcp/createRequest.d.ts +0 -3
  238. package/dist/mcp/createRequest.d.ts.map +0 -1
  239. package/dist/mcp/createRequest.js +0 -14
  240. package/dist/mcp/createRequest.js.map +0 -1
  241. package/dist/mcp/getMcpHandler.d.ts +0 -4
  242. package/dist/mcp/getMcpHandler.d.ts.map +0 -1
  243. package/dist/mcp/getMcpHandler.js +0 -231
  244. package/dist/mcp/getMcpHandler.js.map +0 -1
  245. package/dist/mcp/helpers/config.d.ts +0 -22
  246. package/dist/mcp/helpers/config.d.ts.map +0 -1
  247. package/dist/mcp/helpers/config.js +0 -153
  248. package/dist/mcp/helpers/config.js.map +0 -1
  249. package/dist/mcp/helpers/fields.d.ts +0 -19
  250. package/dist/mcp/helpers/fields.d.ts.map +0 -1
  251. package/dist/mcp/helpers/fields.js +0 -102
  252. package/dist/mcp/helpers/fields.js.map +0 -1
  253. package/dist/mcp/helpers/fileValidation.d.ts +0 -67
  254. package/dist/mcp/helpers/fileValidation.d.ts.map +0 -1
  255. package/dist/mcp/helpers/fileValidation.js +0 -267
  256. package/dist/mcp/helpers/fileValidation.js.map +0 -1
  257. package/dist/mcp/registerTool.d.ts +0 -6
  258. package/dist/mcp/registerTool.d.ts.map +0 -1
  259. package/dist/mcp/registerTool.js +0 -18
  260. package/dist/mcp/registerTool.js.map +0 -1
  261. package/dist/mcp/tools/auth/auth.d.ts +0 -4
  262. package/dist/mcp/tools/auth/auth.d.ts.map +0 -1
  263. package/dist/mcp/tools/auth/auth.js +0 -57
  264. package/dist/mcp/tools/auth/auth.js.map +0 -1
  265. package/dist/mcp/tools/auth/forgotPassword.d.ts +0 -4
  266. package/dist/mcp/tools/auth/forgotPassword.d.ts.map +0 -1
  267. package/dist/mcp/tools/auth/forgotPassword.js +0 -48
  268. package/dist/mcp/tools/auth/forgotPassword.js.map +0 -1
  269. package/dist/mcp/tools/auth/login.d.ts +0 -4
  270. package/dist/mcp/tools/auth/login.d.ts.map +0 -1
  271. package/dist/mcp/tools/auth/login.js +0 -51
  272. package/dist/mcp/tools/auth/login.js.map +0 -1
  273. package/dist/mcp/tools/auth/resetPassword.d.ts +0 -4
  274. package/dist/mcp/tools/auth/resetPassword.d.ts.map +0 -1
  275. package/dist/mcp/tools/auth/resetPassword.js +0 -49
  276. package/dist/mcp/tools/auth/resetPassword.js.map +0 -1
  277. package/dist/mcp/tools/auth/unlock.d.ts +0 -4
  278. package/dist/mcp/tools/auth/unlock.d.ts.map +0 -1
  279. package/dist/mcp/tools/auth/unlock.js +0 -48
  280. package/dist/mcp/tools/auth/unlock.js.map +0 -1
  281. package/dist/mcp/tools/auth/verify.d.ts +0 -4
  282. package/dist/mcp/tools/auth/verify.d.ts.map +0 -1
  283. package/dist/mcp/tools/auth/verify.js +0 -45
  284. package/dist/mcp/tools/auth/verify.js.map +0 -1
  285. package/dist/mcp/tools/collection/create.d.ts +0 -10
  286. package/dist/mcp/tools/collection/create.d.ts.map +0 -1
  287. package/dist/mcp/tools/collection/create.js +0 -139
  288. package/dist/mcp/tools/collection/create.js.map +0 -1
  289. package/dist/mcp/tools/collection/delete.d.ts +0 -10
  290. package/dist/mcp/tools/collection/delete.d.ts.map +0 -1
  291. package/dist/mcp/tools/collection/delete.js +0 -154
  292. package/dist/mcp/tools/collection/delete.js.map +0 -1
  293. package/dist/mcp/tools/collection/find.d.ts +0 -10
  294. package/dist/mcp/tools/collection/find.d.ts.map +0 -1
  295. package/dist/mcp/tools/collection/find.js +0 -165
  296. package/dist/mcp/tools/collection/find.js.map +0 -1
  297. package/dist/mcp/tools/collection/update.d.ts +0 -10
  298. package/dist/mcp/tools/collection/update.d.ts.map +0 -1
  299. package/dist/mcp/tools/collection/update.js +0 -209
  300. package/dist/mcp/tools/collection/update.js.map +0 -1
  301. package/dist/mcp/tools/config/find.d.ts +0 -10
  302. package/dist/mcp/tools/config/find.d.ts.map +0 -1
  303. package/dist/mcp/tools/config/find.js +0 -97
  304. package/dist/mcp/tools/config/find.js.map +0 -1
  305. package/dist/mcp/tools/config/update.d.ts +0 -10
  306. package/dist/mcp/tools/config/update.d.ts.map +0 -1
  307. package/dist/mcp/tools/config/update.js +0 -215
  308. package/dist/mcp/tools/config/update.js.map +0 -1
  309. package/dist/mcp/tools/global/find.d.ts +0 -5
  310. package/dist/mcp/tools/global/find.d.ts.map +0 -1
  311. package/dist/mcp/tools/global/find.js +0 -82
  312. package/dist/mcp/tools/global/find.js.map +0 -1
  313. package/dist/mcp/tools/global/update.d.ts +0 -6
  314. package/dist/mcp/tools/global/update.d.ts.map +0 -1
  315. package/dist/mcp/tools/global/update.js +0 -124
  316. package/dist/mcp/tools/global/update.js.map +0 -1
  317. package/dist/mcp/tools/job/create.d.ts +0 -10
  318. package/dist/mcp/tools/job/create.d.ts.map +0 -1
  319. package/dist/mcp/tools/job/create.js +0 -293
  320. package/dist/mcp/tools/job/create.js.map +0 -1
  321. package/dist/mcp/tools/job/run.d.ts +0 -10
  322. package/dist/mcp/tools/job/run.d.ts.map +0 -1
  323. package/dist/mcp/tools/job/run.js +0 -129
  324. package/dist/mcp/tools/job/run.js.map +0 -1
  325. package/dist/mcp/tools/job/update.d.ts +0 -11
  326. package/dist/mcp/tools/job/update.d.ts.map +0 -1
  327. package/dist/mcp/tools/job/update.js +0 -186
  328. package/dist/mcp/tools/job/update.js.map +0 -1
  329. package/dist/mcp/tools/resource/create.d.ts +0 -6
  330. package/dist/mcp/tools/resource/create.d.ts.map +0 -1
  331. package/dist/mcp/tools/resource/create.js +0 -124
  332. package/dist/mcp/tools/resource/create.js.map +0 -1
  333. package/dist/mcp/tools/resource/delete.d.ts +0 -5
  334. package/dist/mcp/tools/resource/delete.d.ts.map +0 -1
  335. package/dist/mcp/tools/resource/delete.js +0 -151
  336. package/dist/mcp/tools/resource/delete.js.map +0 -1
  337. package/dist/mcp/tools/resource/find.d.ts +0 -5
  338. package/dist/mcp/tools/resource/find.d.ts.map +0 -1
  339. package/dist/mcp/tools/resource/find.js +0 -170
  340. package/dist/mcp/tools/resource/find.js.map +0 -1
  341. package/dist/mcp/tools/resource/update.d.ts +0 -6
  342. package/dist/mcp/tools/resource/update.d.ts.map +0 -1
  343. package/dist/mcp/tools/resource/update.js +0 -256
  344. package/dist/mcp/tools/resource/update.js.map +0 -1
  345. package/dist/mcp/tools/schemas.d.ts +0 -457
  346. package/dist/mcp/tools/schemas.d.ts.map +0 -1
  347. package/dist/mcp/tools/schemas.js +0 -243
  348. package/dist/mcp/tools/schemas.js.map +0 -1
  349. package/dist/utils/adminEntitySettings.d.ts +0 -17
  350. package/dist/utils/adminEntitySettings.d.ts.map +0 -1
  351. package/dist/utils/adminEntitySettings.js +0 -41
  352. package/dist/utils/adminEntitySettings.js.map +0 -1
  353. package/dist/utils/createApiKeyFields.d.ts +0 -15
  354. package/dist/utils/createApiKeyFields.d.ts.map +0 -1
  355. package/dist/utils/createApiKeyFields.js +0 -57
  356. package/dist/utils/createApiKeyFields.js.map +0 -1
  357. package/dist/utils/getEnabledSlugs.d.ts +0 -13
  358. package/dist/utils/getEnabledSlugs.d.ts.map +0 -1
  359. package/dist/utils/getEnabledSlugs.js +0 -32
  360. package/dist/utils/getEnabledSlugs.js.map +0 -1
  361. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts +0 -3
  362. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts.map +0 -1
  363. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js +0 -43
  364. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js.map +0 -1
  365. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  366. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  367. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  368. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  369. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts +0 -13
  370. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts.map +0 -1
  371. package/dist/utils/schemaConversion/sanitizeJsonSchema.js +0 -56
  372. package/dist/utils/schemaConversion/sanitizeJsonSchema.js.map +0 -1
  373. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts +0 -20
  374. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts.map +0 -1
  375. package/dist/utils/schemaConversion/simplifyRelationshipFields.js +0 -53
  376. package/dist/utils/schemaConversion/simplifyRelationshipFields.js.map +0 -1
  377. package/dist/utils/schemaConversion/transformPointFields.d.ts +0 -3
  378. package/dist/utils/schemaConversion/transformPointFields.d.ts.map +0 -1
  379. package/dist/utils/schemaConversion/transformPointFields.js +0 -51
  380. package/dist/utils/schemaConversion/transformPointFields.js.map +0 -1
  381. package/src/collections/createApiKeysCollection.ts +0 -373
  382. package/src/defaults.ts +0 -3
  383. package/src/endpoints/mcp.ts +0 -91
  384. package/src/mcp/createRequest.ts +0 -13
  385. package/src/mcp/getMcpHandler.ts +0 -545
  386. package/src/mcp/helpers/config.ts +0 -213
  387. package/src/mcp/helpers/fields.ts +0 -154
  388. package/src/mcp/helpers/fileValidation.ts +0 -362
  389. package/src/mcp/registerTool.ts +0 -22
  390. package/src/mcp/tools/auth/auth.ts +0 -71
  391. package/src/mcp/tools/auth/forgotPassword.ts +0 -70
  392. package/src/mcp/tools/auth/login.ts +0 -72
  393. package/src/mcp/tools/auth/resetPassword.ts +0 -61
  394. package/src/mcp/tools/auth/unlock.ts +0 -64
  395. package/src/mcp/tools/auth/verify.ts +0 -57
  396. package/src/mcp/tools/collection/create.ts +0 -210
  397. package/src/mcp/tools/collection/delete.ts +0 -211
  398. package/src/mcp/tools/collection/find.ts +0 -224
  399. package/src/mcp/tools/collection/update.ts +0 -290
  400. package/src/mcp/tools/config/find.ts +0 -128
  401. package/src/mcp/tools/config/update.ts +0 -280
  402. package/src/mcp/tools/global/find.ts +0 -128
  403. package/src/mcp/tools/global/update.ts +0 -207
  404. package/src/mcp/tools/job/create.ts +0 -416
  405. package/src/mcp/tools/job/run.ts +0 -167
  406. package/src/mcp/tools/job/update.ts +0 -274
  407. package/src/mcp/tools/resource/create.ts +0 -211
  408. package/src/mcp/tools/resource/delete.ts +0 -218
  409. package/src/mcp/tools/resource/find.ts +0 -246
  410. package/src/mcp/tools/resource/update.ts +0 -383
  411. package/src/mcp/tools/schemas.ts +0 -520
  412. package/src/utils/adminEntitySettings.ts +0 -40
  413. package/src/utils/createApiKeyFields.ts +0 -72
  414. package/src/utils/getEnabledSlugs.ts +0 -42
  415. package/src/utils/schemaConversion/convertCollectionSchemaToZod.ts +0 -52
  416. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
  417. package/src/utils/schemaConversion/sanitizeJsonSchema.ts +0 -62
  418. package/src/utils/schemaConversion/simplifyRelationshipFields.ts +0 -65
  419. package/src/utils/schemaConversion/transformPointFields.ts +0 -55
@@ -0,0 +1,384 @@
1
+ /**
2
+ * Refines Payload's `input`-variant JSON Schema into an MCP create/update tool's input schema. The
3
+ * variant already covers correctness (ID-only relationships, no managed/virtual/join fields); the
4
+ * passes here are MCP-specific - reshaping fields for the model and shrinking the result - and keep
5
+ * every node valid JSON Schema draft 2020-12. Each is tagged **Correctness**, **Size**, or **LLM
6
+ * ergonomics**, with a before/after example on its definition.
7
+ */ export const sanitizeEntitySchema = (schema)=>{
8
+ // Work on a copy — the caller reuses the original schema elsewhere (e.g. when listing tools).
9
+ let result = structuredClone(schema);
10
+ // LLM ergonomics — drop the redundant `'null'` from optional arrays/objects (`['array','null']` → `'array'`).
11
+ result = collapseOptionalContainerTypes(result);
12
+ // LLM ergonomics — rewrite point fields from a `[number, number]` tuple into a `{ longitude, latitude }` object.
13
+ result = pointFieldsToObjects(result);
14
+ // Size — strip inert type-gen leftovers that only bloat the schema (`tsType`, block-collision notes).
15
+ result = removeTypeGenArtifacts(result);
16
+ // Size — where a `const` already pins a value, the sibling `type` is redundant; remove it.
17
+ result = dropRedundantConstType(result);
18
+ // Size — fold per-collection relationship/upload variants (identical but for `relationTo`) into one `enum`.
19
+ result = mergeConstDiscriminatedUnions(result);
20
+ // Size — pull any subschema that appears more than once into a single shared `$defs` entry.
21
+ result = deduplicateIntoDefinitions(result);
22
+ // LLM ergonomics — give `$defs` short, readable names (`Code`, `paragraph`, `node`) so the `$ref`s read nicely.
23
+ result = shortenDefinitionNames(result);
24
+ return result;
25
+ };
26
+ /**
27
+ * Rebuilds a schema bottom-up, calling `visit` on each node after its children. Shared by the
28
+ * transforms that need to touch every node in the tree.
29
+ */ const mapNodes = (node, visit)=>{
30
+ if (Array.isArray(node)) {
31
+ return node.map((child)=>mapNodes(child, visit));
32
+ }
33
+ if (!node || typeof node !== 'object') {
34
+ return node;
35
+ }
36
+ const out = {};
37
+ for (const [key, value] of Object.entries(node)){
38
+ out[key] = mapNodes(value, visit);
39
+ }
40
+ return visit(out);
41
+ };
42
+ /**
43
+ * **LLM ergonomics.** Collapses optional array/object types (`['array', 'null']` → `'array'`) via
44
+ * {@link collapseNullableType}, recursing through `properties` and array items. The `required` list
45
+ * already conveys optionality, so the `'null'` is redundant noise for the model.
46
+ *
47
+ * @example
48
+ * { properties: { tags: { type: ['array', 'null'], items: {} } }, required: [] }
49
+ * → { properties: { tags: { type: 'array', items: {} } }, required: [] }
50
+ */ const collapseOptionalContainerTypes = (schema)=>{
51
+ if (schema.properties && typeof schema.properties === 'object') {
52
+ for (const key of Object.keys(schema.properties)){
53
+ const prop = schema.properties[key];
54
+ if (!prop || typeof prop !== 'object') {
55
+ continue;
56
+ }
57
+ const isRequired = Array.isArray(schema.required) && schema.required.includes(key);
58
+ collapseNullableType(prop, isRequired);
59
+ if (prop.properties) {
60
+ collapseOptionalContainerTypes(prop);
61
+ }
62
+ if (prop.items && typeof prop.items === 'object' && !Array.isArray(prop.items)) {
63
+ collapseOptionalContainerTypes(prop.items);
64
+ }
65
+ }
66
+ }
67
+ return schema;
68
+ };
69
+ /**
70
+ * Drops the `'null'` from an optional array/object type (`['array', 'null']` → `'array'`, likewise
71
+ * `'object'`). Payload marks a field optional by unioning its type with `'null'`, but a create/update
72
+ * tool already conveys "optional" through the `required` list - the client just omits the field - so the
73
+ * `'null'` is redundant here. Dropping it shows the model a plain `type: 'array'` instead of implying it
74
+ * should send a literal `null`.
75
+ *
76
+ * We never touch the `required` list, so this can't change whether a field is required. And we skip fields
77
+ * that ARE required (`isRequired`): there a `'null'` is a value the field genuinely accepts, not optionality
78
+ * encoding. Nullable scalars (`['string', 'null']`) are also left alone - they read fine as `string | null`.
79
+ *
80
+ * @example
81
+ * optional { type: ['array', 'null'] } → { type: 'array' } (still optional, just no longer null-valued)
82
+ * required { type: ['array', 'null'] } → unchanged
83
+ * { type: ['string', 'null'] } → unchanged
84
+ */ const collapseNullableType = (schema, isRequired)=>{
85
+ if (isRequired || !Array.isArray(schema.type)) {
86
+ return;
87
+ }
88
+ const nonNullTypes = schema.type.filter((t)=>t !== 'null');
89
+ if (nonNullTypes.length === 1 && (nonNullTypes[0] === 'array' || nonNullTypes[0] === 'object')) {
90
+ schema.type = nonNullTypes[0];
91
+ }
92
+ };
93
+ /**
94
+ * **LLM ergonomics.** Rewrites a point field (stored as a two-number tuple) into a `{ longitude, latitude }` object, which
95
+ * is far easier for the model to fill in than a positional array. This is input-only and lossless: the
96
+ * create/update handler converts the object back to the `[longitude, latitude]` tuple Payload stores,
97
+ * via `transformPointDataToPayload`.
98
+ *
99
+ * @example
100
+ * { type: 'array', items: [{ type: 'number' }, { type: 'number' }] }
101
+ * → { type: 'object', properties: { longitude: { type: 'number' }, latitude: { type: 'number' } }, required: ['longitude', 'latitude'] }
102
+ */ const pointFieldsToObjects = (schema)=>{
103
+ if (!schema || typeof schema !== 'object') {
104
+ return schema;
105
+ }
106
+ const transformed = {
107
+ ...schema
108
+ };
109
+ if (transformed.properties && typeof transformed.properties === 'object') {
110
+ transformed.properties = Object.fromEntries(Object.entries(transformed.properties).map(([key, value])=>{
111
+ if (!value || typeof value !== 'object') {
112
+ return [
113
+ key,
114
+ value
115
+ ];
116
+ }
117
+ const isArrayType = value.type === 'array' || Array.isArray(value.type) && value.type.includes('array');
118
+ const isPointField = isArrayType && Array.isArray(value.items) && value.items.length === 2 && value.items.every((item)=>item && typeof item === 'object' && item.type === 'number');
119
+ if (isPointField) {
120
+ const isNullable = Array.isArray(value.type) && value.type.includes('null');
121
+ return [
122
+ key,
123
+ {
124
+ type: isNullable ? [
125
+ 'object',
126
+ 'null'
127
+ ] : 'object',
128
+ description: value.description || 'Geographic coordinates (longitude, latitude)',
129
+ properties: {
130
+ latitude: {
131
+ type: 'number',
132
+ description: 'Latitude coordinate'
133
+ },
134
+ longitude: {
135
+ type: 'number',
136
+ description: 'Longitude coordinate'
137
+ }
138
+ },
139
+ required: [
140
+ 'longitude',
141
+ 'latitude'
142
+ ]
143
+ }
144
+ ];
145
+ }
146
+ return [
147
+ key,
148
+ pointFieldsToObjects(value)
149
+ ];
150
+ }));
151
+ }
152
+ if (transformed.items && typeof transformed.items === 'object' && !Array.isArray(transformed.items)) {
153
+ transformed.items = pointFieldsToObjects(transformed.items);
154
+ }
155
+ return transformed;
156
+ };
157
+ /**
158
+ * **Size.** Strips type-generation leftovers that bloat the schema without helping the model: the `tsType`
159
+ * hint (a `json-schema-to-typescript` extension; JSON Schema validators just ignore it, they don't reject it)
160
+ * and the block-interface-collision note Payload adds to some block descriptions (the
161
+ * `block-interface-name-collisions` docs link set in `registerBlockInterface`, see configToJSONSchema.ts).
162
+ * Both are inert here - removing them only shrinks the schema (and spares the model irrelevant noise).
163
+ *
164
+ * @example
165
+ * { type: 'object', tsType: 'SerializedBlockNode', description: 'see …#block-interface-name-collisions' }
166
+ * → { type: 'object' }
167
+ */ const removeTypeGenArtifacts = (schema)=>mapNodes(schema, (node)=>{
168
+ delete node.tsType;
169
+ const { description } = node;
170
+ if (typeof description === 'string' && description.includes('block-interface-name-collisions')) {
171
+ delete node.description;
172
+ }
173
+ return node;
174
+ });
175
+ /**
176
+ * **Size.** Removes `type` whenever a `const` sits next to it — the constant already fixes the value.
177
+ *
178
+ * @example
179
+ * { type: 'string', const: 'paragraph' } → { const: 'paragraph' }
180
+ */ const dropRedundantConstType = (schema)=>mapNodes(schema, (node)=>{
181
+ if ('const' in node && 'type' in node) {
182
+ delete node.type;
183
+ }
184
+ return node;
185
+ });
186
+ /**
187
+ * **Size.** Merges the members of a `oneOf`/`anyOf` that are identical except for one `const`-valued property
188
+ * into a single member with that property as an `enum`. Since the members differ only by that one
189
+ * constant, the `enum` form accepts exactly the same values - it's just smaller. This folds the
190
+ * per-collection relationship and upload variants, which differ only in their `relationTo` constant.
191
+ *
192
+ * @example
193
+ * { oneOf: [
194
+ * { properties: { relationTo: { const: 'posts' }, value: { type: 'string' } } },
195
+ * { properties: { relationTo: { const: 'pages' }, value: { type: 'string' } } },
196
+ * ] }
197
+ * → { properties: { relationTo: { enum: ['posts', 'pages'] }, value: { type: 'string' } } }
198
+ */ const mergeConstDiscriminatedUnions = (schema)=>mapNodes(schema, (node)=>{
199
+ for (const keyword of [
200
+ 'oneOf',
201
+ 'anyOf'
202
+ ]){
203
+ const members = node[keyword];
204
+ if (Array.isArray(members) && members.length > 1) {
205
+ const merged = mergeMembersByConst(members);
206
+ if (merged) {
207
+ delete node[keyword];
208
+ Object.assign(node, merged);
209
+ }
210
+ }
211
+ }
212
+ return node;
213
+ });
214
+ /** Returns the merged member for {@link mergeConstDiscriminatedUnions}, or `null` if they can't merge. */ const mergeMembersByConst = (members)=>{
215
+ const objects = members.filter((member)=>typeof member === 'object' && member !== null && typeof member.properties === 'object');
216
+ if (objects.length < 2 || objects.length !== members.length) {
217
+ return null;
218
+ }
219
+ for (const discriminator of Object.keys(objects[0].properties)){
220
+ // Each member must pin this property to a `const`...
221
+ const constValues = [];
222
+ const everyMemberPinsConst = objects.every((member)=>{
223
+ const prop = member.properties[discriminator];
224
+ if (prop && typeof prop === 'object' && 'const' in prop) {
225
+ constValues.push(prop.const);
226
+ return true;
227
+ }
228
+ return false;
229
+ });
230
+ if (!everyMemberPinsConst) {
231
+ continue;
232
+ }
233
+ // ...and be otherwise identical (compare each member with the discriminator removed).
234
+ const fingerprintWithoutDiscriminator = (member)=>{
235
+ const { [discriminator]: _discriminator, ...otherProperties } = member.properties;
236
+ return JSON.stringify({
237
+ ...member,
238
+ properties: otherProperties
239
+ });
240
+ };
241
+ if (new Set(objects.map(fingerprintWithoutDiscriminator)).size !== 1) {
242
+ continue;
243
+ }
244
+ const uniqueConstValues = [
245
+ ...new Set(constValues)
246
+ ];
247
+ if (uniqueConstValues.length < 2) {
248
+ continue;
249
+ }
250
+ // Replace the per-member `const` with a single `enum` of every value.
251
+ const merged = structuredClone(objects[0]);
252
+ const discriminatorProp = merged.properties[discriminator];
253
+ if (discriminatorProp && typeof discriminatorProp === 'object') {
254
+ delete discriminatorProp.const;
255
+ discriminatorProp.enum = uniqueConstValues;
256
+ }
257
+ return merged;
258
+ }
259
+ return null;
260
+ };
261
+ // A `$ref` costs ~30 characters once names are shortened, so sharing a subschema only pays off when
262
+ // it's larger than that and appears more than once.
263
+ const MIN_SHARED_SIZE = 64;
264
+ /** A subschema worth sharing: a standalone object/union/described schema, not a `$ref` or a primitive. */ const isShareable = (node)=>{
265
+ if (!node || typeof node !== 'object' || Array.isArray(node) || '$ref' in node) {
266
+ return false;
267
+ }
268
+ const schema = node;
269
+ return Array.isArray(schema.oneOf) || Array.isArray(schema.anyOf) || Boolean(schema.properties) || Boolean(schema.items) || typeof schema.description === 'string';
270
+ };
271
+ /**
272
+ * **Size.** Replaces any subschema that appears more than once with a single shared `$defs` entry referenced by
273
+ * `$ref`. Lossless — only the serialized size shrinks. A collection with several rich-text fields, for
274
+ * example, inlines the same large lexical node schema once per field; this collapses them into one.
275
+ *
276
+ * @example
277
+ * { properties: { billing: address, shipping: address } }
278
+ * → { properties: { billing: { $ref: '#/$defs/shared_0' }, shipping: { $ref: '#/$defs/shared_0' } }, $defs: { shared_0: address } }
279
+ */ const deduplicateIntoDefinitions = (schema)=>{
280
+ // Count how often each shareable subschema appears, keyed by its serialized form.
281
+ const counts = new Map();
282
+ const count = (node)=>{
283
+ if (isShareable(node)) {
284
+ const key = JSON.stringify(node);
285
+ if (key.length >= MIN_SHARED_SIZE) {
286
+ counts.set(key, (counts.get(key) ?? 0) + 1);
287
+ }
288
+ }
289
+ if (Array.isArray(node)) {
290
+ node.forEach(count);
291
+ } else if (node && typeof node === 'object') {
292
+ Object.values(node).forEach(count);
293
+ }
294
+ };
295
+ count(schema);
296
+ if (![
297
+ ...counts.values()
298
+ ].some((n)=>n >= 2)) {
299
+ return schema;
300
+ }
301
+ // Replace each subschema seen 2+ times with a `$ref`. The first time we meet one it becomes a shared
302
+ // entry; we never descend into a stored entry, so shared entries never reference one another.
303
+ const sharedEntries = {};
304
+ const nameByKey = new Map();
305
+ const share = (node)=>{
306
+ if (isShareable(node)) {
307
+ const key = JSON.stringify(node);
308
+ if ((counts.get(key) ?? 0) >= 2) {
309
+ let name = nameByKey.get(key);
310
+ if (!name) {
311
+ name = `shared_${nameByKey.size}`;
312
+ nameByKey.set(key, name);
313
+ sharedEntries[name] = node;
314
+ }
315
+ return {
316
+ $ref: `#/$defs/${name}`
317
+ };
318
+ }
319
+ }
320
+ if (Array.isArray(node)) {
321
+ return node.map(share);
322
+ }
323
+ if (node && typeof node === 'object') {
324
+ return Object.fromEntries(Object.entries(node).map(([childKey, value])=>[
325
+ childKey,
326
+ share(value)
327
+ ]));
328
+ }
329
+ return node;
330
+ };
331
+ const result = share(schema);
332
+ result.$defs = {
333
+ ...result.$defs,
334
+ ...sharedEntries
335
+ };
336
+ return result;
337
+ };
338
+ /**
339
+ * **LLM ergonomics.** Renames `$defs` entries to short, readable names so the `$ref`s stay legible to the model: a block's
340
+ * `blockType` (`Code`), a node's `type` (`paragraph`), `node` for a rich-text node union, otherwise the
341
+ * generated name with its disambiguating hash dropped. A numeric suffix keeps collisions unique.
342
+ *
343
+ * @example
344
+ * { properties: { body: { $ref: '#/$defs/LexicalNodes_9FBEC708' } }, $defs: { LexicalNodes_9FBEC708: {} } }
345
+ * → { properties: { body: { $ref: '#/$defs/node' } }, $defs: { node: {} } }
346
+ */ const shortenDefinitionNames = (schema)=>{
347
+ const definitions = schema.$defs;
348
+ if (!definitions || Object.keys(definitions).length === 0) {
349
+ return schema;
350
+ }
351
+ const shortNameFor = (name, definition)=>{
352
+ const properties = typeof definition === 'object' && definition.properties || {};
353
+ const constString = (key)=>{
354
+ const prop = properties[key];
355
+ return prop && typeof prop === 'object' && typeof prop.const === 'string' ? prop.const : undefined;
356
+ };
357
+ const members = typeof definition === 'object' ? definition.anyOf ?? definition.oneOf : undefined;
358
+ const isNodeUnion = Array.isArray(members) && members.some((m)=>typeof m === 'object' && Boolean(m.$ref || m.properties?.type));
359
+ return constString('blockType') ?? constString('type') ?? (isNodeUnion ? 'node' : undefined) ?? name.replace(/_[0-9A-F]{6,}$/i, '');
360
+ };
361
+ const prefix = '#/$defs/';
362
+ const usedNames = new Map();
363
+ const rename = new Map();
364
+ for (const [name, definition] of Object.entries(definitions)){
365
+ const shortName = shortNameFor(name, definition);
366
+ const used = usedNames.get(shortName) ?? 0;
367
+ usedNames.set(shortName, used + 1);
368
+ rename.set(name, used === 0 ? shortName : `${shortName}${used + 1}`);
369
+ }
370
+ const result = mapNodes(schema, (node)=>{
371
+ if (typeof node.$ref === 'string' && node.$ref.startsWith(prefix)) {
372
+ const name = node.$ref.slice(prefix.length);
373
+ node.$ref = `${prefix}${rename.get(name) ?? name}`;
374
+ }
375
+ return node;
376
+ });
377
+ result.$defs = Object.fromEntries(Object.entries(result.$defs).map(([name, body])=>[
378
+ rename.get(name) ?? name,
379
+ body
380
+ ]));
381
+ return result;
382
+ };
383
+
384
+ //# sourceMappingURL=sanitizeEntitySchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/schemaConversion/sanitizeEntitySchema.ts"],"sourcesContent":["import type { JsonSchemaType } from '../../types.js'\n\n/**\n * Refines Payload's `input`-variant JSON Schema into an MCP create/update tool's input schema. The\n * variant already covers correctness (ID-only relationships, no managed/virtual/join fields); the\n * passes here are MCP-specific - reshaping fields for the model and shrinking the result - and keep\n * every node valid JSON Schema draft 2020-12. Each is tagged **Correctness**, **Size**, or **LLM\n * ergonomics**, with a before/after example on its definition.\n */\nexport const sanitizeEntitySchema = (schema: JsonSchemaType): JsonSchemaType => {\n // Work on a copy — the caller reuses the original schema elsewhere (e.g. when listing tools).\n let result = structuredClone(schema)\n\n // LLM ergonomics — drop the redundant `'null'` from optional arrays/objects (`['array','null']` → `'array'`).\n result = collapseOptionalContainerTypes(result)\n\n // LLM ergonomics — rewrite point fields from a `[number, number]` tuple into a `{ longitude, latitude }` object.\n result = pointFieldsToObjects(result)\n\n // Size — strip inert type-gen leftovers that only bloat the schema (`tsType`, block-collision notes).\n result = removeTypeGenArtifacts(result)\n\n // Size — where a `const` already pins a value, the sibling `type` is redundant; remove it.\n result = dropRedundantConstType(result)\n\n // Size — fold per-collection relationship/upload variants (identical but for `relationTo`) into one `enum`.\n result = mergeConstDiscriminatedUnions(result)\n\n // Size — pull any subschema that appears more than once into a single shared `$defs` entry.\n result = deduplicateIntoDefinitions(result)\n\n // LLM ergonomics — give `$defs` short, readable names (`Code`, `paragraph`, `node`) so the `$ref`s read nicely.\n result = shortenDefinitionNames(result)\n\n return result\n}\n\n/**\n * Rebuilds a schema bottom-up, calling `visit` on each node after its children. Shared by the\n * transforms that need to touch every node in the tree.\n */\nconst mapNodes = (node: unknown, visit: (node: JsonSchemaType) => JsonSchemaType): unknown => {\n if (Array.isArray(node)) {\n return node.map((child) => mapNodes(child, visit))\n }\n if (!node || typeof node !== 'object') {\n return node\n }\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(node)) {\n out[key] = mapNodes(value, visit)\n }\n return visit(out)\n}\n\n/**\n * **LLM ergonomics.** Collapses optional array/object types (`['array', 'null']` → `'array'`) via\n * {@link collapseNullableType}, recursing through `properties` and array items. The `required` list\n * already conveys optionality, so the `'null'` is redundant noise for the model.\n *\n * @example\n * { properties: { tags: { type: ['array', 'null'], items: {} } }, required: [] }\n * → { properties: { tags: { type: 'array', items: {} } }, required: [] }\n */\nconst collapseOptionalContainerTypes = (schema: JsonSchemaType): JsonSchemaType => {\n if (schema.properties && typeof schema.properties === 'object') {\n for (const key of Object.keys(schema.properties)) {\n const prop = schema.properties[key] as JsonSchemaType\n if (!prop || typeof prop !== 'object') {\n continue\n }\n const isRequired = Array.isArray(schema.required) && schema.required.includes(key)\n collapseNullableType(prop, isRequired)\n if (prop.properties) {\n collapseOptionalContainerTypes(prop)\n }\n if (prop.items && typeof prop.items === 'object' && !Array.isArray(prop.items)) {\n collapseOptionalContainerTypes(prop.items)\n }\n }\n }\n\n return schema\n}\n\n/**\n * Drops the `'null'` from an optional array/object type (`['array', 'null']` → `'array'`, likewise\n * `'object'`). Payload marks a field optional by unioning its type with `'null'`, but a create/update\n * tool already conveys \"optional\" through the `required` list - the client just omits the field - so the\n * `'null'` is redundant here. Dropping it shows the model a plain `type: 'array'` instead of implying it\n * should send a literal `null`.\n *\n * We never touch the `required` list, so this can't change whether a field is required. And we skip fields\n * that ARE required (`isRequired`): there a `'null'` is a value the field genuinely accepts, not optionality\n * encoding. Nullable scalars (`['string', 'null']`) are also left alone - they read fine as `string | null`.\n *\n * @example\n * optional { type: ['array', 'null'] } → { type: 'array' } (still optional, just no longer null-valued)\n * required { type: ['array', 'null'] } → unchanged\n * { type: ['string', 'null'] } → unchanged\n */\nconst collapseNullableType = (schema: JsonSchemaType, isRequired: boolean): void => {\n if (isRequired || !Array.isArray(schema.type)) {\n return\n }\n const nonNullTypes = schema.type.filter((t) => t !== 'null')\n if (nonNullTypes.length === 1 && (nonNullTypes[0] === 'array' || nonNullTypes[0] === 'object')) {\n schema.type = nonNullTypes[0]\n }\n}\n\n/**\n * **LLM ergonomics.** Rewrites a point field (stored as a two-number tuple) into a `{ longitude, latitude }` object, which\n * is far easier for the model to fill in than a positional array. This is input-only and lossless: the\n * create/update handler converts the object back to the `[longitude, latitude]` tuple Payload stores,\n * via `transformPointDataToPayload`.\n *\n * @example\n * { type: 'array', items: [{ type: 'number' }, { type: 'number' }] }\n * → { type: 'object', properties: { longitude: { type: 'number' }, latitude: { type: 'number' } }, required: ['longitude', 'latitude'] }\n */\nconst pointFieldsToObjects = (schema: JsonSchemaType): JsonSchemaType => {\n if (!schema || typeof schema !== 'object') {\n return schema\n }\n\n const transformed = { ...schema }\n\n if (transformed.properties && typeof transformed.properties === 'object') {\n transformed.properties = Object.fromEntries(\n Object.entries(transformed.properties).map(([key, value]) => {\n if (!value || typeof value !== 'object') {\n return [key, value]\n }\n const isArrayType =\n value.type === 'array' || (Array.isArray(value.type) && value.type.includes('array'))\n const isPointField =\n isArrayType &&\n Array.isArray(value.items) &&\n value.items.length === 2 &&\n value.items.every((item) => item && typeof item === 'object' && item.type === 'number')\n\n if (isPointField) {\n const isNullable = Array.isArray(value.type) && value.type.includes('null')\n return [\n key,\n {\n type: isNullable ? ['object', 'null'] : 'object',\n description: value.description || 'Geographic coordinates (longitude, latitude)',\n properties: {\n latitude: { type: 'number', description: 'Latitude coordinate' },\n longitude: { type: 'number', description: 'Longitude coordinate' },\n },\n required: ['longitude', 'latitude'],\n },\n ]\n }\n\n return [key, pointFieldsToObjects(value)]\n }),\n )\n }\n\n if (\n transformed.items &&\n typeof transformed.items === 'object' &&\n !Array.isArray(transformed.items)\n ) {\n transformed.items = pointFieldsToObjects(transformed.items)\n }\n\n return transformed\n}\n\n/**\n * **Size.** Strips type-generation leftovers that bloat the schema without helping the model: the `tsType`\n * hint (a `json-schema-to-typescript` extension; JSON Schema validators just ignore it, they don't reject it)\n * and the block-interface-collision note Payload adds to some block descriptions (the\n * `block-interface-name-collisions` docs link set in `registerBlockInterface`, see configToJSONSchema.ts).\n * Both are inert here - removing them only shrinks the schema (and spares the model irrelevant noise).\n *\n * @example\n * { type: 'object', tsType: 'SerializedBlockNode', description: 'see …#block-interface-name-collisions' }\n * → { type: 'object' }\n */\nconst removeTypeGenArtifacts = (schema: JsonSchemaType): JsonSchemaType =>\n mapNodes(schema, (node) => {\n delete (node as { tsType?: unknown }).tsType\n const { description } = node as { description?: string }\n if (\n typeof description === 'string' &&\n description.includes('block-interface-name-collisions')\n ) {\n delete (node as { description?: unknown }).description\n }\n return node\n }) as JsonSchemaType\n\n/**\n * **Size.** Removes `type` whenever a `const` sits next to it — the constant already fixes the value.\n *\n * @example\n * { type: 'string', const: 'paragraph' } → { const: 'paragraph' }\n */\nconst dropRedundantConstType = (schema: JsonSchemaType): JsonSchemaType =>\n mapNodes(schema, (node) => {\n if ('const' in node && 'type' in node) {\n delete (node as { type?: unknown }).type\n }\n return node\n }) as JsonSchemaType\n\n/**\n * **Size.** Merges the members of a `oneOf`/`anyOf` that are identical except for one `const`-valued property\n * into a single member with that property as an `enum`. Since the members differ only by that one\n * constant, the `enum` form accepts exactly the same values - it's just smaller. This folds the\n * per-collection relationship and upload variants, which differ only in their `relationTo` constant.\n *\n * @example\n * { oneOf: [\n * { properties: { relationTo: { const: 'posts' }, value: { type: 'string' } } },\n * { properties: { relationTo: { const: 'pages' }, value: { type: 'string' } } },\n * ] }\n * → { properties: { relationTo: { enum: ['posts', 'pages'] }, value: { type: 'string' } } }\n */\nconst mergeConstDiscriminatedUnions = (schema: JsonSchemaType): JsonSchemaType =>\n mapNodes(schema, (node) => {\n for (const keyword of ['oneOf', 'anyOf'] as const) {\n const members = node[keyword]\n if (Array.isArray(members) && members.length > 1) {\n const merged = mergeMembersByConst(members)\n if (merged) {\n delete node[keyword]\n Object.assign(node, merged)\n }\n }\n }\n return node\n }) as JsonSchemaType\n\n/** Returns the merged member for {@link mergeConstDiscriminatedUnions}, or `null` if they can't merge. */\nconst mergeMembersByConst = (members: Array<boolean | JsonSchemaType>): JsonSchemaType | null => {\n const objects = members.filter(\n (member): member is JsonSchemaType =>\n typeof member === 'object' && member !== null && typeof member.properties === 'object',\n )\n if (objects.length < 2 || objects.length !== members.length) {\n return null\n }\n\n for (const discriminator of Object.keys(objects[0]!.properties!)) {\n // Each member must pin this property to a `const`...\n const constValues: unknown[] = []\n const everyMemberPinsConst = objects.every((member) => {\n const prop = member.properties![discriminator]\n if (prop && typeof prop === 'object' && 'const' in prop) {\n constValues.push(prop.const)\n return true\n }\n return false\n })\n if (!everyMemberPinsConst) {\n continue\n }\n\n // ...and be otherwise identical (compare each member with the discriminator removed).\n const fingerprintWithoutDiscriminator = (member: JsonSchemaType): string => {\n const { [discriminator]: _discriminator, ...otherProperties } = member.properties!\n return JSON.stringify({ ...member, properties: otherProperties })\n }\n if (new Set(objects.map(fingerprintWithoutDiscriminator)).size !== 1) {\n continue\n }\n\n const uniqueConstValues = [...new Set(constValues)]\n if (uniqueConstValues.length < 2) {\n continue\n }\n\n // Replace the per-member `const` with a single `enum` of every value.\n const merged = structuredClone(objects[0]!)\n const discriminatorProp = merged.properties![discriminator]\n if (discriminatorProp && typeof discriminatorProp === 'object') {\n delete discriminatorProp.const\n discriminatorProp.enum = uniqueConstValues as NonNullable<typeof discriminatorProp.enum>\n }\n return merged\n }\n return null\n}\n\n// A `$ref` costs ~30 characters once names are shortened, so sharing a subschema only pays off when\n// it's larger than that and appears more than once.\nconst MIN_SHARED_SIZE = 64\n\n/** A subschema worth sharing: a standalone object/union/described schema, not a `$ref` or a primitive. */\nconst isShareable = (node: unknown): node is Record<string, unknown> => {\n if (!node || typeof node !== 'object' || Array.isArray(node) || '$ref' in node) {\n return false\n }\n const schema = node as JsonSchemaType\n return (\n Array.isArray(schema.oneOf) ||\n Array.isArray(schema.anyOf) ||\n Boolean(schema.properties) ||\n Boolean(schema.items) ||\n typeof schema.description === 'string'\n )\n}\n\n/**\n * **Size.** Replaces any subschema that appears more than once with a single shared `$defs` entry referenced by\n * `$ref`. Lossless — only the serialized size shrinks. A collection with several rich-text fields, for\n * example, inlines the same large lexical node schema once per field; this collapses them into one.\n *\n * @example\n * { properties: { billing: address, shipping: address } }\n * → { properties: { billing: { $ref: '#/$defs/shared_0' }, shipping: { $ref: '#/$defs/shared_0' } }, $defs: { shared_0: address } }\n */\nconst deduplicateIntoDefinitions = (schema: JsonSchemaType): JsonSchemaType => {\n // Count how often each shareable subschema appears, keyed by its serialized form.\n const counts = new Map<string, number>()\n const count = (node: unknown): void => {\n if (isShareable(node)) {\n const key = JSON.stringify(node)\n if (key.length >= MIN_SHARED_SIZE) {\n counts.set(key, (counts.get(key) ?? 0) + 1)\n }\n }\n if (Array.isArray(node)) {\n node.forEach(count)\n } else if (node && typeof node === 'object') {\n Object.values(node).forEach(count)\n }\n }\n count(schema)\n\n if (![...counts.values()].some((n) => n >= 2)) {\n return schema\n }\n\n // Replace each subschema seen 2+ times with a `$ref`. The first time we meet one it becomes a shared\n // entry; we never descend into a stored entry, so shared entries never reference one another.\n const sharedEntries: Record<string, JsonSchemaType> = {}\n const nameByKey = new Map<string, string>()\n const share = (node: unknown): unknown => {\n if (isShareable(node)) {\n const key = JSON.stringify(node)\n if ((counts.get(key) ?? 0) >= 2) {\n let name = nameByKey.get(key)\n if (!name) {\n name = `shared_${nameByKey.size}`\n nameByKey.set(key, name)\n sharedEntries[name] = node\n }\n return { $ref: `#/$defs/${name}` }\n }\n }\n if (Array.isArray(node)) {\n return node.map(share)\n }\n if (node && typeof node === 'object') {\n return Object.fromEntries(\n Object.entries(node).map(([childKey, value]) => [childKey, share(value)]),\n )\n }\n return node\n }\n\n const result = share(schema) as JsonSchemaType\n result.$defs = { ...result.$defs, ...sharedEntries }\n return result\n}\n\n/**\n * **LLM ergonomics.** Renames `$defs` entries to short, readable names so the `$ref`s stay legible to the model: a block's\n * `blockType` (`Code`), a node's `type` (`paragraph`), `node` for a rich-text node union, otherwise the\n * generated name with its disambiguating hash dropped. A numeric suffix keeps collisions unique.\n *\n * @example\n * { properties: { body: { $ref: '#/$defs/LexicalNodes_9FBEC708' } }, $defs: { LexicalNodes_9FBEC708: {} } }\n * → { properties: { body: { $ref: '#/$defs/node' } }, $defs: { node: {} } }\n */\nconst shortenDefinitionNames = (schema: JsonSchemaType): JsonSchemaType => {\n const definitions = schema.$defs\n if (!definitions || Object.keys(definitions).length === 0) {\n return schema\n }\n\n const shortNameFor = (name: string, definition: boolean | JsonSchemaType): string => {\n const properties = (typeof definition === 'object' && definition.properties) || {}\n const constString = (key: string): string | undefined => {\n const prop = properties[key]\n return prop && typeof prop === 'object' && typeof prop.const === 'string'\n ? prop.const\n : undefined\n }\n const members =\n typeof definition === 'object' ? (definition.anyOf ?? definition.oneOf) : undefined\n const isNodeUnion =\n Array.isArray(members) &&\n members.some((m) => typeof m === 'object' && Boolean(m.$ref || m.properties?.type))\n return (\n constString('blockType') ??\n constString('type') ??\n (isNodeUnion ? 'node' : undefined) ??\n name.replace(/_[0-9A-F]{6,}$/i, '')\n )\n }\n\n const prefix = '#/$defs/'\n const usedNames = new Map<string, number>()\n const rename = new Map<string, string>()\n for (const [name, definition] of Object.entries(definitions)) {\n const shortName = shortNameFor(name, definition)\n const used = usedNames.get(shortName) ?? 0\n usedNames.set(shortName, used + 1)\n rename.set(name, used === 0 ? shortName : `${shortName}${used + 1}`)\n }\n\n const result = mapNodes(schema, (node) => {\n if (typeof node.$ref === 'string' && node.$ref.startsWith(prefix)) {\n const name = node.$ref.slice(prefix.length)\n node.$ref = `${prefix}${rename.get(name) ?? name}`\n }\n return node\n }) as JsonSchemaType\n result.$defs = Object.fromEntries(\n Object.entries(result.$defs!).map(([name, body]) => [rename.get(name) ?? name, body]),\n )\n return result\n}\n"],"names":["sanitizeEntitySchema","schema","result","structuredClone","collapseOptionalContainerTypes","pointFieldsToObjects","removeTypeGenArtifacts","dropRedundantConstType","mergeConstDiscriminatedUnions","deduplicateIntoDefinitions","shortenDefinitionNames","mapNodes","node","visit","Array","isArray","map","child","out","key","value","Object","entries","properties","keys","prop","isRequired","required","includes","collapseNullableType","items","type","nonNullTypes","filter","t","length","transformed","fromEntries","isArrayType","isPointField","every","item","isNullable","description","latitude","longitude","tsType","keyword","members","merged","mergeMembersByConst","assign","objects","member","discriminator","constValues","everyMemberPinsConst","push","const","fingerprintWithoutDiscriminator","_discriminator","otherProperties","JSON","stringify","Set","size","uniqueConstValues","discriminatorProp","enum","MIN_SHARED_SIZE","isShareable","oneOf","anyOf","Boolean","counts","Map","count","set","get","forEach","values","some","n","sharedEntries","nameByKey","share","name","$ref","childKey","$defs","definitions","shortNameFor","definition","constString","undefined","isNodeUnion","m","replace","prefix","usedNames","rename","shortName","used","startsWith","slice","body"],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { sanitizeEntitySchema } from './sanitizeEntitySchema.js';
3
+ describe('sanitizeEntitySchema', ()=>{
4
+ it('renames the Lexical node-union definition to a short name and keeps it a strict oneOf', ()=>{
5
+ // Shaped like the schema the MCP server prepares for a collection with a Lexical richText field
6
+ // (Payload's `input` variant): a `$defs` node union (a `oneOf` of node shapes). The input variant
7
+ // already types the relationship node's `value` as a bare ID - there is no populated-doc `$ref` to
8
+ // reduce here (the variant did that upstream), so sanitize leaves the value untouched.
9
+ const standalone = {
10
+ type: 'object',
11
+ $defs: {
12
+ LexicalNodes_ABCDEF12: {
13
+ oneOf: [
14
+ {
15
+ type: 'object',
16
+ additionalProperties: false,
17
+ properties: {
18
+ type: {
19
+ const: 'paragraph'
20
+ }
21
+ },
22
+ required: [
23
+ 'type'
24
+ ]
25
+ },
26
+ {
27
+ type: 'object',
28
+ additionalProperties: false,
29
+ properties: {
30
+ type: {
31
+ const: 'relationship'
32
+ },
33
+ value: {
34
+ type: 'string',
35
+ description: 'The related document ID.'
36
+ }
37
+ },
38
+ required: [
39
+ 'type'
40
+ ]
41
+ }
42
+ ]
43
+ }
44
+ },
45
+ properties: {
46
+ id: {
47
+ type: 'string'
48
+ },
49
+ content: {
50
+ type: 'object',
51
+ properties: {
52
+ root: {
53
+ type: 'object',
54
+ properties: {
55
+ children: {
56
+ type: 'array',
57
+ items: {
58
+ $ref: '#/$defs/LexicalNodes_ABCDEF12'
59
+ }
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ };
67
+ expect(sanitizeEntitySchema(standalone)).toStrictEqual({
68
+ type: 'object',
69
+ $defs: {
70
+ // The node union is renamed to a short, readable `node`, and stays a strict discriminated
71
+ // `oneOf` - not loosened to `anyOf`.
72
+ node: {
73
+ oneOf: [
74
+ {
75
+ type: 'object',
76
+ additionalProperties: false,
77
+ properties: {
78
+ type: {
79
+ const: 'paragraph'
80
+ }
81
+ },
82
+ required: [
83
+ 'type'
84
+ ]
85
+ },
86
+ {
87
+ type: 'object',
88
+ additionalProperties: false,
89
+ properties: {
90
+ type: {
91
+ const: 'relationship'
92
+ },
93
+ // The value is already ID-only from the input variant - left as-is.
94
+ value: {
95
+ type: 'string',
96
+ description: 'The related document ID.'
97
+ }
98
+ },
99
+ required: [
100
+ 'type'
101
+ ]
102
+ }
103
+ ]
104
+ }
105
+ },
106
+ properties: {
107
+ // Managed fields (createdAt/updatedAt/_status) are excluded upstream by the `input` variant;
108
+ // `id` stays because it's a valid optional input (a client may supply a custom ID).
109
+ id: {
110
+ type: 'string'
111
+ },
112
+ content: {
113
+ type: 'object',
114
+ properties: {
115
+ root: {
116
+ type: 'object',
117
+ properties: {
118
+ children: {
119
+ type: 'array',
120
+ items: {
121
+ $ref: '#/$defs/node'
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ });
130
+ });
131
+ });
132
+
133
+ //# sourceMappingURL=sanitizeEntitySchema.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/schemaConversion/sanitizeEntitySchema.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport type { JsonSchemaType } from '../../types.js'\n\nimport { sanitizeEntitySchema } from './sanitizeEntitySchema.js'\n\ndescribe('sanitizeEntitySchema', () => {\n it('renames the Lexical node-union definition to a short name and keeps it a strict oneOf', () => {\n // Shaped like the schema the MCP server prepares for a collection with a Lexical richText field\n // (Payload's `input` variant): a `$defs` node union (a `oneOf` of node shapes). The input variant\n // already types the relationship node's `value` as a bare ID - there is no populated-doc `$ref` to\n // reduce here (the variant did that upstream), so sanitize leaves the value untouched.\n const standalone: JsonSchemaType = {\n type: 'object',\n $defs: {\n LexicalNodes_ABCDEF12: {\n oneOf: [\n {\n type: 'object',\n additionalProperties: false,\n properties: { type: { const: 'paragraph' } },\n required: ['type'],\n },\n {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { const: 'relationship' },\n value: { type: 'string', description: 'The related document ID.' },\n },\n required: ['type'],\n },\n ],\n },\n },\n properties: {\n id: { type: 'string' },\n content: {\n type: 'object',\n properties: {\n root: {\n type: 'object',\n properties: {\n children: { type: 'array', items: { $ref: '#/$defs/LexicalNodes_ABCDEF12' } },\n },\n },\n },\n },\n },\n }\n\n expect(sanitizeEntitySchema(standalone)).toStrictEqual({\n type: 'object',\n $defs: {\n // The node union is renamed to a short, readable `node`, and stays a strict discriminated\n // `oneOf` - not loosened to `anyOf`.\n node: {\n oneOf: [\n {\n type: 'object',\n additionalProperties: false,\n properties: { type: { const: 'paragraph' } },\n required: ['type'],\n },\n {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { const: 'relationship' },\n // The value is already ID-only from the input variant - left as-is.\n value: { type: 'string', description: 'The related document ID.' },\n },\n required: ['type'],\n },\n ],\n },\n },\n properties: {\n // Managed fields (createdAt/updatedAt/_status) are excluded upstream by the `input` variant;\n // `id` stays because it's a valid optional input (a client may supply a custom ID).\n id: { type: 'string' },\n content: {\n type: 'object',\n properties: {\n root: {\n type: 'object',\n properties: {\n children: { type: 'array', items: { $ref: '#/$defs/node' } },\n },\n },\n },\n },\n },\n })\n })\n})\n"],"names":["describe","expect","it","sanitizeEntitySchema","standalone","type","$defs","LexicalNodes_ABCDEF12","oneOf","additionalProperties","properties","const","required","value","description","id","content","root","children","items","$ref","toStrictEqual","node"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAI7C,SAASC,oBAAoB,QAAQ,4BAA2B;AAEhEH,SAAS,wBAAwB;IAC/BE,GAAG,yFAAyF;QAC1F,gGAAgG;QAChG,kGAAkG;QAClG,mGAAmG;QACnG,uFAAuF;QACvF,MAAME,aAA6B;YACjCC,MAAM;YACNC,OAAO;gBACLC,uBAAuB;oBACrBC,OAAO;wBACL;4BACEH,MAAM;4BACNI,sBAAsB;4BACtBC,YAAY;gCAAEL,MAAM;oCAAEM,OAAO;gCAAY;4BAAE;4BAC3CC,UAAU;gCAAC;6BAAO;wBACpB;wBACA;4BACEP,MAAM;4BACNI,sBAAsB;4BACtBC,YAAY;gCACVL,MAAM;oCAAEM,OAAO;gCAAe;gCAC9BE,OAAO;oCAAER,MAAM;oCAAUS,aAAa;gCAA2B;4BACnE;4BACAF,UAAU;gCAAC;6BAAO;wBACpB;qBACD;gBACH;YACF;YACAF,YAAY;gBACVK,IAAI;oBAAEV,MAAM;gBAAS;gBACrBW,SAAS;oBACPX,MAAM;oBACNK,YAAY;wBACVO,MAAM;4BACJZ,MAAM;4BACNK,YAAY;gCACVQ,UAAU;oCAAEb,MAAM;oCAASc,OAAO;wCAAEC,MAAM;oCAAgC;gCAAE;4BAC9E;wBACF;oBACF;gBACF;YACF;QACF;QAEAnB,OAAOE,qBAAqBC,aAAaiB,aAAa,CAAC;YACrDhB,MAAM;YACNC,OAAO;gBACL,0FAA0F;gBAC1F,qCAAqC;gBACrCgB,MAAM;oBACJd,OAAO;wBACL;4BACEH,MAAM;4BACNI,sBAAsB;4BACtBC,YAAY;gCAAEL,MAAM;oCAAEM,OAAO;gCAAY;4BAAE;4BAC3CC,UAAU;gCAAC;6BAAO;wBACpB;wBACA;4BACEP,MAAM;4BACNI,sBAAsB;4BACtBC,YAAY;gCACVL,MAAM;oCAAEM,OAAO;gCAAe;gCAC9B,oEAAoE;gCACpEE,OAAO;oCAAER,MAAM;oCAAUS,aAAa;gCAA2B;4BACnE;4BACAF,UAAU;gCAAC;6BAAO;wBACpB;qBACD;gBACH;YACF;YACAF,YAAY;gBACV,6FAA6F;gBAC7F,oFAAoF;gBACpFK,IAAI;oBAAEV,MAAM;gBAAS;gBACrBW,SAAS;oBACPX,MAAM;oBACNK,YAAY;wBACVO,MAAM;4BACJZ,MAAM;4BACNK,YAAY;gCACVQ,UAAU;oCAAEb,MAAM;oCAASc,OAAO;wCAAEC,MAAM;oCAAe;gCAAE;4BAC7D;wBACF;oBACF;gBACF;YACF;QACF;IACF;AACF"}
@@ -0,0 +1,5 @@
1
+ import { type StandardSchemaWithJSON } from '@modelcontextprotocol/server';
2
+ import type { ToolInputSchema } from '../types.js';
3
+ /** Normalize a tool/prompt input to a Standard Schema. Raw JSON Schema gets wrapped; Standard Schema instances pass through. */
4
+ export declare const toStandardSchema: (schema: ToolInputSchema) => StandardSchemaWithJSON;
5
+ //# sourceMappingURL=toStandardSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toStandardSchema.d.ts","sourceRoot":"","sources":["../../src/utils/toStandardSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAE1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,gIAAgI;AAChI,eAAO,MAAM,gBAAgB,GAAI,QAAQ,eAAe,KAAG,sBAG/B,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { fromJsonSchema } from '@modelcontextprotocol/server';
2
+ /** Normalize a tool/prompt input to a Standard Schema. Raw JSON Schema gets wrapped; Standard Schema instances pass through. */ export const toStandardSchema = (schema)=>typeof schema === 'object' && schema !== null && '~standard' in schema ? schema : fromJsonSchema(schema);
3
+
4
+ //# sourceMappingURL=toStandardSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/toStandardSchema.ts"],"sourcesContent":["import { fromJsonSchema, type StandardSchemaWithJSON } from '@modelcontextprotocol/server'\n\nimport type { ToolInputSchema } from '../types.js'\n\n/** Normalize a tool/prompt input to a Standard Schema. Raw JSON Schema gets wrapped; Standard Schema instances pass through. */\nexport const toStandardSchema = (schema: ToolInputSchema): StandardSchemaWithJSON =>\n typeof schema === 'object' && schema !== null && '~standard' in schema\n ? (schema as StandardSchemaWithJSON)\n : fromJsonSchema(schema)\n"],"names":["fromJsonSchema","toStandardSchema","schema"],"mappings":"AAAA,SAASA,cAAc,QAAqC,+BAA8B;AAI1F,8HAA8H,GAC9H,OAAO,MAAMC,mBAAmB,CAACC,SAC/B,OAAOA,WAAW,YAAYA,WAAW,QAAQ,eAAeA,SAC3DA,SACDF,eAAeE,QAAO"}
@@ -0,0 +1,9 @@
1
+ import type { Where } from 'payload';
2
+ import { z } from 'zod';
3
+ /**
4
+ * - Validates the `where` input of collection tools against Payload's `Where` shape
5
+ * - Field keys map to operator objects restricted to `validOperators`
6
+ * - `and` / `or` nest recursively
7
+ */
8
+ export declare const whereSchema: z.ZodType<Where>;
9
+ //# sourceMappingURL=whereSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whereSchema.d.ts","sourceRoot":"","sources":["../../src/utils/whereSchema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAGpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CASqD,CAAA"}
@@ -0,0 +1,13 @@
1
+ import { validOperators } from 'payload/shared';
2
+ import { z } from 'zod';
3
+ const whereFieldSchema = z.partialRecord(z.enum(validOperators), z.unknown()).describe('Field query operators');
4
+ /**
5
+ * - Validates the `where` input of collection tools against Payload's `Where` shape
6
+ * - Field keys map to operator objects restricted to `validOperators`
7
+ * - `and` / `or` nest recursively
8
+ */ export const whereSchema = z.lazy(()=>z.object({
9
+ and: z.array(whereSchema).optional(),
10
+ or: z.array(whereSchema).optional()
11
+ }).catchall(whereFieldSchema)).describe('Where clause using field names with Payload query operators, plus and/or groups');
12
+
13
+ //# sourceMappingURL=whereSchema.js.map