@payloadcms/plugin-mcp 4.0.0-internal.011fd46 → 4.0.0-internal.078835b

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 (471) hide show
  1. package/LICENSE.md +1 -1
  2. package/bin.js +7 -0
  3. package/dist/defaultAccess.d.ts +3 -0
  4. package/dist/defaultAccess.d.ts.map +1 -0
  5. package/dist/defaultAccess.js +3 -0
  6. package/dist/defaultAccess.js.map +1 -0
  7. package/dist/defineTool.d.ts +8 -8
  8. package/dist/defineTool.d.ts.map +1 -1
  9. package/dist/endpoint/access.d.ts +12 -5
  10. package/dist/endpoint/access.d.ts.map +1 -1
  11. package/dist/endpoint/access.js +74 -103
  12. package/dist/endpoint/access.js.map +1 -1
  13. package/dist/endpoint/index.d.ts +1 -1
  14. package/dist/endpoint/index.d.ts.map +1 -1
  15. package/dist/endpoint/index.js +68 -17
  16. package/dist/endpoint/index.js.map +1 -1
  17. package/dist/exports/client.d.ts +1 -4
  18. package/dist/exports/client.d.ts.map +1 -1
  19. package/dist/exports/client.js +1 -4
  20. package/dist/exports/client.js.map +1 -1
  21. package/dist/exports/internal.d.ts +2 -0
  22. package/dist/exports/internal.d.ts.map +1 -0
  23. package/dist/exports/internal.js +3 -0
  24. package/dist/exports/internal.js.map +1 -0
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -56
  28. package/dist/index.js.map +1 -1
  29. package/dist/mcp/buildMcpServer.d.ts +4 -4
  30. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  31. package/dist/mcp/buildMcpServer.js +32 -10
  32. package/dist/mcp/buildMcpServer.js.map +1 -1
  33. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  34. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  35. package/dist/mcp/builtin/collections/countTool.js +68 -0
  36. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  37. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  38. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  39. package/dist/mcp/builtin/collections/countVersionsTool.js +64 -0
  40. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  41. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
  42. package/dist/mcp/builtin/collections/createTool.js +17 -6
  43. package/dist/mcp/builtin/collections/createTool.js.map +1 -1
  44. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
  45. package/dist/mcp/builtin/collections/deleteTool.js +3 -2
  46. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
  47. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  48. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  49. package/dist/mcp/builtin/collections/duplicateTool.js +96 -0
  50. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  51. package/dist/mcp/builtin/collections/fileInput.d.ts +28 -0
  52. package/dist/mcp/builtin/collections/fileInput.d.ts.map +1 -0
  53. package/dist/mcp/builtin/collections/fileInput.js +117 -0
  54. package/dist/mcp/builtin/collections/fileInput.js.map +1 -0
  55. package/dist/mcp/builtin/collections/fileInput.spec.js +86 -0
  56. package/dist/mcp/builtin/collections/fileInput.spec.js.map +1 -0
  57. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  58. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  59. package/dist/mcp/builtin/collections/findDistinctTool.js +92 -0
  60. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  61. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  62. package/dist/mcp/builtin/collections/findTool.js +5 -4
  63. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  64. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  65. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  66. package/dist/mcp/builtin/collections/findVersionByIDTool.js +83 -0
  67. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  68. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  69. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  70. package/dist/mcp/builtin/collections/findVersionsTool.js +98 -0
  71. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  72. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +1 -1
  73. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -1
  74. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -1
  75. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -1
  76. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +49 -4
  77. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -1
  78. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  79. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  80. package/dist/mcp/builtin/collections/restoreVersionTool.js +81 -0
  81. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  82. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  83. package/dist/mcp/builtin/collections/updateTool.js +26 -12
  84. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  85. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts +2 -0
  86. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts.map +1 -0
  87. package/dist/mcp/builtin/collections/uploadInstructionsTool.js +55 -0
  88. package/dist/mcp/builtin/collections/uploadInstructionsTool.js.map +1 -0
  89. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -1
  90. package/dist/mcp/builtin/getConfigInfoTool.js +20 -8
  91. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -1
  92. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  93. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  94. package/dist/mcp/builtin/globals/countVersionsTool.js +64 -0
  95. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  96. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  97. package/dist/mcp/builtin/globals/findTool.js +4 -2
  98. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  99. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  100. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  101. package/dist/mcp/builtin/globals/findVersionByIDTool.js +79 -0
  102. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  103. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  104. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  105. package/dist/mcp/builtin/globals/findVersionsTool.js +94 -0
  106. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  107. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -1
  108. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +25 -2
  109. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -1
  110. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  111. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  112. package/dist/mcp/builtin/globals/restoreVersionTool.js +77 -0
  113. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  114. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -1
  115. package/dist/mcp/builtin/globals/updateTool.js +4 -2
  116. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  117. package/dist/mcp/builtin/validateEntityData.d.ts.map +1 -1
  118. package/dist/mcp/builtin/validateEntityData.js +1 -1
  119. package/dist/mcp/builtin/validateEntityData.js.map +1 -1
  120. package/dist/mcp/builtinTools.d.ts +73 -2
  121. package/dist/mcp/builtinTools.d.ts.map +1 -1
  122. package/dist/mcp/builtinTools.js +70 -0
  123. package/dist/mcp/builtinTools.js.map +1 -1
  124. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  125. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  126. package/dist/mcp/sanitizeMCPConfig.js +48 -17
  127. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  128. package/dist/stdio.d.ts +3 -3
  129. package/dist/stdio.d.ts.map +1 -1
  130. package/dist/stdio.js +82 -45
  131. package/dist/stdio.js.map +1 -1
  132. package/dist/types.d.ts +93 -87
  133. package/dist/types.d.ts.map +1 -1
  134. package/dist/types.js +2 -4
  135. package/dist/types.js.map +1 -1
  136. package/dist/utils/camelCase.d.ts.map +1 -1
  137. package/dist/utils/getPluginConfig.d.ts +1 -1
  138. package/dist/utils/getPluginConfig.js +1 -1
  139. package/dist/utils/getPluginConfig.js.map +1 -1
  140. package/dist/utils/resolveProjectRoot.d.ts.map +1 -1
  141. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts +28 -0
  142. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts.map +1 -0
  143. package/dist/utils/schemaConversion/filterFieldsByAccess.js +71 -0
  144. package/dist/utils/schemaConversion/filterFieldsByAccess.js.map +1 -0
  145. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +5 -3
  146. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +1 -1
  147. package/dist/utils/schemaConversion/getEntityInputSchema.js +44 -12
  148. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +1 -1
  149. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +5 -10
  150. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -1
  151. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +15 -95
  152. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -1
  153. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +15 -40
  154. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -1
  155. package/dist/utils/toStandardSchema.d.ts.map +1 -1
  156. package/package.json +11 -17
  157. package/src/defaultAccess.ts +3 -0
  158. package/src/endpoint/access.ts +80 -112
  159. package/src/endpoint/index.ts +58 -16
  160. package/src/exports/client.ts +2 -4
  161. package/src/exports/internal.ts +1 -0
  162. package/src/index.ts +5 -62
  163. package/src/mcp/buildMcpServer.ts +46 -21
  164. package/src/mcp/builtin/collections/countTool.ts +73 -0
  165. package/src/mcp/builtin/collections/countVersionsTool.ts +69 -0
  166. package/src/mcp/builtin/collections/createTool.ts +18 -6
  167. package/src/mcp/builtin/collections/deleteTool.ts +4 -2
  168. package/src/mcp/builtin/collections/duplicateTool.ts +134 -0
  169. package/src/mcp/builtin/collections/fileInput.spec.ts +93 -0
  170. package/src/mcp/builtin/collections/fileInput.ts +154 -0
  171. package/src/mcp/builtin/collections/findDistinctTool.ts +119 -0
  172. package/src/mcp/builtin/collections/findTool.ts +6 -4
  173. package/src/mcp/builtin/collections/findVersionByIDTool.ts +109 -0
  174. package/src/mcp/builtin/collections/findVersionsTool.ts +154 -0
  175. package/src/mcp/builtin/collections/formatCollectionError.ts +1 -1
  176. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +48 -3
  177. package/src/mcp/builtin/collections/restoreVersionTool.ts +107 -0
  178. package/src/mcp/builtin/collections/updateTool.ts +29 -10
  179. package/src/mcp/builtin/collections/uploadInstructionsTool.ts +64 -0
  180. package/src/mcp/builtin/getConfigInfoTool.ts +20 -4
  181. package/src/mcp/builtin/globals/countVersionsTool.ts +68 -0
  182. package/src/mcp/builtin/globals/findTool.ts +5 -2
  183. package/src/mcp/builtin/globals/findVersionByIDTool.ts +103 -0
  184. package/src/mcp/builtin/globals/findVersionsTool.ts +147 -0
  185. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +30 -2
  186. package/src/mcp/builtin/globals/restoreVersionTool.ts +99 -0
  187. package/src/mcp/builtin/globals/updateTool.ts +5 -2
  188. package/src/mcp/builtin/validateEntityData.ts +1 -1
  189. package/src/mcp/builtinTools.ts +70 -4
  190. package/src/mcp/sanitizeMCPConfig.ts +36 -19
  191. package/src/stdio.ts +77 -45
  192. package/src/types.ts +101 -91
  193. package/src/utils/getPluginConfig.ts +1 -1
  194. package/src/utils/schemaConversion/filterFieldsByAccess.ts +123 -0
  195. package/src/utils/schemaConversion/getEntityInputSchema.ts +45 -27
  196. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +12 -19
  197. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +17 -114
  198. package/dist/collection/getAccessField.d.ts +0 -12
  199. package/dist/collection/getAccessField.d.ts.map +0 -1
  200. package/dist/collection/getAccessField.js +0 -72
  201. package/dist/collection/getAccessField.js.map +0 -1
  202. package/dist/collection/index.d.ts +0 -6
  203. package/dist/collection/index.d.ts.map +0 -1
  204. package/dist/collection/index.js +0 -105
  205. package/dist/collection/index.js.map +0 -1
  206. package/dist/components/APIKeyField/index.client.d.ts +0 -9
  207. package/dist/components/APIKeyField/index.client.d.ts.map +0 -1
  208. package/dist/components/APIKeyField/index.client.js +0 -85
  209. package/dist/components/APIKeyField/index.client.js.map +0 -1
  210. package/dist/components/APIKeyField/index.css +0 -105
  211. package/dist/components/APIKeysEmptyState/index.client.d.ts +0 -4
  212. package/dist/components/APIKeysEmptyState/index.client.d.ts.map +0 -1
  213. package/dist/components/APIKeysEmptyState/index.client.js +0 -21
  214. package/dist/components/APIKeysEmptyState/index.client.js.map +0 -1
  215. package/dist/components/AccessField/index.client.d.ts +0 -10
  216. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  217. package/dist/components/AccessField/index.client.js +0 -247
  218. package/dist/components/AccessField/index.client.js.map +0 -1
  219. package/dist/components/AccessField/index.css +0 -99
  220. package/dist/components/SettingsMenu/index.client.d.ts +0 -8
  221. package/dist/components/SettingsMenu/index.client.d.ts.map +0 -1
  222. package/dist/components/SettingsMenu/index.client.js +0 -24
  223. package/dist/components/SettingsMenu/index.client.js.map +0 -1
  224. package/dist/translations/index.d.ts +0 -11
  225. package/dist/translations/index.d.ts.map +0 -1
  226. package/dist/translations/index.js +0 -92
  227. package/dist/translations/index.js.map +0 -1
  228. package/dist/translations/languages/ar.d.ts +0 -31
  229. package/dist/translations/languages/ar.d.ts.map +0 -1
  230. package/dist/translations/languages/ar.js +0 -34
  231. package/dist/translations/languages/ar.js.map +0 -1
  232. package/dist/translations/languages/az.d.ts +0 -31
  233. package/dist/translations/languages/az.d.ts.map +0 -1
  234. package/dist/translations/languages/az.js +0 -34
  235. package/dist/translations/languages/az.js.map +0 -1
  236. package/dist/translations/languages/bg.d.ts +0 -31
  237. package/dist/translations/languages/bg.d.ts.map +0 -1
  238. package/dist/translations/languages/bg.js +0 -34
  239. package/dist/translations/languages/bg.js.map +0 -1
  240. package/dist/translations/languages/bnBd.d.ts +0 -31
  241. package/dist/translations/languages/bnBd.d.ts.map +0 -1
  242. package/dist/translations/languages/bnBd.js +0 -34
  243. package/dist/translations/languages/bnBd.js.map +0 -1
  244. package/dist/translations/languages/bnIn.d.ts +0 -31
  245. package/dist/translations/languages/bnIn.d.ts.map +0 -1
  246. package/dist/translations/languages/bnIn.js +0 -34
  247. package/dist/translations/languages/bnIn.js.map +0 -1
  248. package/dist/translations/languages/ca.d.ts +0 -31
  249. package/dist/translations/languages/ca.d.ts.map +0 -1
  250. package/dist/translations/languages/ca.js +0 -34
  251. package/dist/translations/languages/ca.js.map +0 -1
  252. package/dist/translations/languages/cs.d.ts +0 -31
  253. package/dist/translations/languages/cs.d.ts.map +0 -1
  254. package/dist/translations/languages/cs.js +0 -34
  255. package/dist/translations/languages/cs.js.map +0 -1
  256. package/dist/translations/languages/da.d.ts +0 -31
  257. package/dist/translations/languages/da.d.ts.map +0 -1
  258. package/dist/translations/languages/da.js +0 -34
  259. package/dist/translations/languages/da.js.map +0 -1
  260. package/dist/translations/languages/de.d.ts +0 -31
  261. package/dist/translations/languages/de.d.ts.map +0 -1
  262. package/dist/translations/languages/de.js +0 -34
  263. package/dist/translations/languages/de.js.map +0 -1
  264. package/dist/translations/languages/en.d.ts +0 -31
  265. package/dist/translations/languages/en.d.ts.map +0 -1
  266. package/dist/translations/languages/en.js +0 -34
  267. package/dist/translations/languages/en.js.map +0 -1
  268. package/dist/translations/languages/es.d.ts +0 -31
  269. package/dist/translations/languages/es.d.ts.map +0 -1
  270. package/dist/translations/languages/es.js +0 -34
  271. package/dist/translations/languages/es.js.map +0 -1
  272. package/dist/translations/languages/et.d.ts +0 -31
  273. package/dist/translations/languages/et.d.ts.map +0 -1
  274. package/dist/translations/languages/et.js +0 -34
  275. package/dist/translations/languages/et.js.map +0 -1
  276. package/dist/translations/languages/fa.d.ts +0 -31
  277. package/dist/translations/languages/fa.d.ts.map +0 -1
  278. package/dist/translations/languages/fa.js +0 -34
  279. package/dist/translations/languages/fa.js.map +0 -1
  280. package/dist/translations/languages/fr.d.ts +0 -31
  281. package/dist/translations/languages/fr.d.ts.map +0 -1
  282. package/dist/translations/languages/fr.js +0 -34
  283. package/dist/translations/languages/fr.js.map +0 -1
  284. package/dist/translations/languages/he.d.ts +0 -31
  285. package/dist/translations/languages/he.d.ts.map +0 -1
  286. package/dist/translations/languages/he.js +0 -34
  287. package/dist/translations/languages/he.js.map +0 -1
  288. package/dist/translations/languages/hr.d.ts +0 -31
  289. package/dist/translations/languages/hr.d.ts.map +0 -1
  290. package/dist/translations/languages/hr.js +0 -34
  291. package/dist/translations/languages/hr.js.map +0 -1
  292. package/dist/translations/languages/hu.d.ts +0 -31
  293. package/dist/translations/languages/hu.d.ts.map +0 -1
  294. package/dist/translations/languages/hu.js +0 -34
  295. package/dist/translations/languages/hu.js.map +0 -1
  296. package/dist/translations/languages/hy.d.ts +0 -31
  297. package/dist/translations/languages/hy.d.ts.map +0 -1
  298. package/dist/translations/languages/hy.js +0 -34
  299. package/dist/translations/languages/hy.js.map +0 -1
  300. package/dist/translations/languages/id.d.ts +0 -31
  301. package/dist/translations/languages/id.d.ts.map +0 -1
  302. package/dist/translations/languages/id.js +0 -34
  303. package/dist/translations/languages/id.js.map +0 -1
  304. package/dist/translations/languages/is.d.ts +0 -31
  305. package/dist/translations/languages/is.d.ts.map +0 -1
  306. package/dist/translations/languages/is.js +0 -34
  307. package/dist/translations/languages/is.js.map +0 -1
  308. package/dist/translations/languages/it.d.ts +0 -31
  309. package/dist/translations/languages/it.d.ts.map +0 -1
  310. package/dist/translations/languages/it.js +0 -34
  311. package/dist/translations/languages/it.js.map +0 -1
  312. package/dist/translations/languages/ja.d.ts +0 -31
  313. package/dist/translations/languages/ja.d.ts.map +0 -1
  314. package/dist/translations/languages/ja.js +0 -34
  315. package/dist/translations/languages/ja.js.map +0 -1
  316. package/dist/translations/languages/ko.d.ts +0 -31
  317. package/dist/translations/languages/ko.d.ts.map +0 -1
  318. package/dist/translations/languages/ko.js +0 -34
  319. package/dist/translations/languages/ko.js.map +0 -1
  320. package/dist/translations/languages/lt.d.ts +0 -31
  321. package/dist/translations/languages/lt.d.ts.map +0 -1
  322. package/dist/translations/languages/lt.js +0 -34
  323. package/dist/translations/languages/lt.js.map +0 -1
  324. package/dist/translations/languages/lv.d.ts +0 -31
  325. package/dist/translations/languages/lv.d.ts.map +0 -1
  326. package/dist/translations/languages/lv.js +0 -34
  327. package/dist/translations/languages/lv.js.map +0 -1
  328. package/dist/translations/languages/my.d.ts +0 -31
  329. package/dist/translations/languages/my.d.ts.map +0 -1
  330. package/dist/translations/languages/my.js +0 -34
  331. package/dist/translations/languages/my.js.map +0 -1
  332. package/dist/translations/languages/nb.d.ts +0 -31
  333. package/dist/translations/languages/nb.d.ts.map +0 -1
  334. package/dist/translations/languages/nb.js +0 -34
  335. package/dist/translations/languages/nb.js.map +0 -1
  336. package/dist/translations/languages/nl.d.ts +0 -31
  337. package/dist/translations/languages/nl.d.ts.map +0 -1
  338. package/dist/translations/languages/nl.js +0 -34
  339. package/dist/translations/languages/nl.js.map +0 -1
  340. package/dist/translations/languages/pl.d.ts +0 -31
  341. package/dist/translations/languages/pl.d.ts.map +0 -1
  342. package/dist/translations/languages/pl.js +0 -34
  343. package/dist/translations/languages/pl.js.map +0 -1
  344. package/dist/translations/languages/pt.d.ts +0 -31
  345. package/dist/translations/languages/pt.d.ts.map +0 -1
  346. package/dist/translations/languages/pt.js +0 -34
  347. package/dist/translations/languages/pt.js.map +0 -1
  348. package/dist/translations/languages/ro.d.ts +0 -31
  349. package/dist/translations/languages/ro.d.ts.map +0 -1
  350. package/dist/translations/languages/ro.js +0 -34
  351. package/dist/translations/languages/ro.js.map +0 -1
  352. package/dist/translations/languages/rs.d.ts +0 -31
  353. package/dist/translations/languages/rs.d.ts.map +0 -1
  354. package/dist/translations/languages/rs.js +0 -34
  355. package/dist/translations/languages/rs.js.map +0 -1
  356. package/dist/translations/languages/rsLatin.d.ts +0 -31
  357. package/dist/translations/languages/rsLatin.d.ts.map +0 -1
  358. package/dist/translations/languages/rsLatin.js +0 -34
  359. package/dist/translations/languages/rsLatin.js.map +0 -1
  360. package/dist/translations/languages/ru.d.ts +0 -31
  361. package/dist/translations/languages/ru.d.ts.map +0 -1
  362. package/dist/translations/languages/ru.js +0 -34
  363. package/dist/translations/languages/ru.js.map +0 -1
  364. package/dist/translations/languages/sk.d.ts +0 -31
  365. package/dist/translations/languages/sk.d.ts.map +0 -1
  366. package/dist/translations/languages/sk.js +0 -34
  367. package/dist/translations/languages/sk.js.map +0 -1
  368. package/dist/translations/languages/sl.d.ts +0 -31
  369. package/dist/translations/languages/sl.d.ts.map +0 -1
  370. package/dist/translations/languages/sl.js +0 -34
  371. package/dist/translations/languages/sl.js.map +0 -1
  372. package/dist/translations/languages/sv.d.ts +0 -31
  373. package/dist/translations/languages/sv.d.ts.map +0 -1
  374. package/dist/translations/languages/sv.js +0 -34
  375. package/dist/translations/languages/sv.js.map +0 -1
  376. package/dist/translations/languages/ta.d.ts +0 -31
  377. package/dist/translations/languages/ta.d.ts.map +0 -1
  378. package/dist/translations/languages/ta.js +0 -34
  379. package/dist/translations/languages/ta.js.map +0 -1
  380. package/dist/translations/languages/th.d.ts +0 -31
  381. package/dist/translations/languages/th.d.ts.map +0 -1
  382. package/dist/translations/languages/th.js +0 -34
  383. package/dist/translations/languages/th.js.map +0 -1
  384. package/dist/translations/languages/tr.d.ts +0 -31
  385. package/dist/translations/languages/tr.d.ts.map +0 -1
  386. package/dist/translations/languages/tr.js +0 -34
  387. package/dist/translations/languages/tr.js.map +0 -1
  388. package/dist/translations/languages/uk.d.ts +0 -31
  389. package/dist/translations/languages/uk.d.ts.map +0 -1
  390. package/dist/translations/languages/uk.js +0 -34
  391. package/dist/translations/languages/uk.js.map +0 -1
  392. package/dist/translations/languages/vi.d.ts +0 -31
  393. package/dist/translations/languages/vi.d.ts.map +0 -1
  394. package/dist/translations/languages/vi.js +0 -34
  395. package/dist/translations/languages/vi.js.map +0 -1
  396. package/dist/translations/languages/zh.d.ts +0 -31
  397. package/dist/translations/languages/zh.d.ts.map +0 -1
  398. package/dist/translations/languages/zh.js +0 -34
  399. package/dist/translations/languages/zh.js.map +0 -1
  400. package/dist/translations/languages/zhTw.d.ts +0 -31
  401. package/dist/translations/languages/zhTw.d.ts.map +0 -1
  402. package/dist/translations/languages/zhTw.js +0 -34
  403. package/dist/translations/languages/zhTw.js.map +0 -1
  404. package/dist/translations/types.d.ts +0 -32
  405. package/dist/translations/types.d.ts.map +0 -1
  406. package/dist/translations/types.js +0 -3
  407. package/dist/translations/types.js.map +0 -1
  408. package/dist/utils/localAPIDefaults.d.ts +0 -20
  409. package/dist/utils/localAPIDefaults.d.ts.map +0 -1
  410. package/dist/utils/localAPIDefaults.js +0 -19
  411. package/dist/utils/localAPIDefaults.js.map +0 -1
  412. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  413. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  414. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  415. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  416. package/src/collection/getAccessField.ts +0 -84
  417. package/src/collection/index.ts +0 -105
  418. package/src/components/APIKeyField/index.client.tsx +0 -68
  419. package/src/components/APIKeyField/index.css +0 -105
  420. package/src/components/APIKeysEmptyState/index.client.tsx +0 -33
  421. package/src/components/AccessField/index.client.tsx +0 -296
  422. package/src/components/AccessField/index.css +0 -99
  423. package/src/components/SettingsMenu/index.client.tsx +0 -30
  424. package/src/translations/index.ts +0 -105
  425. package/src/translations/languages/ar.ts +0 -38
  426. package/src/translations/languages/az.ts +0 -38
  427. package/src/translations/languages/bg.ts +0 -39
  428. package/src/translations/languages/bnBd.ts +0 -39
  429. package/src/translations/languages/bnIn.ts +0 -39
  430. package/src/translations/languages/ca.ts +0 -39
  431. package/src/translations/languages/cs.ts +0 -39
  432. package/src/translations/languages/da.ts +0 -38
  433. package/src/translations/languages/de.ts +0 -39
  434. package/src/translations/languages/en.ts +0 -39
  435. package/src/translations/languages/es.ts +0 -39
  436. package/src/translations/languages/et.ts +0 -38
  437. package/src/translations/languages/fa.ts +0 -39
  438. package/src/translations/languages/fr.ts +0 -39
  439. package/src/translations/languages/he.ts +0 -37
  440. package/src/translations/languages/hr.ts +0 -39
  441. package/src/translations/languages/hu.ts +0 -39
  442. package/src/translations/languages/hy.ts +0 -39
  443. package/src/translations/languages/id.ts +0 -39
  444. package/src/translations/languages/is.ts +0 -39
  445. package/src/translations/languages/it.ts +0 -39
  446. package/src/translations/languages/ja.ts +0 -39
  447. package/src/translations/languages/ko.ts +0 -39
  448. package/src/translations/languages/lt.ts +0 -39
  449. package/src/translations/languages/lv.ts +0 -38
  450. package/src/translations/languages/my.ts +0 -39
  451. package/src/translations/languages/nb.ts +0 -39
  452. package/src/translations/languages/nl.ts +0 -39
  453. package/src/translations/languages/pl.ts +0 -38
  454. package/src/translations/languages/pt.ts +0 -39
  455. package/src/translations/languages/ro.ts +0 -39
  456. package/src/translations/languages/rs.ts +0 -38
  457. package/src/translations/languages/rsLatin.ts +0 -38
  458. package/src/translations/languages/ru.ts +0 -39
  459. package/src/translations/languages/sk.ts +0 -39
  460. package/src/translations/languages/sl.ts +0 -38
  461. package/src/translations/languages/sv.ts +0 -39
  462. package/src/translations/languages/ta.ts +0 -39
  463. package/src/translations/languages/th.ts +0 -38
  464. package/src/translations/languages/tr.ts +0 -38
  465. package/src/translations/languages/uk.ts +0 -39
  466. package/src/translations/languages/vi.ts +0 -39
  467. package/src/translations/languages/zh.ts +0 -36
  468. package/src/translations/languages/zhTw.ts +0 -36
  469. package/src/translations/types.ts +0 -34
  470. package/src/utils/localAPIDefaults.ts +0 -22
  471. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
