@payloadcms/plugin-mcp 4.0.0-internal.688c4d0 → 4.0.0-internal.697830c

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 (457) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/defaultAccess.d.ts +3 -0
  3. package/dist/defaultAccess.d.ts.map +1 -0
  4. package/dist/defaultAccess.js +3 -0
  5. package/dist/defaultAccess.js.map +1 -0
  6. package/dist/endpoint/access.d.ts +12 -5
  7. package/dist/endpoint/access.d.ts.map +1 -1
  8. package/dist/endpoint/access.js +74 -103
  9. package/dist/endpoint/access.js.map +1 -1
  10. package/dist/endpoint/index.d.ts +1 -1
  11. package/dist/endpoint/index.d.ts.map +1 -1
  12. package/dist/endpoint/index.js +68 -17
  13. package/dist/endpoint/index.js.map +1 -1
  14. package/dist/exports/client.d.ts +1 -4
  15. package/dist/exports/client.d.ts.map +1 -1
  16. package/dist/exports/client.js +1 -4
  17. package/dist/exports/client.js.map +1 -1
  18. package/dist/exports/internal.d.ts +2 -0
  19. package/dist/exports/internal.d.ts.map +1 -0
  20. package/dist/exports/internal.js +3 -0
  21. package/dist/exports/internal.js.map +1 -0
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +3 -51
  25. package/dist/index.js.map +1 -1
  26. package/dist/mcp/buildMcpServer.d.ts +4 -4
  27. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  28. package/dist/mcp/buildMcpServer.js +34 -10
  29. package/dist/mcp/buildMcpServer.js.map +1 -1
  30. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -1
  31. package/dist/mcp/builtin/collections/authTools.js +44 -6
  32. package/dist/mcp/builtin/collections/authTools.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 +13 -21
  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 +10 -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/findDistinctTool.d.ts +2 -0
  52. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  53. package/dist/mcp/builtin/collections/findDistinctTool.js +92 -0
  54. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  55. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  56. package/dist/mcp/builtin/collections/findTool.js +45 -25
  57. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  58. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  59. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  60. package/dist/mcp/builtin/collections/findVersionByIDTool.js +83 -0
  61. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  62. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  63. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  64. package/dist/mcp/builtin/collections/findVersionsTool.js +98 -0
  65. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  66. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +1 -1
  67. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -1
  68. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -1
  69. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -1
  70. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +32 -2
  71. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -1
  72. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  73. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  74. package/dist/mcp/builtin/collections/restoreVersionTool.js +81 -0
  75. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  76. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  77. package/dist/mcp/builtin/collections/updateTool.js +16 -24
  78. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  79. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -1
  80. package/dist/mcp/builtin/getConfigInfoTool.js +27 -8
  81. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -1
  82. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  83. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  84. package/dist/mcp/builtin/globals/countVersionsTool.js +64 -0
  85. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  86. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  87. package/dist/mcp/builtin/globals/findTool.js +19 -22
  88. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  89. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  90. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  91. package/dist/mcp/builtin/globals/findVersionByIDTool.js +79 -0
  92. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  93. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  94. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  95. package/dist/mcp/builtin/globals/findVersionsTool.js +94 -0
  96. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  97. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -1
  98. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +32 -2
  99. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -1
  100. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  101. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  102. package/dist/mcp/builtin/globals/restoreVersionTool.js +77 -0
  103. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  104. package/dist/mcp/builtin/globals/updateTool.js +14 -21
  105. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  106. package/dist/mcp/builtin/validateEntityData.js +1 -1
  107. package/dist/mcp/builtin/validateEntityData.js.map +1 -1
  108. package/dist/mcp/builtinTools.d.ts +69 -12
  109. package/dist/mcp/builtinTools.d.ts.map +1 -1
  110. package/dist/mcp/builtinTools.js +66 -10
  111. package/dist/mcp/builtinTools.js.map +1 -1
  112. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  113. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  114. package/dist/mcp/sanitizeMCPConfig.js +69 -27
  115. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  116. package/dist/stdio.d.ts +3 -3
  117. package/dist/stdio.d.ts.map +1 -1
  118. package/dist/stdio.js +82 -45
  119. package/dist/stdio.js.map +1 -1
  120. package/dist/types.d.ts +100 -92
  121. package/dist/types.d.ts.map +1 -1
  122. package/dist/types.js +2 -4
  123. package/dist/types.js.map +1 -1
  124. package/dist/utils/getPluginConfig.d.ts +1 -1
  125. package/dist/utils/getPluginConfig.js +1 -1
  126. package/dist/utils/getPluginConfig.js.map +1 -1
  127. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts +28 -0
  128. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts.map +1 -0
  129. package/dist/utils/schemaConversion/filterFieldsByAccess.js +71 -0
  130. package/dist/utils/schemaConversion/filterFieldsByAccess.js.map +1 -0
  131. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +5 -3
  132. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +1 -1
  133. package/dist/utils/schemaConversion/getEntityInputSchema.js +44 -12
  134. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +1 -1
  135. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +5 -10
  136. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -1
  137. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +15 -95
  138. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -1
  139. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +15 -40
  140. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -1
  141. package/package.json +10 -16
  142. package/src/defaultAccess.ts +3 -0
  143. package/src/endpoint/access.ts +80 -112
  144. package/src/endpoint/index.ts +58 -16
  145. package/src/exports/client.ts +2 -4
  146. package/src/exports/internal.ts +1 -0
  147. package/src/index.ts +5 -59
  148. package/src/mcp/buildMcpServer.ts +48 -21
  149. package/src/mcp/builtin/collections/authTools.ts +45 -9
  150. package/src/mcp/builtin/collections/countTool.ts +73 -0
  151. package/src/mcp/builtin/collections/countVersionsTool.ts +69 -0
  152. package/src/mcp/builtin/collections/createTool.ts +14 -15
  153. package/src/mcp/builtin/collections/deleteTool.ts +11 -2
  154. package/src/mcp/builtin/collections/duplicateTool.ts +134 -0
  155. package/src/mcp/builtin/collections/findDistinctTool.ts +119 -0
  156. package/src/mcp/builtin/collections/findTool.ts +58 -19
  157. package/src/mcp/builtin/collections/findVersionByIDTool.ts +109 -0
  158. package/src/mcp/builtin/collections/findVersionsTool.ts +154 -0
  159. package/src/mcp/builtin/collections/formatCollectionError.ts +1 -1
  160. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +37 -2
  161. package/src/mcp/builtin/collections/restoreVersionTool.ts +107 -0
  162. package/src/mcp/builtin/collections/updateTool.ts +16 -17
  163. package/src/mcp/builtin/getConfigInfoTool.ts +27 -4
  164. package/src/mcp/builtin/globals/countVersionsTool.ts +68 -0
  165. package/src/mcp/builtin/globals/findTool.ts +27 -18
  166. package/src/mcp/builtin/globals/findVersionByIDTool.ts +103 -0
  167. package/src/mcp/builtin/globals/findVersionsTool.ts +147 -0
  168. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +37 -2
  169. package/src/mcp/builtin/globals/restoreVersionTool.ts +99 -0
  170. package/src/mcp/builtin/globals/updateTool.ts +16 -16
  171. package/src/mcp/builtin/validateEntityData.ts +1 -1
  172. package/src/mcp/builtinTools.ts +72 -16
  173. package/src/mcp/sanitizeMCPConfig.ts +48 -30
  174. package/src/stdio.ts +77 -45
  175. package/src/types.ts +108 -95
  176. package/src/utils/getPluginConfig.ts +1 -1
  177. package/src/utils/schemaConversion/filterFieldsByAccess.ts +123 -0
  178. package/src/utils/schemaConversion/getEntityInputSchema.ts +45 -27
  179. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +12 -19
  180. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +17 -114
  181. package/dist/@types/assets.d.js +0 -2
  182. package/dist/@types/assets.d.js.map +0 -1
  183. package/dist/collection/getAccessField.d.ts +0 -12
  184. package/dist/collection/getAccessField.d.ts.map +0 -1
  185. package/dist/collection/getAccessField.js +0 -72
  186. package/dist/collection/getAccessField.js.map +0 -1
  187. package/dist/collection/index.d.ts +0 -6
  188. package/dist/collection/index.d.ts.map +0 -1
  189. package/dist/collection/index.js +0 -105
  190. package/dist/collection/index.js.map +0 -1
  191. package/dist/components/APIKeyField/index.client.d.ts +0 -9
  192. package/dist/components/APIKeyField/index.client.d.ts.map +0 -1
  193. package/dist/components/APIKeyField/index.client.js +0 -85
  194. package/dist/components/APIKeyField/index.client.js.map +0 -1
  195. package/dist/components/APIKeyField/index.css +0 -105
  196. package/dist/components/APIKeysEmptyState/index.client.d.ts +0 -4
  197. package/dist/components/APIKeysEmptyState/index.client.d.ts.map +0 -1
  198. package/dist/components/APIKeysEmptyState/index.client.js +0 -21
  199. package/dist/components/APIKeysEmptyState/index.client.js.map +0 -1
  200. package/dist/components/AccessField/index.client.d.ts +0 -10
  201. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  202. package/dist/components/AccessField/index.client.js +0 -247
  203. package/dist/components/AccessField/index.client.js.map +0 -1
  204. package/dist/components/AccessField/index.css +0 -99
  205. package/dist/components/SettingsMenu/index.client.d.ts +0 -8
  206. package/dist/components/SettingsMenu/index.client.d.ts.map +0 -1
  207. package/dist/components/SettingsMenu/index.client.js +0 -29
  208. package/dist/components/SettingsMenu/index.client.js.map +0 -1
  209. package/dist/translations/index.d.ts +0 -11
  210. package/dist/translations/index.d.ts.map +0 -1
  211. package/dist/translations/index.js +0 -92
  212. package/dist/translations/index.js.map +0 -1
  213. package/dist/translations/languages/ar.d.ts +0 -31
  214. package/dist/translations/languages/ar.d.ts.map +0 -1
  215. package/dist/translations/languages/ar.js +0 -34
  216. package/dist/translations/languages/ar.js.map +0 -1
  217. package/dist/translations/languages/az.d.ts +0 -31
  218. package/dist/translations/languages/az.d.ts.map +0 -1
  219. package/dist/translations/languages/az.js +0 -34
  220. package/dist/translations/languages/az.js.map +0 -1
  221. package/dist/translations/languages/bg.d.ts +0 -31
  222. package/dist/translations/languages/bg.d.ts.map +0 -1
  223. package/dist/translations/languages/bg.js +0 -34
  224. package/dist/translations/languages/bg.js.map +0 -1
  225. package/dist/translations/languages/bnBd.d.ts +0 -31
  226. package/dist/translations/languages/bnBd.d.ts.map +0 -1
  227. package/dist/translations/languages/bnBd.js +0 -34
  228. package/dist/translations/languages/bnBd.js.map +0 -1
  229. package/dist/translations/languages/bnIn.d.ts +0 -31
  230. package/dist/translations/languages/bnIn.d.ts.map +0 -1
  231. package/dist/translations/languages/bnIn.js +0 -34
  232. package/dist/translations/languages/bnIn.js.map +0 -1
  233. package/dist/translations/languages/ca.d.ts +0 -31
  234. package/dist/translations/languages/ca.d.ts.map +0 -1
  235. package/dist/translations/languages/ca.js +0 -34
  236. package/dist/translations/languages/ca.js.map +0 -1
  237. package/dist/translations/languages/cs.d.ts +0 -31
  238. package/dist/translations/languages/cs.d.ts.map +0 -1
  239. package/dist/translations/languages/cs.js +0 -34
  240. package/dist/translations/languages/cs.js.map +0 -1
  241. package/dist/translations/languages/da.d.ts +0 -31
  242. package/dist/translations/languages/da.d.ts.map +0 -1
  243. package/dist/translations/languages/da.js +0 -34
  244. package/dist/translations/languages/da.js.map +0 -1
  245. package/dist/translations/languages/de.d.ts +0 -31
  246. package/dist/translations/languages/de.d.ts.map +0 -1
  247. package/dist/translations/languages/de.js +0 -34
  248. package/dist/translations/languages/de.js.map +0 -1
  249. package/dist/translations/languages/en.d.ts +0 -31
  250. package/dist/translations/languages/en.d.ts.map +0 -1
  251. package/dist/translations/languages/en.js +0 -34
  252. package/dist/translations/languages/en.js.map +0 -1
  253. package/dist/translations/languages/es.d.ts +0 -31
  254. package/dist/translations/languages/es.d.ts.map +0 -1
  255. package/dist/translations/languages/es.js +0 -34
  256. package/dist/translations/languages/es.js.map +0 -1
  257. package/dist/translations/languages/et.d.ts +0 -31
  258. package/dist/translations/languages/et.d.ts.map +0 -1
  259. package/dist/translations/languages/et.js +0 -34
  260. package/dist/translations/languages/et.js.map +0 -1
  261. package/dist/translations/languages/fa.d.ts +0 -31
  262. package/dist/translations/languages/fa.d.ts.map +0 -1
  263. package/dist/translations/languages/fa.js +0 -34
  264. package/dist/translations/languages/fa.js.map +0 -1
  265. package/dist/translations/languages/fr.d.ts +0 -31
  266. package/dist/translations/languages/fr.d.ts.map +0 -1
  267. package/dist/translations/languages/fr.js +0 -34
  268. package/dist/translations/languages/fr.js.map +0 -1
  269. package/dist/translations/languages/he.d.ts +0 -31
  270. package/dist/translations/languages/he.d.ts.map +0 -1
  271. package/dist/translations/languages/he.js +0 -34
  272. package/dist/translations/languages/he.js.map +0 -1
  273. package/dist/translations/languages/hr.d.ts +0 -31
  274. package/dist/translations/languages/hr.d.ts.map +0 -1
  275. package/dist/translations/languages/hr.js +0 -34
  276. package/dist/translations/languages/hr.js.map +0 -1
  277. package/dist/translations/languages/hu.d.ts +0 -31
  278. package/dist/translations/languages/hu.d.ts.map +0 -1
  279. package/dist/translations/languages/hu.js +0 -34
  280. package/dist/translations/languages/hu.js.map +0 -1
  281. package/dist/translations/languages/hy.d.ts +0 -31
  282. package/dist/translations/languages/hy.d.ts.map +0 -1
  283. package/dist/translations/languages/hy.js +0 -34
  284. package/dist/translations/languages/hy.js.map +0 -1
  285. package/dist/translations/languages/id.d.ts +0 -31
  286. package/dist/translations/languages/id.d.ts.map +0 -1
  287. package/dist/translations/languages/id.js +0 -34
  288. package/dist/translations/languages/id.js.map +0 -1
  289. package/dist/translations/languages/is.d.ts +0 -31
  290. package/dist/translations/languages/is.d.ts.map +0 -1
  291. package/dist/translations/languages/is.js +0 -34
  292. package/dist/translations/languages/is.js.map +0 -1
  293. package/dist/translations/languages/it.d.ts +0 -31
  294. package/dist/translations/languages/it.d.ts.map +0 -1
  295. package/dist/translations/languages/it.js +0 -34
  296. package/dist/translations/languages/it.js.map +0 -1
  297. package/dist/translations/languages/ja.d.ts +0 -31
  298. package/dist/translations/languages/ja.d.ts.map +0 -1
  299. package/dist/translations/languages/ja.js +0 -34
  300. package/dist/translations/languages/ja.js.map +0 -1
  301. package/dist/translations/languages/ko.d.ts +0 -31
  302. package/dist/translations/languages/ko.d.ts.map +0 -1
  303. package/dist/translations/languages/ko.js +0 -34
  304. package/dist/translations/languages/ko.js.map +0 -1
  305. package/dist/translations/languages/lt.d.ts +0 -31
  306. package/dist/translations/languages/lt.d.ts.map +0 -1
  307. package/dist/translations/languages/lt.js +0 -34
  308. package/dist/translations/languages/lt.js.map +0 -1
  309. package/dist/translations/languages/lv.d.ts +0 -31
  310. package/dist/translations/languages/lv.d.ts.map +0 -1
  311. package/dist/translations/languages/lv.js +0 -34
  312. package/dist/translations/languages/lv.js.map +0 -1
  313. package/dist/translations/languages/my.d.ts +0 -31
  314. package/dist/translations/languages/my.d.ts.map +0 -1
  315. package/dist/translations/languages/my.js +0 -34
  316. package/dist/translations/languages/my.js.map +0 -1
  317. package/dist/translations/languages/nb.d.ts +0 -31
  318. package/dist/translations/languages/nb.d.ts.map +0 -1
  319. package/dist/translations/languages/nb.js +0 -34
  320. package/dist/translations/languages/nb.js.map +0 -1
  321. package/dist/translations/languages/nl.d.ts +0 -31
  322. package/dist/translations/languages/nl.d.ts.map +0 -1
  323. package/dist/translations/languages/nl.js +0 -34
  324. package/dist/translations/languages/nl.js.map +0 -1
  325. package/dist/translations/languages/pl.d.ts +0 -31
  326. package/dist/translations/languages/pl.d.ts.map +0 -1
  327. package/dist/translations/languages/pl.js +0 -34
  328. package/dist/translations/languages/pl.js.map +0 -1
  329. package/dist/translations/languages/pt.d.ts +0 -31
  330. package/dist/translations/languages/pt.d.ts.map +0 -1
  331. package/dist/translations/languages/pt.js +0 -34
  332. package/dist/translations/languages/pt.js.map +0 -1
  333. package/dist/translations/languages/ro.d.ts +0 -31
  334. package/dist/translations/languages/ro.d.ts.map +0 -1
  335. package/dist/translations/languages/ro.js +0 -34
  336. package/dist/translations/languages/ro.js.map +0 -1
  337. package/dist/translations/languages/rs.d.ts +0 -31
  338. package/dist/translations/languages/rs.d.ts.map +0 -1
  339. package/dist/translations/languages/rs.js +0 -34
  340. package/dist/translations/languages/rs.js.map +0 -1
  341. package/dist/translations/languages/rsLatin.d.ts +0 -31
  342. package/dist/translations/languages/rsLatin.d.ts.map +0 -1
  343. package/dist/translations/languages/rsLatin.js +0 -34
  344. package/dist/translations/languages/rsLatin.js.map +0 -1
  345. package/dist/translations/languages/ru.d.ts +0 -31
  346. package/dist/translations/languages/ru.d.ts.map +0 -1
  347. package/dist/translations/languages/ru.js +0 -34
  348. package/dist/translations/languages/ru.js.map +0 -1
  349. package/dist/translations/languages/sk.d.ts +0 -31
  350. package/dist/translations/languages/sk.d.ts.map +0 -1
  351. package/dist/translations/languages/sk.js +0 -34
  352. package/dist/translations/languages/sk.js.map +0 -1
  353. package/dist/translations/languages/sl.d.ts +0 -31
  354. package/dist/translations/languages/sl.d.ts.map +0 -1
  355. package/dist/translations/languages/sl.js +0 -34
  356. package/dist/translations/languages/sl.js.map +0 -1
  357. package/dist/translations/languages/sv.d.ts +0 -31
  358. package/dist/translations/languages/sv.d.ts.map +0 -1
  359. package/dist/translations/languages/sv.js +0 -34
  360. package/dist/translations/languages/sv.js.map +0 -1
  361. package/dist/translations/languages/ta.d.ts +0 -31
  362. package/dist/translations/languages/ta.d.ts.map +0 -1
  363. package/dist/translations/languages/ta.js +0 -34
  364. package/dist/translations/languages/ta.js.map +0 -1
  365. package/dist/translations/languages/th.d.ts +0 -31
  366. package/dist/translations/languages/th.d.ts.map +0 -1
  367. package/dist/translations/languages/th.js +0 -34
  368. package/dist/translations/languages/th.js.map +0 -1
  369. package/dist/translations/languages/tr.d.ts +0 -31
  370. package/dist/translations/languages/tr.d.ts.map +0 -1
  371. package/dist/translations/languages/tr.js +0 -34
  372. package/dist/translations/languages/tr.js.map +0 -1
  373. package/dist/translations/languages/uk.d.ts +0 -31
  374. package/dist/translations/languages/uk.d.ts.map +0 -1
  375. package/dist/translations/languages/uk.js +0 -34
  376. package/dist/translations/languages/uk.js.map +0 -1
  377. package/dist/translations/languages/vi.d.ts +0 -31
  378. package/dist/translations/languages/vi.d.ts.map +0 -1
  379. package/dist/translations/languages/vi.js +0 -34
  380. package/dist/translations/languages/vi.js.map +0 -1
  381. package/dist/translations/languages/zh.d.ts +0 -31
  382. package/dist/translations/languages/zh.d.ts.map +0 -1
  383. package/dist/translations/languages/zh.js +0 -34
  384. package/dist/translations/languages/zh.js.map +0 -1
  385. package/dist/translations/languages/zhTw.d.ts +0 -31
  386. package/dist/translations/languages/zhTw.d.ts.map +0 -1
  387. package/dist/translations/languages/zhTw.js +0 -34
  388. package/dist/translations/languages/zhTw.js.map +0 -1
  389. package/dist/translations/types.d.ts +0 -32
  390. package/dist/translations/types.d.ts.map +0 -1
  391. package/dist/translations/types.js +0 -3
  392. package/dist/translations/types.js.map +0 -1
  393. package/dist/utils/localAPIDefaults.d.ts +0 -20
  394. package/dist/utils/localAPIDefaults.d.ts.map +0 -1
  395. package/dist/utils/localAPIDefaults.js +0 -19
  396. package/dist/utils/localAPIDefaults.js.map +0 -1
  397. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  398. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  399. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  400. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  401. package/src/@types/assets.d.ts +0 -3
  402. package/src/collection/getAccessField.ts +0 -84
  403. package/src/collection/index.ts +0 -105
  404. package/src/components/APIKeyField/index.client.tsx +0 -73
  405. package/src/components/APIKeyField/index.css +0 -105
  406. package/src/components/APIKeysEmptyState/index.client.tsx +0 -36
  407. package/src/components/AccessField/index.client.tsx +0 -299
  408. package/src/components/AccessField/index.css +0 -99
  409. package/src/components/SettingsMenu/index.client.tsx +0 -34
  410. package/src/translations/index.ts +0 -108
  411. package/src/translations/languages/ar.ts +0 -35
  412. package/src/translations/languages/az.ts +0 -35
  413. package/src/translations/languages/bg.ts +0 -35
  414. package/src/translations/languages/bnBd.ts +0 -35
  415. package/src/translations/languages/bnIn.ts +0 -35
  416. package/src/translations/languages/ca.ts +0 -35
  417. package/src/translations/languages/cs.ts +0 -35
  418. package/src/translations/languages/da.ts +0 -35
  419. package/src/translations/languages/de.ts +0 -35
  420. package/src/translations/languages/en.ts +0 -35
  421. package/src/translations/languages/es.ts +0 -35
  422. package/src/translations/languages/et.ts +0 -35
  423. package/src/translations/languages/fa.ts +0 -35
  424. package/src/translations/languages/fr.ts +0 -35
  425. package/src/translations/languages/he.ts +0 -35
  426. package/src/translations/languages/hr.ts +0 -35
  427. package/src/translations/languages/hu.ts +0 -35
  428. package/src/translations/languages/hy.ts +0 -35
  429. package/src/translations/languages/id.ts +0 -35
  430. package/src/translations/languages/is.ts +0 -35
  431. package/src/translations/languages/it.ts +0 -35
  432. package/src/translations/languages/ja.ts +0 -35
  433. package/src/translations/languages/ko.ts +0 -35
  434. package/src/translations/languages/lt.ts +0 -35
  435. package/src/translations/languages/lv.ts +0 -35
  436. package/src/translations/languages/my.ts +0 -35
  437. package/src/translations/languages/nb.ts +0 -35
  438. package/src/translations/languages/nl.ts +0 -35
  439. package/src/translations/languages/pl.ts +0 -35
  440. package/src/translations/languages/pt.ts +0 -35
  441. package/src/translations/languages/ro.ts +0 -35
  442. package/src/translations/languages/rs.ts +0 -35
  443. package/src/translations/languages/rsLatin.ts +0 -35
  444. package/src/translations/languages/ru.ts +0 -35
  445. package/src/translations/languages/sk.ts +0 -35
  446. package/src/translations/languages/sl.ts +0 -35
  447. package/src/translations/languages/sv.ts +0 -35
  448. package/src/translations/languages/ta.ts +0 -35
  449. package/src/translations/languages/th.ts +0 -35
  450. package/src/translations/languages/tr.ts +0 -35
  451. package/src/translations/languages/uk.ts +0 -35
  452. package/src/translations/languages/vi.ts +0 -35
  453. package/src/translations/languages/zh.ts +0 -35
  454. package/src/translations/languages/zhTw.ts +0 -35
  455. package/src/translations/types.ts +0 -34
  456. package/src/utils/localAPIDefaults.ts +0 -22
  457. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
