@payloadcms/plugin-mcp 4.0.0-internal.d28e9fb → 4.0.0-internal.d3909a9

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 (409) hide show
  1. package/LICENSE.md +1 -1
  2. package/bin.js +39 -0
  3. package/dist/defaultAccess.d.ts +3 -0
  4. package/dist/defaultAccess.d.ts.map +1 -0
  5. package/dist/defaultAccess.js +3 -0
  6. package/dist/defaultAccess.js.map +1 -0
  7. package/dist/defineTool.d.ts +26 -0
  8. package/dist/defineTool.d.ts.map +1 -0
  9. package/dist/defineTool.js +37 -0
  10. package/dist/defineTool.js.map +1 -0
  11. package/dist/endpoint/access.d.ts +17 -0
  12. package/dist/endpoint/access.d.ts.map +1 -0
  13. package/dist/endpoint/access.js +93 -0
  14. package/dist/endpoint/access.js.map +1 -0
  15. package/dist/endpoint/index.d.ts +3 -0
  16. package/dist/endpoint/index.d.ts.map +1 -0
  17. package/dist/endpoint/index.js +116 -0
  18. package/dist/endpoint/index.js.map +1 -0
  19. package/dist/exports/client.d.ts +2 -0
  20. package/dist/exports/client.d.ts.map +1 -0
  21. package/dist/exports/client.js +4 -0
  22. package/dist/exports/client.js.map +1 -0
  23. package/dist/exports/internal.d.ts +2 -0
  24. package/dist/exports/internal.d.ts.map +1 -0
  25. package/dist/exports/internal.js +3 -0
  26. package/dist/exports/internal.js.map +1 -0
  27. package/dist/index.d.ts +6 -9
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +39 -67
  30. package/dist/index.js.map +1 -1
  31. package/dist/mcp/buildMcpServer.d.ts +19 -0
  32. package/dist/mcp/buildMcpServer.d.ts.map +1 -0
  33. package/dist/mcp/buildMcpServer.js +235 -0
  34. package/dist/mcp/buildMcpServer.js.map +1 -0
  35. package/dist/mcp/builtin/collections/authTools.d.ts +7 -0
  36. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -0
  37. package/dist/mcp/builtin/collections/authTools.js +312 -0
  38. package/dist/mcp/builtin/collections/authTools.js.map +1 -0
  39. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  40. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  41. package/dist/mcp/builtin/collections/countTool.js +63 -0
  42. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  43. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  44. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  45. package/dist/mcp/builtin/collections/countVersionsTool.js +60 -0
  46. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  47. package/dist/mcp/builtin/collections/createTool.d.ts +2 -0
  48. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -0
  49. package/dist/mcp/builtin/collections/createTool.js +137 -0
  50. package/dist/mcp/builtin/collections/createTool.js.map +1 -0
  51. package/dist/mcp/builtin/collections/deleteTool.d.ts +2 -0
  52. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -0
  53. package/dist/mcp/builtin/collections/deleteTool.js +111 -0
  54. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -0
  55. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  56. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  57. package/dist/mcp/builtin/collections/duplicateTool.js +90 -0
  58. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  59. package/dist/mcp/builtin/collections/fileInput.d.ts +28 -0
  60. package/dist/mcp/builtin/collections/fileInput.d.ts.map +1 -0
  61. package/dist/mcp/builtin/collections/fileInput.js +88 -0
  62. package/dist/mcp/builtin/collections/fileInput.js.map +1 -0
  63. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  64. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  65. package/dist/mcp/builtin/collections/findDistinctTool.js +77 -0
  66. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  67. package/dist/mcp/builtin/collections/findTool.d.ts +2 -0
  68. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -0
  69. package/dist/mcp/builtin/collections/findTool.js +146 -0
  70. package/dist/mcp/builtin/collections/findTool.js.map +1 -0
  71. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  72. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  73. package/dist/mcp/builtin/collections/findVersionByIDTool.js +74 -0
  74. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  75. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  76. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  77. package/dist/mcp/builtin/collections/findVersionsTool.js +84 -0
  78. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  79. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts +2 -0
  80. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -0
  81. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +103 -0
  82. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -0
  83. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  84. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  85. package/dist/mcp/builtin/collections/restoreVersionTool.js +69 -0
  86. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  87. package/dist/mcp/builtin/collections/updateTool.d.ts +2 -0
  88. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -0
  89. package/dist/mcp/builtin/collections/updateTool.js +172 -0
  90. package/dist/mcp/builtin/collections/updateTool.js.map +1 -0
  91. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts +2 -0
  92. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts.map +1 -0
  93. package/dist/mcp/builtin/collections/uploadInstructionsTool.js +55 -0
  94. package/dist/mcp/builtin/collections/uploadInstructionsTool.js.map +1 -0
  95. package/dist/mcp/builtin/formatEntityError.d.ts +16 -0
  96. package/dist/mcp/builtin/formatEntityError.d.ts.map +1 -0
  97. package/dist/mcp/builtin/formatEntityError.js +55 -0
  98. package/dist/mcp/builtin/formatEntityError.js.map +1 -0
  99. package/dist/mcp/builtin/getConfigInfoTool.d.ts +2 -0
  100. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -0
  101. package/dist/mcp/builtin/getConfigInfoTool.js +69 -0
  102. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -0
  103. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  104. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  105. package/dist/mcp/builtin/globals/countVersionsTool.js +60 -0
  106. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  107. package/dist/mcp/builtin/globals/findTool.d.ts +2 -0
  108. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -0
  109. package/dist/mcp/builtin/globals/findTool.js +67 -0
  110. package/dist/mcp/builtin/globals/findTool.js.map +1 -0
  111. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  112. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  113. package/dist/mcp/builtin/globals/findVersionByIDTool.js +68 -0
  114. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  115. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  116. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  117. package/dist/mcp/builtin/globals/findVersionsTool.js +78 -0
  118. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  119. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts +2 -0
  120. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -0
  121. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +81 -0
  122. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -0
  123. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  124. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  125. package/dist/mcp/builtin/globals/restoreVersionTool.js +70 -0
  126. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  127. package/dist/mcp/builtin/globals/updateTool.d.ts +2 -0
  128. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -0
  129. package/dist/mcp/builtin/globals/updateTool.js +78 -0
  130. package/dist/mcp/builtin/globals/updateTool.js.map +1 -0
  131. package/dist/mcp/builtinTools.d.ts +168 -0
  132. package/dist/mcp/builtinTools.d.ts.map +1 -0
  133. package/dist/mcp/builtinTools.js +169 -0
  134. package/dist/mcp/builtinTools.js.map +1 -0
  135. package/dist/mcp/sanitizeMCPConfig.d.ts +16 -0
  136. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -0
  137. package/dist/mcp/sanitizeMCPConfig.js +233 -0
  138. package/dist/mcp/sanitizeMCPConfig.js.map +1 -0
  139. package/dist/stdio.d.ts +8 -0
  140. package/dist/stdio.d.ts.map +1 -0
  141. package/dist/stdio.js +128 -0
  142. package/dist/stdio.js.map +1 -0
  143. package/dist/types.d.ts +263 -447
  144. package/dist/types.d.ts.map +1 -1
  145. package/dist/types.js +4 -1
  146. package/dist/types.js.map +1 -1
  147. package/dist/utils/getLogger.d.ts +10 -0
  148. package/dist/utils/getLogger.d.ts.map +1 -0
  149. package/dist/utils/getLogger.js +22 -0
  150. package/dist/utils/getLogger.js.map +1 -0
  151. package/dist/utils/getPluginConfig.d.ts +12 -0
  152. package/dist/utils/getPluginConfig.d.ts.map +1 -0
  153. package/dist/utils/getPluginConfig.js +15 -0
  154. package/dist/utils/getPluginConfig.js.map +1 -0
  155. package/dist/utils/resolveProjectRoot.d.ts +7 -0
  156. package/dist/utils/resolveProjectRoot.d.ts.map +1 -0
  157. package/dist/utils/resolveProjectRoot.js +15 -0
  158. package/dist/utils/resolveProjectRoot.js.map +1 -0
  159. package/dist/utils/toStandardSchema.d.ts +5 -0
  160. package/dist/utils/toStandardSchema.d.ts.map +1 -0
  161. package/dist/utils/toStandardSchema.js +4 -0
  162. package/dist/utils/toStandardSchema.js.map +1 -0
  163. package/package.json +41 -26
  164. package/src/defaultAccess.ts +3 -0
  165. package/src/defineTool.ts +44 -0
  166. package/src/endpoint/access.ts +111 -0
  167. package/src/endpoint/index.ts +107 -0
  168. package/src/exports/client.ts +3 -0
  169. package/src/exports/internal.ts +1 -0
  170. package/src/index.ts +31 -89
  171. package/src/mcp/buildMcpServer.ts +294 -0
  172. package/src/mcp/builtin/collections/authTools.ts +280 -0
  173. package/src/mcp/builtin/collections/countTool.ts +61 -0
  174. package/src/mcp/builtin/collections/countVersionsTool.ts +60 -0
  175. package/src/mcp/builtin/collections/createTool.ts +143 -0
  176. package/src/mcp/builtin/collections/deleteTool.ts +97 -0
  177. package/src/mcp/builtin/collections/duplicateTool.ts +84 -0
  178. package/src/mcp/builtin/collections/fileInput.spec.ts +93 -0
  179. package/src/mcp/builtin/collections/fileInput.ts +127 -0
  180. package/src/mcp/builtin/collections/findDistinctTool.ts +67 -0
  181. package/src/mcp/builtin/collections/findTool.ts +134 -0
  182. package/src/mcp/builtin/collections/findVersionByIDTool.ts +66 -0
  183. package/src/mcp/builtin/collections/findVersionsTool.ts +83 -0
  184. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +91 -0
  185. package/src/mcp/builtin/collections/restoreVersionTool.ts +65 -0
  186. package/src/mcp/builtin/collections/updateTool.ts +173 -0
  187. package/src/mcp/builtin/collections/uploadInstructionsTool.ts +64 -0
  188. package/src/mcp/builtin/formatEntityError.ts +77 -0
  189. package/src/mcp/builtin/getConfigInfoTool.ts +68 -0
  190. package/src/mcp/builtin/globals/countVersionsTool.ts +60 -0
  191. package/src/mcp/builtin/globals/findTool.ts +66 -0
  192. package/src/mcp/builtin/globals/findVersionByIDTool.ts +64 -0
  193. package/src/mcp/builtin/globals/findVersionsTool.ts +69 -0
  194. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +73 -0
  195. package/src/mcp/builtin/globals/restoreVersionTool.ts +68 -0
  196. package/src/mcp/builtin/globals/updateTool.ts +92 -0
  197. package/src/mcp/builtinTools.ts +161 -0
  198. package/src/mcp/sanitizeMCPConfig.ts +281 -0
  199. package/src/stdio.ts +131 -0
  200. package/src/types.ts +312 -486
  201. package/src/utils/getLogger.ts +22 -0
  202. package/src/utils/getPluginConfig.ts +24 -0
  203. package/src/utils/resolveProjectRoot.ts +17 -0
  204. package/src/utils/toStandardSchema.ts +9 -0
  205. package/dist/collections/createApiKeysCollection.d.ts +0 -7
  206. package/dist/collections/createApiKeysCollection.d.ts.map +0 -1
  207. package/dist/collections/createApiKeysCollection.js +0 -317
  208. package/dist/collections/createApiKeysCollection.js.map +0 -1
  209. package/dist/defaults.d.ts +0 -4
  210. package/dist/defaults.d.ts.map +0 -1
  211. package/dist/defaults.js +0 -5
  212. package/dist/defaults.js.map +0 -1
  213. package/dist/endpoints/mcp.d.ts +0 -4
  214. package/dist/endpoints/mcp.d.ts.map +0 -1
  215. package/dist/endpoints/mcp.js +0 -71
  216. package/dist/endpoints/mcp.js.map +0 -1
  217. package/dist/mcp/createRequest.d.ts +0 -3
  218. package/dist/mcp/createRequest.d.ts.map +0 -1
  219. package/dist/mcp/createRequest.js +0 -14
  220. package/dist/mcp/createRequest.js.map +0 -1
  221. package/dist/mcp/getMcpHandler.d.ts +0 -4
  222. package/dist/mcp/getMcpHandler.d.ts.map +0 -1
  223. package/dist/mcp/getMcpHandler.js +0 -231
  224. package/dist/mcp/getMcpHandler.js.map +0 -1
  225. package/dist/mcp/helpers/config.d.ts +0 -22
  226. package/dist/mcp/helpers/config.d.ts.map +0 -1
  227. package/dist/mcp/helpers/config.js +0 -153
  228. package/dist/mcp/helpers/config.js.map +0 -1
  229. package/dist/mcp/helpers/fields.d.ts +0 -19
  230. package/dist/mcp/helpers/fields.d.ts.map +0 -1
  231. package/dist/mcp/helpers/fields.js +0 -102
  232. package/dist/mcp/helpers/fields.js.map +0 -1
  233. package/dist/mcp/helpers/fileValidation.d.ts +0 -67
  234. package/dist/mcp/helpers/fileValidation.d.ts.map +0 -1
  235. package/dist/mcp/helpers/fileValidation.js +0 -267
  236. package/dist/mcp/helpers/fileValidation.js.map +0 -1
  237. package/dist/mcp/registerTool.d.ts +0 -6
  238. package/dist/mcp/registerTool.d.ts.map +0 -1
  239. package/dist/mcp/registerTool.js +0 -18
  240. package/dist/mcp/registerTool.js.map +0 -1
  241. package/dist/mcp/tools/auth/auth.d.ts +0 -4
  242. package/dist/mcp/tools/auth/auth.d.ts.map +0 -1
  243. package/dist/mcp/tools/auth/auth.js +0 -57
  244. package/dist/mcp/tools/auth/auth.js.map +0 -1
  245. package/dist/mcp/tools/auth/forgotPassword.d.ts +0 -4
  246. package/dist/mcp/tools/auth/forgotPassword.d.ts.map +0 -1
  247. package/dist/mcp/tools/auth/forgotPassword.js +0 -48
  248. package/dist/mcp/tools/auth/forgotPassword.js.map +0 -1
  249. package/dist/mcp/tools/auth/login.d.ts +0 -4
  250. package/dist/mcp/tools/auth/login.d.ts.map +0 -1
  251. package/dist/mcp/tools/auth/login.js +0 -51
  252. package/dist/mcp/tools/auth/login.js.map +0 -1
  253. package/dist/mcp/tools/auth/resetPassword.d.ts +0 -4
  254. package/dist/mcp/tools/auth/resetPassword.d.ts.map +0 -1
  255. package/dist/mcp/tools/auth/resetPassword.js +0 -49
  256. package/dist/mcp/tools/auth/resetPassword.js.map +0 -1
  257. package/dist/mcp/tools/auth/unlock.d.ts +0 -4
  258. package/dist/mcp/tools/auth/unlock.d.ts.map +0 -1
  259. package/dist/mcp/tools/auth/unlock.js +0 -48
  260. package/dist/mcp/tools/auth/unlock.js.map +0 -1
  261. package/dist/mcp/tools/auth/verify.d.ts +0 -4
  262. package/dist/mcp/tools/auth/verify.d.ts.map +0 -1
  263. package/dist/mcp/tools/auth/verify.js +0 -45
  264. package/dist/mcp/tools/auth/verify.js.map +0 -1
  265. package/dist/mcp/tools/collection/create.d.ts +0 -10
  266. package/dist/mcp/tools/collection/create.d.ts.map +0 -1
  267. package/dist/mcp/tools/collection/create.js +0 -139
  268. package/dist/mcp/tools/collection/create.js.map +0 -1
  269. package/dist/mcp/tools/collection/delete.d.ts +0 -10
  270. package/dist/mcp/tools/collection/delete.d.ts.map +0 -1
  271. package/dist/mcp/tools/collection/delete.js +0 -154
  272. package/dist/mcp/tools/collection/delete.js.map +0 -1
  273. package/dist/mcp/tools/collection/find.d.ts +0 -10
  274. package/dist/mcp/tools/collection/find.d.ts.map +0 -1
  275. package/dist/mcp/tools/collection/find.js +0 -165
  276. package/dist/mcp/tools/collection/find.js.map +0 -1
  277. package/dist/mcp/tools/collection/update.d.ts +0 -10
  278. package/dist/mcp/tools/collection/update.d.ts.map +0 -1
  279. package/dist/mcp/tools/collection/update.js +0 -209
  280. package/dist/mcp/tools/collection/update.js.map +0 -1
  281. package/dist/mcp/tools/config/find.d.ts +0 -10
  282. package/dist/mcp/tools/config/find.d.ts.map +0 -1
  283. package/dist/mcp/tools/config/find.js +0 -97
  284. package/dist/mcp/tools/config/find.js.map +0 -1
  285. package/dist/mcp/tools/config/update.d.ts +0 -10
  286. package/dist/mcp/tools/config/update.d.ts.map +0 -1
  287. package/dist/mcp/tools/config/update.js +0 -215
  288. package/dist/mcp/tools/config/update.js.map +0 -1
  289. package/dist/mcp/tools/global/find.d.ts +0 -5
  290. package/dist/mcp/tools/global/find.d.ts.map +0 -1
  291. package/dist/mcp/tools/global/find.js +0 -82
  292. package/dist/mcp/tools/global/find.js.map +0 -1
  293. package/dist/mcp/tools/global/update.d.ts +0 -6
  294. package/dist/mcp/tools/global/update.d.ts.map +0 -1
  295. package/dist/mcp/tools/global/update.js +0 -124
  296. package/dist/mcp/tools/global/update.js.map +0 -1
  297. package/dist/mcp/tools/job/create.d.ts +0 -10
  298. package/dist/mcp/tools/job/create.d.ts.map +0 -1
  299. package/dist/mcp/tools/job/create.js +0 -293
  300. package/dist/mcp/tools/job/create.js.map +0 -1
  301. package/dist/mcp/tools/job/run.d.ts +0 -10
  302. package/dist/mcp/tools/job/run.d.ts.map +0 -1
  303. package/dist/mcp/tools/job/run.js +0 -129
  304. package/dist/mcp/tools/job/run.js.map +0 -1
  305. package/dist/mcp/tools/job/update.d.ts +0 -11
  306. package/dist/mcp/tools/job/update.d.ts.map +0 -1
  307. package/dist/mcp/tools/job/update.js +0 -186
  308. package/dist/mcp/tools/job/update.js.map +0 -1
  309. package/dist/mcp/tools/resource/create.d.ts +0 -6
  310. package/dist/mcp/tools/resource/create.d.ts.map +0 -1
  311. package/dist/mcp/tools/resource/create.js +0 -124
  312. package/dist/mcp/tools/resource/create.js.map +0 -1
  313. package/dist/mcp/tools/resource/delete.d.ts +0 -5
  314. package/dist/mcp/tools/resource/delete.d.ts.map +0 -1
  315. package/dist/mcp/tools/resource/delete.js +0 -151
  316. package/dist/mcp/tools/resource/delete.js.map +0 -1
  317. package/dist/mcp/tools/resource/find.d.ts +0 -5
  318. package/dist/mcp/tools/resource/find.d.ts.map +0 -1
  319. package/dist/mcp/tools/resource/find.js +0 -170
  320. package/dist/mcp/tools/resource/find.js.map +0 -1
  321. package/dist/mcp/tools/resource/update.d.ts +0 -6
  322. package/dist/mcp/tools/resource/update.d.ts.map +0 -1
  323. package/dist/mcp/tools/resource/update.js +0 -256
  324. package/dist/mcp/tools/resource/update.js.map +0 -1
  325. package/dist/mcp/tools/schemas.d.ts +0 -457
  326. package/dist/mcp/tools/schemas.d.ts.map +0 -1
  327. package/dist/mcp/tools/schemas.js +0 -243
  328. package/dist/mcp/tools/schemas.js.map +0 -1
  329. package/dist/utils/adminEntitySettings.d.ts +0 -17
  330. package/dist/utils/adminEntitySettings.d.ts.map +0 -1
  331. package/dist/utils/adminEntitySettings.js +0 -41
  332. package/dist/utils/adminEntitySettings.js.map +0 -1
  333. package/dist/utils/createApiKeyFields.d.ts +0 -15
  334. package/dist/utils/createApiKeyFields.d.ts.map +0 -1
  335. package/dist/utils/createApiKeyFields.js +0 -57
  336. package/dist/utils/createApiKeyFields.js.map +0 -1
  337. package/dist/utils/getEnabledSlugs.d.ts +0 -13
  338. package/dist/utils/getEnabledSlugs.d.ts.map +0 -1
  339. package/dist/utils/getEnabledSlugs.js +0 -32
  340. package/dist/utils/getEnabledSlugs.js.map +0 -1
  341. package/dist/utils/getVirtualFieldNames.d.ts +0 -14
  342. package/dist/utils/getVirtualFieldNames.d.ts.map +0 -1
  343. package/dist/utils/getVirtualFieldNames.js +0 -35
  344. package/dist/utils/getVirtualFieldNames.js.map +0 -1
  345. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts +0 -3
  346. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts.map +0 -1
  347. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js +0 -43
  348. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js.map +0 -1
  349. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  350. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  351. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  352. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  353. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts +0 -13
  354. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts.map +0 -1
  355. package/dist/utils/schemaConversion/sanitizeJsonSchema.js +0 -56
  356. package/dist/utils/schemaConversion/sanitizeJsonSchema.js.map +0 -1
  357. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts +0 -20
  358. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts.map +0 -1
  359. package/dist/utils/schemaConversion/simplifyRelationshipFields.js +0 -53
  360. package/dist/utils/schemaConversion/simplifyRelationshipFields.js.map +0 -1
  361. package/dist/utils/schemaConversion/transformPointFields.d.ts +0 -3
  362. package/dist/utils/schemaConversion/transformPointFields.d.ts.map +0 -1
  363. package/dist/utils/schemaConversion/transformPointFields.js +0 -51
  364. package/dist/utils/schemaConversion/transformPointFields.js.map +0 -1
  365. package/dist/utils/transformPointDataToPayload.d.ts +0 -7
  366. package/dist/utils/transformPointDataToPayload.d.ts.map +0 -1
  367. package/dist/utils/transformPointDataToPayload.js +0 -28
  368. package/dist/utils/transformPointDataToPayload.js.map +0 -1
  369. package/src/collections/createApiKeysCollection.ts +0 -373
  370. package/src/defaults.ts +0 -3
  371. package/src/endpoints/mcp.ts +0 -91
  372. package/src/mcp/createRequest.ts +0 -13
  373. package/src/mcp/getMcpHandler.ts +0 -545
  374. package/src/mcp/helpers/config.ts +0 -213
  375. package/src/mcp/helpers/fields.ts +0 -154
  376. package/src/mcp/helpers/fileValidation.ts +0 -362
  377. package/src/mcp/registerTool.ts +0 -22
  378. package/src/mcp/tools/auth/auth.ts +0 -71
  379. package/src/mcp/tools/auth/forgotPassword.ts +0 -70
  380. package/src/mcp/tools/auth/login.ts +0 -72
  381. package/src/mcp/tools/auth/resetPassword.ts +0 -61
  382. package/src/mcp/tools/auth/unlock.ts +0 -64
  383. package/src/mcp/tools/auth/verify.ts +0 -57
  384. package/src/mcp/tools/collection/create.ts +0 -210
  385. package/src/mcp/tools/collection/delete.ts +0 -211
  386. package/src/mcp/tools/collection/find.ts +0 -224
  387. package/src/mcp/tools/collection/update.ts +0 -290
  388. package/src/mcp/tools/config/find.ts +0 -128
  389. package/src/mcp/tools/config/update.ts +0 -280
  390. package/src/mcp/tools/global/find.ts +0 -128
  391. package/src/mcp/tools/global/update.ts +0 -207
  392. package/src/mcp/tools/job/create.ts +0 -416
  393. package/src/mcp/tools/job/run.ts +0 -167
  394. package/src/mcp/tools/job/update.ts +0 -274
  395. package/src/mcp/tools/resource/create.ts +0 -211
  396. package/src/mcp/tools/resource/delete.ts +0 -218
  397. package/src/mcp/tools/resource/find.ts +0 -246
  398. package/src/mcp/tools/resource/update.ts +0 -383
  399. package/src/mcp/tools/schemas.ts +0 -520
  400. package/src/utils/adminEntitySettings.ts +0 -40
  401. package/src/utils/createApiKeyFields.ts +0 -72
  402. package/src/utils/getEnabledSlugs.ts +0 -42
  403. package/src/utils/getVirtualFieldNames.ts +0 -53
  404. package/src/utils/schemaConversion/convertCollectionSchemaToZod.ts +0 -52
  405. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
  406. package/src/utils/schemaConversion/sanitizeJsonSchema.ts +0 -62
  407. package/src/utils/schemaConversion/simplifyRelationshipFields.ts +0 -65
  408. package/src/utils/schemaConversion/transformPointFields.ts +0 -55
  409. package/src/utils/transformPointDataToPayload.ts +0 -40
