@payloadcms/plugin-mcp 4.0.0-canary.2 → 4.0.0-canary.20

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 (475) 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 -51
  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 +34 -10
  32. package/dist/mcp/buildMcpServer.js.map +1 -1
  33. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -1
  34. package/dist/mcp/builtin/collections/authTools.js +44 -6
  35. package/dist/mcp/builtin/collections/authTools.js.map +1 -1
  36. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  37. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  38. package/dist/mcp/builtin/collections/countTool.js +68 -0
  39. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  40. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  41. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  42. package/dist/mcp/builtin/collections/countVersionsTool.js +64 -0
  43. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  44. package/dist/mcp/builtin/collections/createTool.d.ts +1 -1
  45. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
  46. package/dist/mcp/builtin/collections/createTool.js +98 -54
  47. package/dist/mcp/builtin/collections/createTool.js.map +1 -1
  48. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
  49. package/dist/mcp/builtin/collections/deleteTool.js +10 -2
  50. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
  51. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  52. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  53. package/dist/mcp/builtin/collections/duplicateTool.js +96 -0
  54. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  55. package/dist/mcp/builtin/collections/fileInput.d.ts +28 -0
  56. package/dist/mcp/builtin/collections/fileInput.d.ts.map +1 -0
  57. package/dist/mcp/builtin/collections/fileInput.js +124 -0
  58. package/dist/mcp/builtin/collections/fileInput.js.map +1 -0
  59. package/dist/mcp/builtin/collections/fileInput.spec.js +86 -0
  60. package/dist/mcp/builtin/collections/fileInput.spec.js.map +1 -0
  61. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  62. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  63. package/dist/mcp/builtin/collections/findDistinctTool.js +92 -0
  64. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  65. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  66. package/dist/mcp/builtin/collections/findTool.js +46 -26
  67. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  68. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  69. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  70. package/dist/mcp/builtin/collections/findVersionByIDTool.js +83 -0
  71. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  72. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  73. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  74. package/dist/mcp/builtin/collections/findVersionsTool.js +98 -0
  75. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  76. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +1 -1
  77. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -1
  78. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -1
  79. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -1
  80. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +56 -4
  81. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -1
  82. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  83. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  84. package/dist/mcp/builtin/collections/restoreVersionTool.js +81 -0
  85. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  86. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  87. package/dist/mcp/builtin/collections/updateTool.js +38 -33
  88. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  89. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts +2 -0
  90. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts.map +1 -0
  91. package/dist/mcp/builtin/collections/uploadInstructionsTool.js +55 -0
  92. package/dist/mcp/builtin/collections/uploadInstructionsTool.js.map +1 -0
  93. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -1
  94. package/dist/mcp/builtin/getConfigInfoTool.js +27 -8
  95. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -1
  96. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  97. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  98. package/dist/mcp/builtin/globals/countVersionsTool.js +64 -0
  99. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  100. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  101. package/dist/mcp/builtin/globals/findTool.js +19 -22
  102. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  103. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  104. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  105. package/dist/mcp/builtin/globals/findVersionByIDTool.js +79 -0
  106. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  107. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  108. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  109. package/dist/mcp/builtin/globals/findVersionsTool.js +94 -0
  110. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  111. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -1
  112. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +32 -2
  113. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -1
  114. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  115. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  116. package/dist/mcp/builtin/globals/restoreVersionTool.js +77 -0
  117. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  118. package/dist/mcp/builtin/globals/updateTool.js +14 -21
  119. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  120. package/dist/mcp/builtin/validateEntityData.d.ts.map +1 -1
  121. package/dist/mcp/builtin/validateEntityData.js +1 -1
  122. package/dist/mcp/builtin/validateEntityData.js.map +1 -1
  123. package/dist/mcp/builtinTools.d.ts +75 -12
  124. package/dist/mcp/builtinTools.d.ts.map +1 -1
  125. package/dist/mcp/builtinTools.js +75 -13
  126. package/dist/mcp/builtinTools.js.map +1 -1
  127. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  128. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  129. package/dist/mcp/sanitizeMCPConfig.js +72 -27
  130. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  131. package/dist/stdio.d.ts +3 -3
  132. package/dist/stdio.d.ts.map +1 -1
  133. package/dist/stdio.js +84 -46
  134. package/dist/stdio.js.map +1 -1
  135. package/dist/types.d.ts +100 -92
  136. package/dist/types.d.ts.map +1 -1
  137. package/dist/types.js +2 -4
  138. package/dist/types.js.map +1 -1
  139. package/dist/utils/camelCase.d.ts.map +1 -1
  140. package/dist/utils/getPluginConfig.d.ts +1 -1
  141. package/dist/utils/getPluginConfig.js +1 -1
  142. package/dist/utils/getPluginConfig.js.map +1 -1
  143. package/dist/utils/resolveProjectRoot.d.ts.map +1 -1
  144. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts +28 -0
  145. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts.map +1 -0
  146. package/dist/utils/schemaConversion/filterFieldsByAccess.js +71 -0
  147. package/dist/utils/schemaConversion/filterFieldsByAccess.js.map +1 -0
  148. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +5 -3
  149. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +1 -1
  150. package/dist/utils/schemaConversion/getEntityInputSchema.js +44 -12
  151. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +1 -1
  152. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +5 -10
  153. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -1
  154. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +15 -95
  155. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -1
  156. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +15 -40
  157. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -1
  158. package/dist/utils/toStandardSchema.d.ts.map +1 -1
  159. package/package.json +10 -16
  160. package/src/defaultAccess.ts +3 -0
  161. package/src/endpoint/access.ts +80 -112
  162. package/src/endpoint/index.ts +58 -16
  163. package/src/exports/client.ts +2 -4
  164. package/src/exports/internal.ts +1 -0
  165. package/src/index.ts +5 -59
  166. package/src/mcp/buildMcpServer.ts +48 -21
  167. package/src/mcp/builtin/collections/authTools.ts +45 -9
  168. package/src/mcp/builtin/collections/countTool.ts +73 -0
  169. package/src/mcp/builtin/collections/countVersionsTool.ts +69 -0
  170. package/src/mcp/builtin/collections/createTool.ts +98 -42
  171. package/src/mcp/builtin/collections/deleteTool.ts +11 -2
  172. package/src/mcp/builtin/collections/duplicateTool.ts +134 -0
  173. package/src/mcp/builtin/collections/fileInput.spec.ts +93 -0
  174. package/src/mcp/builtin/collections/fileInput.ts +164 -0
  175. package/src/mcp/builtin/collections/findDistinctTool.ts +119 -0
  176. package/src/mcp/builtin/collections/findTool.ts +59 -20
  177. package/src/mcp/builtin/collections/findVersionByIDTool.ts +109 -0
  178. package/src/mcp/builtin/collections/findVersionsTool.ts +154 -0
  179. package/src/mcp/builtin/collections/formatCollectionError.ts +1 -1
  180. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +55 -3
  181. package/src/mcp/builtin/collections/restoreVersionTool.ts +107 -0
  182. package/src/mcp/builtin/collections/updateTool.ts +40 -24
  183. package/src/mcp/builtin/collections/uploadInstructionsTool.ts +64 -0
  184. package/src/mcp/builtin/getConfigInfoTool.ts +27 -4
  185. package/src/mcp/builtin/globals/countVersionsTool.ts +68 -0
  186. package/src/mcp/builtin/globals/findTool.ts +27 -18
  187. package/src/mcp/builtin/globals/findVersionByIDTool.ts +103 -0
  188. package/src/mcp/builtin/globals/findVersionsTool.ts +147 -0
  189. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +37 -2
  190. package/src/mcp/builtin/globals/restoreVersionTool.ts +99 -0
  191. package/src/mcp/builtin/globals/updateTool.ts +16 -16
  192. package/src/mcp/builtin/validateEntityData.ts +1 -1
  193. package/src/mcp/builtinTools.ts +81 -18
  194. package/src/mcp/sanitizeMCPConfig.ts +51 -30
  195. package/src/stdio.ts +79 -46
  196. package/src/types.ts +108 -95
  197. package/src/utils/getPluginConfig.ts +1 -1
  198. package/src/utils/schemaConversion/filterFieldsByAccess.ts +123 -0
  199. package/src/utils/schemaConversion/getEntityInputSchema.ts +45 -27
  200. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +12 -19
  201. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +17 -114
  202. package/dist/collection/getAccessField.d.ts +0 -12
  203. package/dist/collection/getAccessField.d.ts.map +0 -1
  204. package/dist/collection/getAccessField.js +0 -72
  205. package/dist/collection/getAccessField.js.map +0 -1
  206. package/dist/collection/index.d.ts +0 -6
  207. package/dist/collection/index.d.ts.map +0 -1
  208. package/dist/collection/index.js +0 -105
  209. package/dist/collection/index.js.map +0 -1
  210. package/dist/components/APIKeyField/index.client.d.ts +0 -9
  211. package/dist/components/APIKeyField/index.client.d.ts.map +0 -1
  212. package/dist/components/APIKeyField/index.client.js +0 -85
  213. package/dist/components/APIKeyField/index.client.js.map +0 -1
  214. package/dist/components/APIKeyField/index.css +0 -105
  215. package/dist/components/APIKeysEmptyState/index.client.d.ts +0 -4
  216. package/dist/components/APIKeysEmptyState/index.client.d.ts.map +0 -1
  217. package/dist/components/APIKeysEmptyState/index.client.js +0 -21
  218. package/dist/components/APIKeysEmptyState/index.client.js.map +0 -1
  219. package/dist/components/AccessField/index.client.d.ts +0 -10
  220. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  221. package/dist/components/AccessField/index.client.js +0 -247
  222. package/dist/components/AccessField/index.client.js.map +0 -1
  223. package/dist/components/AccessField/index.css +0 -99
  224. package/dist/components/SettingsMenu/index.client.d.ts +0 -8
  225. package/dist/components/SettingsMenu/index.client.d.ts.map +0 -1
  226. package/dist/components/SettingsMenu/index.client.js +0 -29
  227. package/dist/components/SettingsMenu/index.client.js.map +0 -1
  228. package/dist/translations/index.d.ts +0 -11
  229. package/dist/translations/index.d.ts.map +0 -1
  230. package/dist/translations/index.js +0 -92
  231. package/dist/translations/index.js.map +0 -1
  232. package/dist/translations/languages/ar.d.ts +0 -31
  233. package/dist/translations/languages/ar.d.ts.map +0 -1
  234. package/dist/translations/languages/ar.js +0 -34
  235. package/dist/translations/languages/ar.js.map +0 -1
  236. package/dist/translations/languages/az.d.ts +0 -31
  237. package/dist/translations/languages/az.d.ts.map +0 -1
  238. package/dist/translations/languages/az.js +0 -34
  239. package/dist/translations/languages/az.js.map +0 -1
  240. package/dist/translations/languages/bg.d.ts +0 -31
  241. package/dist/translations/languages/bg.d.ts.map +0 -1
  242. package/dist/translations/languages/bg.js +0 -34
  243. package/dist/translations/languages/bg.js.map +0 -1
  244. package/dist/translations/languages/bnBd.d.ts +0 -31
  245. package/dist/translations/languages/bnBd.d.ts.map +0 -1
  246. package/dist/translations/languages/bnBd.js +0 -34
  247. package/dist/translations/languages/bnBd.js.map +0 -1
  248. package/dist/translations/languages/bnIn.d.ts +0 -31
  249. package/dist/translations/languages/bnIn.d.ts.map +0 -1
  250. package/dist/translations/languages/bnIn.js +0 -34
  251. package/dist/translations/languages/bnIn.js.map +0 -1
  252. package/dist/translations/languages/ca.d.ts +0 -31
  253. package/dist/translations/languages/ca.d.ts.map +0 -1
  254. package/dist/translations/languages/ca.js +0 -34
  255. package/dist/translations/languages/ca.js.map +0 -1
  256. package/dist/translations/languages/cs.d.ts +0 -31
  257. package/dist/translations/languages/cs.d.ts.map +0 -1
  258. package/dist/translations/languages/cs.js +0 -34
  259. package/dist/translations/languages/cs.js.map +0 -1
  260. package/dist/translations/languages/da.d.ts +0 -31
  261. package/dist/translations/languages/da.d.ts.map +0 -1
  262. package/dist/translations/languages/da.js +0 -34
  263. package/dist/translations/languages/da.js.map +0 -1
  264. package/dist/translations/languages/de.d.ts +0 -31
  265. package/dist/translations/languages/de.d.ts.map +0 -1
  266. package/dist/translations/languages/de.js +0 -34
  267. package/dist/translations/languages/de.js.map +0 -1
  268. package/dist/translations/languages/en.d.ts +0 -31
  269. package/dist/translations/languages/en.d.ts.map +0 -1
  270. package/dist/translations/languages/en.js +0 -34
  271. package/dist/translations/languages/en.js.map +0 -1
  272. package/dist/translations/languages/es.d.ts +0 -31
  273. package/dist/translations/languages/es.d.ts.map +0 -1
  274. package/dist/translations/languages/es.js +0 -34
  275. package/dist/translations/languages/es.js.map +0 -1
  276. package/dist/translations/languages/et.d.ts +0 -31
  277. package/dist/translations/languages/et.d.ts.map +0 -1
  278. package/dist/translations/languages/et.js +0 -34
  279. package/dist/translations/languages/et.js.map +0 -1
  280. package/dist/translations/languages/fa.d.ts +0 -31
  281. package/dist/translations/languages/fa.d.ts.map +0 -1
  282. package/dist/translations/languages/fa.js +0 -34
  283. package/dist/translations/languages/fa.js.map +0 -1
  284. package/dist/translations/languages/fr.d.ts +0 -31
  285. package/dist/translations/languages/fr.d.ts.map +0 -1
  286. package/dist/translations/languages/fr.js +0 -34
  287. package/dist/translations/languages/fr.js.map +0 -1
  288. package/dist/translations/languages/he.d.ts +0 -31
  289. package/dist/translations/languages/he.d.ts.map +0 -1
  290. package/dist/translations/languages/he.js +0 -34
  291. package/dist/translations/languages/he.js.map +0 -1
  292. package/dist/translations/languages/hr.d.ts +0 -31
  293. package/dist/translations/languages/hr.d.ts.map +0 -1
  294. package/dist/translations/languages/hr.js +0 -34
  295. package/dist/translations/languages/hr.js.map +0 -1
  296. package/dist/translations/languages/hu.d.ts +0 -31
  297. package/dist/translations/languages/hu.d.ts.map +0 -1
  298. package/dist/translations/languages/hu.js +0 -34
  299. package/dist/translations/languages/hu.js.map +0 -1
  300. package/dist/translations/languages/hy.d.ts +0 -31
  301. package/dist/translations/languages/hy.d.ts.map +0 -1
  302. package/dist/translations/languages/hy.js +0 -34
  303. package/dist/translations/languages/hy.js.map +0 -1
  304. package/dist/translations/languages/id.d.ts +0 -31
  305. package/dist/translations/languages/id.d.ts.map +0 -1
  306. package/dist/translations/languages/id.js +0 -34
  307. package/dist/translations/languages/id.js.map +0 -1
  308. package/dist/translations/languages/is.d.ts +0 -31
  309. package/dist/translations/languages/is.d.ts.map +0 -1
  310. package/dist/translations/languages/is.js +0 -34
  311. package/dist/translations/languages/is.js.map +0 -1
  312. package/dist/translations/languages/it.d.ts +0 -31
  313. package/dist/translations/languages/it.d.ts.map +0 -1
  314. package/dist/translations/languages/it.js +0 -34
  315. package/dist/translations/languages/it.js.map +0 -1
  316. package/dist/translations/languages/ja.d.ts +0 -31
  317. package/dist/translations/languages/ja.d.ts.map +0 -1
  318. package/dist/translations/languages/ja.js +0 -34
  319. package/dist/translations/languages/ja.js.map +0 -1
  320. package/dist/translations/languages/ko.d.ts +0 -31
  321. package/dist/translations/languages/ko.d.ts.map +0 -1
  322. package/dist/translations/languages/ko.js +0 -34
  323. package/dist/translations/languages/ko.js.map +0 -1
  324. package/dist/translations/languages/lt.d.ts +0 -31
  325. package/dist/translations/languages/lt.d.ts.map +0 -1
  326. package/dist/translations/languages/lt.js +0 -34
  327. package/dist/translations/languages/lt.js.map +0 -1
  328. package/dist/translations/languages/lv.d.ts +0 -31
  329. package/dist/translations/languages/lv.d.ts.map +0 -1
  330. package/dist/translations/languages/lv.js +0 -34
  331. package/dist/translations/languages/lv.js.map +0 -1
  332. package/dist/translations/languages/my.d.ts +0 -31
  333. package/dist/translations/languages/my.d.ts.map +0 -1
  334. package/dist/translations/languages/my.js +0 -34
  335. package/dist/translations/languages/my.js.map +0 -1
  336. package/dist/translations/languages/nb.d.ts +0 -31
  337. package/dist/translations/languages/nb.d.ts.map +0 -1
  338. package/dist/translations/languages/nb.js +0 -34
  339. package/dist/translations/languages/nb.js.map +0 -1
  340. package/dist/translations/languages/nl.d.ts +0 -31
  341. package/dist/translations/languages/nl.d.ts.map +0 -1
  342. package/dist/translations/languages/nl.js +0 -34
  343. package/dist/translations/languages/nl.js.map +0 -1
  344. package/dist/translations/languages/pl.d.ts +0 -31
  345. package/dist/translations/languages/pl.d.ts.map +0 -1
  346. package/dist/translations/languages/pl.js +0 -34
  347. package/dist/translations/languages/pl.js.map +0 -1
  348. package/dist/translations/languages/pt.d.ts +0 -31
  349. package/dist/translations/languages/pt.d.ts.map +0 -1
  350. package/dist/translations/languages/pt.js +0 -34
  351. package/dist/translations/languages/pt.js.map +0 -1
  352. package/dist/translations/languages/ro.d.ts +0 -31
  353. package/dist/translations/languages/ro.d.ts.map +0 -1
  354. package/dist/translations/languages/ro.js +0 -34
  355. package/dist/translations/languages/ro.js.map +0 -1
  356. package/dist/translations/languages/rs.d.ts +0 -31
  357. package/dist/translations/languages/rs.d.ts.map +0 -1
  358. package/dist/translations/languages/rs.js +0 -34
  359. package/dist/translations/languages/rs.js.map +0 -1
  360. package/dist/translations/languages/rsLatin.d.ts +0 -31
  361. package/dist/translations/languages/rsLatin.d.ts.map +0 -1
  362. package/dist/translations/languages/rsLatin.js +0 -34
  363. package/dist/translations/languages/rsLatin.js.map +0 -1
  364. package/dist/translations/languages/ru.d.ts +0 -31
  365. package/dist/translations/languages/ru.d.ts.map +0 -1
  366. package/dist/translations/languages/ru.js +0 -34
  367. package/dist/translations/languages/ru.js.map +0 -1
  368. package/dist/translations/languages/sk.d.ts +0 -31
  369. package/dist/translations/languages/sk.d.ts.map +0 -1
  370. package/dist/translations/languages/sk.js +0 -34
  371. package/dist/translations/languages/sk.js.map +0 -1
  372. package/dist/translations/languages/sl.d.ts +0 -31
  373. package/dist/translations/languages/sl.d.ts.map +0 -1
  374. package/dist/translations/languages/sl.js +0 -34
  375. package/dist/translations/languages/sl.js.map +0 -1
  376. package/dist/translations/languages/sv.d.ts +0 -31
  377. package/dist/translations/languages/sv.d.ts.map +0 -1
  378. package/dist/translations/languages/sv.js +0 -34
  379. package/dist/translations/languages/sv.js.map +0 -1
  380. package/dist/translations/languages/ta.d.ts +0 -31
  381. package/dist/translations/languages/ta.d.ts.map +0 -1
  382. package/dist/translations/languages/ta.js +0 -34
  383. package/dist/translations/languages/ta.js.map +0 -1
  384. package/dist/translations/languages/th.d.ts +0 -31
  385. package/dist/translations/languages/th.d.ts.map +0 -1
  386. package/dist/translations/languages/th.js +0 -34
  387. package/dist/translations/languages/th.js.map +0 -1
  388. package/dist/translations/languages/tr.d.ts +0 -31
  389. package/dist/translations/languages/tr.d.ts.map +0 -1
  390. package/dist/translations/languages/tr.js +0 -34
  391. package/dist/translations/languages/tr.js.map +0 -1
  392. package/dist/translations/languages/uk.d.ts +0 -31
  393. package/dist/translations/languages/uk.d.ts.map +0 -1
  394. package/dist/translations/languages/uk.js +0 -34
  395. package/dist/translations/languages/uk.js.map +0 -1
  396. package/dist/translations/languages/vi.d.ts +0 -31
  397. package/dist/translations/languages/vi.d.ts.map +0 -1
  398. package/dist/translations/languages/vi.js +0 -34
  399. package/dist/translations/languages/vi.js.map +0 -1
  400. package/dist/translations/languages/zh.d.ts +0 -31
  401. package/dist/translations/languages/zh.d.ts.map +0 -1
  402. package/dist/translations/languages/zh.js +0 -34
  403. package/dist/translations/languages/zh.js.map +0 -1
  404. package/dist/translations/languages/zhTw.d.ts +0 -31
  405. package/dist/translations/languages/zhTw.d.ts.map +0 -1
  406. package/dist/translations/languages/zhTw.js +0 -34
  407. package/dist/translations/languages/zhTw.js.map +0 -1
  408. package/dist/translations/types.d.ts +0 -32
  409. package/dist/translations/types.d.ts.map +0 -1
  410. package/dist/translations/types.js +0 -3
  411. package/dist/translations/types.js.map +0 -1
  412. package/dist/utils/localAPIDefaults.d.ts +0 -20
  413. package/dist/utils/localAPIDefaults.d.ts.map +0 -1
  414. package/dist/utils/localAPIDefaults.js +0 -19
  415. package/dist/utils/localAPIDefaults.js.map +0 -1
  416. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  417. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  418. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  419. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  420. package/src/collection/getAccessField.ts +0 -84
  421. package/src/collection/index.ts +0 -105
  422. package/src/components/APIKeyField/index.client.tsx +0 -73
  423. package/src/components/APIKeyField/index.css +0 -105
  424. package/src/components/APIKeysEmptyState/index.client.tsx +0 -36
  425. package/src/components/AccessField/index.client.tsx +0 -299
  426. package/src/components/AccessField/index.css +0 -99
  427. package/src/components/SettingsMenu/index.client.tsx +0 -34
  428. package/src/translations/index.ts +0 -108
  429. package/src/translations/languages/ar.ts +0 -35
  430. package/src/translations/languages/az.ts +0 -35
  431. package/src/translations/languages/bg.ts +0 -35
  432. package/src/translations/languages/bnBd.ts +0 -35
  433. package/src/translations/languages/bnIn.ts +0 -35
  434. package/src/translations/languages/ca.ts +0 -35
  435. package/src/translations/languages/cs.ts +0 -35
  436. package/src/translations/languages/da.ts +0 -35
  437. package/src/translations/languages/de.ts +0 -35
  438. package/src/translations/languages/en.ts +0 -35
  439. package/src/translations/languages/es.ts +0 -35
  440. package/src/translations/languages/et.ts +0 -35
  441. package/src/translations/languages/fa.ts +0 -35
  442. package/src/translations/languages/fr.ts +0 -35
  443. package/src/translations/languages/he.ts +0 -35
  444. package/src/translations/languages/hr.ts +0 -35
  445. package/src/translations/languages/hu.ts +0 -35
  446. package/src/translations/languages/hy.ts +0 -35
  447. package/src/translations/languages/id.ts +0 -35
  448. package/src/translations/languages/is.ts +0 -35
  449. package/src/translations/languages/it.ts +0 -35
  450. package/src/translations/languages/ja.ts +0 -35
  451. package/src/translations/languages/ko.ts +0 -35
  452. package/src/translations/languages/lt.ts +0 -35
  453. package/src/translations/languages/lv.ts +0 -35
  454. package/src/translations/languages/my.ts +0 -35
  455. package/src/translations/languages/nb.ts +0 -35
  456. package/src/translations/languages/nl.ts +0 -35
  457. package/src/translations/languages/pl.ts +0 -35
  458. package/src/translations/languages/pt.ts +0 -35
  459. package/src/translations/languages/ro.ts +0 -35
  460. package/src/translations/languages/rs.ts +0 -35
  461. package/src/translations/languages/rsLatin.ts +0 -35
  462. package/src/translations/languages/ru.ts +0 -35
  463. package/src/translations/languages/sk.ts +0 -35
  464. package/src/translations/languages/sl.ts +0 -35
  465. package/src/translations/languages/sv.ts +0 -35
  466. package/src/translations/languages/ta.ts +0 -35
  467. package/src/translations/languages/th.ts +0 -35
  468. package/src/translations/languages/tr.ts +0 -35
  469. package/src/translations/languages/uk.ts +0 -35
  470. package/src/translations/languages/vi.ts +0 -35
  471. package/src/translations/languages/zh.ts +0 -35
  472. package/src/translations/languages/zhTw.ts +0 -35
  473. package/src/translations/types.ts +0 -34
  474. package/src/utils/localAPIDefaults.ts +0 -22
  475. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
