@payloadcms/plugin-mcp 4.0.0-internal.011fd46 → 4.0.0-internal.078835b

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 (471) hide show
  1. package/LICENSE.md +1 -1
  2. package/bin.js +7 -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 +8 -8
  8. package/dist/defineTool.d.ts.map +1 -1
  9. package/dist/endpoint/access.d.ts +12 -5
  10. package/dist/endpoint/access.d.ts.map +1 -1
  11. package/dist/endpoint/access.js +74 -103
  12. package/dist/endpoint/access.js.map +1 -1
  13. package/dist/endpoint/index.d.ts +1 -1
  14. package/dist/endpoint/index.d.ts.map +1 -1
  15. package/dist/endpoint/index.js +68 -17
  16. package/dist/endpoint/index.js.map +1 -1
  17. package/dist/exports/client.d.ts +1 -4
  18. package/dist/exports/client.d.ts.map +1 -1
  19. package/dist/exports/client.js +1 -4
  20. package/dist/exports/client.js.map +1 -1
  21. package/dist/exports/internal.d.ts +2 -0
  22. package/dist/exports/internal.d.ts.map +1 -0
  23. package/dist/exports/internal.js +3 -0
  24. package/dist/exports/internal.js.map +1 -0
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -56
  28. package/dist/index.js.map +1 -1
  29. package/dist/mcp/buildMcpServer.d.ts +4 -4
  30. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  31. package/dist/mcp/buildMcpServer.js +32 -10
  32. package/dist/mcp/buildMcpServer.js.map +1 -1
  33. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  34. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  35. package/dist/mcp/builtin/collections/countTool.js +68 -0
  36. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  37. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  38. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  39. package/dist/mcp/builtin/collections/countVersionsTool.js +64 -0
  40. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  41. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
  42. package/dist/mcp/builtin/collections/createTool.js +17 -6
  43. package/dist/mcp/builtin/collections/createTool.js.map +1 -1
  44. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
  45. package/dist/mcp/builtin/collections/deleteTool.js +3 -2
  46. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
  47. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  48. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  49. package/dist/mcp/builtin/collections/duplicateTool.js +96 -0
  50. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  51. package/dist/mcp/builtin/collections/fileInput.d.ts +28 -0
  52. package/dist/mcp/builtin/collections/fileInput.d.ts.map +1 -0
  53. package/dist/mcp/builtin/collections/fileInput.js +117 -0
  54. package/dist/mcp/builtin/collections/fileInput.js.map +1 -0
  55. package/dist/mcp/builtin/collections/fileInput.spec.js +86 -0
  56. package/dist/mcp/builtin/collections/fileInput.spec.js.map +1 -0
  57. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  58. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  59. package/dist/mcp/builtin/collections/findDistinctTool.js +92 -0
  60. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  61. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  62. package/dist/mcp/builtin/collections/findTool.js +5 -4
  63. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  64. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  65. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  66. package/dist/mcp/builtin/collections/findVersionByIDTool.js +83 -0
  67. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  68. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  69. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  70. package/dist/mcp/builtin/collections/findVersionsTool.js +98 -0
  71. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  72. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +1 -1
  73. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -1
  74. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -1
  75. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -1
  76. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +49 -4
  77. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -1
  78. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  79. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  80. package/dist/mcp/builtin/collections/restoreVersionTool.js +81 -0
  81. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  82. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  83. package/dist/mcp/builtin/collections/updateTool.js +26 -12
  84. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  85. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts +2 -0
  86. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts.map +1 -0
  87. package/dist/mcp/builtin/collections/uploadInstructionsTool.js +55 -0
  88. package/dist/mcp/builtin/collections/uploadInstructionsTool.js.map +1 -0
  89. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -1
  90. package/dist/mcp/builtin/getConfigInfoTool.js +20 -8
  91. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -1
  92. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  93. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  94. package/dist/mcp/builtin/globals/countVersionsTool.js +64 -0
  95. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  96. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  97. package/dist/mcp/builtin/globals/findTool.js +4 -2
  98. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  99. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  100. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  101. package/dist/mcp/builtin/globals/findVersionByIDTool.js +79 -0
  102. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  103. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  104. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  105. package/dist/mcp/builtin/globals/findVersionsTool.js +94 -0
  106. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  107. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -1
  108. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +25 -2
  109. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -1
  110. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  111. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  112. package/dist/mcp/builtin/globals/restoreVersionTool.js +77 -0
  113. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  114. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -1
  115. package/dist/mcp/builtin/globals/updateTool.js +4 -2
  116. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  117. package/dist/mcp/builtin/validateEntityData.d.ts.map +1 -1
  118. package/dist/mcp/builtin/validateEntityData.js +1 -1
  119. package/dist/mcp/builtin/validateEntityData.js.map +1 -1
  120. package/dist/mcp/builtinTools.d.ts +73 -2
  121. package/dist/mcp/builtinTools.d.ts.map +1 -1
  122. package/dist/mcp/builtinTools.js +70 -0
  123. package/dist/mcp/builtinTools.js.map +1 -1
  124. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  125. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  126. package/dist/mcp/sanitizeMCPConfig.js +48 -17
  127. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  128. package/dist/stdio.d.ts +3 -3
  129. package/dist/stdio.d.ts.map +1 -1
  130. package/dist/stdio.js +82 -45
  131. package/dist/stdio.js.map +1 -1
  132. package/dist/types.d.ts +93 -87
  133. package/dist/types.d.ts.map +1 -1
  134. package/dist/types.js +2 -4
  135. package/dist/types.js.map +1 -1
  136. package/dist/utils/camelCase.d.ts.map +1 -1
  137. package/dist/utils/getPluginConfig.d.ts +1 -1
  138. package/dist/utils/getPluginConfig.js +1 -1
  139. package/dist/utils/getPluginConfig.js.map +1 -1
  140. package/dist/utils/resolveProjectRoot.d.ts.map +1 -1
  141. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts +28 -0
  142. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts.map +1 -0
  143. package/dist/utils/schemaConversion/filterFieldsByAccess.js +71 -0
  144. package/dist/utils/schemaConversion/filterFieldsByAccess.js.map +1 -0
  145. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +5 -3
  146. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +1 -1
  147. package/dist/utils/schemaConversion/getEntityInputSchema.js +44 -12
  148. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +1 -1
  149. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +5 -10
  150. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -1
  151. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +15 -95
  152. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -1
  153. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +15 -40
  154. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -1
  155. package/dist/utils/toStandardSchema.d.ts.map +1 -1
  156. package/package.json +11 -17
  157. package/src/defaultAccess.ts +3 -0
  158. package/src/endpoint/access.ts +80 -112
  159. package/src/endpoint/index.ts +58 -16
  160. package/src/exports/client.ts +2 -4
  161. package/src/exports/internal.ts +1 -0
  162. package/src/index.ts +5 -62
  163. package/src/mcp/buildMcpServer.ts +46 -21
  164. package/src/mcp/builtin/collections/countTool.ts +73 -0
  165. package/src/mcp/builtin/collections/countVersionsTool.ts +69 -0
  166. package/src/mcp/builtin/collections/createTool.ts +18 -6
  167. package/src/mcp/builtin/collections/deleteTool.ts +4 -2
  168. package/src/mcp/builtin/collections/duplicateTool.ts +134 -0
  169. package/src/mcp/builtin/collections/fileInput.spec.ts +93 -0
  170. package/src/mcp/builtin/collections/fileInput.ts +154 -0
  171. package/src/mcp/builtin/collections/findDistinctTool.ts +119 -0
  172. package/src/mcp/builtin/collections/findTool.ts +6 -4
  173. package/src/mcp/builtin/collections/findVersionByIDTool.ts +109 -0
  174. package/src/mcp/builtin/collections/findVersionsTool.ts +154 -0
  175. package/src/mcp/builtin/collections/formatCollectionError.ts +1 -1
  176. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +48 -3
  177. package/src/mcp/builtin/collections/restoreVersionTool.ts +107 -0
  178. package/src/mcp/builtin/collections/updateTool.ts +29 -10
  179. package/src/mcp/builtin/collections/uploadInstructionsTool.ts +64 -0
  180. package/src/mcp/builtin/getConfigInfoTool.ts +20 -4
  181. package/src/mcp/builtin/globals/countVersionsTool.ts +68 -0
  182. package/src/mcp/builtin/globals/findTool.ts +5 -2
  183. package/src/mcp/builtin/globals/findVersionByIDTool.ts +103 -0
  184. package/src/mcp/builtin/globals/findVersionsTool.ts +147 -0
  185. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +30 -2
  186. package/src/mcp/builtin/globals/restoreVersionTool.ts +99 -0
  187. package/src/mcp/builtin/globals/updateTool.ts +5 -2
  188. package/src/mcp/builtin/validateEntityData.ts +1 -1
  189. package/src/mcp/builtinTools.ts +70 -4
  190. package/src/mcp/sanitizeMCPConfig.ts +36 -19
  191. package/src/stdio.ts +77 -45
  192. package/src/types.ts +101 -91
  193. package/src/utils/getPluginConfig.ts +1 -1
  194. package/src/utils/schemaConversion/filterFieldsByAccess.ts +123 -0
  195. package/src/utils/schemaConversion/getEntityInputSchema.ts +45 -27
  196. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +12 -19
  197. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +17 -114
  198. package/dist/collection/getAccessField.d.ts +0 -12
  199. package/dist/collection/getAccessField.d.ts.map +0 -1
  200. package/dist/collection/getAccessField.js +0 -72
  201. package/dist/collection/getAccessField.js.map +0 -1
  202. package/dist/collection/index.d.ts +0 -6
  203. package/dist/collection/index.d.ts.map +0 -1
  204. package/dist/collection/index.js +0 -105
  205. package/dist/collection/index.js.map +0 -1
  206. package/dist/components/APIKeyField/index.client.d.ts +0 -9
  207. package/dist/components/APIKeyField/index.client.d.ts.map +0 -1
  208. package/dist/components/APIKeyField/index.client.js +0 -85
  209. package/dist/components/APIKeyField/index.client.js.map +0 -1
  210. package/dist/components/APIKeyField/index.css +0 -105
  211. package/dist/components/APIKeysEmptyState/index.client.d.ts +0 -4
  212. package/dist/components/APIKeysEmptyState/index.client.d.ts.map +0 -1
  213. package/dist/components/APIKeysEmptyState/index.client.js +0 -21
  214. package/dist/components/APIKeysEmptyState/index.client.js.map +0 -1
  215. package/dist/components/AccessField/index.client.d.ts +0 -10
  216. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  217. package/dist/components/AccessField/index.client.js +0 -247
  218. package/dist/components/AccessField/index.client.js.map +0 -1
  219. package/dist/components/AccessField/index.css +0 -99
  220. package/dist/components/SettingsMenu/index.client.d.ts +0 -8
  221. package/dist/components/SettingsMenu/index.client.d.ts.map +0 -1
  222. package/dist/components/SettingsMenu/index.client.js +0 -24
  223. package/dist/components/SettingsMenu/index.client.js.map +0 -1
  224. package/dist/translations/index.d.ts +0 -11
  225. package/dist/translations/index.d.ts.map +0 -1
  226. package/dist/translations/index.js +0 -92
  227. package/dist/translations/index.js.map +0 -1
  228. package/dist/translations/languages/ar.d.ts +0 -31
  229. package/dist/translations/languages/ar.d.ts.map +0 -1
  230. package/dist/translations/languages/ar.js +0 -34
  231. package/dist/translations/languages/ar.js.map +0 -1
  232. package/dist/translations/languages/az.d.ts +0 -31
  233. package/dist/translations/languages/az.d.ts.map +0 -1
  234. package/dist/translations/languages/az.js +0 -34
  235. package/dist/translations/languages/az.js.map +0 -1
  236. package/dist/translations/languages/bg.d.ts +0 -31
  237. package/dist/translations/languages/bg.d.ts.map +0 -1
  238. package/dist/translations/languages/bg.js +0 -34
  239. package/dist/translations/languages/bg.js.map +0 -1
  240. package/dist/translations/languages/bnBd.d.ts +0 -31
  241. package/dist/translations/languages/bnBd.d.ts.map +0 -1
  242. package/dist/translations/languages/bnBd.js +0 -34
  243. package/dist/translations/languages/bnBd.js.map +0 -1
  244. package/dist/translations/languages/bnIn.d.ts +0 -31
  245. package/dist/translations/languages/bnIn.d.ts.map +0 -1
  246. package/dist/translations/languages/bnIn.js +0 -34
  247. package/dist/translations/languages/bnIn.js.map +0 -1
  248. package/dist/translations/languages/ca.d.ts +0 -31
  249. package/dist/translations/languages/ca.d.ts.map +0 -1
  250. package/dist/translations/languages/ca.js +0 -34
  251. package/dist/translations/languages/ca.js.map +0 -1
  252. package/dist/translations/languages/cs.d.ts +0 -31
  253. package/dist/translations/languages/cs.d.ts.map +0 -1
  254. package/dist/translations/languages/cs.js +0 -34
  255. package/dist/translations/languages/cs.js.map +0 -1
  256. package/dist/translations/languages/da.d.ts +0 -31
  257. package/dist/translations/languages/da.d.ts.map +0 -1
  258. package/dist/translations/languages/da.js +0 -34
  259. package/dist/translations/languages/da.js.map +0 -1
  260. package/dist/translations/languages/de.d.ts +0 -31
  261. package/dist/translations/languages/de.d.ts.map +0 -1
  262. package/dist/translations/languages/de.js +0 -34
  263. package/dist/translations/languages/de.js.map +0 -1
  264. package/dist/translations/languages/en.d.ts +0 -31
  265. package/dist/translations/languages/en.d.ts.map +0 -1
  266. package/dist/translations/languages/en.js +0 -34
  267. package/dist/translations/languages/en.js.map +0 -1
  268. package/dist/translations/languages/es.d.ts +0 -31
  269. package/dist/translations/languages/es.d.ts.map +0 -1
  270. package/dist/translations/languages/es.js +0 -34
  271. package/dist/translations/languages/es.js.map +0 -1
  272. package/dist/translations/languages/et.d.ts +0 -31
  273. package/dist/translations/languages/et.d.ts.map +0 -1
  274. package/dist/translations/languages/et.js +0 -34
  275. package/dist/translations/languages/et.js.map +0 -1
  276. package/dist/translations/languages/fa.d.ts +0 -31
  277. package/dist/translations/languages/fa.d.ts.map +0 -1
  278. package/dist/translations/languages/fa.js +0 -34
  279. package/dist/translations/languages/fa.js.map +0 -1
  280. package/dist/translations/languages/fr.d.ts +0 -31
  281. package/dist/translations/languages/fr.d.ts.map +0 -1
  282. package/dist/translations/languages/fr.js +0 -34
  283. package/dist/translations/languages/fr.js.map +0 -1
  284. package/dist/translations/languages/he.d.ts +0 -31
  285. package/dist/translations/languages/he.d.ts.map +0 -1
  286. package/dist/translations/languages/he.js +0 -34
  287. package/dist/translations/languages/he.js.map +0 -1
  288. package/dist/translations/languages/hr.d.ts +0 -31
  289. package/dist/translations/languages/hr.d.ts.map +0 -1
  290. package/dist/translations/languages/hr.js +0 -34
  291. package/dist/translations/languages/hr.js.map +0 -1
  292. package/dist/translations/languages/hu.d.ts +0 -31
  293. package/dist/translations/languages/hu.d.ts.map +0 -1
  294. package/dist/translations/languages/hu.js +0 -34
  295. package/dist/translations/languages/hu.js.map +0 -1
  296. package/dist/translations/languages/hy.d.ts +0 -31
  297. package/dist/translations/languages/hy.d.ts.map +0 -1
  298. package/dist/translations/languages/hy.js +0 -34
  299. package/dist/translations/languages/hy.js.map +0 -1
  300. package/dist/translations/languages/id.d.ts +0 -31
  301. package/dist/translations/languages/id.d.ts.map +0 -1
  302. package/dist/translations/languages/id.js +0 -34
  303. package/dist/translations/languages/id.js.map +0 -1
  304. package/dist/translations/languages/is.d.ts +0 -31
  305. package/dist/translations/languages/is.d.ts.map +0 -1
  306. package/dist/translations/languages/is.js +0 -34
  307. package/dist/translations/languages/is.js.map +0 -1
  308. package/dist/translations/languages/it.d.ts +0 -31
  309. package/dist/translations/languages/it.d.ts.map +0 -1
  310. package/dist/translations/languages/it.js +0 -34
  311. package/dist/translations/languages/it.js.map +0 -1
  312. package/dist/translations/languages/ja.d.ts +0 -31
  313. package/dist/translations/languages/ja.d.ts.map +0 -1
  314. package/dist/translations/languages/ja.js +0 -34
  315. package/dist/translations/languages/ja.js.map +0 -1
  316. package/dist/translations/languages/ko.d.ts +0 -31
  317. package/dist/translations/languages/ko.d.ts.map +0 -1
  318. package/dist/translations/languages/ko.js +0 -34
  319. package/dist/translations/languages/ko.js.map +0 -1
  320. package/dist/translations/languages/lt.d.ts +0 -31
  321. package/dist/translations/languages/lt.d.ts.map +0 -1
  322. package/dist/translations/languages/lt.js +0 -34
  323. package/dist/translations/languages/lt.js.map +0 -1
  324. package/dist/translations/languages/lv.d.ts +0 -31
  325. package/dist/translations/languages/lv.d.ts.map +0 -1
  326. package/dist/translations/languages/lv.js +0 -34
  327. package/dist/translations/languages/lv.js.map +0 -1
  328. package/dist/translations/languages/my.d.ts +0 -31
  329. package/dist/translations/languages/my.d.ts.map +0 -1
  330. package/dist/translations/languages/my.js +0 -34
  331. package/dist/translations/languages/my.js.map +0 -1
  332. package/dist/translations/languages/nb.d.ts +0 -31
  333. package/dist/translations/languages/nb.d.ts.map +0 -1
  334. package/dist/translations/languages/nb.js +0 -34
  335. package/dist/translations/languages/nb.js.map +0 -1
  336. package/dist/translations/languages/nl.d.ts +0 -31
  337. package/dist/translations/languages/nl.d.ts.map +0 -1
  338. package/dist/translations/languages/nl.js +0 -34
  339. package/dist/translations/languages/nl.js.map +0 -1
  340. package/dist/translations/languages/pl.d.ts +0 -31
  341. package/dist/translations/languages/pl.d.ts.map +0 -1
  342. package/dist/translations/languages/pl.js +0 -34
  343. package/dist/translations/languages/pl.js.map +0 -1
  344. package/dist/translations/languages/pt.d.ts +0 -31
  345. package/dist/translations/languages/pt.d.ts.map +0 -1
  346. package/dist/translations/languages/pt.js +0 -34
  347. package/dist/translations/languages/pt.js.map +0 -1
  348. package/dist/translations/languages/ro.d.ts +0 -31
  349. package/dist/translations/languages/ro.d.ts.map +0 -1
  350. package/dist/translations/languages/ro.js +0 -34
  351. package/dist/translations/languages/ro.js.map +0 -1
  352. package/dist/translations/languages/rs.d.ts +0 -31
  353. package/dist/translations/languages/rs.d.ts.map +0 -1
  354. package/dist/translations/languages/rs.js +0 -34
  355. package/dist/translations/languages/rs.js.map +0 -1
  356. package/dist/translations/languages/rsLatin.d.ts +0 -31
  357. package/dist/translations/languages/rsLatin.d.ts.map +0 -1
  358. package/dist/translations/languages/rsLatin.js +0 -34
  359. package/dist/translations/languages/rsLatin.js.map +0 -1
  360. package/dist/translations/languages/ru.d.ts +0 -31
  361. package/dist/translations/languages/ru.d.ts.map +0 -1
  362. package/dist/translations/languages/ru.js +0 -34
  363. package/dist/translations/languages/ru.js.map +0 -1
  364. package/dist/translations/languages/sk.d.ts +0 -31
  365. package/dist/translations/languages/sk.d.ts.map +0 -1
  366. package/dist/translations/languages/sk.js +0 -34
  367. package/dist/translations/languages/sk.js.map +0 -1
  368. package/dist/translations/languages/sl.d.ts +0 -31
  369. package/dist/translations/languages/sl.d.ts.map +0 -1
  370. package/dist/translations/languages/sl.js +0 -34
  371. package/dist/translations/languages/sl.js.map +0 -1
  372. package/dist/translations/languages/sv.d.ts +0 -31
  373. package/dist/translations/languages/sv.d.ts.map +0 -1
  374. package/dist/translations/languages/sv.js +0 -34
  375. package/dist/translations/languages/sv.js.map +0 -1
  376. package/dist/translations/languages/ta.d.ts +0 -31
  377. package/dist/translations/languages/ta.d.ts.map +0 -1
  378. package/dist/translations/languages/ta.js +0 -34
  379. package/dist/translations/languages/ta.js.map +0 -1
  380. package/dist/translations/languages/th.d.ts +0 -31
  381. package/dist/translations/languages/th.d.ts.map +0 -1
  382. package/dist/translations/languages/th.js +0 -34
  383. package/dist/translations/languages/th.js.map +0 -1
  384. package/dist/translations/languages/tr.d.ts +0 -31
  385. package/dist/translations/languages/tr.d.ts.map +0 -1
  386. package/dist/translations/languages/tr.js +0 -34
  387. package/dist/translations/languages/tr.js.map +0 -1
  388. package/dist/translations/languages/uk.d.ts +0 -31
  389. package/dist/translations/languages/uk.d.ts.map +0 -1
  390. package/dist/translations/languages/uk.js +0 -34
  391. package/dist/translations/languages/uk.js.map +0 -1
  392. package/dist/translations/languages/vi.d.ts +0 -31
  393. package/dist/translations/languages/vi.d.ts.map +0 -1
  394. package/dist/translations/languages/vi.js +0 -34
  395. package/dist/translations/languages/vi.js.map +0 -1
  396. package/dist/translations/languages/zh.d.ts +0 -31
  397. package/dist/translations/languages/zh.d.ts.map +0 -1
  398. package/dist/translations/languages/zh.js +0 -34
  399. package/dist/translations/languages/zh.js.map +0 -1
  400. package/dist/translations/languages/zhTw.d.ts +0 -31
  401. package/dist/translations/languages/zhTw.d.ts.map +0 -1
  402. package/dist/translations/languages/zhTw.js +0 -34
  403. package/dist/translations/languages/zhTw.js.map +0 -1
  404. package/dist/translations/types.d.ts +0 -32
  405. package/dist/translations/types.d.ts.map +0 -1
  406. package/dist/translations/types.js +0 -3
  407. package/dist/translations/types.js.map +0 -1
  408. package/dist/utils/localAPIDefaults.d.ts +0 -20
  409. package/dist/utils/localAPIDefaults.d.ts.map +0 -1
  410. package/dist/utils/localAPIDefaults.js +0 -19
  411. package/dist/utils/localAPIDefaults.js.map +0 -1
  412. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  413. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  414. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  415. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  416. package/src/collection/getAccessField.ts +0 -84
  417. package/src/collection/index.ts +0 -105
  418. package/src/components/APIKeyField/index.client.tsx +0 -68
  419. package/src/components/APIKeyField/index.css +0 -105
  420. package/src/components/APIKeysEmptyState/index.client.tsx +0 -33
  421. package/src/components/AccessField/index.client.tsx +0 -296
  422. package/src/components/AccessField/index.css +0 -99
  423. package/src/components/SettingsMenu/index.client.tsx +0 -30
  424. package/src/translations/index.ts +0 -105
  425. package/src/translations/languages/ar.ts +0 -38
  426. package/src/translations/languages/az.ts +0 -38
  427. package/src/translations/languages/bg.ts +0 -39
  428. package/src/translations/languages/bnBd.ts +0 -39
  429. package/src/translations/languages/bnIn.ts +0 -39
  430. package/src/translations/languages/ca.ts +0 -39
  431. package/src/translations/languages/cs.ts +0 -39
  432. package/src/translations/languages/da.ts +0 -38
  433. package/src/translations/languages/de.ts +0 -39
  434. package/src/translations/languages/en.ts +0 -39
  435. package/src/translations/languages/es.ts +0 -39
  436. package/src/translations/languages/et.ts +0 -38
  437. package/src/translations/languages/fa.ts +0 -39
  438. package/src/translations/languages/fr.ts +0 -39
  439. package/src/translations/languages/he.ts +0 -37
  440. package/src/translations/languages/hr.ts +0 -39
  441. package/src/translations/languages/hu.ts +0 -39
  442. package/src/translations/languages/hy.ts +0 -39
  443. package/src/translations/languages/id.ts +0 -39
  444. package/src/translations/languages/is.ts +0 -39
  445. package/src/translations/languages/it.ts +0 -39
  446. package/src/translations/languages/ja.ts +0 -39
  447. package/src/translations/languages/ko.ts +0 -39
  448. package/src/translations/languages/lt.ts +0 -39
  449. package/src/translations/languages/lv.ts +0 -38
  450. package/src/translations/languages/my.ts +0 -39
  451. package/src/translations/languages/nb.ts +0 -39
  452. package/src/translations/languages/nl.ts +0 -39
  453. package/src/translations/languages/pl.ts +0 -38
  454. package/src/translations/languages/pt.ts +0 -39
  455. package/src/translations/languages/ro.ts +0 -39
  456. package/src/translations/languages/rs.ts +0 -38
  457. package/src/translations/languages/rsLatin.ts +0 -38
  458. package/src/translations/languages/ru.ts +0 -39
  459. package/src/translations/languages/sk.ts +0 -39
  460. package/src/translations/languages/sl.ts +0 -38
  461. package/src/translations/languages/sv.ts +0 -39
  462. package/src/translations/languages/ta.ts +0 -39
  463. package/src/translations/languages/th.ts +0 -38
  464. package/src/translations/languages/tr.ts +0 -38
  465. package/src/translations/languages/uk.ts +0 -39
  466. package/src/translations/languages/vi.ts +0 -39
  467. package/src/translations/languages/zh.ts +0 -36
  468. package/src/translations/languages/zhTw.ts +0 -36
  469. package/src/translations/types.ts +0 -34
  470. package/src/utils/localAPIDefaults.ts +0 -22
  471. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
