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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/bin.js +39 -0
  2. package/dist/@types/assets.d.js +2 -0
  3. package/dist/@types/assets.d.js.map +1 -0
  4. package/dist/defaultAccess.d.ts +3 -0
  5. package/dist/defaultAccess.d.ts.map +1 -0
  6. package/dist/defaultAccess.js +3 -0
  7. package/dist/defaultAccess.js.map +1 -0
  8. package/dist/defineTool.d.ts +26 -0
  9. package/dist/defineTool.d.ts.map +1 -0
  10. package/dist/defineTool.js +37 -0
  11. package/dist/defineTool.js.map +1 -0
  12. package/dist/endpoint/access.d.ts +22 -0
  13. package/dist/endpoint/access.d.ts.map +1 -0
  14. package/dist/endpoint/access.js +100 -0
  15. package/dist/endpoint/access.js.map +1 -0
  16. package/dist/endpoint/index.d.ts +3 -0
  17. package/dist/endpoint/index.d.ts.map +1 -0
  18. package/dist/endpoint/index.js +47 -0
  19. package/dist/endpoint/index.js.map +1 -0
  20. package/dist/exports/client.d.ts +2 -0
  21. package/dist/exports/client.d.ts.map +1 -0
  22. package/dist/exports/client.js +4 -0
  23. package/dist/exports/client.js.map +1 -0
  24. package/dist/exports/internal.d.ts +2 -0
  25. package/dist/exports/internal.d.ts.map +1 -0
  26. package/dist/exports/internal.js +3 -0
  27. package/dist/exports/internal.js.map +1 -0
  28. package/dist/index.d.ts +4 -7
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +39 -67
  31. package/dist/index.js.map +1 -1
  32. package/dist/mcp/buildMcpServer.d.ts +19 -0
  33. package/dist/mcp/buildMcpServer.d.ts.map +1 -0
  34. package/dist/mcp/buildMcpServer.js +201 -0
  35. package/dist/mcp/buildMcpServer.js.map +1 -0
  36. package/dist/mcp/builtin/collections/authTools.d.ts +7 -0
  37. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -0
  38. package/dist/mcp/builtin/collections/authTools.js +288 -0
  39. package/dist/mcp/builtin/collections/authTools.js.map +1 -0
  40. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  41. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  42. package/dist/mcp/builtin/collections/countTool.js +69 -0
  43. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  44. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  45. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  46. package/dist/mcp/builtin/collections/countVersionsTool.js +65 -0
  47. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  48. package/dist/mcp/builtin/collections/createTool.d.ts +2 -0
  49. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -0
  50. package/dist/mcp/builtin/collections/createTool.js +87 -0
  51. package/dist/mcp/builtin/collections/createTool.js.map +1 -0
  52. package/dist/mcp/builtin/collections/deleteTool.d.ts +2 -0
  53. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -0
  54. package/dist/mcp/builtin/collections/deleteTool.js +111 -0
  55. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -0
  56. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  57. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  58. package/dist/mcp/builtin/collections/duplicateTool.js +97 -0
  59. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  60. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  61. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  62. package/dist/mcp/builtin/collections/findDistinctTool.js +93 -0
  63. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  64. package/dist/mcp/builtin/collections/findTool.d.ts +2 -0
  65. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -0
  66. package/dist/mcp/builtin/collections/findTool.js +165 -0
  67. package/dist/mcp/builtin/collections/findTool.js.map +1 -0
  68. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  69. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  70. package/dist/mcp/builtin/collections/findVersionByIDTool.js +84 -0
  71. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  72. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  73. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  74. package/dist/mcp/builtin/collections/findVersionsTool.js +99 -0
  75. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  76. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +9 -0
  77. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -0
  78. package/dist/mcp/builtin/collections/formatCollectionError.js +60 -0
  79. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -0
  80. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts +2 -0
  81. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -0
  82. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +47 -0
  83. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -0
  84. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  85. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  86. package/dist/mcp/builtin/collections/restoreVersionTool.js +82 -0
  87. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  88. package/dist/mcp/builtin/collections/updateTool.d.ts +2 -0
  89. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -0
  90. package/dist/mcp/builtin/collections/updateTool.js +192 -0
  91. package/dist/mcp/builtin/collections/updateTool.js.map +1 -0
  92. package/dist/mcp/builtin/getConfigInfoTool.d.ts +2 -0
  93. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -0
  94. package/dist/mcp/builtin/getConfigInfoTool.js +71 -0
  95. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -0
  96. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  97. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  98. package/dist/mcp/builtin/globals/countVersionsTool.js +65 -0
  99. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  100. package/dist/mcp/builtin/globals/findTool.d.ts +2 -0
  101. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -0
  102. package/dist/mcp/builtin/globals/findTool.js +73 -0
  103. package/dist/mcp/builtin/globals/findTool.js.map +1 -0
  104. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  105. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  106. package/dist/mcp/builtin/globals/findVersionByIDTool.js +80 -0
  107. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  108. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  109. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  110. package/dist/mcp/builtin/globals/findVersionsTool.js +95 -0
  111. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  112. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts +2 -0
  113. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -0
  114. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +47 -0
  115. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -0
  116. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  117. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  118. package/dist/mcp/builtin/globals/restoreVersionTool.js +78 -0
  119. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  120. package/dist/mcp/builtin/globals/updateTool.d.ts +2 -0
  121. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -0
  122. package/dist/mcp/builtin/globals/updateTool.js +87 -0
  123. package/dist/mcp/builtin/globals/updateTool.js.map +1 -0
  124. package/dist/mcp/builtin/validateEntityData.d.ts +14 -0
  125. package/dist/mcp/builtin/validateEntityData.d.ts.map +1 -0
  126. package/dist/mcp/builtin/validateEntityData.js +82 -0
  127. package/dist/mcp/builtin/validateEntityData.js.map +1 -0
  128. package/dist/mcp/builtinTools.d.ts +162 -0
  129. package/dist/mcp/builtinTools.d.ts.map +1 -0
  130. package/dist/mcp/builtinTools.js +163 -0
  131. package/dist/mcp/builtinTools.js.map +1 -0
  132. package/dist/mcp/sanitizeMCPConfig.d.ts +16 -0
  133. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -0
  134. package/dist/mcp/sanitizeMCPConfig.js +229 -0
  135. package/dist/mcp/sanitizeMCPConfig.js.map +1 -0
  136. package/dist/stdio.d.ts +9 -0
  137. package/dist/stdio.d.ts.map +1 -0
  138. package/dist/stdio.js +108 -0
  139. package/dist/stdio.js.map +1 -0
  140. package/dist/types.d.ts +222 -461
  141. package/dist/types.d.ts.map +1 -1
  142. package/dist/types.js +6 -1
  143. package/dist/types.js.map +1 -1
  144. package/dist/utils/camelCase.d.ts.map +1 -1
  145. package/dist/utils/getLogger.d.ts +10 -0
  146. package/dist/utils/getLogger.d.ts.map +1 -0
  147. package/dist/utils/getLogger.js +22 -0
  148. package/dist/utils/getLogger.js.map +1 -0
  149. package/dist/utils/getPluginConfig.d.ts +12 -0
  150. package/dist/utils/getPluginConfig.d.ts.map +1 -0
  151. package/dist/utils/getPluginConfig.js +15 -0
  152. package/dist/utils/getPluginConfig.js.map +1 -0
  153. package/dist/utils/localAPIDefaults.d.ts +20 -0
  154. package/dist/utils/localAPIDefaults.d.ts.map +1 -0
  155. package/dist/utils/localAPIDefaults.js +19 -0
  156. package/dist/utils/localAPIDefaults.js.map +1 -0
  157. package/dist/utils/resolveProjectRoot.d.ts +7 -0
  158. package/dist/utils/resolveProjectRoot.d.ts.map +1 -0
  159. package/dist/utils/resolveProjectRoot.js +15 -0
  160. package/dist/utils/resolveProjectRoot.js.map +1 -0
  161. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +11 -0
  162. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +1 -0
  163. package/dist/utils/schemaConversion/getEntityInputSchema.js +32 -0
  164. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +1 -0
  165. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +10 -0
  166. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -0
  167. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +384 -0
  168. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -0
  169. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +133 -0
  170. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -0
  171. package/dist/utils/toStandardSchema.d.ts +5 -0
  172. package/dist/utils/toStandardSchema.d.ts.map +1 -0
  173. package/dist/utils/toStandardSchema.js +4 -0
  174. package/dist/utils/toStandardSchema.js.map +1 -0
  175. package/dist/utils/whereSchema.d.ts +9 -0
  176. package/dist/utils/whereSchema.d.ts.map +1 -0
  177. package/dist/utils/whereSchema.js +13 -0
  178. package/dist/utils/whereSchema.js.map +1 -0
  179. package/package.json +32 -10
  180. package/src/@types/assets.d.ts +3 -0
  181. package/src/defaultAccess.ts +3 -0
  182. package/src/defineTool.ts +44 -0
  183. package/src/endpoint/access.ts +119 -0
  184. package/src/endpoint/index.ts +48 -0
  185. package/src/exports/client.ts +3 -0
  186. package/src/exports/internal.ts +1 -0
  187. package/src/index.ts +29 -87
  188. package/src/mcp/buildMcpServer.ts +264 -0
  189. package/src/mcp/builtin/collections/authTools.ts +269 -0
  190. package/src/mcp/builtin/collections/countTool.ts +74 -0
  191. package/src/mcp/builtin/collections/countVersionsTool.ts +70 -0
  192. package/src/mcp/builtin/collections/createTool.ts +112 -0
  193. package/src/mcp/builtin/collections/deleteTool.ts +126 -0
  194. package/src/mcp/builtin/collections/duplicateTool.ts +135 -0
  195. package/src/mcp/builtin/collections/findDistinctTool.ts +120 -0
  196. package/src/mcp/builtin/collections/findTool.ts +217 -0
  197. package/src/mcp/builtin/collections/findVersionByIDTool.ts +110 -0
  198. package/src/mcp/builtin/collections/findVersionsTool.ts +155 -0
  199. package/src/mcp/builtin/collections/formatCollectionError.ts +84 -0
  200. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +46 -0
  201. package/src/mcp/builtin/collections/restoreVersionTool.ts +108 -0
  202. package/src/mcp/builtin/collections/updateTool.ts +211 -0
  203. package/src/mcp/builtin/getConfigInfoTool.ts +69 -0
  204. package/src/mcp/builtin/globals/countVersionsTool.ts +69 -0
  205. package/src/mcp/builtin/globals/findTool.ts +105 -0
  206. package/src/mcp/builtin/globals/findVersionByIDTool.ts +104 -0
  207. package/src/mcp/builtin/globals/findVersionsTool.ts +148 -0
  208. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +41 -0
  209. package/src/mcp/builtin/globals/restoreVersionTool.ts +100 -0
  210. package/src/mcp/builtin/globals/updateTool.ts +115 -0
  211. package/src/mcp/builtin/validateEntityData.ts +132 -0
  212. package/src/mcp/builtinTools.ts +154 -0
  213. package/src/mcp/sanitizeMCPConfig.ts +277 -0
  214. package/src/stdio.ts +113 -0
  215. package/src/types.ts +263 -493
  216. package/src/utils/getLogger.ts +22 -0
  217. package/src/utils/getPluginConfig.ts +24 -0
  218. package/src/utils/localAPIDefaults.ts +22 -0
  219. package/src/utils/resolveProjectRoot.ts +17 -0
  220. package/src/utils/schemaConversion/getEntityInputSchema.ts +62 -0
  221. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +96 -0
  222. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +432 -0
  223. package/src/utils/toStandardSchema.ts +9 -0
  224. package/src/utils/whereSchema.ts +24 -0
  225. package/dist/collections/createApiKeysCollection.d.ts +0 -7
  226. package/dist/collections/createApiKeysCollection.d.ts.map +0 -1
  227. package/dist/collections/createApiKeysCollection.js +0 -317
  228. package/dist/collections/createApiKeysCollection.js.map +0 -1
  229. package/dist/defaults.d.ts +0 -4
  230. package/dist/defaults.d.ts.map +0 -1
  231. package/dist/defaults.js +0 -5
  232. package/dist/defaults.js.map +0 -1
  233. package/dist/endpoints/mcp.d.ts +0 -4
  234. package/dist/endpoints/mcp.d.ts.map +0 -1
  235. package/dist/endpoints/mcp.js +0 -71
  236. package/dist/endpoints/mcp.js.map +0 -1
  237. package/dist/mcp/createRequest.d.ts +0 -3
  238. package/dist/mcp/createRequest.d.ts.map +0 -1
  239. package/dist/mcp/createRequest.js +0 -14
  240. package/dist/mcp/createRequest.js.map +0 -1
  241. package/dist/mcp/getMcpHandler.d.ts +0 -4
  242. package/dist/mcp/getMcpHandler.d.ts.map +0 -1
  243. package/dist/mcp/getMcpHandler.js +0 -231
  244. package/dist/mcp/getMcpHandler.js.map +0 -1
  245. package/dist/mcp/helpers/config.d.ts +0 -22
  246. package/dist/mcp/helpers/config.d.ts.map +0 -1
  247. package/dist/mcp/helpers/config.js +0 -153
  248. package/dist/mcp/helpers/config.js.map +0 -1
  249. package/dist/mcp/helpers/fields.d.ts +0 -19
  250. package/dist/mcp/helpers/fields.d.ts.map +0 -1
  251. package/dist/mcp/helpers/fields.js +0 -102
  252. package/dist/mcp/helpers/fields.js.map +0 -1
  253. package/dist/mcp/helpers/fileValidation.d.ts +0 -67
  254. package/dist/mcp/helpers/fileValidation.d.ts.map +0 -1
  255. package/dist/mcp/helpers/fileValidation.js +0 -267
  256. package/dist/mcp/helpers/fileValidation.js.map +0 -1
  257. package/dist/mcp/registerTool.d.ts +0 -6
  258. package/dist/mcp/registerTool.d.ts.map +0 -1
  259. package/dist/mcp/registerTool.js +0 -18
  260. package/dist/mcp/registerTool.js.map +0 -1
  261. package/dist/mcp/tools/auth/auth.d.ts +0 -4
  262. package/dist/mcp/tools/auth/auth.d.ts.map +0 -1
  263. package/dist/mcp/tools/auth/auth.js +0 -57
  264. package/dist/mcp/tools/auth/auth.js.map +0 -1
  265. package/dist/mcp/tools/auth/forgotPassword.d.ts +0 -4
  266. package/dist/mcp/tools/auth/forgotPassword.d.ts.map +0 -1
  267. package/dist/mcp/tools/auth/forgotPassword.js +0 -48
  268. package/dist/mcp/tools/auth/forgotPassword.js.map +0 -1
  269. package/dist/mcp/tools/auth/login.d.ts +0 -4
  270. package/dist/mcp/tools/auth/login.d.ts.map +0 -1
  271. package/dist/mcp/tools/auth/login.js +0 -51
  272. package/dist/mcp/tools/auth/login.js.map +0 -1
  273. package/dist/mcp/tools/auth/resetPassword.d.ts +0 -4
  274. package/dist/mcp/tools/auth/resetPassword.d.ts.map +0 -1
  275. package/dist/mcp/tools/auth/resetPassword.js +0 -49
  276. package/dist/mcp/tools/auth/resetPassword.js.map +0 -1
  277. package/dist/mcp/tools/auth/unlock.d.ts +0 -4
  278. package/dist/mcp/tools/auth/unlock.d.ts.map +0 -1
  279. package/dist/mcp/tools/auth/unlock.js +0 -48
  280. package/dist/mcp/tools/auth/unlock.js.map +0 -1
  281. package/dist/mcp/tools/auth/verify.d.ts +0 -4
  282. package/dist/mcp/tools/auth/verify.d.ts.map +0 -1
  283. package/dist/mcp/tools/auth/verify.js +0 -45
  284. package/dist/mcp/tools/auth/verify.js.map +0 -1
  285. package/dist/mcp/tools/collection/create.d.ts +0 -10
  286. package/dist/mcp/tools/collection/create.d.ts.map +0 -1
  287. package/dist/mcp/tools/collection/create.js +0 -139
  288. package/dist/mcp/tools/collection/create.js.map +0 -1
  289. package/dist/mcp/tools/collection/delete.d.ts +0 -10
  290. package/dist/mcp/tools/collection/delete.d.ts.map +0 -1
  291. package/dist/mcp/tools/collection/delete.js +0 -154
  292. package/dist/mcp/tools/collection/delete.js.map +0 -1
  293. package/dist/mcp/tools/collection/find.d.ts +0 -10
  294. package/dist/mcp/tools/collection/find.d.ts.map +0 -1
  295. package/dist/mcp/tools/collection/find.js +0 -165
  296. package/dist/mcp/tools/collection/find.js.map +0 -1
  297. package/dist/mcp/tools/collection/update.d.ts +0 -10
  298. package/dist/mcp/tools/collection/update.d.ts.map +0 -1
  299. package/dist/mcp/tools/collection/update.js +0 -209
  300. package/dist/mcp/tools/collection/update.js.map +0 -1
  301. package/dist/mcp/tools/config/find.d.ts +0 -10
  302. package/dist/mcp/tools/config/find.d.ts.map +0 -1
  303. package/dist/mcp/tools/config/find.js +0 -97
  304. package/dist/mcp/tools/config/find.js.map +0 -1
  305. package/dist/mcp/tools/config/update.d.ts +0 -10
  306. package/dist/mcp/tools/config/update.d.ts.map +0 -1
  307. package/dist/mcp/tools/config/update.js +0 -215
  308. package/dist/mcp/tools/config/update.js.map +0 -1
  309. package/dist/mcp/tools/global/find.d.ts +0 -5
  310. package/dist/mcp/tools/global/find.d.ts.map +0 -1
  311. package/dist/mcp/tools/global/find.js +0 -82
  312. package/dist/mcp/tools/global/find.js.map +0 -1
  313. package/dist/mcp/tools/global/update.d.ts +0 -6
  314. package/dist/mcp/tools/global/update.d.ts.map +0 -1
  315. package/dist/mcp/tools/global/update.js +0 -124
  316. package/dist/mcp/tools/global/update.js.map +0 -1
  317. package/dist/mcp/tools/job/create.d.ts +0 -10
  318. package/dist/mcp/tools/job/create.d.ts.map +0 -1
  319. package/dist/mcp/tools/job/create.js +0 -293
  320. package/dist/mcp/tools/job/create.js.map +0 -1
  321. package/dist/mcp/tools/job/run.d.ts +0 -10
  322. package/dist/mcp/tools/job/run.d.ts.map +0 -1
  323. package/dist/mcp/tools/job/run.js +0 -129
  324. package/dist/mcp/tools/job/run.js.map +0 -1
  325. package/dist/mcp/tools/job/update.d.ts +0 -11
  326. package/dist/mcp/tools/job/update.d.ts.map +0 -1
  327. package/dist/mcp/tools/job/update.js +0 -186
  328. package/dist/mcp/tools/job/update.js.map +0 -1
  329. package/dist/mcp/tools/resource/create.d.ts +0 -6
  330. package/dist/mcp/tools/resource/create.d.ts.map +0 -1
  331. package/dist/mcp/tools/resource/create.js +0 -124
  332. package/dist/mcp/tools/resource/create.js.map +0 -1
  333. package/dist/mcp/tools/resource/delete.d.ts +0 -5
  334. package/dist/mcp/tools/resource/delete.d.ts.map +0 -1
  335. package/dist/mcp/tools/resource/delete.js +0 -151
  336. package/dist/mcp/tools/resource/delete.js.map +0 -1
  337. package/dist/mcp/tools/resource/find.d.ts +0 -5
  338. package/dist/mcp/tools/resource/find.d.ts.map +0 -1
  339. package/dist/mcp/tools/resource/find.js +0 -170
  340. package/dist/mcp/tools/resource/find.js.map +0 -1
  341. package/dist/mcp/tools/resource/update.d.ts +0 -6
  342. package/dist/mcp/tools/resource/update.d.ts.map +0 -1
  343. package/dist/mcp/tools/resource/update.js +0 -256
  344. package/dist/mcp/tools/resource/update.js.map +0 -1
  345. package/dist/mcp/tools/schemas.d.ts +0 -457
  346. package/dist/mcp/tools/schemas.d.ts.map +0 -1
  347. package/dist/mcp/tools/schemas.js +0 -243
  348. package/dist/mcp/tools/schemas.js.map +0 -1
  349. package/dist/utils/adminEntitySettings.d.ts +0 -17
  350. package/dist/utils/adminEntitySettings.d.ts.map +0 -1
  351. package/dist/utils/adminEntitySettings.js +0 -41
  352. package/dist/utils/adminEntitySettings.js.map +0 -1
  353. package/dist/utils/createApiKeyFields.d.ts +0 -15
  354. package/dist/utils/createApiKeyFields.d.ts.map +0 -1
  355. package/dist/utils/createApiKeyFields.js +0 -57
  356. package/dist/utils/createApiKeyFields.js.map +0 -1
  357. package/dist/utils/getEnabledSlugs.d.ts +0 -13
  358. package/dist/utils/getEnabledSlugs.d.ts.map +0 -1
  359. package/dist/utils/getEnabledSlugs.js +0 -32
  360. package/dist/utils/getEnabledSlugs.js.map +0 -1
  361. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts +0 -3
  362. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts.map +0 -1
  363. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js +0 -43
  364. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js.map +0 -1
  365. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  366. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  367. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  368. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  369. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts +0 -13
  370. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts.map +0 -1
  371. package/dist/utils/schemaConversion/sanitizeJsonSchema.js +0 -56
  372. package/dist/utils/schemaConversion/sanitizeJsonSchema.js.map +0 -1
  373. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts +0 -20
  374. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts.map +0 -1
  375. package/dist/utils/schemaConversion/simplifyRelationshipFields.js +0 -53
  376. package/dist/utils/schemaConversion/simplifyRelationshipFields.js.map +0 -1
  377. package/dist/utils/schemaConversion/transformPointFields.d.ts +0 -3
  378. package/dist/utils/schemaConversion/transformPointFields.d.ts.map +0 -1
  379. package/dist/utils/schemaConversion/transformPointFields.js +0 -51
  380. package/dist/utils/schemaConversion/transformPointFields.js.map +0 -1
  381. package/src/collections/createApiKeysCollection.ts +0 -373
  382. package/src/defaults.ts +0 -3
  383. package/src/endpoints/mcp.ts +0 -91
  384. package/src/mcp/createRequest.ts +0 -13
  385. package/src/mcp/getMcpHandler.ts +0 -545
  386. package/src/mcp/helpers/config.ts +0 -213
  387. package/src/mcp/helpers/fields.ts +0 -154
  388. package/src/mcp/helpers/fileValidation.ts +0 -362
  389. package/src/mcp/registerTool.ts +0 -22
  390. package/src/mcp/tools/auth/auth.ts +0 -71
  391. package/src/mcp/tools/auth/forgotPassword.ts +0 -70
  392. package/src/mcp/tools/auth/login.ts +0 -72
  393. package/src/mcp/tools/auth/resetPassword.ts +0 -61
  394. package/src/mcp/tools/auth/unlock.ts +0 -64
  395. package/src/mcp/tools/auth/verify.ts +0 -57
  396. package/src/mcp/tools/collection/create.ts +0 -210
  397. package/src/mcp/tools/collection/delete.ts +0 -211
  398. package/src/mcp/tools/collection/find.ts +0 -224
  399. package/src/mcp/tools/collection/update.ts +0 -290
  400. package/src/mcp/tools/config/find.ts +0 -128
  401. package/src/mcp/tools/config/update.ts +0 -280
  402. package/src/mcp/tools/global/find.ts +0 -128
  403. package/src/mcp/tools/global/update.ts +0 -207
  404. package/src/mcp/tools/job/create.ts +0 -416
  405. package/src/mcp/tools/job/run.ts +0 -167
  406. package/src/mcp/tools/job/update.ts +0 -274
  407. package/src/mcp/tools/resource/create.ts +0 -211
  408. package/src/mcp/tools/resource/delete.ts +0 -218
  409. package/src/mcp/tools/resource/find.ts +0 -246
  410. package/src/mcp/tools/resource/update.ts +0 -383
  411. package/src/mcp/tools/schemas.ts +0 -520
  412. package/src/utils/adminEntitySettings.ts +0 -40
  413. package/src/utils/createApiKeyFields.ts +0 -72
  414. package/src/utils/getEnabledSlugs.ts +0 -42
  415. package/src/utils/schemaConversion/convertCollectionSchemaToZod.ts +0 -52
  416. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
  417. package/src/utils/schemaConversion/sanitizeJsonSchema.ts +0 -62
  418. package/src/utils/schemaConversion/simplifyRelationshipFields.ts +0 -65
  419. package/src/utils/schemaConversion/transformPointFields.ts +0 -55