@@ -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
@@ -55,13 +55,13 @@ export const sanitizeMCPConfig = ({
55
55
  items.push(...sanitizeGlobalConfig({ global, pluginConfig }))
56
56
  }
57
57
 
58
- for (const [configKey, { label, mcpName, tool }] of TOOL_BUILTIN_ENTRIES) {
58
+ for (const [configKey, { mcpName, tool }] of TOOL_BUILTIN_ENTRIES) {
59
59
  items.push({
60
60
  type: 'tool',
61
61
  configKey,
62
- label,
62
+ label: tool.annotations?.title ?? configKey,
63
63
  mcpName,
64
- tool,
64
+ tool: { ...tool, access: tool.access ?? defaultAccess },
65
65
  })
66
66
  }
67
67
 
@@ -72,9 +72,9 @@ export const sanitizeMCPConfig = ({
72
72
  items.push({
73
73
  type: 'tool',
74
74
  configKey,
75
- label: configKey,
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,27 +114,46 @@ 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
133
144
  }
134
145
  const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined
146
+ const annotations = { ...tool.annotations, ...override?.annotations }
135
147
  items.push({
136
148
  type: 'collectionTool',
137
149
  collectionSlug: slug,
138
150
  configKey: toolKey,
139
- label: capitalize(toolKey),
151
+ label: annotations.title ?? toolKey,
140
152
  mcpName,
141
153
  tool: {
142
154
  ...tool,
155
+ access: override?.access ?? tool.access ?? defaultAccess,
156
+ annotations,
143
157
  description: override?.description ?? tool.description,
144
158
  overrideResponse:
145
159
  override?.overrideResponse ??
@@ -150,21 +164,24 @@ const sanitizeCollectionConfig = ({
150
164
  }
151
165
 
152
166
  if (collection.auth) {
153
- for (const [authToolKey, { label, mcpName, tool }] of COLLECTION_AUTH_BUILTIN_ENTRIES) {
167
+ for (const [authToolKey, { mcpName, tool }] of COLLECTION_AUTH_BUILTIN_ENTRIES) {
154
168
  const matchedConfigEntry = collectionPluginConfig?.tools?.[authToolKey]
155
169
  if (!matchedConfigEntry) {
156
170
  continue
157
171
  }
158
172
  // `true` means "enable, no override"; only the object form carries fields.
159
173
  const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined
174
+ const annotations = { ...tool.annotations, ...override?.annotations }
160
175
  items.push({
161
176
  type: 'collectionTool',
162
177
  collectionSlug: slug,
163
178
  configKey: authToolKey,
164
- label,
179
+ label: annotations.title ?? authToolKey,
165
180
  mcpName,
166
181
  tool: {
167
182
  ...tool,
183
+ access: override?.access ?? tool.access ?? defaultAccess,
184
+ annotations,
168
185
  description: override?.description ?? tool.description,
169
186
  overrideResponse:
170
187
  override?.overrideResponse ??
@@ -191,9 +208,9 @@ const sanitizeCollectionConfig = ({
191
208
  type: 'collectionTool',
192
209
  collectionSlug: slug,
193
210
  configKey,
194
- label: configKey,
211
+ label: customTool.annotations?.title ?? configKey,
195
212
  mcpName: configKey,
196
- tool: customTool,
213
+ tool: { ...customTool, access: customTool.access ?? defaultAccess },
197
214
  })
198
215
  }
199
216
 
@@ -211,20 +228,26 @@ const sanitizeGlobalConfig = ({
211
228
  const globalPluginConfig = pluginConfig.globals?.[slug]
212
229
  const items: GlobalMCPItem[] = []
213
230
 
214
- 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
+ }
215
235
  const matchedConfigEntry = globalPluginConfig?.tools?.[toolKey]
216
236
  if (matchedConfigEntry === false) {
217
237
  continue
218
238
  }
219
239
  const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined
240
+ const annotations = { ...tool.annotations, ...override?.annotations }
220
241
  items.push({
221
242
  type: 'globalTool',
222
243
  configKey: toolKey,
223
244
  globalSlug: slug,
224
- label: capitalize(toolKey),
245
+ label: annotations.title ?? toolKey,
225
246
  mcpName,
226
247
  tool: {
227
248
  ...tool,
249
+ access: override?.access ?? tool.access ?? defaultAccess,
250
+ annotations,
228
251
  description: override?.description ?? tool.description,
229
252
  overrideResponse:
230
253
  override?.overrideResponse ??
@@ -248,13 +271,11 @@ const sanitizeGlobalConfig = ({
248
271
  type: 'globalTool',
249
272
  configKey,
250
273
  globalSlug: slug,
251
- label: configKey,
274
+ label: customTool.annotations?.title ?? configKey,
252
275
  mcpName: configKey,
253
- tool: customTool,
276
+ tool: { ...customTool, access: customTool.access ?? defaultAccess },
254
277
  })
255
278
  }
256
279
 
257
280
  return items
258
281
  }
259
-
260
- const capitalize = (s: string): string => s.charAt(0).toUpperCase() + s.slice(1)
package/src/stdio.ts CHANGED
@@ -1,98 +1,131 @@
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
- import { findConfig } from 'payload/node'
7
+ import { findConfig, loadEnv } 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)
36
29
  }
37
30
 
31
+ loadEnv()
38
32
  const configPath = findConfig()
39
33
  const configModule = await import(pathToFileURL(configPath).toString())
40
- const config = (await (configModule.default ?? configModule)) as MaybePromise<SanitizedConfig>
41
-
42
- const payload = await getPayload({ config })
34
+ const config = (await (configModule.default ?? configModule)) as SanitizedConfig
43
35
 
44
36
  /**
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.
37
+ * stdout is only for MCP messages. The spec says the server must not write
38
+ * logs there and may write them to stderr instead.
39
+ *
40
+ * The 2.0 client library recovers from stray stdout logs, but that behavior is not
41
+ * guaranteed. Move Payload logs to stderr so Payload does not add invalid data
42
+ * to stdout. Keep options from configurable loggers. Replace pre-built loggers
43
+ * because their output cannot be redirected.
44
+ *
45
+ * @see https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#stdio
49
46
  */
47
+ const loggerConfig: { logger?: Config['logger'] } = config
48
+ if (
49
+ loggerConfig.logger &&
50
+ typeof loggerConfig.logger === 'object' &&
51
+ 'options' in loggerConfig.logger
52
+ ) {
53
+ loggerConfig.logger.destination = process.stderr
54
+ } else {
55
+ loggerConfig.logger = { destination: process.stderr, options: {} }
56
+ }
57
+
58
+ const payload = await getPayload({ config, cron: false, disableOnInit: true })
59
+
50
60
  let pluginConfig: SanitizedMCPPluginConfig
51
61
  try {
52
62
  pluginConfig = getPluginConfig({ config: payload.config })
53
63
  } catch {
64
+ // The command also works when mcpPlugin() is not in the Payload config.
54
65
  pluginConfig = sanitizeMCPConfig({ config: payload.config, pluginConfig: {} })
55
66
 
56
- const fakePluginFn: Plugin = (config) => config
57
- fakePluginFn.slug = '@payloadcms/plugin-mcp'
58
- // @ts-expect-error
59
- fakePluginFn.sanitizedOptions = pluginConfig
67
+ const fallbackPlugin: Plugin = (config) => config
68
+ Object.assign(fallbackPlugin, {
69
+ slug: '@payloadcms/plugin-mcp',
70
+ sanitizedOptions: pluginConfig,
71
+ })
72
+ payload.config.plugins ??= []
73
+ payload.config.plugins.push(fallbackPlugin)
74
+ }
75
+
76
+ const overrideAccessEnv = process.env.PAYLOAD_MCP_OVERRIDE_ACCESS
77
+ let overrideAccess = false
78
+
79
+ if (overrideAccessEnv === 'true') {
80
+ overrideAccess = true
81
+ } else if (overrideAccessEnv && overrideAccessEnv !== 'false') {
82
+ throw new Error('PAYLOAD_MCP_OVERRIDE_ACCESS must be "true" or "false".')
83
+ }
60
84
 
61
- // Push to payload config, to ensure consecutive calls to `getPluginConfig()` work
62
- ;(payload.config.plugins ??= []).push(fakePluginFn)
85
+ if (overrideAccess && process.env.NODE_ENV !== 'development') {
86
+ throw new Error('PAYLOAD_MCP_OVERRIDE_ACCESS is only available in development.')
63
87
  }
64
88
 
65
- const authorizedMCP: AuthorizedMCP = {
66
- items: pluginConfig.items,
67
- overrideAccess: true,
68
- user: null,
89
+ const headers = new Headers()
90
+ if (process.env.PAYLOAD_MCP_AUTHORIZATION) {
91
+ headers.set('Authorization', process.env.PAYLOAD_MCP_AUTHORIZATION)
69
92
  }
70
93
 
71
- const req = await createLocalReq({}, payload)
94
+ const req = await createLocalReq({ req: { headers } }, payload)
72
95
  req.payloadAPI = 'MCP' as const
96
+ const authorizedMCP = await getAuthorizedMCP({ overrideAccess, req })
73
97
 
74
- const server = buildMcpServer({ authorizedMCP, pluginConfig, req })
98
+ const stdioServer = serveStdio(() => buildMcpServer({ authorizedMCP, pluginConfig, req }), {
99
+ onerror: (err) => {
100
+ // MCP messages use stdout, so write SDK errors to stderr.
101
+ console.error('[payload-mcp] error serving MCP over stdio:', err)
102
+ },
103
+ })
75
104
 
76
- const transport = new StdioServerTransport()
77
- await server.connect(transport)
105
+ // Close the MCP server and Payload when the client disconnects or the process stops.
106
+ let isShuttingDown = false
107
+ const shutdown = async () => {
108
+ if (isShuttingDown) {
109
+ return
110
+ }
111
+ isShuttingDown = true
78
112
 
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
113
  try {
83
- await server.close()
114
+ await stdioServer.close()
84
115
  } catch (err) {
85
116
  console.error('[payload-mcp] error closing server:', err)
86
117
  }
118
+
87
119
  try {
88
120
  await payload.destroy()
89
121
  } catch (err) {
90
122
  console.error('[payload-mcp] error destroying payload:', err)
91
123
  }
92
- process.exit(code)
124
+
125
+ process.exit(0)
93
126
  }
94
127
 
95
- process.on('SIGINT', () => void shutdown(0))
96
- process.on('SIGTERM', () => void shutdown(0))
97
- process.stdin.on('close', () => void shutdown(0))
128
+ process.once('SIGINT', () => void shutdown())
129
+ process.once('SIGTERM', () => void shutdown())
130
+ process.stdin.once('close', () => void shutdown())
98
131
  }