@@ -8,16 +8,42 @@ import {
8
8
  unlockCollectionTool,
9
9
  verifyCollectionTool,
10
10
  } from './builtin/collections/authTools.js'
11
+ import { countDocumentsTool } from './builtin/collections/countTool.js'
12
+ import { countVersionsTool } from './builtin/collections/countVersionsTool.js'
11
13
  import { createDocumentTool } from './builtin/collections/createTool.js'
12
14
  import { deleteDocumentsTool } from './builtin/collections/deleteTool.js'
15
+ import { duplicateDocumentTool } from './builtin/collections/duplicateTool.js'
16
+ import { findDistinctTool } from './builtin/collections/findDistinctTool.js'
13
17
  import { findDocumentsTool } from './builtin/collections/findTool.js'
18
+ import { findVersionByIDTool } from './builtin/collections/findVersionByIDTool.js'
19
+ import { findVersionsTool } from './builtin/collections/findVersionsTool.js'
14
20
  import { getCollectionSchemaTool } from './builtin/collections/getCollectionSchemaTool.js'
21
+ import { restoreVersionTool } from './builtin/collections/restoreVersionTool.js'
15
22
  import { updateDocumentTool } from './builtin/collections/updateTool.js'
23
+ import { getUploadInstructionsTool } from './builtin/collections/uploadInstructionsTool.js'
16
24
  import { getConfigInfoTool } from './builtin/getConfigInfoTool.js'
