@payloadcms/plugin-mcp 4.0.0-internal.5b1e7cd → 4.0.0-internal.a0ef1b8

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 (340) hide show
  1. package/bin.js +39 -0
  2. package/dist/@types/assets.d.js +2 -0
  3. package/dist/@types/assets.d.js.map +1 -0
  4. package/dist/collection/getAccessField.d.ts +12 -0
  5. package/dist/collection/getAccessField.d.ts.map +1 -0
  6. package/dist/collection/getAccessField.js +57 -0
  7. package/dist/collection/getAccessField.js.map +1 -0
  8. package/dist/collection/index.d.ts +6 -0
  9. package/dist/collection/index.d.ts.map +1 -0
  10. package/dist/collection/index.js +60 -0
  11. package/dist/collection/index.js.map +1 -0
  12. package/dist/components/AccessField/index.client.d.ts +10 -0
  13. package/dist/components/AccessField/index.client.d.ts.map +1 -0
  14. package/dist/components/AccessField/index.client.js +305 -0
  15. package/dist/components/AccessField/index.client.js.map +1 -0
  16. package/dist/components/AccessField/index.css +93 -0
  17. package/dist/defineTool.d.ts +26 -0
  18. package/dist/defineTool.d.ts.map +1 -0
  19. package/dist/defineTool.js +37 -0
  20. package/dist/defineTool.js.map +1 -0
  21. package/dist/endpoint/access.d.ts +10 -0
  22. package/dist/endpoint/access.d.ts.map +1 -0
  23. package/dist/endpoint/access.js +106 -0
  24. package/dist/endpoint/access.js.map +1 -0
  25. package/dist/endpoint/index.d.ts +3 -0
  26. package/dist/endpoint/index.d.ts.map +1 -0
  27. package/dist/endpoint/index.js +36 -0
  28. package/dist/endpoint/index.js.map +1 -0
  29. package/dist/exports/client.d.ts +2 -0
  30. package/dist/exports/client.d.ts.map +1 -0
  31. package/dist/exports/client.js +4 -0
  32. package/dist/exports/client.js.map +1 -0
  33. package/dist/index.d.ts +4 -7
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +44 -67
  36. package/dist/index.js.map +1 -1
  37. package/dist/mcp/buildMcpServer.d.ts +19 -0
  38. package/dist/mcp/buildMcpServer.d.ts.map +1 -0
  39. package/dist/mcp/buildMcpServer.js +170 -0
  40. package/dist/mcp/buildMcpServer.js.map +1 -0
  41. package/dist/mcp/builtin/collections/authTools.d.ts +7 -0
  42. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -0
  43. package/dist/mcp/builtin/collections/authTools.js +250 -0
  44. package/dist/mcp/builtin/collections/authTools.js.map +1 -0
  45. package/dist/mcp/builtin/collections/createTool.d.ts +2 -0
  46. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -0
  47. package/dist/mcp/builtin/collections/createTool.js +91 -0
  48. package/dist/mcp/builtin/collections/createTool.js.map +1 -0
  49. package/dist/mcp/builtin/collections/deleteTool.d.ts +2 -0
  50. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -0
  51. package/dist/mcp/builtin/collections/deleteTool.js +117 -0
  52. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -0
  53. package/dist/mcp/builtin/collections/findTool.d.ts +2 -0
  54. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -0
  55. package/dist/mcp/builtin/collections/findTool.js +159 -0
  56. package/dist/mcp/builtin/collections/findTool.js.map +1 -0
  57. package/dist/mcp/builtin/collections/updateTool.d.ts +2 -0
  58. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -0
  59. package/dist/mcp/builtin/collections/updateTool.js +191 -0
  60. package/dist/mcp/builtin/collections/updateTool.js.map +1 -0
  61. package/dist/mcp/builtin/globals/findTool.d.ts +2 -0
  62. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -0
  63. package/dist/mcp/builtin/globals/findTool.js +76 -0
  64. package/dist/mcp/builtin/globals/findTool.js.map +1 -0
  65. package/dist/mcp/builtin/globals/updateTool.d.ts +2 -0
  66. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -0
  67. package/dist/mcp/builtin/globals/updateTool.js +96 -0
  68. package/dist/mcp/builtin/globals/updateTool.js.map +1 -0
  69. package/dist/mcp/builtinTools.d.ts +37 -0
  70. package/dist/mcp/builtinTools.d.ts.map +1 -0
  71. package/dist/mcp/builtinTools.js +64 -0
  72. package/dist/mcp/builtinTools.js.map +1 -0
  73. package/dist/mcp/sanitizeMCPConfig.d.ts +17 -0
  74. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -0
  75. package/dist/mcp/sanitizeMCPConfig.js +167 -0
  76. package/dist/mcp/sanitizeMCPConfig.js.map +1 -0
  77. package/dist/stdio.d.ts +8 -0
  78. package/dist/stdio.d.ts.map +1 -0
  79. package/dist/stdio.js +89 -0
  80. package/dist/stdio.js.map +1 -0
  81. package/dist/types.d.ts +262 -455
  82. package/dist/types.d.ts.map +1 -1
  83. package/dist/types.js +6 -1
  84. package/dist/types.js.map +1 -1
  85. package/dist/utils/camelCase.d.ts.map +1 -1
  86. package/dist/utils/getLogger.d.ts +10 -0
  87. package/dist/utils/getLogger.d.ts.map +1 -0
  88. package/dist/utils/getLogger.js +22 -0
  89. package/dist/utils/getLogger.js.map +1 -0
  90. package/dist/utils/getPluginConfig.d.ts +12 -0
  91. package/dist/utils/getPluginConfig.d.ts.map +1 -0
  92. package/dist/utils/getPluginConfig.js +15 -0
  93. package/dist/utils/getPluginConfig.js.map +1 -0
  94. package/dist/utils/localAPIDefaults.d.ts +20 -0
  95. package/dist/utils/localAPIDefaults.d.ts.map +1 -0
  96. package/dist/utils/localAPIDefaults.js +19 -0
  97. package/dist/utils/localAPIDefaults.js.map +1 -0
  98. package/dist/utils/resolveProjectRoot.d.ts +7 -0
  99. package/dist/utils/resolveProjectRoot.d.ts.map +1 -0
  100. package/dist/utils/resolveProjectRoot.js +15 -0
  101. package/dist/utils/resolveProjectRoot.js.map +1 -0
  102. package/dist/utils/schemaConversion/buildToolInput.d.ts +29 -0
  103. package/dist/utils/schemaConversion/buildToolInput.d.ts.map +1 -0
  104. package/dist/utils/schemaConversion/buildToolInput.js +51 -0
  105. package/dist/utils/schemaConversion/buildToolInput.js.map +1 -0
  106. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +2 -2
  107. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +1 -1
  108. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +1 -1
  109. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +15 -0
  110. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -0
  111. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +464 -0
  112. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -0
  113. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +158 -0
  114. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -0
  115. package/dist/utils/toStandardSchema.d.ts +5 -0
  116. package/dist/utils/toStandardSchema.d.ts.map +1 -0
  117. package/dist/utils/toStandardSchema.js +4 -0
  118. package/dist/utils/toStandardSchema.js.map +1 -0
  119. package/package.json +35 -10
  120. package/src/@types/assets.d.ts +3 -0
  121. package/src/collection/getAccessField.ts +64 -0
  122. package/src/collection/index.ts +64 -0
  123. package/src/components/AccessField/index.client.tsx +344 -0
  124. package/src/components/AccessField/index.css +93 -0
  125. package/src/defineTool.ts +44 -0
  126. package/src/endpoint/access.ts +132 -0
  127. package/src/endpoint/index.ts +35 -0
  128. package/src/exports/client.ts +2 -0
  129. package/src/index.ts +35 -85
  130. package/src/mcp/buildMcpServer.ts +229 -0
  131. package/src/mcp/builtin/collections/authTools.ts +233 -0
  132. package/src/mcp/builtin/collections/createTool.ts +116 -0
  133. package/src/mcp/builtin/collections/deleteTool.ts +123 -0
  134. package/src/mcp/builtin/collections/findTool.ts +187 -0
  135. package/src/mcp/builtin/collections/updateTool.ts +210 -0
  136. package/src/mcp/builtin/globals/findTool.ts +96 -0
  137. package/src/mcp/builtin/globals/updateTool.ts +120 -0
  138. package/src/mcp/builtinTools.ts +84 -0
  139. package/src/mcp/sanitizeMCPConfig.ts +239 -0
  140. package/src/stdio.ts +98 -0
  141. package/src/types.ts +295 -490
  142. package/src/utils/getLogger.ts +22 -0
  143. package/src/utils/getPluginConfig.ts +24 -0
  144. package/src/utils/localAPIDefaults.ts +22 -0
  145. package/src/utils/resolveProjectRoot.ts +17 -0
  146. package/src/utils/schemaConversion/buildToolInput.ts +68 -0
  147. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +3 -3
  148. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +103 -0
  149. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +529 -0
  150. package/src/utils/toStandardSchema.ts +9 -0
  151. package/dist/collections/createApiKeysCollection.d.ts +0 -7
  152. package/dist/collections/createApiKeysCollection.d.ts.map +0 -1
  153. package/dist/collections/createApiKeysCollection.js +0 -317
  154. package/dist/collections/createApiKeysCollection.js.map +0 -1
  155. package/dist/defaults.d.ts +0 -4
  156. package/dist/defaults.d.ts.map +0 -1
  157. package/dist/defaults.js +0 -5
  158. package/dist/defaults.js.map +0 -1
  159. package/dist/endpoints/mcp.d.ts +0 -4
  160. package/dist/endpoints/mcp.d.ts.map +0 -1
  161. package/dist/endpoints/mcp.js +0 -71
  162. package/dist/endpoints/mcp.js.map +0 -1
  163. package/dist/mcp/createRequest.d.ts +0 -3
  164. package/dist/mcp/createRequest.d.ts.map +0 -1
  165. package/dist/mcp/createRequest.js +0 -14
  166. package/dist/mcp/createRequest.js.map +0 -1
  167. package/dist/mcp/getMcpHandler.d.ts +0 -4
  168. package/dist/mcp/getMcpHandler.d.ts.map +0 -1
  169. package/dist/mcp/getMcpHandler.js +0 -231
  170. package/dist/mcp/getMcpHandler.js.map +0 -1
  171. package/dist/mcp/helpers/config.d.ts +0 -22
  172. package/dist/mcp/helpers/config.d.ts.map +0 -1
  173. package/dist/mcp/helpers/config.js +0 -153
  174. package/dist/mcp/helpers/config.js.map +0 -1
  175. package/dist/mcp/helpers/fields.d.ts +0 -19
  176. package/dist/mcp/helpers/fields.d.ts.map +0 -1
  177. package/dist/mcp/helpers/fields.js +0 -102
  178. package/dist/mcp/helpers/fields.js.map +0 -1
  179. package/dist/mcp/helpers/fileValidation.d.ts +0 -67
  180. package/dist/mcp/helpers/fileValidation.d.ts.map +0 -1
  181. package/dist/mcp/helpers/fileValidation.js +0 -267
  182. package/dist/mcp/helpers/fileValidation.js.map +0 -1
  183. package/dist/mcp/registerTool.d.ts +0 -6
  184. package/dist/mcp/registerTool.d.ts.map +0 -1
  185. package/dist/mcp/registerTool.js +0 -18
  186. package/dist/mcp/registerTool.js.map +0 -1
  187. package/dist/mcp/tools/auth/auth.d.ts +0 -4
  188. package/dist/mcp/tools/auth/auth.d.ts.map +0 -1
  189. package/dist/mcp/tools/auth/auth.js +0 -57
  190. package/dist/mcp/tools/auth/auth.js.map +0 -1
  191. package/dist/mcp/tools/auth/forgotPassword.d.ts +0 -4
  192. package/dist/mcp/tools/auth/forgotPassword.d.ts.map +0 -1
  193. package/dist/mcp/tools/auth/forgotPassword.js +0 -48
  194. package/dist/mcp/tools/auth/forgotPassword.js.map +0 -1
  195. package/dist/mcp/tools/auth/login.d.ts +0 -4
  196. package/dist/mcp/tools/auth/login.d.ts.map +0 -1
  197. package/dist/mcp/tools/auth/login.js +0 -51
  198. package/dist/mcp/tools/auth/login.js.map +0 -1
  199. package/dist/mcp/tools/auth/resetPassword.d.ts +0 -4
  200. package/dist/mcp/tools/auth/resetPassword.d.ts.map +0 -1
  201. package/dist/mcp/tools/auth/resetPassword.js +0 -49
  202. package/dist/mcp/tools/auth/resetPassword.js.map +0 -1
  203. package/dist/mcp/tools/auth/unlock.d.ts +0 -4
  204. package/dist/mcp/tools/auth/unlock.d.ts.map +0 -1
  205. package/dist/mcp/tools/auth/unlock.js +0 -48
  206. package/dist/mcp/tools/auth/unlock.js.map +0 -1
  207. package/dist/mcp/tools/auth/verify.d.ts +0 -4
  208. package/dist/mcp/tools/auth/verify.d.ts.map +0 -1
  209. package/dist/mcp/tools/auth/verify.js +0 -45
  210. package/dist/mcp/tools/auth/verify.js.map +0 -1
  211. package/dist/mcp/tools/collection/create.d.ts +0 -10
  212. package/dist/mcp/tools/collection/create.d.ts.map +0 -1
  213. package/dist/mcp/tools/collection/create.js +0 -139
  214. package/dist/mcp/tools/collection/create.js.map +0 -1
  215. package/dist/mcp/tools/collection/delete.d.ts +0 -10
  216. package/dist/mcp/tools/collection/delete.d.ts.map +0 -1
  217. package/dist/mcp/tools/collection/delete.js +0 -154
  218. package/dist/mcp/tools/collection/delete.js.map +0 -1
  219. package/dist/mcp/tools/collection/find.d.ts +0 -10
  220. package/dist/mcp/tools/collection/find.d.ts.map +0 -1
  221. package/dist/mcp/tools/collection/find.js +0 -165
  222. package/dist/mcp/tools/collection/find.js.map +0 -1
  223. package/dist/mcp/tools/collection/update.d.ts +0 -10
  224. package/dist/mcp/tools/collection/update.d.ts.map +0 -1
  225. package/dist/mcp/tools/collection/update.js +0 -209
  226. package/dist/mcp/tools/collection/update.js.map +0 -1
  227. package/dist/mcp/tools/config/find.d.ts +0 -10
  228. package/dist/mcp/tools/config/find.d.ts.map +0 -1
  229. package/dist/mcp/tools/config/find.js +0 -97
  230. package/dist/mcp/tools/config/find.js.map +0 -1
  231. package/dist/mcp/tools/config/update.d.ts +0 -10
  232. package/dist/mcp/tools/config/update.d.ts.map +0 -1
  233. package/dist/mcp/tools/config/update.js +0 -215
  234. package/dist/mcp/tools/config/update.js.map +0 -1
  235. package/dist/mcp/tools/global/find.d.ts +0 -5
  236. package/dist/mcp/tools/global/find.d.ts.map +0 -1
  237. package/dist/mcp/tools/global/find.js +0 -82
  238. package/dist/mcp/tools/global/find.js.map +0 -1
  239. package/dist/mcp/tools/global/update.d.ts +0 -6
  240. package/dist/mcp/tools/global/update.d.ts.map +0 -1
  241. package/dist/mcp/tools/global/update.js +0 -124
  242. package/dist/mcp/tools/global/update.js.map +0 -1
  243. package/dist/mcp/tools/job/create.d.ts +0 -10
  244. package/dist/mcp/tools/job/create.d.ts.map +0 -1
  245. package/dist/mcp/tools/job/create.js +0 -293
  246. package/dist/mcp/tools/job/create.js.map +0 -1
  247. package/dist/mcp/tools/job/run.d.ts +0 -10
  248. package/dist/mcp/tools/job/run.d.ts.map +0 -1
  249. package/dist/mcp/tools/job/run.js +0 -129
  250. package/dist/mcp/tools/job/run.js.map +0 -1
  251. package/dist/mcp/tools/job/update.d.ts +0 -11
  252. package/dist/mcp/tools/job/update.d.ts.map +0 -1
  253. package/dist/mcp/tools/job/update.js +0 -186
  254. package/dist/mcp/tools/job/update.js.map +0 -1
  255. package/dist/mcp/tools/resource/create.d.ts +0 -6
  256. package/dist/mcp/tools/resource/create.d.ts.map +0 -1
  257. package/dist/mcp/tools/resource/create.js +0 -124
  258. package/dist/mcp/tools/resource/create.js.map +0 -1
  259. package/dist/mcp/tools/resource/delete.d.ts +0 -5
  260. package/dist/mcp/tools/resource/delete.d.ts.map +0 -1
  261. package/dist/mcp/tools/resource/delete.js +0 -151
  262. package/dist/mcp/tools/resource/delete.js.map +0 -1
  263. package/dist/mcp/tools/resource/find.d.ts +0 -5
  264. package/dist/mcp/tools/resource/find.d.ts.map +0 -1
  265. package/dist/mcp/tools/resource/find.js +0 -170
  266. package/dist/mcp/tools/resource/find.js.map +0 -1
  267. package/dist/mcp/tools/resource/update.d.ts +0 -6
  268. package/dist/mcp/tools/resource/update.d.ts.map +0 -1
  269. package/dist/mcp/tools/resource/update.js +0 -256
  270. package/dist/mcp/tools/resource/update.js.map +0 -1
  271. package/dist/mcp/tools/schemas.d.ts +0 -457
  272. package/dist/mcp/tools/schemas.d.ts.map +0 -1
  273. package/dist/mcp/tools/schemas.js +0 -243
  274. package/dist/mcp/tools/schemas.js.map +0 -1
  275. package/dist/utils/adminEntitySettings.d.ts +0 -17
  276. package/dist/utils/adminEntitySettings.d.ts.map +0 -1
  277. package/dist/utils/adminEntitySettings.js +0 -41
  278. package/dist/utils/adminEntitySettings.js.map +0 -1
  279. package/dist/utils/createApiKeyFields.d.ts +0 -15
  280. package/dist/utils/createApiKeyFields.d.ts.map +0 -1
  281. package/dist/utils/createApiKeyFields.js +0 -57
  282. package/dist/utils/createApiKeyFields.js.map +0 -1
  283. package/dist/utils/getEnabledSlugs.d.ts +0 -13
  284. package/dist/utils/getEnabledSlugs.d.ts.map +0 -1
  285. package/dist/utils/getEnabledSlugs.js +0 -32
  286. package/dist/utils/getEnabledSlugs.js.map +0 -1
  287. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts +0 -3
  288. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts.map +0 -1
  289. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js +0 -43
  290. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js.map +0 -1
  291. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts +0 -13
  292. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts.map +0 -1
  293. package/dist/utils/schemaConversion/sanitizeJsonSchema.js +0 -56
  294. package/dist/utils/schemaConversion/sanitizeJsonSchema.js.map +0 -1
  295. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts +0 -20
  296. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts.map +0 -1
  297. package/dist/utils/schemaConversion/simplifyRelationshipFields.js +0 -53
  298. package/dist/utils/schemaConversion/simplifyRelationshipFields.js.map +0 -1
  299. package/dist/utils/schemaConversion/transformPointFields.d.ts +0 -3
  300. package/dist/utils/schemaConversion/transformPointFields.d.ts.map +0 -1
  301. package/dist/utils/schemaConversion/transformPointFields.js +0 -51
  302. package/dist/utils/schemaConversion/transformPointFields.js.map +0 -1
  303. package/src/collections/createApiKeysCollection.ts +0 -373
  304. package/src/defaults.ts +0 -3
  305. package/src/endpoints/mcp.ts +0 -91
  306. package/src/mcp/createRequest.ts +0 -13
  307. package/src/mcp/getMcpHandler.ts +0 -545
  308. package/src/mcp/helpers/config.ts +0 -213
  309. package/src/mcp/helpers/fields.ts +0 -154
  310. package/src/mcp/helpers/fileValidation.ts +0 -362
  311. package/src/mcp/registerTool.ts +0 -22
  312. package/src/mcp/tools/auth/auth.ts +0 -71
  313. package/src/mcp/tools/auth/forgotPassword.ts +0 -70
  314. package/src/mcp/tools/auth/login.ts +0 -72
  315. package/src/mcp/tools/auth/resetPassword.ts +0 -61
  316. package/src/mcp/tools/auth/unlock.ts +0 -64
  317. package/src/mcp/tools/auth/verify.ts +0 -57
  318. package/src/mcp/tools/collection/create.ts +0 -210
  319. package/src/mcp/tools/collection/delete.ts +0 -211
  320. package/src/mcp/tools/collection/find.ts +0 -224
  321. package/src/mcp/tools/collection/update.ts +0 -290
  322. package/src/mcp/tools/config/find.ts +0 -128
  323. package/src/mcp/tools/config/update.ts +0 -280
  324. package/src/mcp/tools/global/find.ts +0 -128
  325. package/src/mcp/tools/global/update.ts +0 -207
  326. package/src/mcp/tools/job/create.ts +0 -416
  327. package/src/mcp/tools/job/run.ts +0 -167
  328. package/src/mcp/tools/job/update.ts +0 -274
  329. package/src/mcp/tools/resource/create.ts +0 -211
  330. package/src/mcp/tools/resource/delete.ts +0 -218
  331. package/src/mcp/tools/resource/find.ts +0 -246
  332. package/src/mcp/tools/resource/update.ts +0 -383
  333. package/src/mcp/tools/schemas.ts +0 -520
  334. package/src/utils/adminEntitySettings.ts +0 -40
  335. package/src/utils/createApiKeyFields.ts +0 -72
  336. package/src/utils/getEnabledSlugs.ts +0 -42
  337. package/src/utils/schemaConversion/convertCollectionSchemaToZod.ts +0 -52
  338. package/src/utils/schemaConversion/sanitizeJsonSchema.ts +0 -62
  339. package/src/utils/schemaConversion/simplifyRelationshipFields.ts +0 -65
  340. package/src/utils/schemaConversion/transformPointFields.ts +0 -55