package/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2018-2024 Payload CMS, Inc. <info@payloadcms.com>
3
+ Copyright (c) 2018-2026 Payload CMS, LLC <info@payloadcms.com>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
package/bin.js ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * stdio MCP server for Payload.
4
+ *
5
+ * Loads the project's `payload.config.{ts,js}` (via `findConfig`), boots Payload,
6
+ * and serves MCP over stdin/stdout. Intended for local-dev MCP clients (Claude
7
+ * Desktop, IDEs) that spawn stdio MCP servers - no running Next.js dev server required.
8
+ *
9
+ * Mirrors `payload/bin.js`: by default, transpiles TS on the fly via `tsx`. Pass
10
+ * `--disable-transpile` if your config is already JS (or you've registered your
11
+ * own loader).
12
+ */
13
+ import path from 'path'
14
+ import { fileURLToPath, pathToFileURL } from 'url'
15
+
16
+ const disableTranspile = process.argv.includes('--disable-transpile')
17
+
18
+ const filename = fileURLToPath(import.meta.url)
19
+ const dirname = path.dirname(filename)
20
+ const baseURL = pathToFileURL(dirname).toString() + '/'
21
+
22
+ const start = async () => {
23
+ if (disableTranspile) {
24
+ process.argv = process.argv.filter((arg) => arg !== '--disable-transpile')
25
+ const { runMcpStdio } = await import('./dist/stdio.js')
26
+ await runMcpStdio()
27
+ return
28
+ }
29
+
30
+ const { tsImport } = await import('tsx/esm/api')
31
+ const { runMcpStdio } = await tsImport('./dist/stdio.js', baseURL)
32
+ await runMcpStdio()
33
+ }
34
+
35
+ start().catch((err) => {
36
+ // eslint-disable-next-line no-console
37
+ console.error('[payload-mcp] error:', err)
38
+ process.exit(1)
39
+ })
@@ -0,0 +1,3 @@
1
+ import type { MCPAccessArgs } from './types.js';
2
+ export declare const defaultAccess: ({ req }: MCPAccessArgs) => boolean;
3
+ //# sourceMappingURL=defaultAccess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultAccess.d.ts","sourceRoot":"","sources":["../src/defaultAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,eAAO,MAAM,aAAa,YAAa,aAAa,KAAG,OAA4B,CAAA"}
@@ -0,0 +1,3 @@
1
+ export const defaultAccess = ({ req })=>Boolean(req.user);
2
+
3
+ //# sourceMappingURL=defaultAccess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/defaultAccess.ts"],"sourcesContent":["import type { MCPAccessArgs } from './types.js'\n\nexport const defaultAccess = ({ req }: MCPAccessArgs): boolean => Boolean(req.user)\n"],"names":["defaultAccess","req","Boolean","user"],"mappings":"AAEA,OAAO,MAAMA,gBAAgB,CAAC,EAAEC,GAAG,EAAiB,GAAcC,QAAQD,IAAIE,IAAI,EAAC"}
@@ -0,0 +1,26 @@
1
+ import type { CollectionTool, GlobalTool, Prompt, Tool, ToolInputSchema } from './types.js';
2
+ /**
3
+ * Two-stage builder: pass the schema/metadata first, then chain `.handler(fn)`. Splitting the
4
+ * call lets TypeScript resolve `TSchema` from `input` (call 1) before contextually typing the
5
+ * handler (call 2). A single-call API hit a TS limitation where property order in the literal
6
+ * decided whether `TSchema` was inferred or pinned to its default.
7
+ *
8
+ * defineCollectionTool({ description, input })
9
+ * .handler(({ input }) => …) // ← input is fully typed here regardless of order
10
+ *
11
+ * Config and handler signatures are derived from `Tool` / `CollectionTool` / `GlobalTool` /
12
+ * `Prompt` via `Omit` + indexed access so there's no duplication with `types.ts`.
13
+ */
14
+ export declare const defineTool: <TSchema extends ToolInputSchema | undefined = ToolInputSchema | undefined>(args: Omit<Tool<TSchema>, 'handler'>) => {
15
+ handler: (fn: Tool<TSchema>['handler']) => Tool;
16
+ };
17
+ export declare const defineCollectionTool: <TSchema extends ToolInputSchema | undefined = ToolInputSchema | undefined>(args: Omit<CollectionTool<TSchema>, 'handler'>) => {
18
+ handler: (fn: CollectionTool<TSchema>['handler']) => CollectionTool;
19
+ };
20
+ export declare const defineGlobalTool: <TSchema extends ToolInputSchema | undefined = ToolInputSchema | undefined>(args: Omit<GlobalTool<TSchema>, 'handler'>) => {
21
+ handler: (fn: GlobalTool<TSchema>['handler']) => GlobalTool;
22
+ };
23
+ export declare const definePrompt: <TSchema extends ToolInputSchema = ToolInputSchema>(args: Omit<Prompt<TSchema>, 'handler'>) => {
24
+ handler: (fn: Prompt<TSchema>['handler']) => Prompt;
25
+ };
26
+ //# sourceMappingURL=defineTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineTool.d.ts","sourceRoot":"","sources":["../src/defineTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE3F;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,UAAU,GACrB,OAAO,SAAS,eAAe,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,QAEnE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,KACnC;IAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;CAElD,CAAA;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,SAAS,eAAe,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,QAEnE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,KAC7C;IAAE,OAAO,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,cAAc,CAAA;CAEtE,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,SAAS,eAAe,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,QAEnE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,KACzC;IAAE,OAAO,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,UAAU,CAAA;CAE9D,CAAA;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,eAAe,GAAG,eAAe,QACtE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,KACrC;IAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,MAAM,CAAA;CAEtD,CAAA"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Two-stage builder: pass the schema/metadata first, then chain `.handler(fn)`. Splitting the
3
+ * call lets TypeScript resolve `TSchema` from `input` (call 1) before contextually typing the
4
+ * handler (call 2). A single-call API hit a TS limitation where property order in the literal
5
+ * decided whether `TSchema` was inferred or pinned to its default.
6
+ *
7
+ * defineCollectionTool({ description, input })
8
+ * .handler(({ input }) => …) // ← input is fully typed here regardless of order
9
+ *
10
+ * Config and handler signatures are derived from `Tool` / `CollectionTool` / `GlobalTool` /
11
+ * `Prompt` via `Omit` + indexed access so there's no duplication with `types.ts`.
12
+ */ export const defineTool = (args)=>({
13
+ handler: (fn)=>({
14
+ ...args,
15
+ handler: fn
16
+ })
17
+ });
18
+ export const defineCollectionTool = (args)=>({
19
+ handler: (fn)=>({
20
+ ...args,
21
+ handler: fn
22
+ })
23
+ });
24
+ export const defineGlobalTool = (args)=>({
25
+ handler: (fn)=>({
26
+ ...args,
27
+ handler: fn
28
+ })
29
+ });
30
+ export const definePrompt = (args)=>({
31
+ handler: (fn)=>({
32
+ ...args,
33
+ handler: fn
34
+ })
35
+ });
36
+
37
+ //# sourceMappingURL=defineTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/defineTool.ts"],"sourcesContent":["import type { CollectionTool, GlobalTool, Prompt, Tool, ToolInputSchema } from './types.js'\n\n/**\n * Two-stage builder: pass the schema/metadata first, then chain `.handler(fn)`. Splitting the\n * call lets TypeScript resolve `TSchema` from `input` (call 1) before contextually typing the\n * handler (call 2). A single-call API hit a TS limitation where property order in the literal\n * decided whether `TSchema` was inferred or pinned to its default.\n *\n * defineCollectionTool({ description, input })\n * .handler(({ input }) => …) // ← input is fully typed here regardless of order\n *\n * Config and handler signatures are derived from `Tool` / `CollectionTool` / `GlobalTool` /\n * `Prompt` via `Omit` + indexed access so there's no duplication with `types.ts`.\n */\n\nexport const defineTool = <\n TSchema extends ToolInputSchema | undefined = ToolInputSchema | undefined,\n>(\n args: Omit<Tool<TSchema>, 'handler'>,\n): { handler: (fn: Tool<TSchema>['handler']) => Tool } => ({\n handler: (fn) => ({ ...args, handler: fn }) as unknown as Tool,\n})\n\nexport const defineCollectionTool = <\n TSchema extends ToolInputSchema | undefined = ToolInputSchema | undefined,\n>(\n args: Omit<CollectionTool<TSchema>, 'handler'>,\n): { handler: (fn: CollectionTool<TSchema>['handler']) => CollectionTool } => ({\n handler: (fn) => ({ ...args, handler: fn }) as unknown as CollectionTool,\n})\n\nexport const defineGlobalTool = <\n TSchema extends ToolInputSchema | undefined = ToolInputSchema | undefined,\n>(\n args: Omit<GlobalTool<TSchema>, 'handler'>,\n): { handler: (fn: GlobalTool<TSchema>['handler']) => GlobalTool } => ({\n handler: (fn) => ({ ...args, handler: fn }) as unknown as GlobalTool,\n})\n\nexport const definePrompt = <TSchema extends ToolInputSchema = ToolInputSchema>(\n args: Omit<Prompt<TSchema>, 'handler'>,\n): { handler: (fn: Prompt<TSchema>['handler']) => Prompt } => ({\n handler: (fn) => ({ ...args, handler: fn }) as unknown as Prompt,\n})\n"],"names":["defineTool","args","handler","fn","defineCollectionTool","defineGlobalTool","definePrompt"],"mappings":"AAEA;;;;;;;;;;;CAWC,GAED,OAAO,MAAMA,aAAa,CAGxBC,OACyD,CAAA;QACzDC,SAAS,CAACC,KAAQ,CAAA;gBAAE,GAAGF,IAAI;gBAAEC,SAASC;YAAG,CAAA;IAC3C,CAAA,EAAE;AAEF,OAAO,MAAMC,uBAAuB,CAGlCH,OAC6E,CAAA;QAC7EC,SAAS,CAACC,KAAQ,CAAA;gBAAE,GAAGF,IAAI;gBAAEC,SAASC;YAAG,CAAA;IAC3C,CAAA,EAAE;AAEF,OAAO,MAAME,mBAAmB,CAG9BJ,OACqE,CAAA;QACrEC,SAAS,CAACC,KAAQ,CAAA;gBAAE,GAAGF,IAAI;gBAAEC,SAASC;YAAG,CAAA;IAC3C,CAAA,EAAE;AAEF,OAAO,MAAMG,eAAe,CAC1BL,OAC6D,CAAA;QAC7DC,SAAS,CAACC,KAAQ,CAAA;gBAAE,GAAGF,IAAI;gBAAEC,SAASC;YAAG,CAAA;IAC3C,CAAA,EAAE"}
@@ -0,0 +1,17 @@
1
+ import type { PayloadRequest } from 'payload';
2
+ import type { AuthorizedMCP, MCPItem } from '../types.js';
3
+ export type GetAuthorizedMCPArgs = {
4
+ overrideAccess: boolean;
5
+ req: PayloadRequest;
6
+ };
7
+ /**
8
+ * Authenticates an MCP request and removes items the user cannot access.
9
+ * `overrideAccess` skips Payload and MCP item access checks.
10
+ */
11
+ export declare const getAuthorizedMCP: (args: GetAuthorizedMCPArgs) => Promise<AuthorizedMCP>;
12
+ export declare const filterMCPItems: ({ items, overrideAccess, req, }: {
13
+ items: MCPItem[];
14
+ overrideAccess: boolean;
15
+ req: PayloadRequest;
16
+ }) => Promise<MCPItem[]>;
17
+ //# sourceMappingURL=access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../src/endpoint/access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,SAAS,CAAA;AAInE,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAIzD,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,OAAO,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,OAAO,CAAC,aAAa,CAkCnF,CAAA;AAED,eAAO,MAAM,cAAc,oCAIxB;IACD,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,cAAc,EAAE,OAAO,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,OAAO,EAAE,CAkBpB,CAAA"}
@@ -0,0 +1,93 @@
1
+ import { getAccessResults, UnauthorizedError } from 'payload';
2
+ import { getPluginConfig } from '../utils/getPluginConfig.js';
3
+ /**
4
+ * Authenticates an MCP request and removes items the user cannot access.
5
+ * `overrideAccess` skips Payload and MCP item access checks.
6
+ */ export const getAuthorizedMCP = async ({ overrideAccess, req })=>{
7
+ const pluginConfig = getPluginConfig({
8
+ config: req.payload.config
9
+ });
10
+ if (pluginConfig.overrideGetAuthorizedMCP) {
11
+ return await pluginConfig.overrideGetAuthorizedMCP({
12
+ overrideAccess,
13
+ pluginConfig,
14
+ req
15
+ });
16
+ }
17
+ if (req.headers) {
18
+ const headers = new Headers(req.headers);
19
+ const hasAuthorization = headers.has('Authorization');
20
+ headers.set('DisableAutologin', 'true');
21
+ req.user = (await req.payload.auth({
22
+ headers,
23
+ req
24
+ })).user;
25
+ if (hasAuthorization && !req.user) {
26
+ throw new UnauthorizedError(req.t);
27
+ }
28
+ }
29
+ return {
30
+ items: await filterMCPItems({
31
+ items: pluginConfig.items,
32
+ overrideAccess,
33
+ req
34
+ }),
35
+ overrideAccess
36
+ };
37
+ };
38
+ export const filterMCPItems = async ({ items, overrideAccess, req })=>{
39
+ // Match Payload core: overrideAccess bypasses access evaluation
40
+ if (overrideAccess) {
41
+ return items;
42
+ }
43
+ const authorizedItems = [];
44
+ const permissions = await getAccessResults({
45
+ req
46
+ });
47
+ for (const item of items){
48
+ if (!await checkItemAccess({
49
+ item,
50
+ permissions,
51
+ req
52
+ })) {
53
+ continue;
54
+ }
55
+ authorizedItems.push(item);
56
+ }
57
+ return authorizedItems;
58
+ };
59
+ /**
60
+ * Runs MCP item access callbacks
61
+ */ const checkItemAccess = async ({ item, permissions, req })=>{
62
+ switch(item.type){
63
+ case 'collectionTool':
64
+ return !item.tool.access || await item.tool.access({
65
+ slug: item.collectionSlug,
66
+ permissions,
67
+ req
68
+ });
69
+ case 'globalTool':
70
+ return !item.tool.access || await item.tool.access({
71
+ slug: item.globalSlug,
72
+ permissions,
73
+ req
74
+ });
75
+ case 'prompt':
76
+ return !item.prompt.access || await item.prompt.access({
77
+ permissions,
78
+ req
79
+ });
80
+ case 'resource':
81
+ return !item.resource.access || await item.resource.access({
82
+ permissions,
83
+ req
84
+ });
85
+ case 'tool':
86
+ return !item.tool.access || await item.tool.access({
87
+ permissions,
88
+ req
89
+ });
90
+ }
91
+ };
92
+
93
+ //# sourceMappingURL=access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoint/access.ts"],"sourcesContent":["import type { PayloadRequest, SanitizedPermissions } from 'payload'\n\nimport { getAccessResults, UnauthorizedError } from 'payload'\n\nimport type { AuthorizedMCP, MCPItem } from '../types.js'\n\nimport { getPluginConfig } from '../utils/getPluginConfig.js'\n\nexport type GetAuthorizedMCPArgs = {\n overrideAccess: boolean\n req: PayloadRequest\n}\n\n/**\n * Authenticates an MCP request and removes items the user cannot access.\n * `overrideAccess` skips Payload and MCP item access checks.\n */\nexport const getAuthorizedMCP: (args: GetAuthorizedMCPArgs) => Promise<AuthorizedMCP> = async ({\n overrideAccess,\n req,\n}) => {\n const pluginConfig = getPluginConfig({ config: req.payload.config })\n\n if (pluginConfig.overrideGetAuthorizedMCP) {\n return await pluginConfig.overrideGetAuthorizedMCP({\n overrideAccess,\n pluginConfig,\n req,\n })\n }\n\n if (req.headers) {\n const headers = new Headers(req.headers)\n const hasAuthorization = headers.has('Authorization')\n\n headers.set('DisableAutologin', 'true')\n req.user = (await req.payload.auth({ headers, req })).user\n\n if (hasAuthorization && !req.user) {\n throw new UnauthorizedError(req.t)\n }\n }\n\n return {\n items: await filterMCPItems({\n items: pluginConfig.items,\n overrideAccess,\n req,\n }),\n overrideAccess,\n }\n}\n\nexport const filterMCPItems = async ({\n items,\n overrideAccess,\n req,\n}: {\n items: MCPItem[]\n overrideAccess: boolean\n req: PayloadRequest\n}): Promise<MCPItem[]> => {\n // Match Payload core: overrideAccess bypasses access evaluation\n if (overrideAccess) {\n return items\n }\n\n const authorizedItems: MCPItem[] = []\n\n const permissions = await getAccessResults({ req })\n\n for (const item of items) {\n if (!(await checkItemAccess({ item, permissions, req }))) {\n continue\n }\n authorizedItems.push(item)\n }\n\n return authorizedItems\n}\n\n/**\n * Runs MCP item access callbacks\n */\nconst checkItemAccess = async ({\n item,\n permissions,\n req,\n}: {\n item: MCPItem\n permissions?: SanitizedPermissions\n req: PayloadRequest\n}): Promise<boolean> => {\n switch (item.type) {\n case 'collectionTool':\n return (\n !item.tool.access ||\n (await item.tool.access({ slug: item.collectionSlug, permissions, req }))\n )\n case 'globalTool':\n return (\n !item.tool.access || (await item.tool.access({ slug: item.globalSlug, permissions, req }))\n )\n case 'prompt':\n return !item.prompt.access || (await item.prompt.access({ permissions, req }))\n case 'resource':\n return !item.resource.access || (await item.resource.access({ permissions, req }))\n case 'tool':\n return !item.tool.access || (await item.tool.access({ permissions, req }))\n }\n}\n"],"names":["getAccessResults","UnauthorizedError","getPluginConfig","getAuthorizedMCP","overrideAccess","req","pluginConfig","config","payload","overrideGetAuthorizedMCP","headers","Headers","hasAuthorization","has","set","user","auth","t","items","filterMCPItems","authorizedItems","permissions","item","checkItemAccess","push","type","tool","access","slug","collectionSlug","globalSlug","prompt","resource"],"mappings":"AAEA,SAASA,gBAAgB,EAAEC,iBAAiB,QAAQ,UAAS;AAI7D,SAASC,eAAe,QAAQ,8BAA6B;AAO7D;;;CAGC,GACD,OAAO,MAAMC,mBAA2E,OAAO,EAC7FC,cAAc,EACdC,GAAG,EACJ;IACC,MAAMC,eAAeJ,gBAAgB;QAAEK,QAAQF,IAAIG,OAAO,CAACD,MAAM;IAAC;IAElE,IAAID,aAAaG,wBAAwB,EAAE;QACzC,OAAO,MAAMH,aAAaG,wBAAwB,CAAC;YACjDL;YACAE;YACAD;QACF;IACF;IAEA,IAAIA,IAAIK,OAAO,EAAE;QACf,MAAMA,UAAU,IAAIC,QAAQN,IAAIK,OAAO;QACvC,MAAME,mBAAmBF,QAAQG,GAAG,CAAC;QAErCH,QAAQI,GAAG,CAAC,oBAAoB;QAChCT,IAAIU,IAAI,GAAG,AAAC,CAAA,MAAMV,IAAIG,OAAO,CAACQ,IAAI,CAAC;YAAEN;YAASL;QAAI,EAAC,EAAGU,IAAI;QAE1D,IAAIH,oBAAoB,CAACP,IAAIU,IAAI,EAAE;YACjC,MAAM,IAAId,kBAAkBI,IAAIY,CAAC;QACnC;IACF;IAEA,OAAO;QACLC,OAAO,MAAMC,eAAe;YAC1BD,OAAOZ,aAAaY,KAAK;YACzBd;YACAC;QACF;QACAD;IACF;AACF,EAAC;AAED,OAAO,MAAMe,iBAAiB,OAAO,EACnCD,KAAK,EACLd,cAAc,EACdC,GAAG,EAKJ;IACC,gEAAgE;IAChE,IAAID,gBAAgB;QAClB,OAAOc;IACT;IAEA,MAAME,kBAA6B,EAAE;IAErC,MAAMC,cAAc,MAAMrB,iBAAiB;QAAEK;IAAI;IAEjD,KAAK,MAAMiB,QAAQJ,MAAO;QACxB,IAAI,CAAE,MAAMK,gBAAgB;YAAED;YAAMD;YAAahB;QAAI,IAAK;YACxD;QACF;QACAe,gBAAgBI,IAAI,CAACF;IACvB;IAEA,OAAOF;AACT,EAAC;AAED;;CAEC,GACD,MAAMG,kBAAkB,OAAO,EAC7BD,IAAI,EACJD,WAAW,EACXhB,GAAG,EAKJ;IACC,OAAQiB,KAAKG,IAAI;QACf,KAAK;YACH,OACE,CAACH,KAAKI,IAAI,CAACC,MAAM,IAChB,MAAML,KAAKI,IAAI,CAACC,MAAM,CAAC;gBAAEC,MAAMN,KAAKO,cAAc;gBAAER;gBAAahB;YAAI;QAE1E,KAAK;YACH,OACE,CAACiB,KAAKI,IAAI,CAACC,MAAM,IAAK,MAAML,KAAKI,IAAI,CAACC,MAAM,CAAC;gBAAEC,MAAMN,KAAKQ,UAAU;gBAAET;gBAAahB;YAAI;QAE3F,KAAK;YACH,OAAO,CAACiB,KAAKS,MAAM,CAACJ,MAAM,IAAK,MAAML,KAAKS,MAAM,CAACJ,MAAM,CAAC;gBAAEN;gBAAahB;YAAI;QAC7E,KAAK;YACH,OAAO,CAACiB,KAAKU,QAAQ,CAACL,MAAM,IAAK,MAAML,KAAKU,QAAQ,CAACL,MAAM,CAAC;gBAAEN;gBAAahB;YAAI;QACjF,KAAK;YACH,OAAO,CAACiB,KAAKI,IAAI,CAACC,MAAM,IAAK,MAAML,KAAKI,IAAI,CAACC,MAAM,CAAC;gBAAEN;gBAAahB;YAAI;IAC3E;AACF"}
@@ -0,0 +1,3 @@
1
+ import type { PayloadHandler } from 'payload';
2
+ export declare const mcpEndpoint: PayloadHandler;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/endpoint/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,SAAS,CAAA;AAc7D,eAAO,MAAM,WAAW,EAAE,cAmEzB,CAAA"}
@@ -0,0 +1,116 @@
1
+ import { createMcpHandler, isLegacyRequest, readRequestBody, WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server';
2
+ import { APIError } from 'payload';
3
+ import { buildMcpServer } from '../mcp/buildMcpServer.js';
4
+ import { getPluginConfig } from '../utils/getPluginConfig.js';
5
+ import { getAuthorizedMCP } from './access.js';
6
+ export const mcpEndpoint = async (req)=>{
7
+ if (!req.url) {
8
+ throw new APIError('Missing request URL', 400);
9
+ }
10
+ req.payloadAPI = 'MCP';
11
+ const pluginConfig = getPluginConfig({
12
+ config: req.payload.config
13
+ });
14
+ const overrideAccessParam = new URL(req.url).searchParams.get('overrideAccess');
15
+ if (overrideAccessParam !== null && process.env.NODE_ENV !== 'development') {
16
+ throw new APIError('MCP overrideAccess is only available in development.', 400);
17
+ }
18
+ let overrideAccess = false;
19
+ if (overrideAccessParam === 'true') {
20
+ overrideAccess = true;
21
+ } else if (overrideAccessParam !== null && overrideAccessParam !== 'false') {
22
+ throw new APIError('MCP overrideAccess must be "true" or "false".', 400);
23
+ }
24
+ const authorizedMCP = await getAuthorizedMCP({
25
+ overrideAccess,
26
+ req
27
+ });
28
+ const maxRequestBodySize = pluginConfig.mcp?.maxRequestBodySize;
29
+ // Payload augments the original web-standard Request in place.
30
+ const mcpRequest = req;
31
+ const parsedBody = await parseRequestBody({
32
+ maxRequestBodySize,
33
+ request: mcpRequest
34
+ });
35
+ // Keep the old JSON-only, stateless behavior because the SDK's 2025 fallback uses SSE.
36
+ if (await isLegacyRequest(mcpRequest, parsedBody, {
37
+ maxRequestBodySize
38
+ })) {
39
+ const server = buildMcpServer({
40
+ authorizedMCP,
41
+ pluginConfig,
42
+ req
43
+ });
44
+ const transport = new WebStandardStreamableHTTPServerTransport({
45
+ enableJsonResponse: true,
46
+ maxRequestBodySize,
47
+ sessionIdGenerator: undefined
48
+ });
49
+ transport.onerror = (err)=>{
50
+ req.payload.logger.error({
51
+ err,
52
+ msg: 'Error serving legacy MCP request'
53
+ });
54
+ };
55
+ try {
56
+ await server.connect(transport);
57
+ return await transport.handleRequest(mcpRequest, {
58
+ parsedBody
59
+ });
60
+ } finally{
61
+ await server.close().catch((err)=>{
62
+ req.payload.logger.error({
63
+ err,
64
+ msg: 'Error closing MCP server'
65
+ });
66
+ });
67
+ }
68
+ }
69
+ const handler = createMcpHandler(()=>buildMcpServer({
70
+ authorizedMCP,
71
+ pluginConfig,
72
+ req
73
+ }), {
74
+ legacy: 'reject',
75
+ maxRequestBodySize,
76
+ // SDK subscriptions always use SSE, so disable them to keep every response JSON-only.
77
+ maxSubscriptions: 0,
78
+ onerror: (err)=>{
79
+ req.payload.logger.error({
80
+ err,
81
+ msg: 'Error serving modern MCP request'
82
+ });
83
+ },
84
+ responseMode: 'json'
85
+ });
86
+ try {
87
+ return await handler.fetch(mcpRequest, {
88
+ parsedBody
89
+ });
90
+ } finally{
91
+ await handler.close().catch((err)=>{
92
+ req.payload.logger.error({
93
+ err,
94
+ msg: 'Error closing modern MCP handler'
95
+ });
96
+ });
97
+ }
98
+ };
99
+ /**
100
+ * Parses a POST body once so the era check and the SDK handler can share it. The SDK
101
+ * skips its size limit for a pre-parsed body, so this reads with the same limit. It reads
102
+ * a clone and returns `undefined` for any body the SDK should reject (too large, unreadable,
103
+ * or not JSON), leaving the original request for the SDK to read and answer.
104
+ */ const parseRequestBody = async ({ maxRequestBodySize, request })=>{
105
+ if (request.method.toUpperCase() !== 'POST') {
106
+ return undefined;
107
+ }
108
+ try {
109
+ const body = await readRequestBody(request.clone(), maxRequestBodySize);
110
+ return body.tooLarge ? undefined : JSON.parse(body.text);
111
+ } catch {
112
+ return undefined;
113
+ }
114
+ };
115
+
116
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoint/index.ts"],"sourcesContent":["import type { PayloadHandler, PayloadRequest } from 'payload'\n\nimport {\n createMcpHandler,\n isLegacyRequest,\n readRequestBody,\n WebStandardStreamableHTTPServerTransport,\n} from '@modelcontextprotocol/server'\nimport { APIError } from 'payload'\n\nimport { buildMcpServer } from '../mcp/buildMcpServer.js'\nimport { getPluginConfig } from '../utils/getPluginConfig.js'\nimport { getAuthorizedMCP } from './access.js'\n\nexport const mcpEndpoint: PayloadHandler = async (req) => {\n if (!req.url) {\n throw new APIError('Missing request URL', 400)\n }\n\n req.payloadAPI = 'MCP' as const\n\n const pluginConfig = getPluginConfig({ config: req.payload.config })\n const overrideAccessParam = new URL(req.url).searchParams.get('overrideAccess')\n\n if (overrideAccessParam !== null && process.env.NODE_ENV !== 'development') {\n throw new APIError('MCP overrideAccess is only available in development.', 400)\n }\n\n let overrideAccess = false\n if (overrideAccessParam === 'true') {\n overrideAccess = true\n } else if (overrideAccessParam !== null && overrideAccessParam !== 'false') {\n throw new APIError('MCP overrideAccess must be \"true\" or \"false\".', 400)\n }\n\n const authorizedMCP = await getAuthorizedMCP({ overrideAccess, req })\n const maxRequestBodySize = pluginConfig.mcp?.maxRequestBodySize\n // Payload augments the original web-standard Request in place.\n const mcpRequest = req as PayloadRequest & Request\n const parsedBody = await parseRequestBody({ maxRequestBodySize, request: mcpRequest })\n\n // Keep the old JSON-only, stateless behavior because the SDK's 2025 fallback uses SSE.\n if (await isLegacyRequest(mcpRequest, parsedBody, { maxRequestBodySize })) {\n const server = buildMcpServer({ authorizedMCP, pluginConfig, req })\n const transport = new WebStandardStreamableHTTPServerTransport({\n enableJsonResponse: true,\n maxRequestBodySize,\n sessionIdGenerator: undefined, // stateless mode\n })\n transport.onerror = (err) => {\n req.payload.logger.error({ err, msg: 'Error serving legacy MCP request' })\n }\n\n try {\n await server.connect(transport)\n return await transport.handleRequest(mcpRequest, { parsedBody })\n } finally {\n await server.close().catch((err) => {\n req.payload.logger.error({ err, msg: 'Error closing MCP server' })\n })\n }\n }\n\n const handler = createMcpHandler(() => buildMcpServer({ authorizedMCP, pluginConfig, req }), {\n legacy: 'reject',\n maxRequestBodySize,\n // SDK subscriptions always use SSE, so disable them to keep every response JSON-only.\n maxSubscriptions: 0,\n onerror: (err) => {\n req.payload.logger.error({ err, msg: 'Error serving modern MCP request' })\n },\n responseMode: 'json',\n })\n\n try {\n return await handler.fetch(mcpRequest, { parsedBody })\n } finally {\n await handler.close().catch((err) => {\n req.payload.logger.error({ err, msg: 'Error closing modern MCP handler' })\n })\n }\n}\n\n/**\n * Parses a POST body once so the era check and the SDK handler can share it. The SDK\n * skips its size limit for a pre-parsed body, so this reads with the same limit. It reads\n * a clone and returns `undefined` for any body the SDK should reject (too large, unreadable,\n * or not JSON), leaving the original request for the SDK to read and answer.\n */\nconst parseRequestBody = async ({\n maxRequestBodySize,\n request,\n}: {\n maxRequestBodySize?: number\n request: Request\n}): Promise<unknown> => {\n if (request.method.toUpperCase() !== 'POST') {\n return undefined\n }\n\n try {\n const body = await readRequestBody(request.clone(), maxRequestBodySize)\n return body.tooLarge ? undefined : JSON.parse(body.text)\n } catch {\n return undefined\n }\n}\n"],"names":["createMcpHandler","isLegacyRequest","readRequestBody","WebStandardStreamableHTTPServerTransport","APIError","buildMcpServer","getPluginConfig","getAuthorizedMCP","mcpEndpoint","req","url","payloadAPI","pluginConfig","config","payload","overrideAccessParam","URL","searchParams","get","process","env","NODE_ENV","overrideAccess","authorizedMCP","maxRequestBodySize","mcp","mcpRequest","parsedBody","parseRequestBody","request","server","transport","enableJsonResponse","sessionIdGenerator","undefined","onerror","err","logger","error","msg","connect","handleRequest","close","catch","handler","legacy","maxSubscriptions","responseMode","fetch","method","toUpperCase","body","clone","tooLarge","JSON","parse","text"],"mappings":"AAEA,SACEA,gBAAgB,EAChBC,eAAe,EACfC,eAAe,EACfC,wCAAwC,QACnC,+BAA8B;AACrC,SAASC,QAAQ,QAAQ,UAAS;AAElC,SAASC,cAAc,QAAQ,2BAA0B;AACzD,SAASC,eAAe,QAAQ,8BAA6B;AAC7D,SAASC,gBAAgB,QAAQ,cAAa;AAE9C,OAAO,MAAMC,cAA8B,OAAOC;IAChD,IAAI,CAACA,IAAIC,GAAG,EAAE;QACZ,MAAM,IAAIN,SAAS,uBAAuB;IAC5C;IAEAK,IAAIE,UAAU,GAAG;IAEjB,MAAMC,eAAeN,gBAAgB;QAAEO,QAAQJ,IAAIK,OAAO,CAACD,MAAM;IAAC;IAClE,MAAME,sBAAsB,IAAIC,IAAIP,IAAIC,GAAG,EAAEO,YAAY,CAACC,GAAG,CAAC;IAE9D,IAAIH,wBAAwB,QAAQI,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QAC1E,MAAM,IAAIjB,SAAS,wDAAwD;IAC7E;IAEA,IAAIkB,iBAAiB;IACrB,IAAIP,wBAAwB,QAAQ;QAClCO,iBAAiB;IACnB,OAAO,IAAIP,wBAAwB,QAAQA,wBAAwB,SAAS;QAC1E,MAAM,IAAIX,SAAS,iDAAiD;IACtE;IAEA,MAAMmB,gBAAgB,MAAMhB,iBAAiB;QAAEe;QAAgBb;IAAI;IACnE,MAAMe,qBAAqBZ,aAAaa,GAAG,EAAED;IAC7C,+DAA+D;IAC/D,MAAME,aAAajB;IACnB,MAAMkB,aAAa,MAAMC,iBAAiB;QAAEJ;QAAoBK,SAASH;IAAW;IAEpF,uFAAuF;IACvF,IAAI,MAAMzB,gBAAgByB,YAAYC,YAAY;QAAEH;IAAmB,IAAI;QACzE,MAAMM,SAASzB,eAAe;YAAEkB;YAAeX;YAAcH;QAAI;QACjE,MAAMsB,YAAY,IAAI5B,yCAAyC;YAC7D6B,oBAAoB;YACpBR;YACAS,oBAAoBC;QACtB;QACAH,UAAUI,OAAO,GAAG,CAACC;YACnB3B,IAAIK,OAAO,CAACuB,MAAM,CAACC,KAAK,CAAC;gBAAEF;gBAAKG,KAAK;YAAmC;QAC1E;QAEA,IAAI;YACF,MAAMT,OAAOU,OAAO,CAACT;YACrB,OAAO,MAAMA,UAAUU,aAAa,CAACf,YAAY;gBAAEC;YAAW;QAChE,SAAU;YACR,MAAMG,OAAOY,KAAK,GAAGC,KAAK,CAAC,CAACP;gBAC1B3B,IAAIK,OAAO,CAACuB,MAAM,CAACC,KAAK,CAAC;oBAAEF;oBAAKG,KAAK;gBAA2B;YAClE;QACF;IACF;IAEA,MAAMK,UAAU5C,iBAAiB,IAAMK,eAAe;YAAEkB;YAAeX;YAAcH;QAAI,IAAI;QAC3FoC,QAAQ;QACRrB;QACA,sFAAsF;QACtFsB,kBAAkB;QAClBX,SAAS,CAACC;YACR3B,IAAIK,OAAO,CAACuB,MAAM,CAACC,KAAK,CAAC;gBAAEF;gBAAKG,KAAK;YAAmC;QAC1E;QACAQ,cAAc;IAChB;IAEA,IAAI;QACF,OAAO,MAAMH,QAAQI,KAAK,CAACtB,YAAY;YAAEC;QAAW;IACtD,SAAU;QACR,MAAMiB,QAAQF,KAAK,GAAGC,KAAK,CAAC,CAACP;YAC3B3B,IAAIK,OAAO,CAACuB,MAAM,CAACC,KAAK,CAAC;gBAAEF;gBAAKG,KAAK;YAAmC;QAC1E;IACF;AACF,EAAC;AAED;;;;;CAKC,GACD,MAAMX,mBAAmB,OAAO,EAC9BJ,kBAAkB,EAClBK,OAAO,EAIR;IACC,IAAIA,QAAQoB,MAAM,CAACC,WAAW,OAAO,QAAQ;QAC3C,OAAOhB;IACT;IAEA,IAAI;QACF,MAAMiB,OAAO,MAAMjD,gBAAgB2B,QAAQuB,KAAK,IAAI5B;QACpD,OAAO2B,KAAKE,QAAQ,GAAGnB,YAAYoB,KAAKC,KAAK,CAACJ,KAAKK,IAAI;IACzD,EAAE,OAAM;QACN,OAAOtB;IACT;AACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAA"}
@@ -0,0 +1,4 @@
1
+ 'use client';
2
+ export { };
3
+
4
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["'use client'\n\nexport {}\n"],"names":[],"mappings":"AAAA;AAEA,WAAS"}
@@ -0,0 +1,2 @@
1
+ export { filterMCPItems, getAuthorizedMCP } from '../endpoint/access.js';
2
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/exports/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { filterMCPItems, getAuthorizedMCP } from '../endpoint/access.js';
2
+
3
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/internal.ts"],"sourcesContent":["export { filterMCPItems, getAuthorizedMCP } from '../endpoint/access.js'\n"],"names":["filterMCPItems","getAuthorizedMCP"],"mappings":"AAAA,SAASA,cAAc,EAAEC,gBAAgB,QAAQ,wBAAuB"}
package/dist/index.d.ts CHANGED
@@ -1,17 +1,14 @@
1
- import type { MCPAccessSettings, MCPPluginConfig } from './types.js';
1
+ import type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig } from './types.js';
2
2
  declare module 'payload' {
3
- interface PayloadRequest {
4
- payloadAPI: 'GraphQL' | 'local' | 'MCP' | 'REST';
3
+ interface PayloadRequestAPI {
4
+ MCP: true;
5
5
  }
6
6
  interface RegisteredPlugins {
7
+ /** After the plugin's `plugin` callback runs, `options` holds the sanitized config. */
7
8
  '@payloadcms/plugin-mcp': MCPPluginConfig;
8
9
  }
9
10
  }
10
- export type { MCPAccessSettings, MCPPluginConfig };
11
- /**
12
- * The MCP Plugin for Payload. This plugin allows you to add MCP capabilities to your Payload project.
13
- *
14
- * @param pluginOptions - The options for the MCP plugin.
15
- */
11
+ export type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig };
12
+ export { defineCollectionTool, defineGlobalTool, definePrompt, defineTool } from './defineTool.js';
16
13
  export declare const mcpPlugin: (options: MCPPluginConfig) => import("payload").Plugin;