25
+ import { countGlobalVersionsTool } from './builtin/globals/countVersionsTool.js'
17
26
  import { findGlobalTool } from './builtin/globals/findTool.js'
27
+ import { findGlobalVersionByIDTool } from './builtin/globals/findVersionByIDTool.js'
28
+ import { findGlobalVersionsTool } from './builtin/globals/findVersionsTool.js'
18
29
  import { getGlobalSchemaTool } from './builtin/globals/getGlobalSchemaTool.js'
30
+ import { restoreGlobalVersionTool } from './builtin/globals/restoreVersionTool.js'
19
31
  import { updateGlobalTool } from './builtin/globals/updateTool.js'
20
32
 
33
+ type CollectionBuiltin = {
34
+ mcpName: string
35
+ requiresDuplicateEnabled?: boolean
36
+ requiresUpload?: boolean
37
+ requiresVersions?: boolean
38
+ tool: CollectionTool
39
+ }
40
+
41
+ type GlobalBuiltin = {
42
+ mcpName: string
43
+ requiresVersions?: boolean
44
+ tool: GlobalTool
45
+ }
46
+
21
47
  export const TOOL_BUILTINS = {
22
48
  getConfigInfo: { mcpName: 'getConfigInfo', tool: getConfigInfoTool },
23
49
  } satisfies Record<string, { mcpName: string; tool: Tool }>