@@ -1,91 +0,0 @@
1
- import crypto from 'crypto'
2
- import { type PayloadHandler, type TypedUser, UnauthorizedError, type Where } from 'payload'
3
-
4
- import type { MCPAccessSettings, MCPPluginConfig } from '../types.js'
5
-
6
- import { createRequestFromPayloadRequest } from '../mcp/createRequest.js'
7
- import { getMCPHandler } from '../mcp/getMcpHandler.js'
8
-
9
- export const initializeMCPHandler = (pluginOptions: MCPPluginConfig) => {
10
- const mcpHandler: PayloadHandler = async (req) => {
11
- const { payload } = req
12
- const MCPOptions = pluginOptions.mcp || {}
13
- const MCPHandlerOptions = MCPOptions.handlerOptions || {}
14
- const useVerboseLogs = MCPHandlerOptions.verboseLogs ?? false
15
-
16
- req.payloadAPI = 'MCP' as const
17
-
18
- const getDefaultMcpAccessSettings = async (overrideApiKey?: null | string) => {
19
- const apiKey =
20
- (overrideApiKey ?? req.headers.get('Authorization')?.startsWith('Bearer '))
21
- ? req.headers.get('Authorization')?.replace('Bearer ', '').trim()
22
- : null
23
-
24
- if (apiKey === null) {
25
- throw new UnauthorizedError()
26
- }
27
-
28
- const sha256APIKeyIndex = crypto
29
- .createHmac('sha256', payload.secret)
30
- .update(apiKey || '')
31
- .digest('hex')
32
-
33
- const where: Where = {
34
- apiKeyIndex: {
35
- equals: sha256APIKeyIndex,
36
- },
37
- }
38
-
39
- const { docs } = await payload.find({
40
- collection: 'payload-mcp-api-keys',
41
- depth: 1,
42
- limit: 1,
43
- pagination: false,
44
- where,
45
- })
46
-
47
- if (docs.length === 0) {
48
- throw new UnauthorizedError()
49
- }
50
-
51
- if (useVerboseLogs) {
52
- payload.logger.info('[payload-mcp] API Key is valid')
53
- }
54
-
55
- const user = docs[0]?.user as TypedUser
56
- user.collection = pluginOptions.userCollection as string
57
- user._strategy = 'mcp-api-key' as const
58
-
59
- return docs[0] as unknown as MCPAccessSettings
60
- }
61
-
62
- const mcpAccessSettings = pluginOptions.overrideAuth
63
- ? await pluginOptions.overrideAuth(req, getDefaultMcpAccessSettings)
64
- : await getDefaultMcpAccessSettings()
65
-
66
- // @modelcontextprotocol/sdk's StreamableHTTPServerTransport uses @hono/node-server's
67
- // getRequestListener, which replaces global.Request and global.Response with Hono
68
- // custom classes. Unfortunately, we cannot pass overrideGlobalObjects: false because the option is
69
- // consumed inside the SDK transport and is not exposed to callers.
70
- // Save originals here and restore after the handler resolves so that Next.js
71
- // instanceof Response checks on subsequent route handlers keep working.
72
- const globals = globalThis as Record<string, unknown>
73
- const originalResponse = globals['Response']
74
- const originalRequest = globals['Request']
75
-
76
- const handler = getMCPHandler(pluginOptions, mcpAccessSettings, req)
77
- const request = createRequestFromPayloadRequest(req)
78
-
79
- try {
80
- return await handler(request)
81
- } finally {
82
- if (globals['Response'] !== originalResponse) {
83
- Object.defineProperty(globalThis, 'Response', { value: originalResponse })
84
- }
85
- if (globals['Request'] !== originalRequest) {
86
- Object.defineProperty(globalThis, 'Request', { value: originalRequest })
87
- }
88
- }
89
- }
90
- return mcpHandler
91
- }
@@ -1,13 +0,0 @@
1
- import { AuthenticationError, type PayloadRequest } from 'payload'
2
-
3
- export const createRequestFromPayloadRequest = (req: PayloadRequest) => {
4
- if (!req.url) {
5
- throw new AuthenticationError()
6
- }
7
- return new Request(req.url, {
8
- body: req.body,
9
- duplex: 'half',
10
- headers: req.headers,
11
- method: req.method,
12
- } as { duplex: 'half' } & RequestInit)
13
- }
@@ -1,545 +0,0 @@
1
- import type { JSONSchema4 } from 'json-schema'
2
-
3
- import { createMcpHandler } from 'mcp-handler'
4
- import { join } from 'path'
5
- import { APIError, configToJSONSchema, type PayloadRequest, type TypedUser } from 'payload'
6
-
7
- import type { MCPAccessSettings, MCPPluginConfig } from '../types.js'
8
-
9
- import { toCamelCase } from '../utils/camelCase.js'
10
- import { getEnabledSlugs } from '../utils/getEnabledSlugs.js'
11
- import {
12
- getCollectionVirtualFieldNames,
13
- getGlobalVirtualFieldNames,
14
- } from '../utils/getVirtualFieldNames.js'
15
- import { removeVirtualFieldsFromSchema } from '../utils/schemaConversion/removeVirtualFieldsFromSchema.js'
16
- import { registerTool } from './registerTool.js'
17
-
18
- // Tools
19
- import { findGlobalTool } from './tools/global/find.js'
20
- import { updateGlobalTool } from './tools/global/update.js'
21
- import { createResourceTool } from './tools/resource/create.js'
22
- import { deleteResourceTool } from './tools/resource/delete.js'
23
- import { findResourceTool } from './tools/resource/find.js'
24
- import { updateResourceTool } from './tools/resource/update.js'
25
-
26
- // Experimental Tools
27
- /**
28
- * @experimental This tools are experimental and may change or be removed in the future.
29
- */
30
- import { authTool } from './tools/auth/auth.js'
31
- import { forgotPasswordTool } from './tools/auth/forgotPassword.js'
32
- import { loginTool } from './tools/auth/login.js'
33
- import { resetPasswordTool } from './tools/auth/resetPassword.js'
34
- import { unlockTool } from './tools/auth/unlock.js'
35
- import { verifyTool } from './tools/auth/verify.js'
36
- import { createCollectionTool } from './tools/collection/create.js'
37
- import { deleteCollectionTool } from './tools/collection/delete.js'
38
- import { findCollectionTool } from './tools/collection/find.js'
39
- import { updateCollectionTool } from './tools/collection/update.js'
40
- import { findConfigTool } from './tools/config/find.js'
41
- import { updateConfigTool } from './tools/config/update.js'
42
- import { createJobTool } from './tools/job/create.js'
43
- import { runJobTool } from './tools/job/run.js'
44
- import { updateJobTool } from './tools/job/update.js'
45
-
46
- export const getMCPHandler = (
47
- pluginOptions: MCPPluginConfig,
48
- mcpAccessSettings: MCPAccessSettings,
49
- req: PayloadRequest,
50
- ) => {
51
- const { payload } = req
52
- const configSchema = configToJSONSchema(payload.config, payload.db.defaultIDType, req.i18n, {
53
- forceInlineBlocks: true,
54
- })
55
-
56
- // Handler wrapper that injects req before the _extra argument
57
- const wrapHandler = (handler: (...args: any[]) => any) => {
58
- return async (...args: any[]) => {
59
- const _extra = args[args.length - 1]
60
- const handlerArgs = args.slice(0, -1)
61
- return await handler(...handlerArgs, req, _extra)
62
- }
63
- }
64
-
65
- const payloadToolHandler = (
66
- handler: NonNullable<NonNullable<MCPPluginConfig['mcp']>['tools']>[number]['handler'],
67
- ) => wrapHandler(handler)
68
-
69
- const payloadPromptHandler = (
70
- handler: NonNullable<NonNullable<MCPPluginConfig['mcp']>['prompts']>[number]['handler'],
71
- ) => wrapHandler(handler)
72
-
73
- const payloadResourceHandler = (
74
- handler: NonNullable<NonNullable<MCPPluginConfig['mcp']>['resources']>[number]['handler'],
75
- ) => wrapHandler(handler)
76
-
77
- // User
78
- const user = mcpAccessSettings.user
79
-
80
- // MCP Server and Handler Options
81
- const MCPOptions = pluginOptions.mcp || {}
82
- const customMCPTools = MCPOptions.tools || []
83
- const customMCPPrompts = MCPOptions.prompts || []
84
- const customMCPResources = MCPOptions.resources || []
85
- const MCPHandlerOptions = MCPOptions.handlerOptions || {}
86
- const serverOptions = MCPOptions.serverOptions || {}
87
- const useVerboseLogs = MCPHandlerOptions.verboseLogs ?? false
88
-
89
- // Experimental MCP Tool Requirements
90
- const isDevelopment = process.env.NODE_ENV === 'development'
91
- const experimentalTools: NonNullable<MCPPluginConfig['experimental']>['tools'] =
92
- pluginOptions?.experimental?.tools || {}
93
- const collectionsPluginConfig = pluginOptions.collections || {}
94
- const globalsPluginConfig = pluginOptions.globals || {}
95
- const collectionsDirPath =
96
- experimentalTools && experimentalTools.collections?.collectionsDirPath
97
- ? experimentalTools.collections.collectionsDirPath
98
- : join(process.cwd(), 'src/collections')
99
- const configFilePath =
100
- experimentalTools && experimentalTools.config?.configFilePath
101
- ? experimentalTools.config.configFilePath
102
- : join(process.cwd(), 'src/payload.config.ts')
103
- const jobsDirPath =
104
- experimentalTools && experimentalTools.jobs?.jobsDirPath
105
- ? experimentalTools.jobs.jobsDirPath
106
- : join(process.cwd(), 'src/jobs')
107
-
108
- try {
109
- return createMcpHandler(
110
- (server) => {
111
- // Get enabled collections
112
- const enabledCollectionSlugs = getEnabledSlugs(collectionsPluginConfig, 'collection')
113
-
114
- // Collection Operation Tools
115
- enabledCollectionSlugs.forEach((enabledCollectionSlug) => {
116
- try {
117
- const rawSchema = configSchema.definitions?.[enabledCollectionSlug] as JSONSchema4
118
-
119
- const virtualFieldNames = getCollectionVirtualFieldNames(
120
- payload.config,
121
- enabledCollectionSlug,
122
- )
123
- const schema = removeVirtualFieldsFromSchema(
124
- JSON.parse(JSON.stringify(rawSchema)) as JSONSchema4,
125
- virtualFieldNames,
126
- )
127
-
128
- const toolCapabilities = mcpAccessSettings?.[
129
- `${toCamelCase(enabledCollectionSlug)}`
130
- ] as Record<string, unknown>
131
- const allowCreate: boolean | undefined = toolCapabilities?.create as boolean
132
- const allowUpdate: boolean | undefined = toolCapabilities?.update as boolean
133
- const allowFind: boolean | undefined = toolCapabilities?.find as boolean
134
- const allowDelete: boolean | undefined = toolCapabilities?.delete as boolean
135
-
136
- if (allowCreate) {
137
- registerTool(
138
- allowCreate,
139
- `Create ${enabledCollectionSlug}`,
140
- () =>
141
- createResourceTool(
142
- server,
143
- req,
144
- user,
145
- useVerboseLogs,
146
- enabledCollectionSlug,
147
- collectionsPluginConfig,
148
- schema,
149
- ),
150
- payload,
151
- useVerboseLogs,
152
- )
153
- }
154
- if (allowUpdate) {
155
- registerTool(
156
- allowUpdate,
157
- `Update ${enabledCollectionSlug}`,
158
- () =>
159
- updateResourceTool(
160
- server,
161
- req,
162
- user,
163
- useVerboseLogs,
164
- enabledCollectionSlug,
165
- collectionsPluginConfig,
166
- schema,
167
- ),
168
- payload,
169
- useVerboseLogs,
170
- )
171
- }
172
- if (allowFind) {
173
- registerTool(
174
- allowFind,
175
- `Find ${enabledCollectionSlug}`,
176
- () =>
177
- findResourceTool(
178
- server,
179
- req,
180
- user,
181
- useVerboseLogs,
182
- enabledCollectionSlug,
183
- collectionsPluginConfig,
184
- ),
185
- payload,
186
- useVerboseLogs,
187
- )
188
- }
189
- if (allowDelete) {
190
- registerTool(
191
- allowDelete,
192
- `Delete ${enabledCollectionSlug}`,
193
- () =>
194
- deleteResourceTool(
195
- server,
196
- req,
197
- user,
198
- useVerboseLogs,
199
- enabledCollectionSlug,
200
- collectionsPluginConfig,
201
- ),
202
- payload,
203
- useVerboseLogs,
204
- )
205
- }
206
- } catch (error) {
207
- throw new APIError(
208
- `Error registering tools for collection ${enabledCollectionSlug}: ${String(error)}`,
209
- 500,
210
- )
211
- }
212
- })
213
-
214
- // Global Operation Tools
215
- const enabledGlobalSlugs = getEnabledSlugs(globalsPluginConfig, 'global')
216
-
217
- enabledGlobalSlugs.forEach((enabledGlobalSlug) => {
218
- try {
219
- const rawSchema = configSchema.definitions?.[enabledGlobalSlug] as JSONSchema4
220
-
221
- const virtualFieldNames = getGlobalVirtualFieldNames(payload.config, enabledGlobalSlug)
222
- const schema = removeVirtualFieldsFromSchema(
223
- JSON.parse(JSON.stringify(rawSchema)) as JSONSchema4,
224
- virtualFieldNames,
225
- )
226
-
227
- const toolCapabilities = mcpAccessSettings?.[
228
- `${toCamelCase(enabledGlobalSlug)}`
229
- ] as Record<string, unknown>
230
- const allowFind: boolean | undefined = toolCapabilities?.['find'] as boolean
231
- const allowUpdate: boolean | undefined = toolCapabilities?.['update'] as boolean
232
-
233
- if (allowFind) {
234
- registerTool(
235
- allowFind,
236
- `Find ${enabledGlobalSlug}`,
237
- () =>
238
- findGlobalTool(
239
- server,
240
- req,
241
- user,
242
- useVerboseLogs,
243
- enabledGlobalSlug,
244
- globalsPluginConfig,
245
- ),
246
- payload,
247
- useVerboseLogs,
248
- )
249
- }
250
- if (allowUpdate) {
251
- registerTool(
252
- allowUpdate,
253
- `Update ${enabledGlobalSlug}`,
254
- () =>
255
- updateGlobalTool(
256
- server,
257
- req,
258
- user,
259
- useVerboseLogs,
260
- enabledGlobalSlug,
261
- globalsPluginConfig,
262
- schema,
263
- ),
264
- payload,
265
- useVerboseLogs,
266
- )
267
- }
268
- } catch (error) {
269
- throw new APIError(
270
- `Error registering tools for global ${enabledGlobalSlug}: ${String(error)}`,
271
- 500,
272
- )
273
- }
274
- })
275
-
276
- // Custom tools
277
- customMCPTools.forEach((tool) => {
278
- const camelCasedToolName = toCamelCase(tool.name)
279
- const isToolEnabled = mcpAccessSettings['payload-mcp-tool']?.[camelCasedToolName] ?? false
280
-
281
- registerTool(
282
- isToolEnabled,
283
- tool.name,
284
- () =>
285
- server.registerTool(
286
- tool.name,
287
- {
288
- description: tool.description,
289
- inputSchema: tool.parameters,
290
- },
291
- payloadToolHandler(tool.handler),
292
- ),
293
- payload,
294
- useVerboseLogs,
295
- )
296
- })
297
-
298
- // Custom prompts
299
- customMCPPrompts.forEach((prompt) => {
300
- const camelCasedPromptName = toCamelCase(prompt.name)
301
- const isPromptEnabled =
302
- mcpAccessSettings['payload-mcp-prompt']?.[camelCasedPromptName] ?? false
303
-
304
- if (isPromptEnabled) {
305
- server.registerPrompt(
306
- prompt.name,
307
- {
308
- argsSchema: prompt.argsSchema,
309
- description: prompt.description,
310
- title: prompt.title,
311
- },
312
- payloadPromptHandler(prompt.handler),
313
- )
314
- if (useVerboseLogs) {
315
- payload.logger.info(`[payload-mcp] ✅ Prompt: ${prompt.title} Registered.`)
316
- }
317
- } else if (useVerboseLogs) {
318
- payload.logger.info(`[payload-mcp] ⏭️ Prompt: ${prompt.title} Skipped.`)
319
- }
320
- })
321
-
322
- // Custom resources
323
- customMCPResources.forEach((resource) => {
324
- const camelCasedResourceName = toCamelCase(resource.name)
325
- const isResourceEnabled =
326
- mcpAccessSettings['payload-mcp-resource']?.[camelCasedResourceName] ?? false
327
-
328
- if (isResourceEnabled) {
329
- server.registerResource(
330
- resource.name,
331
- // @ts-expect-error - Overload type is not working however -- ResourceTemplate OR String is a valid type
332
- resource.uri,
333
- {
334
- description: resource.description,
335
- mimeType: resource.mimeType,
336
- title: resource.title,
337
- },
338
- payloadResourceHandler(resource.handler),
339
- )
340
-
341
- if (useVerboseLogs) {
342
- payload.logger.info(`[payload-mcp] ✅ Resource: ${resource.title} Registered.`)
343
- }
344
- } else if (useVerboseLogs) {
345
- payload.logger.info(`[payload-mcp] ⏭️ Resource: ${resource.title} Skipped.`)
346
- }
347
- })
348
-
349
- // Experimental - Collection Schema Modfication Tools
350
- if (
351
- mcpAccessSettings.collections?.create &&
352
- experimentalTools.collections?.enabled &&
353
- isDevelopment
354
- ) {
355
- registerTool(
356
- mcpAccessSettings.collections.create,
357
- 'Create Collection',
358
- () =>
359
- createCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),
360
- payload,
361
- useVerboseLogs,
362
- )
363
- }
364
- if (
365
- mcpAccessSettings.collections?.delete &&
366
- experimentalTools.collections?.enabled &&
367
- isDevelopment
368
- ) {
369
- registerTool(
370
- mcpAccessSettings.collections.delete,
371
- 'Delete Collection',
372
- () =>
373
- deleteCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),
374
- payload,
375
- useVerboseLogs,
376
- )
377
- }
378
-
379
- if (
380
- mcpAccessSettings.collections?.find &&
381
- experimentalTools.collections?.enabled &&
382
- isDevelopment
383
- ) {
384
- registerTool(
385
- mcpAccessSettings.collections.find,
386
- 'Find Collection',
387
- () => findCollectionTool(server, req, useVerboseLogs, collectionsDirPath),
388
- payload,
389
- useVerboseLogs,
390
- )
391
- }
392
-
393
- if (
394
- mcpAccessSettings.collections?.update &&
395
- experimentalTools.collections?.enabled &&
396
- isDevelopment
397
- ) {
398
- registerTool(
399
- mcpAccessSettings.collections.update,
400
- 'Update Collection',
401
- () =>
402
- updateCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),
403
- payload,
404
- useVerboseLogs,
405
- )
406
- }
407
-
408
- // Experimental - Payload Config Modification Tools
409
- if (mcpAccessSettings.config?.find && experimentalTools.config?.enabled && isDevelopment) {
410
- registerTool(
411
- mcpAccessSettings.config.find,
412
- 'Find Config',
413
- () => findConfigTool(server, req, useVerboseLogs, configFilePath),
414
- payload,
415
- useVerboseLogs,
416
- )
417
- }
418
-
419
- if (
420
- mcpAccessSettings.config?.update &&
421
- experimentalTools.config?.enabled &&
422
- isDevelopment
423
- ) {
424
- registerTool(
425
- mcpAccessSettings.config.update,
426
- 'Update Config',
427
- () => updateConfigTool(server, req, useVerboseLogs, configFilePath),
428
- payload,
429
- useVerboseLogs,
430
- )
431
- }
432
-
433
- // Experimental - Job Modification Tools
434
- if (mcpAccessSettings.jobs?.create && experimentalTools.jobs?.enabled && isDevelopment) {
435
- registerTool(
436
- mcpAccessSettings.jobs.create,
437
- 'Create Job',
438
- () => createJobTool(server, req, useVerboseLogs, jobsDirPath),
439
- payload,
440
- useVerboseLogs,
441
- )
442
- }
443
-
444
- if (mcpAccessSettings.jobs?.update && experimentalTools.jobs?.enabled && isDevelopment) {
445
- registerTool(
446
- mcpAccessSettings.jobs.update,
447
- 'Update Job',
448
- () => updateJobTool(server, req, useVerboseLogs, jobsDirPath),
449
- payload,
450
- useVerboseLogs,
451
- )
452
- }
453
-
454
- if (mcpAccessSettings.jobs?.run && experimentalTools.jobs?.enabled && isDevelopment) {
455
- registerTool(
456
- mcpAccessSettings.jobs.run,
457
- 'Run Job',
458
- () => runJobTool(server, req, useVerboseLogs),
459
- payload,
460
- useVerboseLogs,
461
- )
462
- }
463
-
464
- // Experimental - Auth Modification Tools
465
- if (mcpAccessSettings.auth?.auth && experimentalTools.auth?.enabled && isDevelopment) {
466
- registerTool(
467
- mcpAccessSettings.auth.auth,
468
- 'Auth',
469
- () => authTool(server, req, useVerboseLogs),
470
- payload,
471
- useVerboseLogs,
472
- )
473
- }
474
-
475
- if (mcpAccessSettings.auth?.login && experimentalTools.auth?.enabled && isDevelopment) {
476
- registerTool(
477
- mcpAccessSettings.auth.login,
478
- 'Login',
479
- () => loginTool(server, req, useVerboseLogs),
480
- payload,
481
- useVerboseLogs,
482
- )
483
- }
484
-
485
- if (mcpAccessSettings.auth?.verify && experimentalTools.auth?.enabled && isDevelopment) {
486
- registerTool(
487
- mcpAccessSettings.auth.verify,
488
- 'Verify',
489
- () => verifyTool(server, req, useVerboseLogs),
490
- payload,
491
- useVerboseLogs,
492
- )
493
- }
494
-
495
- if (mcpAccessSettings.auth?.resetPassword && experimentalTools.auth?.enabled) {
496
- registerTool(
497
- mcpAccessSettings.auth.resetPassword,
498
- 'Reset Password',
499
- () => resetPasswordTool(server, req, useVerboseLogs),
500
- payload,
501
- useVerboseLogs,
502
- )
503
- }
504
-
505
- if (mcpAccessSettings.auth?.forgotPassword && experimentalTools.auth?.enabled) {
506
- registerTool(
507
- mcpAccessSettings.auth.forgotPassword,
508
- 'Forgot Password',
509
- () => forgotPasswordTool(server, req, useVerboseLogs),
510
- payload,
511
- useVerboseLogs,
512
- )
513
- }
514
-
515
- if (mcpAccessSettings.auth?.unlock && experimentalTools.auth?.enabled) {
516
- registerTool(
517
- mcpAccessSettings.auth.unlock,
518
- 'Unlock',
519
- () => unlockTool(server, req, useVerboseLogs),
520
- payload,
521
- useVerboseLogs,
522
- )
523
- }
524
-
525
- if (useVerboseLogs) {
526
- payload.logger.info('[payload-mcp] 🚀 MCP Server Ready.')
527
- }
528
- },
529
- {
530
- instructions: serverOptions.instructions,
531
- serverInfo: serverOptions.serverInfo,
532
- },
533
- {
534
- basePath: MCPHandlerOptions.basePath || payload.config.routes?.api || '/api',
535
- disableSse: MCPHandlerOptions.disableSse ?? true,
536
- maxDuration: MCPHandlerOptions.maxDuration || 60,
537
- onEvent: MCPHandlerOptions.onEvent,
538
- redisUrl: MCPHandlerOptions.redisUrl,
539
- verboseLogs: useVerboseLogs,
540
- },
541
- )
542
- } catch (error) {
543
- throw new APIError(`Error initializing MCP handler: ${String(error)}`, 500)
544
- }
545
- }