package/src/types.ts CHANGED
@@ -6,18 +6,18 @@ import type {
6
6
  ResourceTemplate,
7
7
  ServerContext,
8
8
  StandardSchemaWithJSON,
9
+ ToolAnnotations,
9
10
  } from '@modelcontextprotocol/server'
10
11
  import type {
11
12
  AuthCollectionSlug,
12
- CollectionConfig,
13
13
  CollectionSlug,
14
- DefaultDocumentIDType,
15
14
  GlobalSlug,
16
15
  MaybePromise,
17
16
  PayloadRequest,
18
- TypedUser,
17
+ SanitizedPermissions,
19
18
  } from 'payload'
20
19
 
20
+ import type { GetAuthorizedMCPArgs } from './endpoint/access.js'
21
21
  import type {
22
22
  MCPCollectionAuthToolName,
23
23
  MCPCollectionBuiltinName,
@@ -26,36 +26,16 @@ import type {
26
26
 
27
27
  export type { MCPCollectionAuthToolName, MCPCollectionBuiltinName, MCPGlobalBuiltinName }
28
28
 
29
- /** Re-exported from `@modelcontextprotocol/server` — the JSON Schema shape the MCP runtime validates against. */
30
- export type { JsonSchemaType, StandardSchemaWithJSON }
29
+ /** Re-exported from `@modelcontextprotocol/server` — common MCP types used in plugin config. */
30
+ export type { JsonSchemaType, StandardSchemaWithJSON, ToolAnnotations }
31
31
 
32
32
  /**
33
33
  * What a tool's `input` (or a prompt's `argsSchema`) can be — either a raw
34
- * 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.
35
36
  */
36
37
  export type ToolInputSchema = JsonSchemaType | StandardSchemaWithJSON
37
38
 
38
- /**
39
- * Serializable mirror of `SanitizedMCPPluginConfig` for client components —
40
- * the full sanitized config carries functions (tool handlers, etc.) that can't
41
- * cross the server→client boundary. Built by `sanitizeClientPluginConfig` and
42
- * passed to the `AccessField` component via `clientProps`.
43
- *
44
- * @internal
45
- */
46
- export type ClientMCPPluginConfig = {
47
- items: Array<{
48
- collectionSlug?: string
49
- configKey: string
50
- description?: string
51
- globalSlug?: string
52
- /** Admin-UI bucket for collection/global tools: built-in CRUD, auth, or custom. */
53
- group?: 'auth' | 'custom' | 'operations'
54
- label: string
55
- type: 'collectionTool' | 'globalTool' | 'prompt' | 'resource' | 'tool'
56
- }>
57
- }
58
-
59
39
  export type MCPToolResponse = {
60
40
  content: ContentBlock[]
61
41
  /**
@@ -72,6 +52,13 @@ export type MCPResponseOverride = (
72
52
  req: PayloadRequest,
73
53
  ) => MCPToolResponse
74
54
 
55
+ export type MCPAfterToolCallHook = (args: {
56
+ input: unknown
57
+ req: PayloadRequest
58
+ response: MCPToolResponse
59
+ toolName: string
60
+ }) => MaybePromise<MCPToolResponse>
61
+
75
62
  /**
76
63
  * The handler's `input` type. A specific Standard Schema (Zod, Valibot, …) gets
77
64
  * its inferred output; anything else falls back to `Record<string, unknown>`.
@@ -82,6 +69,19 @@ export type TypedInput<TSchema> = TSchema extends StandardSchemaWithJSON
82
69
  : StandardSchemaWithJSON.InferOutput<TSchema>
83
70
  : Record<string, unknown>
84
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
+
85
85
  export type ToolHandlerArgs<TSchema = undefined> = {
86
86
  authorizedMCP: AuthorizedMCP
87
87
  input: TypedInput<TSchema>
@@ -98,6 +98,13 @@ export type GlobalToolHandlerArgs<TSchema = undefined> = {
98
98
  } & ToolHandlerArgs<TSchema>
99
99
 
100
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>
107
+ annotations?: ToolAnnotations
101
108
  description: string
102
109
  handler: (args: ToolHandlerArgs<TSchema>) => MaybePromise<MCPToolResponse>
103
110
  input?: TSchema
@@ -110,22 +117,54 @@ export type Tool<TSchema extends ToolInputSchema | undefined = ToolInputSchema |
110
117
  export type CollectionTool<
111
118
  TSchema extends ToolInputSchema | undefined = ToolInputSchema | undefined,
112
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>
113
127
  handler: (args: CollectionToolHandlerArgs<TSchema>) => MaybePromise<MCPToolResponse>
114
128
  input?: TSchema
115
- } & Pick<Tool, 'description' | 'overrideResponse'>
129
+ } & Pick<Tool, 'annotations' | 'description' | 'overrideResponse'>
116
130
 
117
131
  export type GlobalTool<TSchema extends ToolInputSchema | undefined = ToolInputSchema | undefined> =
118
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>
119
140
  handler: (args: GlobalToolHandlerArgs<TSchema>) => MaybePromise<MCPToolResponse>
120
141
  input?: TSchema
121
- } & Pick<Tool, 'description' | 'overrideResponse'>
142
+ } & Pick<Tool, 'annotations' | 'description' | 'overrideResponse'>
122
143
 
123
144
  /**
124
145
  * Configures (or disables) a built-in tool without replacing it.
125
146
  * `handler?: never` prevents a full `CollectionTool`/`GlobalTool` (which has a
126
147
  * required handler) from being silently accepted at a built-in key slot.
127
148
  */
128
- 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>
167
+ annotations?: ToolAnnotations
129
168
  description?: string
130
169
  handler?: never
131
170
  overrideResponse?: MCPResponseOverride
@@ -139,13 +178,13 @@ export type MCPBuiltInToolOverride = {
139
178
  export type MCPTopLevelToolEntry = Tool
140
179
 
141
180
  export type MCPCollectionToolsMap = {
142
- [customToolName: string]: boolean | CollectionTool | MCPBuiltInToolOverride | undefined
181
+ [customToolName: string]: boolean | CollectionTool | MCPBuiltInCollectionToolOverride | undefined
143
182
  } & {
144
- [K in MCPCollectionBuiltinName]?: false | MCPBuiltInToolOverride
183
+ [K in MCPCollectionBuiltinName]?: false | MCPBuiltInCollectionToolOverride
145
184
  }
146
185
 
147
186
  export type MCPAuthCollectionToolsMap = {
148
- [K in MCPCollectionAuthToolName]?: MCPBuiltInToolOverride | true
187
+ [K in MCPCollectionAuthToolName]?: MCPBuiltInCollectionToolOverride | true
149
188
  } & MCPCollectionToolsMap
150
189
 
151
190
  /** Auth-enabled collections get auth-tool name autocomplete; others get CRUD-only. */
@@ -154,9 +193,9 @@ export type MCPToolsMapForCollection<Slug extends CollectionSlug> = Slug extends
154
193
  : MCPCollectionToolsMap
155
194
 
156
195
  export type MCPGlobalToolsMap = {
157
- [customToolName: string]: boolean | GlobalTool | MCPBuiltInToolOverride | undefined
196
+ [customToolName: string]: boolean | GlobalTool | MCPBuiltInGlobalToolOverride | undefined
158
197
  } & {
159
- [K in MCPGlobalBuiltinName]?: false | MCPBuiltInToolOverride
198
+ [K in MCPGlobalBuiltinName]?: false | MCPBuiltInGlobalToolOverride
160
199
  }
161
200
 
162
201
  export type MCPTopLevelToolsMap = Record<string, Tool>
@@ -168,6 +207,12 @@ export type PromptHandlerArgs<TSchema = undefined> = {
168
207
  }
169
208
 
170
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>
171
216
  argsSchema: TSchema
172
217
  description: string
173
218
  handler: (args: PromptHandlerArgs<TSchema>) => MaybePromise<{
@@ -185,6 +230,12 @@ export type ResourceHandlerArgs = {
185
230
  }
186
231
 
187
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>
188
239
  description: string
189
240
  handler: (args: ResourceHandlerArgs) => MaybePromise<{
190
241
  contents: Array<{ text: string; uri: string }>
@@ -218,34 +269,39 @@ export type MCPPluginConfig = {
218
269
  collections?: {
219
270
  [Slug in CollectionSlug]?: MCPPluginCollectionConfig<Slug>
220
271
  }
221
- /** Skip MCP registration. The API key collection is still added (so DB / types stay stable). */
272
+ /** Skip MCP endpoint registration. */
222
273
  disabled?: boolean
223
274
  globals?: {
224
275
  [Slug in GlobalSlug]?: MCPPluginGlobalConfig
225
276
  }
277
+ hooks?: {
278
+ /** Transform a tool response after its handler returns */
279
+ afterToolCall?: MCPAfterToolCallHook[]
280
+ }
226
281
  mcp?: {
227
282
  serverOptions?: MCPServerOptions
228
283
  verboseLogs?: boolean
229
284
  }
230
- overrideApiKeyCollection?: (collection: CollectionConfig) => CollectionConfig
231
- /** Replace the default API-key auth with a custom resolver. */
232
- overrideAuth?: (args: {
233
- getAPIKeyDoc: (overrideApiKey?: string) => Promise<MCPAPIKeysDoc>
234
- getAuthorizedMCP: (args: { apiKeyDoc: MCPAPIKeysDoc }) => AuthorizedMCP
235
- pluginConfig: SanitizedMCPPluginConfig
236
- req: PayloadRequest
237
- }) => 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>
238
296
  prompts?: Record<string, Prompt>
239
297
  resources?: Record<string, Resource>
240
298
  /** Cross-cutting tools (not scoped to any collection or global). */
241
299
  tools?: MCPTopLevelToolsMap
242
- userCollection?: CollectionSlug
243
300
  }
244
301
 
245
302
  export type SanitizedMCPPluginConfig = {
246
303
  items: MCPItem[]
247
- userCollection: CollectionSlug
248
- } & Pick<MCPPluginConfig, 'disabled' | 'mcp' | 'overrideApiKeyCollection' | 'overrideAuth'>
304
+ } & Pick<MCPPluginConfig, 'disabled' | 'hooks' | 'mcp' | 'overrideGetAuthorizedMCP'>
249
305
 
250
306
  export type MCPServerOptions = {
251
307
  options?: ConstructorParameters<typeof McpServer>[1]
@@ -253,52 +309,12 @@ export type MCPServerOptions = {
253
309
  }
254
310
 
255
311
  /**
256
- * Nested access tree as stored in the collection.
257
- * A `false` leaf disables that tool; missing keys defer to
258
- * defaults (built-in CRUD is on, opt-in tools are off).
259
- */
260
- export type MCPAPIKeysDocAccessTree = {
261
- collections?: {
262
- [CollectionSlug: CollectionSlug]: {
263
- [ToolKey: string]: boolean
264
- }
265
- }
266
- globals?: {
267
- [GlobalSlug: GlobalSlug]: {
268
- [ToolKey: string]: boolean
269
- }
270
- }
271
- prompts?: {
272
- [PromptKey: string]: boolean
273
- }
274
- resources?: {
275
- [ResourceKey: string]: boolean
276
- }
277
- tools?: {
278
- [ToolKey: string]: boolean
279
- }
280
- }
281
-
282
- /**
283
- * Stored on `payload-mcp-api-keys` docs
284
- */
285
- export type MCPAPIKeysDoc = {
286
- access: MCPAPIKeysDocAccessTree
287
- apiKey?: string
288
- apiKeyIndex?: string
289
- id: DefaultDocumentIDType
290
- lastUsed?: string
291
- overrideAccess?: boolean
292
- user: null | TypedUser
293
- }
294
-
295
- /**
296
- * 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
297
313
  * registration.
298
314
  *
299
- * - `configKey`: the config/API-key identifier, e.g. `find` or `echo`.
315
+ * - `configKey`: the config identifier, e.g. `find` or `echo`.
300
316
  * - `mcpName`: the MCP wire name, e.g. `findDocuments` or `echo`.
301
- * - `label`: human-readable admin checkbox text.
317
+ * - `label`: human-readable display text.
302
318
  */
303
319
  export type MCPItemBase = {
304
320
  configKey: string
@@ -335,13 +351,10 @@ export type MCPItem =
335
351
  | GlobalMCPItem
336
352
 
337
353
  /**
338
- * The caller's identity + the MCP items they can use for this request. Returned
339
- * by `getAuthorizedMCP`; denied items are simply absent from `items`. Handlers
340
- * receive this via `args.authorizedMCP` so they can spread
341
- * `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`.
342
356
  */
343
357
  export type AuthorizedMCP = {
344
358
  items: MCPItem[]
345
359
  overrideAccess: boolean
346
- user: null | TypedUser
347
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 fields (createdAt/updatedAt/_status) are excluded upstream by the `input` variant;
80
+ // `id` stays because it's 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: {