@@ -0,0 +1,264 @@
1
+ import { McpServer, type ServerContext } from '@modelcontextprotocol/server'
2
+ import { APIError, type PayloadRequest } from 'payload'
3
+ import { z } from 'zod'
4
+
5
+ import type {
6
+ AuthorizedMCP,
7
+ CollectionMCPItem,
8
+ GlobalMCPItem,
9
+ JsonSchemaType,
10
+ MCPResponseOverride,
11
+ MCPToolResponse,
12
+ SanitizedMCPPluginConfig,
13
+ ToolInputSchema,
14
+ } from '../types.js'
15
+
16
+ import { getLogger } from '../utils/getLogger.js'
17
+ import { toStandardSchema } from '../utils/toStandardSchema.js'
18
+
19
+ /**
20
+ * Transport-agnostic core: registers every authorized MCP item onto a fresh
21
+ * `McpServer` and returns it. The caller is responsible for picking a transport
22
+ * (`WebStandardStreamableHTTPServerTransport`, `StdioServerTransport`, …) and
23
+ * calling `server.connect(transport)`.
24
+ *
25
+ * `req` is the request context handlers see. For HTTP it's the live
26
+ * `PayloadRequest` derived from the incoming HTTP request; for stdio it's a
27
+ * synthesized one built via `createLocalReq`.
28
+ */
29
+ export const buildMcpServer = ({
30
+ authorizedMCP,
31
+ pluginConfig,
32
+ req,
33
+ }: {
34
+ authorizedMCP: AuthorizedMCP
35
+ pluginConfig: SanitizedMCPPluginConfig
36
+ req: PayloadRequest
37
+ }): McpServer => {
38
+ const serverOptions = pluginConfig.mcp?.serverOptions || {}
39
+ const server = new McpServer(
40
+ { name: 'Payload MCP Server', version: '1.0.0', ...serverOptions.serverInfo },
41
+ serverOptions.options,
42
+ )
43
+
44
+ const logger = getLogger({ payload: req.payload })
45
+
46
+ /**
47
+ * Wrap a tool handler's response with the tool's `overrideResponse`, then
48
+ * strip the internal `doc` field so it doesn't leak onto the wire.
49
+ */
50
+ const finalizeToolResponse = (
51
+ response: MCPToolResponse,
52
+ overrideResponse?: MCPResponseOverride,
53
+ ): MCPToolResponse => {
54
+ const overridden = overrideResponse?.(response, response.doc ?? {}, req) ?? response
55
+ const { doc: _doc, ...rest } = overridden
56
+ return rest
57
+ }
58
+
59
+ /**
60
+ * Runs a collection/global tool call:
61
+ * - reads `collectionSlug` / `globalSlug` from the input
62
+ * - runs access control: errors if `authorizedMCP.items` has no entry for this tool + slug
63
+ * - runs the tool handler and finalizes its response
64
+ */
65
+ const callEntityTool = async ({
66
+ input,
67
+ item,
68
+ serverContext,
69
+ }: {
70
+ input: unknown
71
+ item: CollectionMCPItem | GlobalMCPItem
72
+ serverContext: ServerContext
73
+ }): Promise<MCPToolResponse> => {
74
+ const entity = item.type === 'collectionTool' ? 'collection' : 'global'
75
+ const slugKey = item.type === 'collectionTool' ? 'collectionSlug' : 'globalSlug'
76
+ const toolInput = (input ?? {}) as Record<string, unknown>
77
+ const slug = toolInput[slugKey] as string | undefined
78
+
79
+ if (!slug) {
80
+ return {
81
+ content: [
82
+ {
83
+ type: 'text',
84
+ text: `Error: "${item.mcpName}" requires ${slugKey}. Use getConfigInfo to inspect ${entity} slugs.`,
85
+ },
86
+ ],
87
+ isError: true,
88
+ }
89
+ }
90
+
91
+ const match = authorizedMCP.items.find(
92
+ (candidate): candidate is CollectionMCPItem | GlobalMCPItem =>
93
+ candidate.type === item.type &&
94
+ candidate.mcpName === item.mcpName &&
95
+ (candidate.type === 'collectionTool'
96
+ ? candidate.collectionSlug === slug
97
+ : candidate.type === 'globalTool' && candidate.globalSlug === slug),
98
+ )
99
+
100
+ if (!match) {
101
+ return {
102
+ content: [
103
+ {
104
+ type: 'text',
105
+ text: `Error: MCP access to "${item.mcpName}" is not enabled for ${entity} "${slug}"`,
106
+ },
107
+ ],
108
+ isError: true,
109
+ }
110
+ }
111
+
112
+ const handlerArgs = {
113
+ authorizedMCP,
114
+ input: toolInput,
115
+ req,
116
+ serverContext,
117
+ }
118
+ const response = await (match.type === 'collectionTool'
119
+ ? match.tool.handler({ ...handlerArgs, collectionSlug: slug })
120
+ : match.tool.handler({ ...handlerArgs, globalSlug: slug }))
121
+
122
+ return finalizeToolResponse(response, match.tool.overrideResponse)
123
+ }
124
+
125
+ try {
126
+ const registeredEntityTools = new Set<string>()
127
+
128
+ for (const item of authorizedMCP.items) {
129
+ switch (item.type) {
130
+ case 'collectionTool':
131
+ case 'globalTool': {
132
+ if (registeredEntityTools.has(item.mcpName)) {
133
+ break
134
+ }
135
+ registeredEntityTools.add(item.mcpName)
136
+
137
+ const inputSchema = withSlugInput({
138
+ name: item.type === 'collectionTool' ? 'collectionSlug' : 'globalSlug',
139
+ input: item.tool.input,
140
+ })
141
+
142
+ server.registerTool(
143
+ item.mcpName,
144
+ {
145
+ annotations: item.tool.annotations,
146
+ description: item.tool.description,
147
+ inputSchema: toStandardSchema(inputSchema),
148
+ },
149
+ async (input: unknown, ctx: ServerContext) =>
150
+ callEntityTool({ input, item, serverContext: ctx }),
151
+ )
152
+ logger.info(`✅ Tool: ${item.mcpName} Registered.`)
153
+ break
154
+ }
155
+ case 'prompt': {
156
+ const prompt = item.prompt
157
+ server.registerPrompt(
158
+ item.mcpName,
159
+ {
160
+ argsSchema: prompt.argsSchema ? toStandardSchema(prompt.argsSchema) : undefined,
161
+ description: prompt.description,
162
+ title: prompt.title,
163
+ },
164
+ async (input: unknown, ctx: ServerContext) =>
165
+ prompt.handler({
166
+ input: (input ?? {}) as Record<string, unknown>,
167
+ req,
168
+ serverContext: ctx,
169
+ }),
170
+ )
171
+ logger.info(`✅ Prompt: ${prompt.title} Registered.`)
172
+ break
173
+ }
174
+ case 'resource': {
175
+ const resource = item.resource
176
+ server.registerResource(
177
+ item.mcpName,
178
+ // @ts-expect-error - Overload type ambiguity (string OR ResourceTemplate is valid)
179
+ resource.uri,
180
+ {
181
+ description: resource.description,
182
+ mimeType: resource.mimeType,
183
+ title: resource.title,
184
+ },
185
+ // Static URIs call (uri, ctx); ResourceTemplates call (uri, params, ctx).
186
+ // The rest-params shape lets us collect either signature uniformly.
187
+ async (...sdkArgs: unknown[]) => {
188
+ const ctx = sdkArgs[sdkArgs.length - 1] as ServerContext
189
+ const uri = sdkArgs[0] as URL
190
+ const params = (sdkArgs.length > 2 ? sdkArgs[1] : {}) as Record<string, string>
191
+ return resource.handler({ params, req, serverContext: ctx, uri })
192
+ },
193
+ )
194
+ logger.info(`✅ Resource: ${resource.title} Registered.`)
195
+ break
196
+ }
197
+ case 'tool': {
198
+ const tool = item.tool
199
+ server.registerTool(
200
+ item.mcpName,
201
+ {
202
+ annotations: tool.annotations,
203
+ description: tool.description,
204
+ inputSchema: tool.input ? toStandardSchema(tool.input) : undefined,
205
+ },
206
+ async (input: unknown, ctx: ServerContext) =>
207
+ finalizeToolResponse(
208
+ await tool.handler({
209
+ authorizedMCP,
210
+ input: (input ?? {}) as Record<string, unknown>,
211
+ req,
212
+ serverContext: ctx,
213
+ }),
214
+ tool.overrideResponse,
215
+ ),
216
+ )
217
+ logger.info(`✅ Tool: ${item.mcpName} Registered.`)
218
+ break
219
+ }
220
+ }
221
+ }
222
+ } catch (error) {
223
+ throw new APIError(`Error initializing MCP handler: ${String(error)}`, 500)
224
+ }
225
+
226
+ return server
227
+ }
228
+
229
+ const withSlugInput = ({
230
+ name,
231
+ input,
232
+ }: {
233
+ input?: ToolInputSchema
234
+ name: 'collectionSlug' | 'globalSlug'
235
+ }): ToolInputSchema => {
236
+ const description = name === 'collectionSlug' ? 'The collection slug' : 'The global slug'
237
+ const slugSchema = z.string().describe(description)
238
+
239
+ if (!input) {
240
+ return z.object({ [name]: slugSchema })
241
+ }
242
+
243
+ if (input instanceof z.ZodObject) {
244
+ return input.extend({ [name]: slugSchema })
245
+ }
246
+
247
+ const schema = input as {
248
+ properties?: Record<string, JsonSchemaType>
249
+ required?: string[]
250
+ } & JsonSchemaType
251
+
252
+ return {
253
+ ...schema,
254
+ type: 'object',
255
+ properties: {
256
+ ...schema.properties,
257
+ [name]: {
258
+ type: 'string',
259
+ description,
260
+ },
261
+ },
262
+ required: Array.from(new Set([name, ...(schema.required ?? [])])),
263
+ }
264
+ }
@@ -0,0 +1,269 @@
1
+ import { z } from 'zod'
2
+
3
+ import type { MCPToolResponse } from '../../../types.js'
4
+
5
+ import { defineCollectionTool } from '../../../defineTool.js'
6
+ import { getLogger } from '../../../utils/getLogger.js'
7
+
8
+ /**
9
+ * Auth tools surfaced under `collections.<auth-collection>.tools`. Opt-in: they
10
+ * default off (an LLM with `login` access can probe passwords; not something
11
+ * to expose by default). Enable in plugin config via `tools: { login: true }`
12
+ * (or `{ description: '...' }`).
13
+ *
14
+ * `auth` (check current token) doesn't actually depend on the collection at
15
+ * runtime — `payload.auth({ headers })` is global — but it's grouped under the
16
+ * users collection so all auth-shaped tools live in one place.
17
+ */
18
+
19
+ const emailSchema = z.string().email().describe('The user email address')
20
+
21
+ const wrapError =
22
+ (name: string) =>
23
+ ({ collectionSlug, message }: { collectionSlug: string; message: string }): MCPToolResponse => {
24
+ return {
25
+ content: [
26
+ {
27
+ type: 'text',
28
+ text: `❌ **Error in ${name}** on ${collectionSlug}: ${message}`,
29
+ },
30
+ ],
31
+ }
32
+ }
33
+
34
+ export const authCollectionTool = defineCollectionTool({
35
+ annotations: {
36
+ destructiveHint: false,
37
+ idempotentHint: true,
38
+ openWorldHint: false,
39
+ readOnlyHint: true,
40
+ title: 'Check Auth Status',
41
+ },
42
+ description: 'Checks authentication status for the current user.',
43
+ input: z.object({
44
+ headers: z
45
+ .record(z.string(), z.string())
46
+ .describe('Optional custom headers to send with the authentication request')
47
+ .optional(),
48
+ }),
49
+ }).handler(async ({ collectionSlug, input, req }) => {
50
+ const logger = getLogger({ payload: req.payload })
51
+ try {
52
+ let authHeaders = new Headers()
53
+ if (input.headers) {
54
+ authHeaders = new Headers(input.headers)
55
+ }
56
+ const result = await req.payload.auth({ headers: authHeaders })
57
+ return {
58
+ content: [
59
+ {
60
+ type: 'text',
61
+ text: `# Authentication Status\n\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
62
+ },
63
+ ],
64
+ doc: result as unknown as Record<string, unknown>,
65
+ }
66
+ } catch (error) {
67
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error'
68
+ logger.error(`Error in auth tool on ${collectionSlug}: ${errorMessage}`)
69
+ return wrapError('auth')({ collectionSlug, message: errorMessage })
70
+ }
71
+ })
72
+
73
+ export const forgotPasswordCollectionTool = defineCollectionTool({
74
+ annotations: {
75
+ destructiveHint: false,
76
+ idempotentHint: false,
77
+ openWorldHint: true,
78
+ readOnlyHint: false,
79
+ title: 'Forgot Password',
80
+ },
81
+ description: 'Sends a password reset email to a user.',
82
+ input: z.object({
83
+ disableEmail: z
84
+ .boolean()
85
+ .describe('Whether to disable sending the email (for testing)')
86
+ .optional()
87
+ .default(false),
88
+ email: emailSchema,
89
+ }),
90
+ }).handler(async ({ collectionSlug, input, req }) => {
91
+ const logger = getLogger({ payload: req.payload })
92
+ try {
93
+ const result = await req.payload.forgotPassword({
94
+ collection: collectionSlug,
95
+ data: { email: input.email },
96
+ disableEmail: input.disableEmail,
97
+ })
98
+ return {
99
+ content: [
100
+ {
101
+ type: 'text',
102
+ text: `# Forgot Password Email Sent\n\n**Collection:** ${collectionSlug}\n**Email:** ${input.email}\n\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
103
+ },
104
+ ],
105
+ doc: { result } as Record<string, unknown>,
106
+ }
107
+ } catch (error) {
108
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error'
109
+ logger.error(`Error in forgotPassword tool on ${collectionSlug}: ${errorMessage}`)
110
+ return wrapError('forgotPassword')({ collectionSlug, message: errorMessage })
111
+ }
112
+ })
113
+
114
+ export const loginCollectionTool = defineCollectionTool({
115
+ annotations: {
116
+ destructiveHint: false,
117
+ idempotentHint: false,
118
+ openWorldHint: false,
119
+ readOnlyHint: false,
120
+ title: 'User Login',
121
+ },
122
+ description: 'Authenticates a user with email and password.',
123
+ input: z.object({
124
+ depth: z
125
+ .number()
126
+ .int()
127
+ .min(0)
128
+ .max(10)
129
+ .describe('Depth of population for relationships')
130
+ .optional()
131
+ .default(0),
132
+ email: emailSchema,
133
+ password: z.string().describe('The user password'),
134
+ showHiddenFields: z
135
+ .boolean()
136
+ .describe('Whether to show hidden fields in the response')
137
+ .optional()
138
+ .default(false),
139
+ }),
140
+ }).handler(async ({ collectionSlug, input, req }) => {
141
+ const logger = getLogger({ payload: req.payload })
142
+ try {
143
+ const result = await req.payload.login({
144
+ collection: collectionSlug,
145
+ data: { email: input.email, password: input.password },
146
+ depth: input.depth,
147
+ showHiddenFields: input.showHiddenFields,
148
+ })
149
+ return {
150
+ content: [
151
+ {
152
+ type: 'text',
153
+ text: `# Login Successful\n\n**User:** ${input.email}\n**Collection:** ${collectionSlug}\n\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
154
+ },
155
+ ],
156
+ doc: result as unknown as Record<string, unknown>,
157
+ }
158
+ } catch (error) {
159
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error'
160
+ logger.error(`Error in login tool on ${collectionSlug}: ${errorMessage}`)
161
+ return wrapError('login')({ collectionSlug, message: errorMessage })
162
+ }
163
+ })
164
+
165
+ export const resetPasswordCollectionTool = defineCollectionTool({
166
+ annotations: {
167
+ destructiveHint: false,
168
+ idempotentHint: false,
169
+ openWorldHint: false,
170
+ readOnlyHint: false,
171
+ title: 'Reset Password',
172
+ },
173
+ description: 'Resets a user password with a reset token.',
174
+ input: z.object({
175
+ password: z.string().describe('The new password for the user'),
176
+ token: z.string().describe('The password reset token sent to the user email'),
177
+ }),
178
+ }).handler(async ({ collectionSlug, input, req }) => {
179
+ const logger = getLogger({ payload: req.payload })
180
+ try {
181
+ const result = await req.payload.resetPassword({
182
+ collection: collectionSlug,
183
+ data: { password: input.password, token: input.token },
184
+ overrideAccess: true,
185
+ })
186
+ return {
187
+ content: [
188
+ {
189
+ type: 'text',
190
+ text: `# Password Reset Successful\n\n**Collection:** ${collectionSlug}\n\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
191
+ },
192
+ ],
193
+ doc: result as unknown as Record<string, unknown>,
194
+ }
195
+ } catch (error) {
196
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error'
197
+ logger.error(`Error in resetPassword tool on ${collectionSlug}: ${errorMessage}`)
198
+ return wrapError('resetPassword')({ collectionSlug, message: errorMessage })
199
+ }
200
+ })
201
+
202
+ export const unlockCollectionTool = defineCollectionTool({
203
+ annotations: {
204
+ destructiveHint: false,
205
+ idempotentHint: true,
206
+ openWorldHint: false,
207
+ readOnlyHint: false,
208
+ title: 'Unlock Account',
209
+ },
210
+ description: 'Unlocks a user account that has been locked due to failed login attempts.',
211
+ input: z.object({ email: emailSchema }),
212
+ }).handler(async ({ collectionSlug, input, req }) => {
213
+ const logger = getLogger({ payload: req.payload })
214
+ try {
215
+ const result = await req.payload.unlock({
216
+ collection: collectionSlug,
217
+ data: { email: input.email },
218
+ overrideAccess: true,
219
+ })
220
+ return {
221
+ content: [
222
+ {
223
+ type: 'text',
224
+ text: `# Account Unlocked\n\n**Collection:** ${collectionSlug}\n**Email:** ${input.email}\n**Result:** ${result ? 'Success' : 'Failed'}`,
225
+ },
226
+ ],
227
+ doc: { result } as Record<string, unknown>,
228
+ }
229
+ } catch (error) {
230
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error'
231
+ logger.error(`Error in unlock tool on ${collectionSlug}: ${errorMessage}`)
232
+ return wrapError('unlock')({ collectionSlug, message: errorMessage })
233
+ }
234
+ })
235
+
236
+ export const verifyCollectionTool = defineCollectionTool({
237
+ annotations: {
238
+ destructiveHint: false,
239
+ idempotentHint: false,
240
+ openWorldHint: false,
241
+ readOnlyHint: false,
242
+ title: 'Email Verification',
243
+ },
244
+ description: 'Verifies a user email with a verification token.',
245
+ input: z.object({
246
+ token: z.string().describe('The verification token sent to the user email'),
247
+ }),
248
+ }).handler(async ({ collectionSlug, input, req }) => {
249
+ const logger = getLogger({ payload: req.payload })
250
+ try {
251
+ const result = await req.payload.verifyEmail({
252
+ collection: collectionSlug,
253
+ token: input.token,
254
+ })
255
+ return {
256
+ content: [
257
+ {
258
+ type: 'text',
259
+ text: `# Email Verification Successful\n\n**Collection:** ${collectionSlug}\n**Result:** ${result ? 'Success' : 'Failed'}`,
260
+ },
261
+ ],
262
+ doc: { result } as Record<string, unknown>,
263
+ }
264
+ } catch (error) {
265
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error'
266
+ logger.error(`Error in verify tool on ${collectionSlug}: ${errorMessage}`)
267
+ return wrapError('verify')({ collectionSlug, message: errorMessage })
268
+ }
269
+ })
@@ -0,0 +1,74 @@
1
+ import { z } from 'zod'
2
+
3
+ import { defaultAccess } from '../../../defaultAccess.js'
4
+ import { defineCollectionTool } from '../../../defineTool.js'
5
+ import { getLogger } from '../../../utils/getLogger.js'
6
+ import { localAPIDefaults } from '../../../utils/localAPIDefaults.js'
7
+ import { whereSchema } from '../../../utils/whereSchema.js'
8
+
9
+ const DEFAULT_DESCRIPTION =
10
+ 'Count documents in any collection by passing the collection slug and optional where clause.'
11
+
12
+ export const countDocumentsTool = defineCollectionTool({
13
+ access: (args) =>
14
+ defaultAccess(args) && Boolean(args.permissions?.collections?.[args.collectionSlug]?.read),
15
+ annotations: {
16
+ destructiveHint: false,
17
+ idempotentHint: true,
18
+ openWorldHint: false,
19
+ readOnlyHint: true,
20
+ title: 'Count Documents',
21
+ },
22
+ description: DEFAULT_DESCRIPTION,
23
+ input: z.object({
24
+ locale: z.string().describe('Optional: locale code to count documents in').optional(),
25
+ trash: z
26
+ .boolean()
27
+ .describe('Optional: include soft-deleted documents when trash is enabled on the collection')
28
+ .optional(),
29
+ where: whereSchema
30
+ .describe(
31
+ 'Optional: where clause for filtering. Use field names with Payload operators, and/or arrays for grouping. Example: {"title":{"contains":"test"}}',
32
+ )
33
+ .optional(),
34
+ }),
35
+ }).handler(async ({ authorizedMCP, collectionSlug, input, req }) => {
36
+ const payload = req.payload
37
+ const logger = getLogger({ payload })
38
+ const { locale, trash, where } = input
39
+
40
+ logger.info(`Counting documents in collection: ${collectionSlug}`)
41
+
42
+ try {
43
+ const result = await payload.count({
44
+ collection: collectionSlug,
45
+ req,
46
+ ...localAPIDefaults(authorizedMCP),
47
+ ...(locale ? { locale } : {}),
48
+ ...(trash !== undefined ? { trash } : {}),
49
+ ...(where ? { where } : {}),
50
+ })
51
+
52
+ return {
53
+ content: [
54
+ {
55
+ type: 'text',
56
+ text: `Collection "${collectionSlug}" contains ${result.totalDocs} matching documents.\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
57
+ },
58
+ ],
59
+ doc: result,
60
+ }
61
+ } catch (error) {
62
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error'
63
+ logger.error(`Error counting documents in ${collectionSlug}: ${errorMessage}`)
64
+ return {
65
+ content: [
66
+ {
67
+ type: 'text',
68
+ text: `❌ **Error counting documents in collection "${collectionSlug}":** ${errorMessage}`,
69
+ },
70
+ ],
71
+ isError: true,
72
+ }
73
+ }
74
+ })
@@ -0,0 +1,70 @@
1
+ import { z } from 'zod'
2
+
3
+ import { defaultAccess } from '../../../defaultAccess.js'
4
+ import { defineCollectionTool } from '../../../defineTool.js'
5
+ import { getLogger } from '../../../utils/getLogger.js'
6
+ import { localAPIDefaults } from '../../../utils/localAPIDefaults.js'
7
+ import { whereSchema } from '../../../utils/whereSchema.js'
8
+
9
+ const DEFAULT_DESCRIPTION =
10
+ 'Count document versions in any version-enabled collection by passing the collection slug and optional where clause.'
11
+
12
+ export const countVersionsTool = defineCollectionTool({
13
+ access: (args) =>
14
+ defaultAccess(args) &&
15
+ Boolean(args.permissions?.collections?.[args.collectionSlug]?.readVersions),
16
+ annotations: {
17
+ destructiveHint: false,
18
+ idempotentHint: true,
19
+ openWorldHint: false,
20
+ readOnlyHint: true,
21
+ title: 'Count Versions',
22
+ },
23
+ description: DEFAULT_DESCRIPTION,
24
+ input: z.object({
25
+ locale: z.string().describe('Optional: locale code to count versions in').optional(),
26
+ where: whereSchema
27
+ .describe(
28
+ 'Optional: where clause for filtering versions. Version document fields are usually under "version". Example: {"version.title":{"contains":"test"}}',
29
+ )
30
+ .optional(),
31
+ }),
32
+ }).handler(async ({ authorizedMCP, collectionSlug, input, req }) => {
33
+ const payload = req.payload
34
+ const logger = getLogger({ payload })
35
+ const { locale, where } = input
36
+
37
+ logger.info(`Counting versions in collection: ${collectionSlug}`)
38
+
39
+ try {
40
+ const result = await payload.countVersions({
41
+ collection: collectionSlug,
42
+ req,
43
+ ...localAPIDefaults(authorizedMCP),
44
+ ...(locale ? { locale } : {}),
45
+ ...(where ? { where } : {}),
46
+ })
47
+
48
+ return {
49
+ content: [
50
+ {
51
+ type: 'text',
52
+ text: `Collection "${collectionSlug}" contains ${result.totalDocs} matching versions.\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
53
+ },
54
+ ],
55
+ doc: result,
56
+ }
57
+ } catch (error) {
58
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error'
59
+ logger.error(`Error counting versions in ${collectionSlug}: ${errorMessage}`)
60
+ return {
61
+ content: [
62
+ {
63
+ type: 'text',
64
+ text: `❌ **Error counting versions in collection "${collectionSlug}":** ${errorMessage}`,
65
+ },
66
+ ],
67
+ isError: true,
68
+ }
69
+ }
70
+ })