@payloadcms/plugin-mcp 4.0.0-internal.e16cf59 → 4.0.0-internal.e55ccef

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 (424) hide show
  1. package/LICENSE.md +1 -1
  2. package/bin.js +46 -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 +87 -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 +223 -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 +288 -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 +68 -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 +64 -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 +96 -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 +110 -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 +96 -0
  58. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  59. package/dist/mcp/builtin/collections/fileInput.d.ts +20 -0
  60. package/dist/mcp/builtin/collections/fileInput.d.ts.map +1 -0
  61. package/dist/mcp/builtin/collections/fileInput.js +100 -0
  62. package/dist/mcp/builtin/collections/fileInput.js.map +1 -0
  63. package/dist/mcp/builtin/collections/fileInput.spec.js +72 -0
  64. package/dist/mcp/builtin/collections/fileInput.spec.js.map +1 -0
  65. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  66. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  67. package/dist/mcp/builtin/collections/findDistinctTool.js +92 -0
  68. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  69. package/dist/mcp/builtin/collections/findTool.d.ts +2 -0
  70. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -0
  71. package/dist/mcp/builtin/collections/findTool.js +164 -0
  72. package/dist/mcp/builtin/collections/findTool.js.map +1 -0
  73. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  74. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  75. package/dist/mcp/builtin/collections/findVersionByIDTool.js +83 -0
  76. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  77. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  78. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  79. package/dist/mcp/builtin/collections/findVersionsTool.js +98 -0
  80. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  81. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +9 -0
  82. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -0
  83. package/dist/mcp/builtin/collections/formatCollectionError.js +60 -0
  84. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -0
  85. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts +2 -0
  86. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -0
  87. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +86 -0
  88. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -0
  89. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  90. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  91. package/dist/mcp/builtin/collections/restoreVersionTool.js +81 -0
  92. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  93. package/dist/mcp/builtin/collections/updateTool.d.ts +2 -0
  94. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -0
  95. package/dist/mcp/builtin/collections/updateTool.js +204 -0
  96. package/dist/mcp/builtin/collections/updateTool.js.map +1 -0
  97. package/dist/mcp/builtin/getConfigInfoTool.d.ts +2 -0
  98. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -0
  99. package/dist/mcp/builtin/getConfigInfoTool.js +68 -0
  100. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -0
  101. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  102. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  103. package/dist/mcp/builtin/globals/countVersionsTool.js +64 -0
  104. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  105. package/dist/mcp/builtin/globals/findTool.d.ts +2 -0
  106. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -0
  107. package/dist/mcp/builtin/globals/findTool.js +73 -0
  108. package/dist/mcp/builtin/globals/findTool.js.map +1 -0
  109. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  110. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  111. package/dist/mcp/builtin/globals/findVersionByIDTool.js +79 -0
  112. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  113. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  114. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  115. package/dist/mcp/builtin/globals/findVersionsTool.js +94 -0
  116. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  117. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts +2 -0
  118. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -0
  119. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +65 -0
  120. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -0
  121. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  122. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  123. package/dist/mcp/builtin/globals/restoreVersionTool.js +77 -0
  124. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  125. package/dist/mcp/builtin/globals/updateTool.d.ts +2 -0
  126. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -0
  127. package/dist/mcp/builtin/globals/updateTool.js +87 -0
  128. package/dist/mcp/builtin/globals/updateTool.js.map +1 -0
  129. package/dist/mcp/builtin/validateEntityData.d.ts +14 -0
  130. package/dist/mcp/builtin/validateEntityData.d.ts.map +1 -0
  131. package/dist/mcp/builtin/validateEntityData.js +82 -0
  132. package/dist/mcp/builtin/validateEntityData.js.map +1 -0
  133. package/dist/mcp/builtinTools.d.ts +162 -0
  134. package/dist/mcp/builtinTools.d.ts.map +1 -0
  135. package/dist/mcp/builtinTools.js +163 -0
  136. package/dist/mcp/builtinTools.js.map +1 -0
  137. package/dist/mcp/sanitizeMCPConfig.d.ts +16 -0
  138. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -0
  139. package/dist/mcp/sanitizeMCPConfig.js +230 -0
  140. package/dist/mcp/sanitizeMCPConfig.js.map +1 -0
  141. package/dist/stdio.d.ts +8 -0
  142. package/dist/stdio.d.ts.map +1 -0
  143. package/dist/stdio.js +126 -0
  144. package/dist/stdio.js.map +1 -0
  145. package/dist/types.d.ts +256 -447
  146. package/dist/types.d.ts.map +1 -1
  147. package/dist/types.js +4 -1
  148. package/dist/types.js.map +1 -1
  149. package/dist/utils/getLogger.d.ts +10 -0
  150. package/dist/utils/getLogger.d.ts.map +1 -0
  151. package/dist/utils/getLogger.js +22 -0
  152. package/dist/utils/getLogger.js.map +1 -0
  153. package/dist/utils/getPluginConfig.d.ts +12 -0
  154. package/dist/utils/getPluginConfig.d.ts.map +1 -0
  155. package/dist/utils/getPluginConfig.js +15 -0
  156. package/dist/utils/getPluginConfig.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/filterFieldsByAccess.d.ts +28 -0
  162. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts.map +1 -0
  163. package/dist/utils/schemaConversion/filterFieldsByAccess.js +71 -0
  164. package/dist/utils/schemaConversion/filterFieldsByAccess.js.map +1 -0
  165. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +13 -0
  166. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +1 -0
  167. package/dist/utils/schemaConversion/getEntityInputSchema.js +66 -0
  168. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +1 -0
  169. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +10 -0
  170. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -0
  171. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +384 -0
  172. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -0
  173. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +133 -0
  174. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -0
  175. package/dist/utils/toStandardSchema.d.ts +5 -0
  176. package/dist/utils/toStandardSchema.d.ts.map +1 -0
  177. package/dist/utils/toStandardSchema.js +4 -0
  178. package/dist/utils/toStandardSchema.js.map +1 -0
  179. package/dist/utils/whereSchema.d.ts +9 -0
  180. package/dist/utils/whereSchema.d.ts.map +1 -0
  181. package/dist/utils/whereSchema.js +13 -0
  182. package/dist/utils/whereSchema.js.map +1 -0
  183. package/package.json +30 -10
  184. package/src/defaultAccess.ts +3 -0
  185. package/src/defineTool.ts +44 -0
  186. package/src/endpoint/access.ts +112 -0
  187. package/src/endpoint/index.ts +77 -0
  188. package/src/exports/client.ts +3 -0
  189. package/src/exports/internal.ts +1 -0
  190. package/src/index.ts +31 -89
  191. package/src/mcp/buildMcpServer.ts +284 -0
  192. package/src/mcp/builtin/collections/authTools.ts +269 -0
  193. package/src/mcp/builtin/collections/countTool.ts +73 -0
  194. package/src/mcp/builtin/collections/countVersionsTool.ts +69 -0
  195. package/src/mcp/builtin/collections/createTool.ts +121 -0
  196. package/src/mcp/builtin/collections/deleteTool.ts +125 -0
  197. package/src/mcp/builtin/collections/duplicateTool.ts +134 -0
  198. package/src/mcp/builtin/collections/fileInput.spec.ts +79 -0
  199. package/src/mcp/builtin/collections/fileInput.ts +139 -0
  200. package/src/mcp/builtin/collections/findDistinctTool.ts +119 -0
  201. package/src/mcp/builtin/collections/findTool.ts +216 -0
  202. package/src/mcp/builtin/collections/findVersionByIDTool.ts +109 -0
  203. package/src/mcp/builtin/collections/findVersionsTool.ts +154 -0
  204. package/src/mcp/builtin/collections/formatCollectionError.ts +84 -0
  205. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +76 -0
  206. package/src/mcp/builtin/collections/restoreVersionTool.ts +107 -0
  207. package/src/mcp/builtin/collections/updateTool.ts +227 -0
  208. package/src/mcp/builtin/getConfigInfoTool.ts +67 -0
  209. package/src/mcp/builtin/globals/countVersionsTool.ts +68 -0
  210. package/src/mcp/builtin/globals/findTool.ts +105 -0
  211. package/src/mcp/builtin/globals/findVersionByIDTool.ts +103 -0
  212. package/src/mcp/builtin/globals/findVersionsTool.ts +147 -0
  213. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +63 -0
  214. package/src/mcp/builtin/globals/restoreVersionTool.ts +99 -0
  215. package/src/mcp/builtin/globals/updateTool.ts +115 -0
  216. package/src/mcp/builtin/validateEntityData.ts +132 -0
  217. package/src/mcp/builtinTools.ts +154 -0
  218. package/src/mcp/sanitizeMCPConfig.ts +278 -0
  219. package/src/stdio.ts +130 -0
  220. package/src/types.ts +304 -486
  221. package/src/utils/getLogger.ts +22 -0
  222. package/src/utils/getPluginConfig.ts +24 -0
  223. package/src/utils/resolveProjectRoot.ts +17 -0
  224. package/src/utils/schemaConversion/filterFieldsByAccess.ts +123 -0
  225. package/src/utils/schemaConversion/getEntityInputSchema.ts +96 -0
  226. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +96 -0
  227. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +432 -0
  228. package/src/utils/toStandardSchema.ts +9 -0
  229. package/src/utils/whereSchema.ts +24 -0
  230. package/dist/collections/createApiKeysCollection.d.ts +0 -7
  231. package/dist/collections/createApiKeysCollection.d.ts.map +0 -1
  232. package/dist/collections/createApiKeysCollection.js +0 -317
  233. package/dist/collections/createApiKeysCollection.js.map +0 -1
  234. package/dist/defaults.d.ts +0 -4
  235. package/dist/defaults.d.ts.map +0 -1
  236. package/dist/defaults.js +0 -5
  237. package/dist/defaults.js.map +0 -1
  238. package/dist/endpoints/mcp.d.ts +0 -4
  239. package/dist/endpoints/mcp.d.ts.map +0 -1
  240. package/dist/endpoints/mcp.js +0 -71
  241. package/dist/endpoints/mcp.js.map +0 -1
  242. package/dist/mcp/createRequest.d.ts +0 -3
  243. package/dist/mcp/createRequest.d.ts.map +0 -1
  244. package/dist/mcp/createRequest.js +0 -14
  245. package/dist/mcp/createRequest.js.map +0 -1
  246. package/dist/mcp/getMcpHandler.d.ts +0 -4
  247. package/dist/mcp/getMcpHandler.d.ts.map +0 -1
  248. package/dist/mcp/getMcpHandler.js +0 -231
  249. package/dist/mcp/getMcpHandler.js.map +0 -1
  250. package/dist/mcp/helpers/config.d.ts +0 -22
  251. package/dist/mcp/helpers/config.d.ts.map +0 -1
  252. package/dist/mcp/helpers/config.js +0 -153
  253. package/dist/mcp/helpers/config.js.map +0 -1
  254. package/dist/mcp/helpers/fields.d.ts +0 -19
  255. package/dist/mcp/helpers/fields.d.ts.map +0 -1
  256. package/dist/mcp/helpers/fields.js +0 -102
  257. package/dist/mcp/helpers/fields.js.map +0 -1
  258. package/dist/mcp/helpers/fileValidation.d.ts +0 -67
  259. package/dist/mcp/helpers/fileValidation.d.ts.map +0 -1
  260. package/dist/mcp/helpers/fileValidation.js +0 -267
  261. package/dist/mcp/helpers/fileValidation.js.map +0 -1
  262. package/dist/mcp/registerTool.d.ts +0 -6
  263. package/dist/mcp/registerTool.d.ts.map +0 -1
  264. package/dist/mcp/registerTool.js +0 -18
  265. package/dist/mcp/registerTool.js.map +0 -1
  266. package/dist/mcp/tools/auth/auth.d.ts +0 -4
  267. package/dist/mcp/tools/auth/auth.d.ts.map +0 -1
  268. package/dist/mcp/tools/auth/auth.js +0 -57
  269. package/dist/mcp/tools/auth/auth.js.map +0 -1
  270. package/dist/mcp/tools/auth/forgotPassword.d.ts +0 -4
  271. package/dist/mcp/tools/auth/forgotPassword.d.ts.map +0 -1
  272. package/dist/mcp/tools/auth/forgotPassword.js +0 -48
  273. package/dist/mcp/tools/auth/forgotPassword.js.map +0 -1
  274. package/dist/mcp/tools/auth/login.d.ts +0 -4
  275. package/dist/mcp/tools/auth/login.d.ts.map +0 -1
  276. package/dist/mcp/tools/auth/login.js +0 -51
  277. package/dist/mcp/tools/auth/login.js.map +0 -1
  278. package/dist/mcp/tools/auth/resetPassword.d.ts +0 -4
  279. package/dist/mcp/tools/auth/resetPassword.d.ts.map +0 -1
  280. package/dist/mcp/tools/auth/resetPassword.js +0 -49
  281. package/dist/mcp/tools/auth/resetPassword.js.map +0 -1
  282. package/dist/mcp/tools/auth/unlock.d.ts +0 -4
  283. package/dist/mcp/tools/auth/unlock.d.ts.map +0 -1
  284. package/dist/mcp/tools/auth/unlock.js +0 -48
  285. package/dist/mcp/tools/auth/unlock.js.map +0 -1
  286. package/dist/mcp/tools/auth/verify.d.ts +0 -4
  287. package/dist/mcp/tools/auth/verify.d.ts.map +0 -1
  288. package/dist/mcp/tools/auth/verify.js +0 -45
  289. package/dist/mcp/tools/auth/verify.js.map +0 -1
  290. package/dist/mcp/tools/collection/create.d.ts +0 -10
  291. package/dist/mcp/tools/collection/create.d.ts.map +0 -1
  292. package/dist/mcp/tools/collection/create.js +0 -139
  293. package/dist/mcp/tools/collection/create.js.map +0 -1
  294. package/dist/mcp/tools/collection/delete.d.ts +0 -10
  295. package/dist/mcp/tools/collection/delete.d.ts.map +0 -1
  296. package/dist/mcp/tools/collection/delete.js +0 -154
  297. package/dist/mcp/tools/collection/delete.js.map +0 -1
  298. package/dist/mcp/tools/collection/find.d.ts +0 -10
  299. package/dist/mcp/tools/collection/find.d.ts.map +0 -1
  300. package/dist/mcp/tools/collection/find.js +0 -165
  301. package/dist/mcp/tools/collection/find.js.map +0 -1
  302. package/dist/mcp/tools/collection/update.d.ts +0 -10
  303. package/dist/mcp/tools/collection/update.d.ts.map +0 -1
  304. package/dist/mcp/tools/collection/update.js +0 -209
  305. package/dist/mcp/tools/collection/update.js.map +0 -1
  306. package/dist/mcp/tools/config/find.d.ts +0 -10
  307. package/dist/mcp/tools/config/find.d.ts.map +0 -1
  308. package/dist/mcp/tools/config/find.js +0 -97
  309. package/dist/mcp/tools/config/find.js.map +0 -1
  310. package/dist/mcp/tools/config/update.d.ts +0 -10
  311. package/dist/mcp/tools/config/update.d.ts.map +0 -1
  312. package/dist/mcp/tools/config/update.js +0 -215
  313. package/dist/mcp/tools/config/update.js.map +0 -1
  314. package/dist/mcp/tools/global/find.d.ts +0 -5
  315. package/dist/mcp/tools/global/find.d.ts.map +0 -1
  316. package/dist/mcp/tools/global/find.js +0 -82
  317. package/dist/mcp/tools/global/find.js.map +0 -1
  318. package/dist/mcp/tools/global/update.d.ts +0 -6
  319. package/dist/mcp/tools/global/update.d.ts.map +0 -1
  320. package/dist/mcp/tools/global/update.js +0 -124
  321. package/dist/mcp/tools/global/update.js.map +0 -1
  322. package/dist/mcp/tools/job/create.d.ts +0 -10
  323. package/dist/mcp/tools/job/create.d.ts.map +0 -1
  324. package/dist/mcp/tools/job/create.js +0 -293
  325. package/dist/mcp/tools/job/create.js.map +0 -1
  326. package/dist/mcp/tools/job/run.d.ts +0 -10
  327. package/dist/mcp/tools/job/run.d.ts.map +0 -1
  328. package/dist/mcp/tools/job/run.js +0 -129
  329. package/dist/mcp/tools/job/run.js.map +0 -1
  330. package/dist/mcp/tools/job/update.d.ts +0 -11
  331. package/dist/mcp/tools/job/update.d.ts.map +0 -1
  332. package/dist/mcp/tools/job/update.js +0 -186
  333. package/dist/mcp/tools/job/update.js.map +0 -1
  334. package/dist/mcp/tools/resource/create.d.ts +0 -6
  335. package/dist/mcp/tools/resource/create.d.ts.map +0 -1
  336. package/dist/mcp/tools/resource/create.js +0 -124
  337. package/dist/mcp/tools/resource/create.js.map +0 -1
  338. package/dist/mcp/tools/resource/delete.d.ts +0 -5
  339. package/dist/mcp/tools/resource/delete.d.ts.map +0 -1
  340. package/dist/mcp/tools/resource/delete.js +0 -151
  341. package/dist/mcp/tools/resource/delete.js.map +0 -1
  342. package/dist/mcp/tools/resource/find.d.ts +0 -5
  343. package/dist/mcp/tools/resource/find.d.ts.map +0 -1
  344. package/dist/mcp/tools/resource/find.js +0 -170
  345. package/dist/mcp/tools/resource/find.js.map +0 -1
  346. package/dist/mcp/tools/resource/update.d.ts +0 -6
  347. package/dist/mcp/tools/resource/update.d.ts.map +0 -1
  348. package/dist/mcp/tools/resource/update.js +0 -256
  349. package/dist/mcp/tools/resource/update.js.map +0 -1
  350. package/dist/mcp/tools/schemas.d.ts +0 -457
  351. package/dist/mcp/tools/schemas.d.ts.map +0 -1
  352. package/dist/mcp/tools/schemas.js +0 -243
  353. package/dist/mcp/tools/schemas.js.map +0 -1
  354. package/dist/utils/adminEntitySettings.d.ts +0 -17
  355. package/dist/utils/adminEntitySettings.d.ts.map +0 -1
  356. package/dist/utils/adminEntitySettings.js +0 -41
  357. package/dist/utils/adminEntitySettings.js.map +0 -1
  358. package/dist/utils/createApiKeyFields.d.ts +0 -15
  359. package/dist/utils/createApiKeyFields.d.ts.map +0 -1
  360. package/dist/utils/createApiKeyFields.js +0 -57
  361. package/dist/utils/createApiKeyFields.js.map +0 -1
  362. package/dist/utils/getEnabledSlugs.d.ts +0 -13
  363. package/dist/utils/getEnabledSlugs.d.ts.map +0 -1
  364. package/dist/utils/getEnabledSlugs.js +0 -32
  365. package/dist/utils/getEnabledSlugs.js.map +0 -1
  366. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts +0 -3
  367. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts.map +0 -1
  368. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js +0 -43
  369. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js.map +0 -1
  370. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  371. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  372. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  373. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  374. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts +0 -13
  375. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts.map +0 -1
  376. package/dist/utils/schemaConversion/sanitizeJsonSchema.js +0 -56
  377. package/dist/utils/schemaConversion/sanitizeJsonSchema.js.map +0 -1
  378. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts +0 -20
  379. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts.map +0 -1
  380. package/dist/utils/schemaConversion/simplifyRelationshipFields.js +0 -53
  381. package/dist/utils/schemaConversion/simplifyRelationshipFields.js.map +0 -1
  382. package/dist/utils/schemaConversion/transformPointFields.d.ts +0 -3
  383. package/dist/utils/schemaConversion/transformPointFields.d.ts.map +0 -1
  384. package/dist/utils/schemaConversion/transformPointFields.js +0 -51
  385. package/dist/utils/schemaConversion/transformPointFields.js.map +0 -1
  386. package/src/collections/createApiKeysCollection.ts +0 -373
  387. package/src/defaults.ts +0 -3
  388. package/src/endpoints/mcp.ts +0 -91
  389. package/src/mcp/createRequest.ts +0 -13
  390. package/src/mcp/getMcpHandler.ts +0 -545
  391. package/src/mcp/helpers/config.ts +0 -213
  392. package/src/mcp/helpers/fields.ts +0 -154
  393. package/src/mcp/helpers/fileValidation.ts +0 -362
  394. package/src/mcp/registerTool.ts +0 -22
  395. package/src/mcp/tools/auth/auth.ts +0 -71
  396. package/src/mcp/tools/auth/forgotPassword.ts +0 -70
  397. package/src/mcp/tools/auth/login.ts +0 -72
  398. package/src/mcp/tools/auth/resetPassword.ts +0 -61
  399. package/src/mcp/tools/auth/unlock.ts +0 -64
  400. package/src/mcp/tools/auth/verify.ts +0 -57
  401. package/src/mcp/tools/collection/create.ts +0 -210
  402. package/src/mcp/tools/collection/delete.ts +0 -211
  403. package/src/mcp/tools/collection/find.ts +0 -224
  404. package/src/mcp/tools/collection/update.ts +0 -290
  405. package/src/mcp/tools/config/find.ts +0 -128
  406. package/src/mcp/tools/config/update.ts +0 -280
  407. package/src/mcp/tools/global/find.ts +0 -128
  408. package/src/mcp/tools/global/update.ts +0 -207
  409. package/src/mcp/tools/job/create.ts +0 -416
  410. package/src/mcp/tools/job/run.ts +0 -167
  411. package/src/mcp/tools/job/update.ts +0 -274
  412. package/src/mcp/tools/resource/create.ts +0 -211
  413. package/src/mcp/tools/resource/delete.ts +0 -218
  414. package/src/mcp/tools/resource/find.ts +0 -246
  415. package/src/mcp/tools/resource/update.ts +0 -383
  416. package/src/mcp/tools/schemas.ts +0 -520
  417. package/src/utils/adminEntitySettings.ts +0 -40
  418. package/src/utils/createApiKeyFields.ts +0 -72
  419. package/src/utils/getEnabledSlugs.ts +0 -42
  420. package/src/utils/schemaConversion/convertCollectionSchemaToZod.ts +0 -52
  421. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
  422. package/src/utils/schemaConversion/sanitizeJsonSchema.ts +0 -62
  423. package/src/utils/schemaConversion/simplifyRelationshipFields.ts +0 -65
  424. package/src/utils/schemaConversion/transformPointFields.ts +0 -55
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,46 @@
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
+ // tsx 4.22.4's synchronous loader leaks its namespace query onto Node built-ins on Node 23.5+.
31
+ // Force the stable asynchronous loader path, matching payload/bin.js.
32
+ const nodeModule = await import('node:module')
33
+ if (typeof nodeModule.default.registerHooks === 'function') {
34
+ nodeModule.default.registerHooks = undefined
35
+ }
36
+
37
+ const { tsImport } = await import('tsx/esm/api')
38
+ const { runMcpStdio } = await tsImport('./dist/stdio.js', baseURL)
39
+ await runMcpStdio()
40
+ }
41
+
42
+ start().catch((err) => {
43
+ // eslint-disable-next-line no-console
44
+ console.error('[payload-mcp] error:', err)
45
+ process.exit(1)
46
+ })
@@ -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
+ collectionSlug: item.collectionSlug,
66
+ permissions,
67
+ req
68
+ });
69
+ case 'globalTool':
70
+ return !item.tool.access || await item.tool.access({
71
+ globalSlug: 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({ collectionSlug: item.collectionSlug, permissions, req }))\n )\n case 'globalTool':\n return (\n !item.tool.access ||\n (await item.tool.access({ globalSlug: 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","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,gBAAgBN,KAAKM,cAAc;gBAAEP;gBAAahB;YAAI;QAEpF,KAAK;YACH,OACE,CAACiB,KAAKI,IAAI,CAACC,MAAM,IAChB,MAAML,KAAKI,IAAI,CAACC,MAAM,CAAC;gBAAEE,YAAYP,KAAKO,UAAU;gBAAER;gBAAahB;YAAI;QAE5E,KAAK;YACH,OAAO,CAACiB,KAAKQ,MAAM,CAACH,MAAM,IAAK,MAAML,KAAKQ,MAAM,CAACH,MAAM,CAAC;gBAAEN;gBAAahB;YAAI;QAC7E,KAAK;YACH,OAAO,CAACiB,KAAKS,QAAQ,CAACJ,MAAM,IAAK,MAAML,KAAKS,QAAQ,CAACJ,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;AAa7D,eAAO,MAAM,WAAW,EAAE,cA+DzB,CAAA"}
@@ -0,0 +1,87 @@
1
+ import { createMcpHandler, isLegacyRequest, 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
+ // Payload augments the original web-standard Request in place.
29
+ const mcpRequest = req;
30
+ // Keep the old JSON-only, stateless behavior because the SDK's 2025 fallback uses SSE.
31
+ if (await isLegacyRequest(mcpRequest)) {
32
+ const server = buildMcpServer({
33
+ authorizedMCP,
34
+ pluginConfig,
35
+ req
36
+ });
37
+ const transport = new WebStandardStreamableHTTPServerTransport({
38
+ enableJsonResponse: true,
39
+ sessionIdGenerator: undefined
40
+ });
41
+ transport.onerror = (err)=>{
42
+ req.payload.logger.error({
43
+ err,
44
+ msg: 'Error serving legacy MCP request'
45
+ });
46
+ };
47
+ try {
48
+ await server.connect(transport);
49
+ return await transport.handleRequest(mcpRequest);
50
+ } finally{
51
+ await server.close().catch((err)=>{
52
+ req.payload.logger.error({
53
+ err,
54
+ msg: 'Error closing MCP server'
55
+ });
56
+ });
57
+ }
58
+ }
59
+ const handler = createMcpHandler(()=>buildMcpServer({
60
+ authorizedMCP,
61
+ pluginConfig,
62
+ req
63
+ }), {
64
+ legacy: 'reject',
65
+ // SDK subscriptions always use SSE, so disable them to keep every response JSON-only.
66
+ maxSubscriptions: 0,
67
+ onerror: (err)=>{
68
+ req.payload.logger.error({
69
+ err,
70
+ msg: 'Error serving modern MCP request'
71
+ });
72
+ },
73
+ responseMode: 'json'
74
+ });
75
+ try {
76
+ return await handler.fetch(mcpRequest);
77
+ } finally{
78
+ await handler.close().catch((err)=>{
79
+ req.payload.logger.error({
80
+ err,
81
+ msg: 'Error closing modern MCP handler'
82
+ });
83
+ });
84
+ }
85
+ };
86
+
87
+ //# 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 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 // Payload augments the original web-standard Request in place.\n const mcpRequest = req as PayloadRequest & Request\n\n // Keep the old JSON-only, stateless behavior because the SDK's 2025 fallback uses SSE.\n if (await isLegacyRequest(mcpRequest)) {\n const server = buildMcpServer({ authorizedMCP, pluginConfig, req })\n const transport = new WebStandardStreamableHTTPServerTransport({\n enableJsonResponse: true,\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)\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 // 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)\n } finally {\n await handler.close().catch((err) => {\n req.payload.logger.error({ err, msg: 'Error closing modern MCP handler' })\n })\n }\n}\n"],"names":["createMcpHandler","isLegacyRequest","WebStandardStreamableHTTPServerTransport","APIError","buildMcpServer","getPluginConfig","getAuthorizedMCP","mcpEndpoint","req","url","payloadAPI","pluginConfig","config","payload","overrideAccessParam","URL","searchParams","get","process","env","NODE_ENV","overrideAccess","authorizedMCP","mcpRequest","server","transport","enableJsonResponse","sessionIdGenerator","undefined","onerror","err","logger","error","msg","connect","handleRequest","close","catch","handler","legacy","maxSubscriptions","responseMode","fetch"],"mappings":"AAEA,SACEA,gBAAgB,EAChBC,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,+DAA+D;IAC/D,MAAMe,aAAaf;IAEnB,uFAAuF;IACvF,IAAI,MAAMP,gBAAgBsB,aAAa;QACrC,MAAMC,SAASpB,eAAe;YAAEkB;YAAeX;YAAcH;QAAI;QACjE,MAAMiB,YAAY,IAAIvB,yCAAyC;YAC7DwB,oBAAoB;YACpBC,oBAAoBC;QACtB;QACAH,UAAUI,OAAO,GAAG,CAACC;YACnBtB,IAAIK,OAAO,CAACkB,MAAM,CAACC,KAAK,CAAC;gBAAEF;gBAAKG,KAAK;YAAmC;QAC1E;QAEA,IAAI;YACF,MAAMT,OAAOU,OAAO,CAACT;YACrB,OAAO,MAAMA,UAAUU,aAAa,CAACZ;QACvC,SAAU;YACR,MAAMC,OAAOY,KAAK,GAAGC,KAAK,CAAC,CAACP;gBAC1BtB,IAAIK,OAAO,CAACkB,MAAM,CAACC,KAAK,CAAC;oBAAEF;oBAAKG,KAAK;gBAA2B;YAClE;QACF;IACF;IAEA,MAAMK,UAAUtC,iBAAiB,IAAMI,eAAe;YAAEkB;YAAeX;YAAcH;QAAI,IAAI;QAC3F+B,QAAQ;QACR,sFAAsF;QACtFC,kBAAkB;QAClBX,SAAS,CAACC;YACRtB,IAAIK,OAAO,CAACkB,MAAM,CAACC,KAAK,CAAC;gBAAEF;gBAAKG,KAAK;YAAmC;QAC1E;QACAQ,cAAc;IAChB;IAEA,IAAI;QACF,OAAO,MAAMH,QAAQI,KAAK,CAACnB;IAC7B,SAAU;QACR,MAAMe,QAAQF,KAAK,GAAGC,KAAK,CAAC,CAACP;YAC3BtB,IAAIK,OAAO,CAACkB,MAAM,CAACC,KAAK,CAAC;gBAAEF;gBAAKG,KAAK;YAAmC;QAC1E;IACF;AACF,EAAC"}
@@ -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
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { definePlugin } from 'payload'\n\nimport type { MCPAccessSettings, MCPPluginConfig } from './types.js'\n\nimport { createAPIKeysCollection } from './collections/createApiKeysCollection.js'\nimport { initializeMCPHandler } from './endpoints/mcp.js'\n\ndeclare module 'payload' {\n export interface PayloadRequest {\n payloadAPI: 'GraphQL' | 'local' | 'MCP' | 'REST'\n }\n interface RegisteredPlugins {\n '@payloadcms/plugin-mcp': MCPPluginConfig\n }\n}\n\nimport { defaults } from './defaults.js'\n\nexport type { MCPAccessSettings, MCPPluginConfig }\n\n/**\n * The MCP Plugin for Payload. This plugin allows you to add MCP capabilities to your Payload project.\n *\n * @param pluginOptions - The options for the MCP plugin.\n */\nexport const mcpPlugin = definePlugin<MCPPluginConfig>({\n slug: '@payloadcms/plugin-mcp',\n order: 10,\n plugin: ({ config, plugins: _plugins, ...pluginOptions }) => {\n if (!config.collections) {\n config.collections = []\n }\n\n // Collections\n const collections = pluginOptions.collections || {}\n // Globals\n const globals = pluginOptions.globals || {}\n // Extract custom tools for the global config\n const customTools =\n pluginOptions.mcp?.tools?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n })) || []\n\n // User Collection\n pluginOptions.userCollection =\n pluginOptions.userCollection ?? config?.admin?.user ?? defaults.userCollection\n\n const experimentalTools = pluginOptions?.experimental?.tools || {}\n\n /**\n * API Keys\n * --------\n * High resolution control over MCP capabilities is crucial when using Payload with LLMs.\n *\n * This API Keys collection has ways for admins to create API keys and allow or disallow the MCP capabilities.\n * This is useful when Admins want to allow or disallow the use of the MCP capabilities in real time.\n * For example:\n * - If a collection has all of its capabilities enabled, admins can allow or disallow the create, update, delete, and find capabilities on that collection.\n * - If a collection only has the find capability enabled, admins can only allow or disallow the find capability on that collection.\n * - If a global has all of its capabilities enabled, admins can allow or disallow the find and update capabilities on that global.\n * - If a custom tool has gone haywire, admins can disallow that tool.\n *\n */\n const apiKeyCollection = createAPIKeysCollection(\n collections,\n globals,\n customTools,\n experimentalTools,\n pluginOptions,\n )\n if (pluginOptions.overrideApiKeyCollection) {\n config.collections.push(pluginOptions.overrideApiKeyCollection(apiKeyCollection))\n } else {\n config.collections.push(apiKeyCollection)\n }\n\n /**\n * If the plugin is disabled, we still want to keep added collections/fields so the database schema is consistent which is important for migrations.\n * If your plugin heavily modifies the database schema, you may want to remove this property.\n */\n if (pluginOptions.disabled) {\n return config\n }\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n /**\n * This is the primary MCP Server Endpoint.\n * Payload will automatically add the /api prefix to the path, so the full path is `/api/mcp`\n * NOTE: This is only transport method until we add full support for SSE which will be another endpoint at `/api/sse`\n */\n config.endpoints.push({\n handler: initializeMCPHandler(pluginOptions),\n method: 'post',\n path: '/mcp',\n })\n\n /**\n * The GET response is always: {\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32000,\"message\":\"Method not allowed.\"},\"id\":null} -- even with an API key\n * This is expected behavior and MCP clients should always use the POST endpoint.\n */\n config.endpoints.push({\n handler: initializeMCPHandler(pluginOptions),\n method: 'get',\n path: '/mcp',\n })\n\n return config\n },\n})\n"],"names":["definePlugin","createAPIKeysCollection","initializeMCPHandler","defaults","mcpPlugin","slug","order","plugin","config","plugins","_plugins","pluginOptions","collections","globals","customTools","mcp","tools","map","tool","name","description","userCollection","admin","user","experimentalTools","experimental","apiKeyCollection","overrideApiKeyCollection","push","disabled","endpoints","handler","method","path"],"mappings":"AAAA,SAASA,YAAY,QAAQ,UAAS;AAItC,SAASC,uBAAuB,QAAQ,2CAA0C;AAClF,SAASC,oBAAoB,QAAQ,qBAAoB;AAWzD,SAASC,QAAQ,QAAQ,gBAAe;AAIxC;;;;CAIC,GACD,OAAO,MAAMC,YAAYJ,aAA8B;IACrDK,MAAM;IACNC,OAAO;IACPC,QAAQ,CAAC,EAAEC,MAAM,EAAEC,SAASC,QAAQ,EAAE,GAAGC,eAAe;QACtD,IAAI,CAACH,OAAOI,WAAW,EAAE;YACvBJ,OAAOI,WAAW,GAAG,EAAE;QACzB;QAEA,cAAc;QACd,MAAMA,cAAcD,cAAcC,WAAW,IAAI,CAAC;QAClD,UAAU;QACV,MAAMC,UAAUF,cAAcE,OAAO,IAAI,CAAC;QAC1C,6CAA6C;QAC7C,MAAMC,cACJH,cAAcI,GAAG,EAAEC,OAAOC,IAAI,CAACC,OAAU,CAAA;gBACvCC,MAAMD,KAAKC,IAAI;gBACfC,aAAaF,KAAKE,WAAW;YAC/B,CAAA,MAAO,EAAE;QAEX,kBAAkB;QAClBT,cAAcU,cAAc,GAC1BV,cAAcU,cAAc,IAAIb,QAAQc,OAAOC,QAAQpB,SAASkB,cAAc;QAEhF,MAAMG,oBAAoBb,eAAec,cAAcT,SAAS,CAAC;QAEjE;;;;;;;;;;;;;KAaC,GACD,MAAMU,mBAAmBzB,wBACvBW,aACAC,SACAC,aACAU,mBACAb;QAEF,IAAIA,cAAcgB,wBAAwB,EAAE;YAC1CnB,OAAOI,WAAW,CAACgB,IAAI,CAACjB,cAAcgB,wBAAwB,CAACD;QACjE,OAAO;YACLlB,OAAOI,WAAW,CAACgB,IAAI,CAACF;QAC1B;QAEA;;;KAGC,GACD,IAAIf,cAAckB,QAAQ,EAAE;YAC1B,OAAOrB;QACT;QAEA,IAAI,CAACA,OAAOsB,SAAS,EAAE;YACrBtB,OAAOsB,SAAS,GAAG,EAAE;QACvB;QAEA;;;;KAIC,GACDtB,OAAOsB,SAAS,CAACF,IAAI,CAAC;YACpBG,SAAS7B,qBAAqBS;YAC9BqB,QAAQ;YACRC,MAAM;QACR;QAEA;;;KAGC,GACDzB,OAAOsB,SAAS,CAACF,IAAI,CAAC;YACpBG,SAAS7B,qBAAqBS;YAC9BqB,QAAQ;YACRC,MAAM;QACR;QAEA,OAAOzB;IACT;AACF,GAAE"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { definePlugin } from 'payload'\n\nimport type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig } from './types.js'\n\nimport { mcpEndpoint } from './endpoint/index.js'\nimport { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js'\n\ndeclare module 'payload' {\n export interface PayloadRequestAPI {\n MCP: true\n }\n interface RegisteredPlugins {\n /** After the plugin's `plugin` callback runs, `options` holds the sanitized config. */\n '@payloadcms/plugin-mcp': MCPPluginConfig\n }\n}\n\nexport type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig }\n\nexport { defineCollectionTool, defineGlobalTool, definePrompt, defineTool } from './defineTool.js'\n\nexport const mcpPlugin = definePlugin<MCPPluginConfig>({\n slug: '@payloadcms/plugin-mcp',\n order: 10,\n plugin: ({ config, options, plugins }) => {\n const pluginConfig = sanitizeMCPConfig({ config, pluginConfig: options })\n\n // Stash the sanitized config on plugin options so `getPluginConfig()` reads it.\n const registered = plugins['@payloadcms/plugin-mcp']\n if (registered) {\n // @ts-expect-error\n registered.sanitizedOptions = pluginConfig as unknown as typeof registered.options\n }\n\n if (pluginConfig.disabled) {\n return config\n }\n\n return {\n ...config,\n endpoints: [\n ...(config.endpoints ?? []),\n // Payload prefixes /api, so the full path is /api/mcp.\n { handler: mcpEndpoint, method: 'post', path: '/mcp' },\n // Streamable HTTP's optional server=>client GET stream. We don't offer\n // one, so answer 405 per spec-— clients then skip it cleanly\n {\n handler: () => new Response(null, { headers: { Allow: 'POST' }, status: 405 }),\n method: 'get',\n path: '/mcp',\n },\n ],\n }\n },\n})\n"],"names":["definePlugin","mcpEndpoint","sanitizeMCPConfig","defineCollectionTool","defineGlobalTool","definePrompt","defineTool","mcpPlugin","slug","order","plugin","config","options","plugins","pluginConfig","registered","sanitizedOptions","disabled","endpoints","handler","method","path","Response","headers","Allow","status"],"mappings":"AAAA,SAASA,YAAY,QAAQ,UAAS;AAItC,SAASC,WAAW,QAAQ,sBAAqB;AACjD,SAASC,iBAAiB,QAAQ,6BAA4B;AAc9D,SAASC,oBAAoB,EAAEC,gBAAgB,EAAEC,YAAY,EAAEC,UAAU,QAAQ,kBAAiB;AAElG,OAAO,MAAMC,YAAYP,aAA8B;IACrDQ,MAAM;IACNC,OAAO;IACPC,QAAQ,CAAC,EAAEC,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE;QACnC,MAAMC,eAAeZ,kBAAkB;YAAES;YAAQG,cAAcF;QAAQ;QAEvE,gFAAgF;QAChF,MAAMG,aAAaF,OAAO,CAAC,yBAAyB;QACpD,IAAIE,YAAY;YACd,mBAAmB;YACnBA,WAAWC,gBAAgB,GAAGF;QAChC;QAEA,IAAIA,aAAaG,QAAQ,EAAE;YACzB,OAAON;QACT;QAEA,OAAO;YACL,GAAGA,MAAM;YACTO,WAAW;mBACLP,OAAOO,SAAS,IAAI,EAAE;gBAC1B,uDAAuD;gBACvD;oBAAEC,SAASlB;oBAAamB,QAAQ;oBAAQC,MAAM;gBAAO;gBACrD,uEAAuE;gBACvE,6DAA6D;gBAC7D;oBACEF,SAAS,IAAM,IAAIG,SAAS,MAAM;4BAAEC,SAAS;gCAAEC,OAAO;4BAAO;4BAAGC,QAAQ;wBAAI;oBAC5EL,QAAQ;oBACRC,MAAM;gBACR;aACD;QACH;IACF;AACF,GAAE"}
@@ -0,0 +1,19 @@
1
+ import { McpServer } from '@modelcontextprotocol/server';
2
+ import { type PayloadRequest } from 'payload';
3
+ import type { AuthorizedMCP, SanitizedMCPPluginConfig } from '../types.js';
4
+ /**
5
+ * Serving-entry-agnostic core: registers every authorized MCP item onto a fresh
6
+ * `McpServer` and returns it. The HTTP and stdio entry point callers provide fresh
7
+ * instances from this builder while they own the transport and protocol-era
8
+ * decision.
9
+ *
10
+ * `req` is the request context handlers see. For HTTP it's the live
11
+ * `PayloadRequest` derived from the incoming HTTP request; for stdio it's a
12
+ * synthesized one built via `createLocalReq`.
13
+ */
14
+ export declare const buildMcpServer: ({ authorizedMCP, pluginConfig, req, }: {
15
+ authorizedMCP: AuthorizedMCP;
16
+ pluginConfig: SanitizedMCPPluginConfig;
17
+ req: PayloadRequest;
18
+ }) => McpServer;
19
+ //# sourceMappingURL=buildMcpServer.d.ts.map