@@ -28,12 +54,32 @@ export const TOOL_BUILTINS = {
28
54
  * automatically.
29
55
  */
30
56
  export const COLLECTION_BUILTINS = {
57
+ count: { mcpName: 'countDocuments', tool: countDocumentsTool },
58
+ countVersions: { mcpName: 'countVersions', requiresVersions: true, tool: countVersionsTool },
31
59
  create: { mcpName: 'createDocument', tool: createDocumentTool },
32
60
  delete: { mcpName: 'deleteDocuments', tool: deleteDocumentsTool },
61
+ duplicate: {
62
+ mcpName: 'duplicateDocument',
63
+ requiresDuplicateEnabled: true,
64
+ tool: duplicateDocumentTool,
65
+ },
33
66
  find: { mcpName: 'findDocuments', tool: findDocumentsTool },
67
+ findDistinct: { mcpName: 'findDistinct', tool: findDistinctTool },
68
+ findVersionByID: {
69
+ mcpName: 'findVersionByID',
70
+ requiresVersions: true,
71
+ tool: findVersionByIDTool,
72
+ },
73
+ findVersions: { mcpName: 'findVersions', requiresVersions: true, tool: findVersionsTool },
34
74
  getCollectionSchema: { mcpName: 'getCollectionSchema', tool: getCollectionSchemaTool },
75
+ getUploadInstructions: {
76
+ mcpName: 'getUploadInstructions',
77
+ requiresUpload: true,
78
+ tool: getUploadInstructionsTool,
79
+ },
80
+ restoreVersion: { mcpName: 'restoreVersion', requiresVersions: true, tool: restoreVersionTool },
35
81
  update: { mcpName: 'updateDocument', tool: updateDocumentTool },
36
- } satisfies Record<string, { mcpName: string; tool: CollectionTool }>
82
+ } satisfies Record<string, CollectionBuiltin>
37
83
 