package/src/types.ts CHANGED
@@ -10,15 +10,14 @@ import type {
10
10
  } from '@modelcontextprotocol/server'
11
11
  import type {
12
12
  AuthCollectionSlug,
13
- CollectionConfig,
14
13
  CollectionSlug,
15
- DefaultDocumentIDType,
16
14
  GlobalSlug,
17
15
  MaybePromise,
18
16
  PayloadRequest,
19
- TypedUser,
17
+ SanitizedPermissions,
20
18
  } from 'payload'
21
19
 
20
+ import type { GetAuthorizedMCPArgs } from './endpoint/access.js'
22
21
  import type {
23
22
  MCPCollectionAuthToolName,
24
23
  MCPCollectionBuiltinName,
@@ -32,31 +31,11 @@ export type { JsonSchemaType, StandardSchemaWithJSON, ToolAnnotations }
32
31
 
33
32
  /**
34
33
  * What a tool's `input` (or a prompt's `argsSchema`) can be — either a raw
35
- * JSON Schema literal, or a Standard Schema instance (Zod, Valibot, …).
34
+ * JSON Schema 2020-12 literal, or a Standard Schema instance (Zod, Valibot, …).
35
+ * Raw schemas may omit `$schema`; when present it must declare the 2020-12 dialect.
36
36
  */
37
37
  export type ToolInputSchema = JsonSchemaType | StandardSchemaWithJSON
38
38
 
39
- /**
40
- * Serializable mirror of `SanitizedMCPPluginConfig` for client components —
41
- * the full sanitized config carries functions (tool handlers, etc.) that can't
42
- * cross the server→client boundary. Built by `sanitizeClientPluginConfig` and
43
- * passed to the `AccessField` component via `clientProps`.
44
- *
45
- * @internal
46
- */
47
- export type ClientMCPPluginConfig = {
48
- items: Array<{
49
- collectionSlug?: string
50
- configKey: string
51
- description?: string
52
- globalSlug?: string
53
- /** Admin-UI bucket for collection/global tools: built-in CRUD, auth, or custom. */
54
- group?: 'auth' | 'custom' | 'operations'
55
- label: string
56
- type: 'collectionTool' | 'globalTool' | 'prompt' | 'resource' | 'tool'
57
- }>
58
- }
59
-
60
39
  export type MCPToolResponse = {
61
40
  content: ContentBlock[]
62
41
  /**
@@ -73,6 +52,13 @@ export type MCPResponseOverride = (
73
52
  req: PayloadRequest,
74
53
  ) => MCPToolResponse
75
54
 
55
+ export type MCPAfterToolCallHook = (args: {
56
+ input: unknown
57
+ req: PayloadRequest
58
+ response: MCPToolResponse
59
+ toolName: string
60
+ }) => MaybePromise<MCPToolResponse>
61
+
76
62
  /**
77
63
  * The handler's `input` type. A specific Standard Schema (Zod, Valibot, …) gets
78
64
  * its inferred output; anything else falls back to `Record<string, unknown>`.
@@ -83,6 +69,19 @@ export type TypedInput<TSchema> = TSchema extends StandardSchemaWithJSON
83
69
  : StandardSchemaWithJSON.InferOutput<TSchema>
84
70
  : Record<string, unknown>
85
71
 
72
+ export type MCPAccessArgs = {
73
+ permissions?: SanitizedPermissions
74
+ req: PayloadRequest
75
+ }
76
+
77
+ export type CollectionMCPAccessArgs = {
78
+ collectionSlug: CollectionSlug
79
+ } & MCPAccessArgs
80
+
81
+ export type GlobalMCPAccessArgs = {
82
+ globalSlug: GlobalSlug
83
+ } & MCPAccessArgs
84
+
86
85
  export type ToolHandlerArgs<TSchema = undefined> = {
87
86
  authorizedMCP: AuthorizedMCP
88
87
  input: TypedInput<TSchema>
@@ -99,6 +98,12 @@ export type GlobalToolHandlerArgs<TSchema = undefined> = {
99
98
  } & ToolHandlerArgs<TSchema>
100
99
 
101
100
  export type Tool<TSchema extends ToolInputSchema | undefined = ToolInputSchema | undefined> = {
101
+ /**
102
+ * Runs while authorizing each MCP request, before the tool is advertised or called. Return
103
+ * `false` to make the tool unavailable for that request. This is skipped when `overrideAccess`
104
+ * is enabled.
105
+ */
106
+ access?: (args: MCPAccessArgs) => MaybePromise<boolean>
102
107
  annotations?: ToolAnnotations
103
108
  description: string
104
109
  handler: (args: ToolHandlerArgs<TSchema>) => MaybePromise<MCPToolResponse>
@@ -112,12 +117,26 @@ export type Tool<TSchema extends ToolInputSchema | undefined = ToolInputSchema |
112
117
  export type CollectionTool<
113
118
  TSchema extends ToolInputSchema | undefined = ToolInputSchema | undefined,
114
119
  > = {
120
+ /**
121
+ * Runs while authorizing each MCP request for this collection. Return `false` to reject calls
122
+ * to this tool for the collection. The shared tool is not advertised when no collections allow
123
+ * it, but can remain advertised when it is available for another collection. This is skipped
124
+ * when `overrideAccess` is enabled.
125
+ */
126
+ access?: (args: CollectionMCPAccessArgs) => MaybePromise<boolean>
115
127
  handler: (args: CollectionToolHandlerArgs<TSchema>) => MaybePromise<MCPToolResponse>
116
128
  input?: TSchema
117
129
  } & Pick<Tool, 'annotations' | 'description' | 'overrideResponse'>
118
130
 
119
131
  export type GlobalTool<TSchema extends ToolInputSchema | undefined = ToolInputSchema | undefined> =
120
132
  {
133
+ /**
134
+ * Runs while authorizing each MCP request for this global. Return `false` to reject calls to
135
+ * this tool for the global. The shared tool is not advertised when no globals allow it, but
136
+ * can remain advertised when it is available for another global. This is skipped when
137
+ * `overrideAccess` is enabled.
138
+ */
139
+ access?: (args: GlobalMCPAccessArgs) => MaybePromise<boolean>
121
140
  handler: (args: GlobalToolHandlerArgs<TSchema>) => MaybePromise<MCPToolResponse>
122
141
  input?: TSchema
123
142
  } & Pick<Tool, 'annotations' | 'description' | 'overrideResponse'>
@@ -127,7 +146,24 @@ export type GlobalTool<TSchema extends ToolInputSchema | undefined = ToolInputSc
127
146
  * `handler?: never` prevents a full `CollectionTool`/`GlobalTool` (which has a
128
147
  * required handler) from being silently accepted at a built-in key slot.
129
148
  */
130
- export type MCPBuiltInToolOverride = {
149
+ export type MCPBuiltInCollectionToolOverride = {
150
+ /**
151
+ * Replaces the built-in tool's access check. Return `false` to make the tool unavailable for
152
+ * this collection. This is skipped when `overrideAccess` is enabled.
153
+ */
154
+ access?: (args: CollectionMCPAccessArgs) => MaybePromise<boolean>
155
+ annotations?: ToolAnnotations
156
+ description?: string
157
+ handler?: never
158
+ overrideResponse?: MCPResponseOverride
159
+ }
160
+
161
+ export type MCPBuiltInGlobalToolOverride = {
162
+ /**
163
+ * Replaces the built-in tool's access check. Return `false` to make the tool unavailable for
164
+ * this global. This is skipped when `overrideAccess` is enabled.
165
+ */
166
+ access?: (args: GlobalMCPAccessArgs) => MaybePromise<boolean>
131
167
  annotations?: ToolAnnotations
132
168
  description?: string
133
169
  handler?: never
@@ -142,13 +178,13 @@ export type MCPBuiltInToolOverride = {
142
178
  export type MCPTopLevelToolEntry = Tool
143
179
 
144
180
  export type MCPCollectionToolsMap = {
145
- [customToolName: string]: boolean | CollectionTool | MCPBuiltInToolOverride | undefined
181
+ [customToolName: string]: boolean | CollectionTool | MCPBuiltInCollectionToolOverride | undefined
146
182
  } & {
147
- [K in MCPCollectionBuiltinName]?: false | MCPBuiltInToolOverride
183
+ [K in MCPCollectionBuiltinName]?: false | MCPBuiltInCollectionToolOverride
148
184
  }
149
185
 
150
186
  export type MCPAuthCollectionToolsMap = {
151
- [K in MCPCollectionAuthToolName]?: MCPBuiltInToolOverride | true
187
+ [K in MCPCollectionAuthToolName]?: MCPBuiltInCollectionToolOverride | true
152
188
  } & MCPCollectionToolsMap
153
189
 
154
190
  /** Auth-enabled collections get auth-tool name autocomplete; others get CRUD-only. */
@@ -157,9 +193,9 @@ export type MCPToolsMapForCollection<Slug extends CollectionSlug> = Slug extends
157
193
  : MCPCollectionToolsMap
158
194
 
159
195
  export type MCPGlobalToolsMap = {
160
- [customToolName: string]: boolean | GlobalTool | MCPBuiltInToolOverride | undefined
196
+ [customToolName: string]: boolean | GlobalTool | MCPBuiltInGlobalToolOverride | undefined
161
197
  } & {
162
- [K in MCPGlobalBuiltinName]?: false | MCPBuiltInToolOverride
198
+ [K in MCPGlobalBuiltinName]?: false | MCPBuiltInGlobalToolOverride
163
199
  }
164
200
 
165
201
  export type MCPTopLevelToolsMap = Record<string, Tool>
@@ -171,6 +207,12 @@ export type PromptHandlerArgs<TSchema = undefined> = {
171
207
  }
172
208
 
173
209
  export type Prompt<TSchema extends ToolInputSchema = ToolInputSchema> = {
210
+ /**
211
+ * Runs while authorizing each MCP request, before the prompt is advertised or used. Return
212
+ * `false` to make the prompt unavailable for that request. This is skipped when
213
+ * `overrideAccess` is enabled.
214
+ */
215
+ access?: (args: MCPAccessArgs) => MaybePromise<boolean>
174
216
  argsSchema: TSchema
175
217
  description: string
176
218
  handler: (args: PromptHandlerArgs<TSchema>) => MaybePromise<{
@@ -188,6 +230,12 @@ export type ResourceHandlerArgs = {
188
230
  }
189
231
 
190
232
  export type Resource = {
233
+ /**
234
+ * Runs while authorizing each MCP request, before the resource is advertised or read. Return
235
+ * `false` to make the resource unavailable for that request. This is skipped when
236
+ * `overrideAccess` is enabled.
237
+ */
238
+ access?: (args: MCPAccessArgs) => MaybePromise<boolean>
191
239
  description: string
192
240
  handler: (args: ResourceHandlerArgs) => MaybePromise<{
193
241
  contents: Array<{ text: string; uri: string }>
@@ -221,34 +269,39 @@ export type MCPPluginConfig = {
221
269
  collections?: {
222
270
  [Slug in CollectionSlug]?: MCPPluginCollectionConfig<Slug>
223
271
  }
224
- /** Skip MCP registration. The API key collection is still added (so DB / types stay stable). */
272
+ /** Skip MCP endpoint registration. */
225
273
  disabled?: boolean
226
274
  globals?: {
227
275
  [Slug in GlobalSlug]?: MCPPluginGlobalConfig
228
276
  }
277
+ hooks?: {
278
+ /** Transform a tool response after its handler returns */
279
+ afterToolCall?: MCPAfterToolCallHook[]
280
+ }
229
281
  mcp?: {
230
282
  serverOptions?: MCPServerOptions
231
283
  verboseLogs?: boolean
232
284
  }
233
- overrideApiKeyCollection?: (collection: CollectionConfig) => CollectionConfig
234
- /** Replace the default API-key auth with a custom resolver. */
235
- overrideAuth?: (args: {
236
- getAPIKeyDoc: (overrideApiKey?: string) => Promise<MCPAPIKeysDoc>
237
- getAuthorizedMCP: (args: { apiKeyDoc: MCPAPIKeysDoc }) => AuthorizedMCP
238
- pluginConfig: SanitizedMCPPluginConfig
239
- req: PayloadRequest
240
- }) => MaybePromise<AuthorizedMCP>
285
+ /**
286
+ * Replace the default MCP authorization resolver.
287
+ *
288
+ * This hook replaces the default authentication flow. It must set `req.user` to the
289
+ * authenticated Payload user, or to `null` for an anonymous caller, before returning.
290
+ */
291
+ overrideGetAuthorizedMCP?: (
292
+ args: {
293
+ pluginConfig: SanitizedMCPPluginConfig
294
+ } & GetAuthorizedMCPArgs,
295
+ ) => MaybePromise<AuthorizedMCP>
241
296
  prompts?: Record<string, Prompt>
242
297
  resources?: Record<string, Resource>
243
298
  /** Cross-cutting tools (not scoped to any collection or global). */
244
299
  tools?: MCPTopLevelToolsMap
245
- userCollection?: CollectionSlug
246
300
  }
247
301
 
248
302
  export type SanitizedMCPPluginConfig = {
249
303
  items: MCPItem[]
250
- userCollection: CollectionSlug
251
- } & Pick<MCPPluginConfig, 'disabled' | 'mcp' | 'overrideApiKeyCollection' | 'overrideAuth'>
304
+ } & Pick<MCPPluginConfig, 'disabled' | 'hooks' | 'mcp' | 'overrideGetAuthorizedMCP'>
252
305
 
253
306
  export type MCPServerOptions = {
254
307
  options?: ConstructorParameters<typeof McpServer>[1]
@@ -256,52 +309,12 @@ export type MCPServerOptions = {
256
309
  }
257
310
 
258
311
  /**
259
- * Nested access tree as stored in the collection.
260
- * A `false` leaf disables that tool; missing keys defer to
261
- * defaults (built-in CRUD is on, opt-in tools are off).
262
- */
263
- export type MCPAPIKeysDocAccessTree = {
264
- collections?: {
265
- [CollectionSlug: CollectionSlug]: {
266
- [ToolKey: string]: boolean
267
- }
268
- }
269
- globals?: {
270
- [GlobalSlug: GlobalSlug]: {
271
- [ToolKey: string]: boolean
272
- }
273
- }
274
- prompts?: {
275
- [PromptKey: string]: boolean
276
- }
277
- resources?: {
278
- [ResourceKey: string]: boolean
279
- }
280
- tools?: {
281
- [ToolKey: string]: boolean
282
- }
283
- }
284
-
285
- /**
286
- * Stored on `payload-mcp-api-keys` docs
287
- */
288
- export type MCPAPIKeysDoc = {
289
- access: MCPAPIKeysDocAccessTree
290
- apiKey?: string
291
- apiKeyIndex?: string
292
- id: DefaultDocumentIDType
293
- lastUsed?: string
294
- overrideAccess?: boolean
295
- user: null | TypedUser
296
- }
297
-
298
- /**
299
- * One MCP primitive plus the metadata needed for access checks, admin UI, and
312
+ * One MCP primitive plus the metadata needed for config-driven filtering and
300
313
  * registration.
301
314
  *
302
- * - `configKey`: the config/API-key identifier, e.g. `find` or `echo`.
315
+ * - `configKey`: the config identifier, e.g. `find` or `echo`.
303
316
  * - `mcpName`: the MCP wire name, e.g. `findDocuments` or `echo`.
304
- * - `label`: human-readable admin checkbox text.
317
+ * - `label`: human-readable display text.
305
318
  */
306
319
  export type MCPItemBase = {
307
320
  configKey: string
@@ -338,13 +351,10 @@ export type MCPItem =
338
351
  | GlobalMCPItem
339
352
 
340
353
  /**
341
- * The caller's identity + the MCP items they can use for this request. Returned
342
- * by `getAuthorizedMCP`; denied items are simply absent from `items`. Handlers
343
- * receive this via `args.authorizedMCP` so they can spread
344
- * `localAPIDefaults(authorizedMCP)` into every local API call.
354
+ * The MCP items and access mode authorized for this request. The authenticated user is available
355
+ * as `req.user`.
345
356
  */
346
357
  export type AuthorizedMCP = {
347
358
  items: MCPItem[]
348
359
  overrideAccess: boolean
349
- user: null | TypedUser
350
360
  }
@@ -5,7 +5,7 @@ import type { SanitizedMCPPluginConfig } from '../types.js'
5
5
  /**
6
6
  * Returns the sanitized plugin config — the form produced by
7
7
  * `sanitizeMCPConfig` and stashed back on the plugin's `options` during init.
8
- * Callers downstream of plugin init can rely on `items`, `userCollection`, etc.
8
+ * Callers downstream of plugin init can rely on `items` and other defaults
9
9
  * being fully resolved.
10
10
  */
11
11
  export const getPluginConfig: (args: { config: SanitizedConfig }) => SanitizedMCPPluginConfig = ({
@@ -0,0 +1,123 @@
1
+ import type {
2
+ FlattenedBlock,
3
+ FlattenedField,
4
+ Operation,
5
+ SanitizedDocumentPermissions,
6
+ SanitizedFieldsPermissions,
7
+ } from 'payload'
8
+
9
+ type FieldOperation = Exclude<Operation, 'delete'>
10
+ type AllowedFieldOperations = Record<FieldOperation, boolean>
11
+
12
+ /**
13
+ * Filters fields using the access results in `permissions`. `shouldExcludeField` receives the
14
+ * operations allowed by the entity, field, and its parents and decides whether to remove the
15
+ * field.
16
+ *
17
+ * Arrays, groups, named tabs, and blocks are filtered recursively. Rows and unnamed tabs are
18
+ * flattened by Payload, so their children are filtered at the containing level.
19
+ *
20
+ * @example Include fields writable through any collection operation the user can perform.
21
+ * ```ts
22
+ * filterFieldsByAccess({
23
+ * fields,
24
+ * permissions: collectionPermissions,
25
+ * shouldExcludeField: ({ create, update }) => !create && !update,
26
+ * })
27
+ * ```
28
+ */
29
+ export const filterFieldsByAccess = ({
30
+ blocks,
31
+ fields,
32
+ permissions,
33
+ shouldExcludeField,
34
+ }: {
35
+ blocks?: FlattenedBlock[]
36
+ fields: FlattenedField[]
37
+ permissions: SanitizedDocumentPermissions
38
+ shouldExcludeField: (allowedOperations: AllowedFieldOperations) => boolean
39
+ }): FlattenedField[] => {
40
+ const filterFields = (
41
+ nestedFields: FlattenedField[],
42
+ nestedPermissions: SanitizedFieldsPermissions | undefined,
43
+ parentAllowedOperations: AllowedFieldOperations,
44
+ ): FlattenedField[] => {
45
+ const accessibleFields: FlattenedField[] = []
46
+
47
+ for (const field of nestedFields) {
48
+ const fieldPermissions = nestedPermissions === true ? true : nestedPermissions?.[field.name]
49
+ const isOperationAllowed = (operation: FieldOperation): boolean =>
50
+ parentAllowedOperations[operation] &&
51
+ (fieldPermissions === true || fieldPermissions?.[operation] === true)
52
+ const allowedOperations: AllowedFieldOperations = {
53
+ create: isOperationAllowed('create'),
54
+ read: isOperationAllowed('read'),
55
+ update: isOperationAllowed('update'),
56
+ }
57
+
58
+ if (shouldExcludeField(allowedOperations)) {
59
+ continue
60
+ }
61
+
62
+ if (field.type === 'blocks') {
63
+ const accessibleBlocks: (FlattenedBlock | string)[] = []
64
+
65
+ for (const blockOrReference of field.blocks) {
66
+ const block =
67
+ typeof blockOrReference === 'string'
68
+ ? blocks?.find(({ slug }) => slug === blockOrReference)
69
+ : blockOrReference
70
+
71
+ if (!block) {
72
+ continue
73
+ }
74
+
75
+ const blockPermissions =
76
+ fieldPermissions === true
77
+ ? true
78
+ : fieldPermissions?.blocks === true
79
+ ? true
80
+ : fieldPermissions?.blocks?.[block.slug]
81
+
82
+ accessibleBlocks.push({
83
+ ...block,
84
+ flattenedFields: filterFields(
85
+ block.flattenedFields,
86
+ blockPermissions === true ? true : blockPermissions?.fields,
87
+ allowedOperations,
88
+ ),
89
+ })
90
+ }
91
+
92
+ if (accessibleBlocks.length === 0) {
93
+ continue
94
+ }
95
+
96
+ accessibleFields.push({ ...field, blocks: accessibleBlocks })
97
+ continue
98
+ }
99
+
100
+ if (field.type === 'array' || field.type === 'group' || field.type === 'tab') {
101
+ accessibleFields.push({
102
+ ...field,
103
+ flattenedFields: filterFields(
104
+ field.flattenedFields,
105
+ fieldPermissions === true ? true : fieldPermissions?.fields,
106
+ allowedOperations,
107
+ ),
108
+ })
109
+ continue
110
+ }
111
+
112
+ accessibleFields.push(field)
113
+ }
114
+
115
+ return accessibleFields
116
+ }
117
+
118
+ return filterFields(fields, permissions.fields, {
119
+ create: 'create' in permissions && permissions.create === true,
120
+ read: permissions.read === true,
121
+ update: permissions.update === true,
122
+ })
123
+ }
@@ -1,26 +1,27 @@
1
1
  import {
2
2
  type CollectionSlug,
3
3
  entityToStandaloneJSONSchema,
4
+ type FlattenedField,
4
5
  type GlobalSlug,
5
6
  type PayloadRequest,
6
7
  type SanitizedCollectionConfig,
8
+ type SanitizedCollectionPermission,
7
9
  type SanitizedGlobalConfig,
10
+ type SanitizedGlobalPermission,
8
11
  } from 'payload'
9
12
 
10
13
  import type { JsonSchemaType } from '../../types.js'
11
14
 
12
- import {
13
- getCollectionVirtualFieldNames,
14
- getGlobalVirtualFieldNames,
15
- } from '../getVirtualFieldNames.js'
16
- import { removeVirtualFieldsFromSchema } from './removeVirtualFieldsFromSchema.js'
15
+ import { filterFieldsByAccess } from './filterFieldsByAccess.js'
17
16
  import { sanitizeEntitySchema } from './sanitizeEntitySchema.js'
18
17
 
19
18
  export const getCollectionInputSchema = ({
20
19
  collectionSlug,
20
+ permissions,
21
21
  req,
22
22
  }: {
23
23
  collectionSlug: CollectionSlug
24
+ permissions?: SanitizedCollectionPermission
24
25
  req: PayloadRequest
25
26
  }): JsonSchemaType | null => {
26
27
  const collection = req.payload.collections[collectionSlug]?.config
@@ -29,18 +30,27 @@ export const getCollectionInputSchema = ({
29
30
  return null
30
31
  }
31
32
 
32
- return buildEntityInputSchema({
33
- entity: collection,
34
- req,
35
- virtualFieldNames: getCollectionVirtualFieldNames(req.payload.config, collectionSlug),
33
+ if (!permissions) {
34
+ return buildEntityInputSchema({ entity: collection, req })
35
+ }
36
+
37
+ const fieldsAllowedByAccess = filterFieldsByAccess({
38
+ blocks: req.payload.config.blocks,
39
+ fields: collection.flattenedFields,
40
+ permissions,
41
+ shouldExcludeField: ({ create, update }) => !create && !update,
36
42
  })
43
+
44
+ return buildEntityInputSchema({ entity: collection, fields: fieldsAllowedByAccess, req })
37
45
  }
38
46
 
39
47
  export const getGlobalInputSchema = ({
40
48
  globalSlug,
49
+ permissions,
41
50
  req,
42
51
  }: {
43
52
  globalSlug: GlobalSlug
53
+ permissions?: SanitizedGlobalPermission
44
54
  req: PayloadRequest
45
55
  }): JsonSchemaType | null => {
46
56
  const global = req.payload.config.globals.find((globalConfig) => globalConfig.slug === globalSlug)
@@ -49,30 +59,38 @@ export const getGlobalInputSchema = ({
49
59
  return null
50
60
  }
51
61
 
52
- return buildEntityInputSchema({
53
- entity: global,
54
- req,
55
- virtualFieldNames: getGlobalVirtualFieldNames(req.payload.config, globalSlug),
62
+ if (!permissions) {
63
+ return buildEntityInputSchema({ entity: global, req })
64
+ }
65
+
66
+ const fieldsAllowedByAccess = filterFieldsByAccess({
67
+ blocks: req.payload.config.blocks,
68
+ fields: global.flattenedFields,
69
+ permissions,
70
+ shouldExcludeField: ({ create, update }) => !create && !update,
56
71
  })
72
+
73
+ return buildEntityInputSchema({ entity: global, fields: fieldsAllowedByAccess, req })
57
74
  }
58
75
 
59
76
  const buildEntityInputSchema = ({
60
77
  entity,
78
+ fields = entity.flattenedFields,
61
79
  req,
62
- virtualFieldNames,
63
80
  }: {
64
81
  entity: SanitizedCollectionConfig | SanitizedGlobalConfig
82
+ fields?: FlattenedField[]
65
83
  req: PayloadRequest
66
- virtualFieldNames: string[]
67
- }): JsonSchemaType =>
68
- sanitizeEntitySchema(
69
- removeVirtualFieldsFromSchema(
70
- entityToStandaloneJSONSchema({
71
- config: req.payload.config,
72
- defaultIDType: req.payload.db.defaultIDType,
73
- entity,
74
- i18n: req.i18n,
75
- }) as unknown as JsonSchemaType,
76
- virtualFieldNames,
77
- ),
78
- )
84
+ }): JsonSchemaType => {
85
+ // The core schema generator reads flattenedFields from the entity and has no fields argument.
86
+ const entityForSchema = { ...entity, flattenedFields: fields }
87
+ const schema = entityToStandaloneJSONSchema({
88
+ config: req.payload.config,
89
+ defaultIDType: req.payload.db.defaultIDType,
90
+ entity: entityForSchema,
91
+ i18n: req.i18n,
92
+ variant: 'input',
93
+ }) as unknown as JsonSchemaType
94
+
95
+ return sanitizeEntitySchema(schema)
96
+ }
@@ -5,10 +5,11 @@ import type { JsonSchemaType } from '../../types.js'
5
5
  import { sanitizeEntitySchema } from './sanitizeEntitySchema.js'
6
6
 
7
7
  describe('sanitizeEntitySchema', () => {
8
- it('keeps a Lexical node union strict (oneOf) while simplifying relationship values to IDs', () => {
9
- // Shaped like the schema the MCP server prepares for a collection with a Lexical richText field:
10
- // a `$defs` node union (a `oneOf` of node shapes) where a relationship node's `value` is either
11
- // an ID or a `$ref` to the populated related collection.
8
+ it('renames the Lexical node-union definition to a short name and keeps it a strict oneOf', () => {
9
+ // Shaped like the schema the MCP server prepares for a collection with a Lexical richText field
10
+ // (Payload's `input` variant): a `$defs` node union (a `oneOf` of node shapes). The input variant
11
+ // already types the relationship node's `value` as a bare ID - there is no populated-doc `$ref` to
12
+ // reduce here (the variant did that upstream), so sanitize leaves the value untouched.
12
13
  const standalone: JsonSchemaType = {
13
14
  type: 'object',
14
15
  $defs: {
@@ -25,17 +26,12 @@ describe('sanitizeEntitySchema', () => {
25
26
  additionalProperties: false,
26
27
  properties: {
27
28
  type: { const: 'relationship' },
28
- value: { oneOf: [{ type: 'string' }, { $ref: '#/$defs/posts' }] },
29
+ value: { type: 'string', description: 'The related document ID.' },
29
30
  },
30
31
  required: ['type'],
31
32
  },
32
33
  ],
33
34
  },
34
- posts: {
35
- type: 'object',
36
- additionalProperties: false,
37
- properties: { id: { type: 'string' }, title: { type: 'string' } },
38
- },
39
35
  },
40
36
  properties: {
41
37
  id: { type: 'string' },
@@ -57,7 +53,7 @@ describe('sanitizeEntitySchema', () => {
57
53
  type: 'object',
58
54
  $defs: {
59
55
  // The node union is renamed to a short, readable `node`, and stays a strict discriminated
60
- // `oneOf` - not loosened to `anyOf`...
56
+ // `oneOf` - not loosened to `anyOf`.
61
57
  node: {
62
58
  oneOf: [
63
59
  {
@@ -71,21 +67,18 @@ describe('sanitizeEntitySchema', () => {
71
67
  additionalProperties: false,
72
68
  properties: {
73
69
  type: { const: 'relationship' },
74
- // ...while the relationship `value` is simplified to a bare ID (the populated-doc `$ref` is dropped).
75
- value: { type: 'string', description: 'The ID of the related "posts" document.' },
70
+ // The value is already ID-only from the input variant - left as-is.
71
+ value: { type: 'string', description: 'The related document ID.' },
76
72
  },
77
73
  required: ['type'],
78
74
  },
79
75
  ],
80
76
  },
81
- posts: {
82
- type: 'object',
83
- additionalProperties: false,
84
- properties: { id: { type: 'string' }, title: { type: 'string' } },
85
- },
86
77
  },
87
78
  properties: {
88
- // `id` is dropped - it's a Payload-managed field MCP clients never set.
79
+ // Managed timestamps are excluded upstream by the `input` variant. `id` stays because it's
80
+ // a valid optional input (a client may supply a custom ID).
81
+ id: { type: 'string' },
89
82
  content: {
90
83
  type: 'object',
91
84
  properties: {