17
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAKpE,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,cAAc;QAC7B,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAA;KACjD;IACD,UAAU,iBAAiB;QACzB,wBAAwB,EAAE,eAAe,CAAA;KAC1C;CACF;AAID,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAA;AAElD;;;;GAIG;AACH,eAAO,MAAM,SAAS,wDAuFpB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAK1F,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,iBAAiB;QAChC,GAAG,EAAE,IAAI,CAAA;KACV;IACD,UAAU,iBAAiB;QACzB,uFAAuF;QACvF,wBAAwB,EAAE,eAAe,CAAA;KAC1C;CACF;AAED,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,CAAA;AAExE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAElG,eAAO,MAAM,SAAS,wDAiCpB,CAAA"}
package/dist/index.js CHANGED
@@ -1,76 +1,48 @@
1
1
  import { definePlugin } from 'payload';
2
- import { createAPIKeysCollection } from './collections/createApiKeysCollection.js';
3
- import { initializeMCPHandler } from './endpoints/mcp.js';
4
- import { defaults } from './defaults.js';
5
- /**
6
- * The MCP Plugin for Payload. This plugin allows you to add MCP capabilities to your Payload project.
7
- *
8
- * @param pluginOptions - The options for the MCP plugin.
9
- */ export const mcpPlugin = definePlugin({
2
+ import { mcpEndpoint } from './endpoint/index.js';
3
+ import { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js';
4
+ export { defineCollectionTool, defineGlobalTool, definePrompt, defineTool } from './defineTool.js';
5
+ export const mcpPlugin = definePlugin({
10
6
  slug: '@payloadcms/plugin-mcp',
11
7
  order: 10,
12
- plugin: ({ config, plugins: _plugins, ...pluginOptions })=>{
13
- if (!config.collections) {
14
- config.collections = [];
15
- }
16
- // Collections
17
- const collections = pluginOptions.collections || {};
18
- // Globals
19
- const globals = pluginOptions.globals || {};
20
- // Extract custom tools for the global config
21
- const customTools = pluginOptions.mcp?.tools?.map((tool)=>({
22
- name: tool.name,
23
- description: tool.description
24
- })) || [];
25
- // User Collection
26
- pluginOptions.userCollection = pluginOptions.userCollection ?? config?.admin?.user ?? defaults.userCollection;
27
- const experimentalTools = pluginOptions?.experimental?.tools || {};
28
- /**
29
- * API Keys
30
- * --------
31
- * High resolution control over MCP capabilities is crucial when using Payload with LLMs.
32
- *
33
- * This API Keys collection has ways for admins to create API keys and allow or disallow the MCP capabilities.
34
- * This is useful when Admins want to allow or disallow the use of the MCP capabilities in real time.
35
- * For example:
36
- * - If a collection has all of its capabilities enabled, admins can allow or disallow the create, update, delete, and find capabilities on that collection.
37
- * - If a collection only has the find capability enabled, admins can only allow or disallow the find capability on that collection.
38
- * - If a global has all of its capabilities enabled, admins can allow or disallow the find and update capabilities on that global.
39
- * - If a custom tool has gone haywire, admins can disallow that tool.
40
- *
41
- */ const apiKeyCollection = createAPIKeysCollection(collections, globals, customTools, experimentalTools, pluginOptions);
42
- if (pluginOptions.overrideApiKeyCollection) {
43
- config.collections.push(pluginOptions.overrideApiKeyCollection(apiKeyCollection));
44
- } else {
45
- config.collections.push(apiKeyCollection);
8
+ plugin: ({ config, options, plugins })=>{
9
+ const pluginConfig = sanitizeMCPConfig({
10
+ config,
11
+ pluginConfig: options
12
+ });
13
+ // Stash the sanitized config on plugin options so `getPluginConfig()` reads it.
14
+ const registered = plugins['@payloadcms/plugin-mcp'];
15
+ if (registered) {
16
+ // @ts-expect-error
17
+ registered.sanitizedOptions = pluginConfig;
46
18
  }
47
- /**
48
- * If the plugin is disabled, we still want to keep added collections/fields so the database schema is consistent which is important for migrations.
49
- * If your plugin heavily modifies the database schema, you may want to remove this property.
50
- */ if (pluginOptions.disabled) {
19
+ if (pluginConfig.disabled) {
51
20
  return config;
52
21
  }
53
- if (!config.endpoints) {
54
- config.endpoints = [];
55
- }
56
- /**
57
- * This is the primary MCP Server Endpoint.
58
- * Payload will automatically add the /api prefix to the path, so the full path is `/api/mcp`
59
- * NOTE: This is only transport method until we add full support for SSE which will be another endpoint at `/api/sse`
60
- */ config.endpoints.push({
61
- handler: initializeMCPHandler(pluginOptions),
62
- method: 'post',
63
- path: '/mcp'
64
- });
65
- /**
66
- * The GET response is always: {"jsonrpc":"2.0","error":{"code":-32000,"message":"Method not allowed."},"id":null} -- even with an API key
67
- * This is expected behavior and MCP clients should always use the POST endpoint.
68
- */ config.endpoints.push({
69
- handler: initializeMCPHandler(pluginOptions),
70
- method: 'get',
71
- path: '/mcp'
72
- });
73
- return config;
22
+ return {
23
+ ...config,
24
+ endpoints: [
25
+ ...config.endpoints ?? [],
26
+ // Payload prefixes /api, so the full path is /api/mcp.
27
+ {
28
+ handler: mcpEndpoint,
29
+ method: 'post',
30
+ path: '/mcp'
31
+ },
32
+ // Streamable HTTP's optional server=>client GET stream. We don't offer
33
+ // one, so answer 405 per spec-— clients then skip it cleanly
34
+ {
35
+ handler: ()=>new Response(null, {
36
+ headers: {
37
+ Allow: 'POST'
38
+ },
39
+ status: 405
40
+ }),
41
+ method: 'get',
42
+ path: '/mcp'
43
+ }
44
+ ]
45
+ };
74
46
  }
75
47
  });
76
48