38
84
  /**
39
85
  * The static auth tools surfaced under auth-enabled collections. Keys are the
@@ -59,10 +105,30 @@ export const COLLECTION_AUTH_BUILTINS = {
59
105
  * `MCPGlobalBuiltinName`.
60
106
  */
61
107
  export const GLOBAL_BUILTINS = {
108
+ countGlobalVersions: {
109
+ mcpName: 'countGlobalVersions',
110
+ requiresVersions: true,
111
+ tool: countGlobalVersionsTool,
112
+ },
62
113
  find: { mcpName: 'findGlobal', tool: findGlobalTool },
114
+ findGlobalVersionByID: {
115
+ mcpName: 'findGlobalVersionByID',
116
+ requiresVersions: true,
117
+ tool: findGlobalVersionByIDTool,
118
+ },
119
+ findGlobalVersions: {
120
+ mcpName: 'findGlobalVersions',
121
+ requiresVersions: true,
122
+ tool: findGlobalVersionsTool,
123
+ },
63
124
  getGlobalSchema: { mcpName: 'getGlobalSchema', tool: getGlobalSchemaTool },
125
+ restoreGlobalVersion: {
126
+ mcpName: 'restoreGlobalVersion',
127
+ requiresVersions: true,
128
+ tool: restoreGlobalVersionTool,
129
+ },
64
130
  update: { mcpName: 'updateGlobal', tool: updateGlobalTool },
65
- } satisfies Record<string, { mcpName: string; tool: GlobalTool }>
131
+ } satisfies Record<string, GlobalBuiltin>
66
132
 
67
133
  export type MCPCollectionBuiltinName = keyof typeof COLLECTION_BUILTINS
68
134
 
@@ -83,7 +149,7 @@ export const TOOL_BUILTIN_ENTRIES = Object.entries(TOOL_BUILTINS) as Array<
83
149
  >
84
150
 
85
151
  export const COLLECTION_BUILTIN_ENTRIES = Object.entries(COLLECTION_BUILTINS) as Array<
86
- [MCPCollectionBuiltinName, (typeof COLLECTION_BUILTINS)[MCPCollectionBuiltinName]]
152
+ [MCPCollectionBuiltinName, CollectionBuiltin]
87
153
  >
88
154
 
89
155
  export const COLLECTION_AUTH_BUILTIN_ENTRIES = Object.entries(COLLECTION_AUTH_BUILTINS) as Array<
@@ -91,5 +157,5 @@ export const COLLECTION_AUTH_BUILTIN_ENTRIES = Object.entries(COLLECTION_AUTH_BU
91
157
  >
92
158
 
93
159
  export const GLOBAL_BUILTIN_ENTRIES = Object.entries(GLOBAL_BUILTINS) as Array<
94
- [MCPGlobalBuiltinName, (typeof GLOBAL_BUILTINS)[MCPGlobalBuiltinName]]
160
+ [MCPGlobalBuiltinName, GlobalBuiltin]
95
161
  >
@@ -17,6 +17,7 @@ import type {
17
17
  SanitizedMCPPluginConfig,
18
18
  } from '../types.js'
19
19
 
20
+ import { defaultAccess } from '../defaultAccess.js'
20
21
  import {
21
22
  COLLECTION_AUTH_BUILTIN_ENTRIES,
22
23
  COLLECTION_AUTH_BUILTINS,
@@ -33,7 +34,6 @@ import {
33
34
  * - Flattens `tools` / `prompts` / `resources` / per-collection / per-global
34
35
  * tool maps into a single `items` array.
35
36
  * - Applies built-in tools for collections and globals, respecting opt-out user overrides.
36
- * - Applies the `userCollection` default
37
37
  *
38
38
  * Called once during plugin init. After that, `plugins['@payloadcms/plugin-mcp']
39
39
  * ?.options` holds the sanitized result
@@ -61,7 +61,7 @@ export const sanitizeMCPConfig = ({
61
61
  configKey,
62
62
  label: tool.annotations?.title ?? configKey,
63
63
  mcpName,
64
- tool,
64
+ tool: { ...tool, access: tool.access ?? defaultAccess },
65
65
  })
66
66
  }
67
67
 
@@ -74,7 +74,7 @@ export const sanitizeMCPConfig = ({
74
74
  configKey,
75
75
  label: tool.annotations?.title ?? configKey,
76
76
  mcpName: configKey,
77
- tool,
77
+ tool: { ...tool, access: tool.access ?? defaultAccess },
78
78
  })
79
79
  }
80
80
 
@@ -84,7 +84,7 @@ export const sanitizeMCPConfig = ({
84
84
  configKey,
85
85
  label: prompt.title ?? configKey,
86
86
  mcpName: configKey,
87
- prompt,
87
+ prompt: { ...prompt, access: prompt.access ?? defaultAccess },
88
88
  })
89
89
  }
90
90
 
@@ -94,21 +94,16 @@ export const sanitizeMCPConfig = ({
94
94
  configKey,
95
95
  label: resource.title ?? configKey,
96
96
  mcpName: configKey,
97
- resource,
97
+ resource: { ...resource, access: resource.access ?? defaultAccess },
98
98
  })
99
99
  }
100
100
 
101
- // Mirror Payload's own admin.user detection (sanitize.ts) since plugins run first.
102
- const firstCollectionWithAuth = config.collections!.find(({ auth }) => Boolean(auth))
103
-
104
101
  return {
105
102
  disabled: pluginConfig.disabled,
103
+ hooks: pluginConfig.hooks,
106
104
  items,
107
105
  mcp: pluginConfig.mcp,
108
- overrideApiKeyCollection: pluginConfig.overrideApiKeyCollection,
109
- overrideAuth: pluginConfig.overrideAuth,
110
- userCollection:
111
- pluginConfig.userCollection ?? config.admin?.user ?? firstCollectionWithAuth?.slug ?? 'users',
106
+ overrideGetAuthorizedMCP: pluginConfig.overrideGetAuthorizedMCP,
112
107
  }
113
108
  }
114
109
 
@@ -119,14 +114,30 @@ const sanitizeCollectionConfig = ({
119
114
  collection: CollectionConfig | SanitizedCollectionConfig
120
115
  pluginConfig: MCPPluginConfig
121
116
  }): CollectionMCPItem[] => {
122
- if (collection.slug === 'payload-mcp-api-keys') {
123
- return []
124
- }
125
117
  const slug = collection.slug
126
118
  const collectionPluginConfig = pluginConfig.collections?.[slug]
127
119
  const items: CollectionMCPItem[] = []
120
+ /**
121
+ * Payload disables duplicate for auth collections by default unless the
122
+ * collection explicitly opts back in with `disableDuplicate: false`.
123
+ */
124
+ const isDuplicateDisabled =
125
+ collection.disableDuplicate === true ||
126
+ (Boolean(collection.auth) && collection.disableDuplicate !== false)
128
127
 
129
- for (const [toolKey, { mcpName, tool }] of COLLECTION_BUILTIN_ENTRIES) {
128
+ for (const [
129
+ toolKey,
130
+ { mcpName, requiresDuplicateEnabled, requiresUpload, requiresVersions, tool },
131
+ ] of COLLECTION_BUILTIN_ENTRIES) {
132
+ if (requiresVersions && !collection.versions) {
133
+ continue
134
+ }
135
+ if (requiresDuplicateEnabled && isDuplicateDisabled) {
136
+ continue
137
+ }
138
+ if (requiresUpload && !collection.upload) {
139
+ continue
140
+ }
130
141
  const matchedConfigEntry = collectionPluginConfig?.tools?.[toolKey]
131
142
  if (matchedConfigEntry === false) {
132
143
  continue
@@ -141,6 +152,7 @@ const sanitizeCollectionConfig = ({
141
152
  mcpName,
142
153
  tool: {
143
154
  ...tool,
155
+ access: override?.access ?? tool.access ?? defaultAccess,
144
156
  annotations,
145
157
  description: override?.description ?? tool.description,
146
158
  overrideResponse:
@@ -168,6 +180,7 @@ const sanitizeCollectionConfig = ({
168
180
  mcpName,
169
181
  tool: {
170
182
  ...tool,
183
+ access: override?.access ?? tool.access ?? defaultAccess,
171
184
  annotations,
172
185
  description: override?.description ?? tool.description,
173
186
  overrideResponse:
@@ -197,7 +210,7 @@ const sanitizeCollectionConfig = ({
197
210
  configKey,
198
211
  label: customTool.annotations?.title ?? configKey,
199
212
  mcpName: configKey,
200
- tool: customTool,
213
+ tool: { ...customTool, access: customTool.access ?? defaultAccess },
201
214
  })
202
215
  }
203
216
 
@@ -215,7 +228,10 @@ const sanitizeGlobalConfig = ({
215
228
  const globalPluginConfig = pluginConfig.globals?.[slug]
216
229
  const items: GlobalMCPItem[] = []
217
230
 
218
- for (const [toolKey, { mcpName, tool }] of GLOBAL_BUILTIN_ENTRIES) {
231
+ for (const [toolKey, { mcpName, requiresVersions, tool }] of GLOBAL_BUILTIN_ENTRIES) {
232
+ if (requiresVersions && !global.versions) {
233
+ continue
234
+ }
219
235
  const matchedConfigEntry = globalPluginConfig?.tools?.[toolKey]
220
236
  if (matchedConfigEntry === false) {
221
237
  continue
@@ -230,6 +246,7 @@ const sanitizeGlobalConfig = ({
230
246
  mcpName,
231
247
  tool: {
232
248
  ...tool,
249
+ access: override?.access ?? tool.access ?? defaultAccess,
233
250
  annotations,
234
251
  description: override?.description ?? tool.description,
235
252
  overrideResponse:
@@ -256,7 +273,7 @@ const sanitizeGlobalConfig = ({
256
273
  globalSlug: slug,
257
274
  label: customTool.annotations?.title ?? configKey,
258
275
  mcpName: configKey,
259
- tool: customTool,
276
+ tool: { ...customTool, access: customTool.access ?? defaultAccess },
260
277
  })
261
278
  }
262
279
 
package/src/stdio.ts CHANGED
@@ -1,35 +1,28 @@
1
- import type { MaybePromise, Plugin, SanitizedConfig } from 'payload'
1
+ import type { Config, Plugin, SanitizedConfig } from 'payload'
2
2
 
3
3
  /* eslint-disable no-console */
4
- import { StdioServerTransport } from '@modelcontextprotocol/server'
4
+ import { serveStdio } from '@modelcontextprotocol/server/stdio'
5
5
  import { fileURLToPath, pathToFileURL } from 'node:url'
6
6
  import { createLocalReq, getPayload } from 'payload'
7
7
  import { findConfig } from 'payload/node'
8
8
 
9
- import type { AuthorizedMCP, SanitizedMCPPluginConfig } from './types.js'
9
+ import type { SanitizedMCPPluginConfig } from './types.js'
10
10
 
11
+ import { getAuthorizedMCP } from './endpoint/access.js'
11
12
  import { buildMcpServer } from './mcp/buildMcpServer.js'
12
13
  import { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js'
13
14
  import { getPluginConfig } from './utils/getPluginConfig.js'
14
15
  import { resolveProjectRoot } from './utils/resolveProjectRoot.js'
15
16
 
16
17
  /**
17
- * Stdio adapter for the Payload MCP server.
18
+ * Starts Payload's MCP server over stdin and stdout.
18
19
  *
19
- * Do not use in production. There's no auth; whoever can spawn the process gets
20
- * full access to your local data.
20
+ * Set `PAYLOAD_MCP_AUTHORIZATION` to authenticate. In development,
21
+ * `PAYLOAD_MCP_OVERRIDE_ACCESS=true` skips access checks.
21
22
  */
22
23
  export const runMcpStdio = async (): Promise<void> => {
23
- /**
24
- * If MCP clients spawn stdio servers from an arbitrary working directory,
25
- * Payload's cwd-anchored `findConfig()` can't locate the project on
26
- * its own. This module always lives inside the project's `node_modules`, so
27
- * we derive the project root from its own path and `chdir` into it.
28
- *
29
- * An absolute `PAYLOAD_CONFIG_PATH` still overrides everything; unusual
30
- * layouts (e.g. a monorepo where the package is hoisted above the app) can
31
- * fall back to it. See the implementation of findConfig for details.
32
- */
24
+ // MCP clients may start this command from another folder. Move to the Payload
25
+ // project so findConfig() can find the config.
33
26
  const projectRoot = resolveProjectRoot(fileURLToPath(import.meta.url))
34
27
  if (projectRoot) {
35
28
  process.chdir(projectRoot)
@@ -37,62 +30,101 @@ export const runMcpStdio = async (): Promise<void> => {
37
30
 
38
31
  const configPath = findConfig()
39
32
  const configModule = await import(pathToFileURL(configPath).toString())
40
- const config = (await (configModule.default ?? configModule)) as MaybePromise<SanitizedConfig>
41
-
42
- const payload = await getPayload({ config })
33
+ const config = (await (configModule.default ?? configModule)) as SanitizedConfig
43
34
 
44
35
  /**
45
- * If the user added `mcpPlugin({...})` to their `plugins` array, read the
46
- * sanitized config they registered. Otherwise fall back to the defaults. That way,
47
- * the mcp works on any project that has `@payloadcms/plugin-mcp` installed,
48
- * even if the plugin is not added to the plugins array.
36
+ * stdout is only for MCP messages. The spec says the server must not write
37
+ * logs there and may write them to stderr instead.
38
+ *
39
+ * The 2.0 client library recovers from stray stdout logs, but that behavior is not
40
+ * guaranteed. Move Payload logs to stderr so Payload does not add invalid data
41
+ * to stdout. Keep options from configurable loggers. Replace pre-built loggers
42
+ * because their output cannot be redirected.
43
+ *
44
+ * @see https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#stdio
49
45
  */
46
+ const loggerConfig: { logger?: Config['logger'] } = config
47
+ if (
48
+ loggerConfig.logger &&
49
+ typeof loggerConfig.logger === 'object' &&
50
+ 'options' in loggerConfig.logger
51
+ ) {
52
+ loggerConfig.logger.destination = process.stderr
53
+ } else {
54
+ loggerConfig.logger = { destination: process.stderr, options: {} }
55
+ }
56
+
57
+ const payload = await getPayload({ config, cron: false, disableOnInit: true })
58
+
50
59
  let pluginConfig: SanitizedMCPPluginConfig
51
60
  try {
52
61
  pluginConfig = getPluginConfig({ config: payload.config })
53
62
  } catch {
63
+ // The command also works when mcpPlugin() is not in the Payload config.
54
64
  pluginConfig = sanitizeMCPConfig({ config: payload.config, pluginConfig: {} })
55
65
 
56
- const fakePluginFn: Plugin = (config) => config
57
- fakePluginFn.slug = '@payloadcms/plugin-mcp'
58
- // @ts-expect-error
59
- fakePluginFn.sanitizedOptions = pluginConfig
66
+ const fallbackPlugin: Plugin = (config) => config
67
+ Object.assign(fallbackPlugin, {
68
+ slug: '@payloadcms/plugin-mcp',
69
+ sanitizedOptions: pluginConfig,
70
+ })
71
+ payload.config.plugins ??= []
72
+ payload.config.plugins.push(fallbackPlugin)
73
+ }
74
+
75
+ const overrideAccessEnv = process.env.PAYLOAD_MCP_OVERRIDE_ACCESS
76
+ let overrideAccess = false
77
+
78
+ if (overrideAccessEnv === 'true') {
79
+ overrideAccess = true
80
+ } else if (overrideAccessEnv && overrideAccessEnv !== 'false') {
81
+ throw new Error('PAYLOAD_MCP_OVERRIDE_ACCESS must be "true" or "false".')
82
+ }
60
83
 
61
- // Push to payload config, to ensure consecutive calls to `getPluginConfig()` work
62
- ;(payload.config.plugins ??= []).push(fakePluginFn)
84
+ if (overrideAccess && process.env.NODE_ENV !== 'development') {
85
+ throw new Error('PAYLOAD_MCP_OVERRIDE_ACCESS is only available in development.')
63
86
  }
64
87
 
65
- const authorizedMCP: AuthorizedMCP = {
66
- items: pluginConfig.items,
67
- overrideAccess: true,
68
- user: null,
88
+ const headers = new Headers()
89
+ if (process.env.PAYLOAD_MCP_AUTHORIZATION) {
90
+ headers.set('Authorization', process.env.PAYLOAD_MCP_AUTHORIZATION)
69
91
  }
70
92
 
71
- const req = await createLocalReq({}, payload)
93
+ const req = await createLocalReq({ req: { headers } }, payload)
72
94
  req.payloadAPI = 'MCP' as const
95
+ const authorizedMCP = await getAuthorizedMCP({ overrideAccess, req })
73
96
 
74
- const server = buildMcpServer({ authorizedMCP, pluginConfig, req })
97
+ const stdioServer = serveStdio(() => buildMcpServer({ authorizedMCP, pluginConfig, req }), {
98
+ onerror: (err) => {
99
+ // MCP messages use stdout, so write SDK errors to stderr.
100
+ console.error('[payload-mcp] error serving MCP over stdio:', err)
101
+ },
102
+ })
75
103
 
76
- const transport = new StdioServerTransport()
77
- await server.connect(transport)
104
+ // Close the MCP server and Payload when the client disconnects or the process stops.
105
+ let isShuttingDown = false
106
+ const shutdown = async () => {
107
+ if (isShuttingDown) {
108
+ return
109
+ }
110
+ isShuttingDown = true
78
111
 
79
- // Process now lives until stdin closes. Wire graceful shutdown so DB
80
- // connections (and any other Payload-managed resources) get released.
81
- const shutdown = async (code = 0) => {
82
112
  try {
83
- await server.close()
113
+ await stdioServer.close()
84
114
  } catch (err) {
85
115
  console.error('[payload-mcp] error closing server:', err)
86
116
  }
117
+
87
118
  try {
88
119
  await payload.destroy()
89
120
  } catch (err) {
90
121
  console.error('[payload-mcp] error destroying payload:', err)
91
122
  }
92
- process.exit(code)
123
+
124
+ process.exit(0)
93
125
  }
94
126
 
95
- process.on('SIGINT', () => void shutdown(0))
96
- process.on('SIGTERM', () => void shutdown(0))
97
- process.stdin.on('close', () => void shutdown(0))
127
+ process.once('SIGINT', () => void shutdown())
128
+ process.once('SIGTERM', () => void shutdown())
129
+ process.stdin.once('close', () => void shutdown())
98
130
  }