@payloadcms/plugin-mcp 4.0.0-canary.3 → 4.0.0-canary.31

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 (493) 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 +5 -5
  30. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  31. package/dist/mcp/buildMcpServer.js +67 -33
  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 +79 -56
  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 +63 -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 +60 -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 +105 -53
  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 +46 -44
  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 +90 -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 +123 -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 +77 -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 +30 -47
  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 +74 -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 +84 -0
  75. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  76. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -1
  77. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +54 -9
  78. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -1
  79. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  80. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  81. package/dist/mcp/builtin/collections/restoreVersionTool.js +69 -0
  82. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  83. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  84. package/dist/mcp/builtin/collections/updateTool.js +68 -86
  85. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  86. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts +2 -0
  87. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts.map +1 -0
  88. package/dist/mcp/builtin/collections/uploadInstructionsTool.js +55 -0
  89. package/dist/mcp/builtin/collections/uploadInstructionsTool.js.map +1 -0
  90. package/dist/mcp/builtin/formatEntityError.d.ts +16 -0
  91. package/dist/mcp/builtin/formatEntityError.d.ts.map +1 -0
  92. package/dist/mcp/builtin/formatEntityError.js +55 -0
  93. package/dist/mcp/builtin/formatEntityError.js.map +1 -0
  94. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -1
  95. package/dist/mcp/builtin/getConfigInfoTool.js +23 -10
  96. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -1
  97. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  98. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  99. package/dist/mcp/builtin/globals/countVersionsTool.js +60 -0
  100. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  101. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  102. package/dist/mcp/builtin/globals/findTool.js +13 -17
  103. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  104. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  105. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  106. package/dist/mcp/builtin/globals/findVersionByIDTool.js +68 -0
  107. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  108. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  109. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  110. package/dist/mcp/builtin/globals/findVersionsTool.js +78 -0
  111. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  112. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -1
  113. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +31 -8
  114. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -1
  115. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  116. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  117. package/dist/mcp/builtin/globals/restoreVersionTool.js +70 -0
  118. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  119. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -1
  120. package/dist/mcp/builtin/globals/updateTool.js +29 -36
  121. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  122. package/dist/mcp/builtinTools.d.ts +73 -2
  123. package/dist/mcp/builtinTools.d.ts.map +1 -1
  124. package/dist/mcp/builtinTools.js +73 -3
  125. package/dist/mcp/builtinTools.js.map +1 -1
  126. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  127. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  128. package/dist/mcp/sanitizeMCPConfig.js +48 -17
  129. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  130. package/dist/stdio.d.ts +3 -3
  131. package/dist/stdio.d.ts.map +1 -1
  132. package/dist/stdio.js +84 -46
  133. package/dist/stdio.js.map +1 -1
  134. package/dist/types.d.ts +95 -89
  135. package/dist/types.d.ts.map +1 -1
  136. package/dist/types.js +2 -4
  137. package/dist/types.js.map +1 -1
  138. package/dist/utils/camelCase.d.ts.map +1 -1
  139. package/dist/utils/getPluginConfig.d.ts +1 -1
  140. package/dist/utils/getPluginConfig.js +1 -1
  141. package/dist/utils/getPluginConfig.js.map +1 -1
  142. package/dist/utils/resolveProjectRoot.d.ts.map +1 -1
  143. package/dist/utils/toStandardSchema.d.ts.map +1 -1
  144. package/package.json +10 -18
  145. package/src/defaultAccess.ts +3 -0
  146. package/src/endpoint/access.ts +79 -112
  147. package/src/endpoint/index.ts +58 -16
  148. package/src/exports/client.ts +2 -4
  149. package/src/exports/internal.ts +1 -0
  150. package/src/index.ts +5 -62
  151. package/src/mcp/buildMcpServer.ts +85 -50
  152. package/src/mcp/builtin/collections/authTools.ts +77 -69
  153. package/src/mcp/builtin/collections/countTool.ts +61 -0
  154. package/src/mcp/builtin/collections/countVersionsTool.ts +60 -0
  155. package/src/mcp/builtin/collections/createTool.ts +112 -76
  156. package/src/mcp/builtin/collections/deleteTool.ts +38 -64
  157. package/src/mcp/builtin/collections/duplicateTool.ts +84 -0
  158. package/src/mcp/builtin/collections/fileInput.spec.ts +93 -0
  159. package/src/mcp/builtin/collections/fileInput.ts +169 -0
  160. package/src/mcp/builtin/collections/findDistinctTool.ts +67 -0
  161. package/src/mcp/builtin/collections/findTool.ts +27 -107
  162. package/src/mcp/builtin/collections/findVersionByIDTool.ts +66 -0
  163. package/src/mcp/builtin/collections/findVersionsTool.ts +83 -0
  164. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +51 -6
  165. package/src/mcp/builtin/collections/restoreVersionTool.ts +65 -0
  166. package/src/mcp/builtin/collections/updateTool.ts +65 -100
  167. package/src/mcp/builtin/collections/uploadInstructionsTool.ts +64 -0
  168. package/src/mcp/builtin/formatEntityError.ts +77 -0
  169. package/src/mcp/builtin/getConfigInfoTool.ts +22 -5
  170. package/src/mcp/builtin/globals/countVersionsTool.ts +60 -0
  171. package/src/mcp/builtin/globals/findTool.ts +15 -51
  172. package/src/mcp/builtin/globals/findVersionByIDTool.ts +64 -0
  173. package/src/mcp/builtin/globals/findVersionsTool.ts +69 -0
  174. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +34 -6
  175. package/src/mcp/builtin/globals/restoreVersionTool.ts +68 -0
  176. package/src/mcp/builtin/globals/updateTool.ts +40 -60
  177. package/src/mcp/builtinTools.ts +72 -6
  178. package/src/mcp/sanitizeMCPConfig.ts +36 -19
  179. package/src/stdio.ts +79 -46
  180. package/src/types.ts +103 -93
  181. package/src/utils/getPluginConfig.ts +1 -1
  182. package/dist/collection/getAccessField.d.ts +0 -12
  183. package/dist/collection/getAccessField.d.ts.map +0 -1
  184. package/dist/collection/getAccessField.js +0 -72
  185. package/dist/collection/getAccessField.js.map +0 -1
  186. package/dist/collection/index.d.ts +0 -6
  187. package/dist/collection/index.d.ts.map +0 -1
  188. package/dist/collection/index.js +0 -105
  189. package/dist/collection/index.js.map +0 -1
  190. package/dist/components/APIKeyField/index.client.d.ts +0 -9
  191. package/dist/components/APIKeyField/index.client.d.ts.map +0 -1
  192. package/dist/components/APIKeyField/index.client.js +0 -85
  193. package/dist/components/APIKeyField/index.client.js.map +0 -1
  194. package/dist/components/APIKeyField/index.css +0 -105
  195. package/dist/components/APIKeysEmptyState/index.client.d.ts +0 -4
  196. package/dist/components/APIKeysEmptyState/index.client.d.ts.map +0 -1
  197. package/dist/components/APIKeysEmptyState/index.client.js +0 -21
  198. package/dist/components/APIKeysEmptyState/index.client.js.map +0 -1
  199. package/dist/components/AccessField/index.client.d.ts +0 -10
  200. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  201. package/dist/components/AccessField/index.client.js +0 -247
  202. package/dist/components/AccessField/index.client.js.map +0 -1
  203. package/dist/components/AccessField/index.css +0 -99
  204. package/dist/components/SettingsMenu/index.client.d.ts +0 -8
  205. package/dist/components/SettingsMenu/index.client.d.ts.map +0 -1
  206. package/dist/components/SettingsMenu/index.client.js +0 -24
  207. package/dist/components/SettingsMenu/index.client.js.map +0 -1
  208. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +0 -9
  209. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +0 -1
  210. package/dist/mcp/builtin/collections/formatCollectionError.js +0 -60
  211. package/dist/mcp/builtin/collections/formatCollectionError.js.map +0 -1
  212. package/dist/mcp/builtin/validateEntityData.d.ts +0 -14
  213. package/dist/mcp/builtin/validateEntityData.d.ts.map +0 -1
  214. package/dist/mcp/builtin/validateEntityData.js +0 -82
  215. package/dist/mcp/builtin/validateEntityData.js.map +0 -1
  216. package/dist/translations/index.d.ts +0 -11
  217. package/dist/translations/index.d.ts.map +0 -1
  218. package/dist/translations/index.js +0 -92
  219. package/dist/translations/index.js.map +0 -1
  220. package/dist/translations/languages/ar.d.ts +0 -31
  221. package/dist/translations/languages/ar.d.ts.map +0 -1
  222. package/dist/translations/languages/ar.js +0 -34
  223. package/dist/translations/languages/ar.js.map +0 -1
  224. package/dist/translations/languages/az.d.ts +0 -31
  225. package/dist/translations/languages/az.d.ts.map +0 -1
  226. package/dist/translations/languages/az.js +0 -34
  227. package/dist/translations/languages/az.js.map +0 -1
  228. package/dist/translations/languages/bg.d.ts +0 -31
  229. package/dist/translations/languages/bg.d.ts.map +0 -1
  230. package/dist/translations/languages/bg.js +0 -34
  231. package/dist/translations/languages/bg.js.map +0 -1
  232. package/dist/translations/languages/bnBd.d.ts +0 -31
  233. package/dist/translations/languages/bnBd.d.ts.map +0 -1
  234. package/dist/translations/languages/bnBd.js +0 -34
  235. package/dist/translations/languages/bnBd.js.map +0 -1
  236. package/dist/translations/languages/bnIn.d.ts +0 -31
  237. package/dist/translations/languages/bnIn.d.ts.map +0 -1
  238. package/dist/translations/languages/bnIn.js +0 -34
  239. package/dist/translations/languages/bnIn.js.map +0 -1
  240. package/dist/translations/languages/ca.d.ts +0 -31
  241. package/dist/translations/languages/ca.d.ts.map +0 -1
  242. package/dist/translations/languages/ca.js +0 -34
  243. package/dist/translations/languages/ca.js.map +0 -1
  244. package/dist/translations/languages/cs.d.ts +0 -31
  245. package/dist/translations/languages/cs.d.ts.map +0 -1
  246. package/dist/translations/languages/cs.js +0 -34
  247. package/dist/translations/languages/cs.js.map +0 -1
  248. package/dist/translations/languages/da.d.ts +0 -31
  249. package/dist/translations/languages/da.d.ts.map +0 -1
  250. package/dist/translations/languages/da.js +0 -34
  251. package/dist/translations/languages/da.js.map +0 -1
  252. package/dist/translations/languages/de.d.ts +0 -31
  253. package/dist/translations/languages/de.d.ts.map +0 -1
  254. package/dist/translations/languages/de.js +0 -34
  255. package/dist/translations/languages/de.js.map +0 -1
  256. package/dist/translations/languages/en.d.ts +0 -31
  257. package/dist/translations/languages/en.d.ts.map +0 -1
  258. package/dist/translations/languages/en.js +0 -34
  259. package/dist/translations/languages/en.js.map +0 -1
  260. package/dist/translations/languages/es.d.ts +0 -31
  261. package/dist/translations/languages/es.d.ts.map +0 -1
  262. package/dist/translations/languages/es.js +0 -34
  263. package/dist/translations/languages/es.js.map +0 -1
  264. package/dist/translations/languages/et.d.ts +0 -31
  265. package/dist/translations/languages/et.d.ts.map +0 -1
  266. package/dist/translations/languages/et.js +0 -34
  267. package/dist/translations/languages/et.js.map +0 -1
  268. package/dist/translations/languages/fa.d.ts +0 -31
  269. package/dist/translations/languages/fa.d.ts.map +0 -1
  270. package/dist/translations/languages/fa.js +0 -34
  271. package/dist/translations/languages/fa.js.map +0 -1
  272. package/dist/translations/languages/fr.d.ts +0 -31
  273. package/dist/translations/languages/fr.d.ts.map +0 -1
  274. package/dist/translations/languages/fr.js +0 -34
  275. package/dist/translations/languages/fr.js.map +0 -1
  276. package/dist/translations/languages/he.d.ts +0 -31
  277. package/dist/translations/languages/he.d.ts.map +0 -1
  278. package/dist/translations/languages/he.js +0 -34
  279. package/dist/translations/languages/he.js.map +0 -1
  280. package/dist/translations/languages/hr.d.ts +0 -31
  281. package/dist/translations/languages/hr.d.ts.map +0 -1
  282. package/dist/translations/languages/hr.js +0 -34
  283. package/dist/translations/languages/hr.js.map +0 -1
  284. package/dist/translations/languages/hu.d.ts +0 -31
  285. package/dist/translations/languages/hu.d.ts.map +0 -1
  286. package/dist/translations/languages/hu.js +0 -34
  287. package/dist/translations/languages/hu.js.map +0 -1
  288. package/dist/translations/languages/hy.d.ts +0 -31
  289. package/dist/translations/languages/hy.d.ts.map +0 -1
  290. package/dist/translations/languages/hy.js +0 -34
  291. package/dist/translations/languages/hy.js.map +0 -1
  292. package/dist/translations/languages/id.d.ts +0 -31
  293. package/dist/translations/languages/id.d.ts.map +0 -1
  294. package/dist/translations/languages/id.js +0 -34
  295. package/dist/translations/languages/id.js.map +0 -1
  296. package/dist/translations/languages/is.d.ts +0 -31
  297. package/dist/translations/languages/is.d.ts.map +0 -1
  298. package/dist/translations/languages/is.js +0 -34
  299. package/dist/translations/languages/is.js.map +0 -1
  300. package/dist/translations/languages/it.d.ts +0 -31
  301. package/dist/translations/languages/it.d.ts.map +0 -1
  302. package/dist/translations/languages/it.js +0 -34
  303. package/dist/translations/languages/it.js.map +0 -1
  304. package/dist/translations/languages/ja.d.ts +0 -31
  305. package/dist/translations/languages/ja.d.ts.map +0 -1
  306. package/dist/translations/languages/ja.js +0 -34
  307. package/dist/translations/languages/ja.js.map +0 -1
  308. package/dist/translations/languages/ko.d.ts +0 -31
  309. package/dist/translations/languages/ko.d.ts.map +0 -1
  310. package/dist/translations/languages/ko.js +0 -34
  311. package/dist/translations/languages/ko.js.map +0 -1
  312. package/dist/translations/languages/lt.d.ts +0 -31
  313. package/dist/translations/languages/lt.d.ts.map +0 -1
  314. package/dist/translations/languages/lt.js +0 -34
  315. package/dist/translations/languages/lt.js.map +0 -1
  316. package/dist/translations/languages/lv.d.ts +0 -31
  317. package/dist/translations/languages/lv.d.ts.map +0 -1
  318. package/dist/translations/languages/lv.js +0 -34
  319. package/dist/translations/languages/lv.js.map +0 -1
  320. package/dist/translations/languages/my.d.ts +0 -31
  321. package/dist/translations/languages/my.d.ts.map +0 -1
  322. package/dist/translations/languages/my.js +0 -34
  323. package/dist/translations/languages/my.js.map +0 -1
  324. package/dist/translations/languages/nb.d.ts +0 -31
  325. package/dist/translations/languages/nb.d.ts.map +0 -1
  326. package/dist/translations/languages/nb.js +0 -34
  327. package/dist/translations/languages/nb.js.map +0 -1
  328. package/dist/translations/languages/nl.d.ts +0 -31
  329. package/dist/translations/languages/nl.d.ts.map +0 -1
  330. package/dist/translations/languages/nl.js +0 -34
  331. package/dist/translations/languages/nl.js.map +0 -1
  332. package/dist/translations/languages/pl.d.ts +0 -31
  333. package/dist/translations/languages/pl.d.ts.map +0 -1
  334. package/dist/translations/languages/pl.js +0 -34
  335. package/dist/translations/languages/pl.js.map +0 -1
  336. package/dist/translations/languages/pt.d.ts +0 -31
  337. package/dist/translations/languages/pt.d.ts.map +0 -1
  338. package/dist/translations/languages/pt.js +0 -34
  339. package/dist/translations/languages/pt.js.map +0 -1
  340. package/dist/translations/languages/ro.d.ts +0 -31
  341. package/dist/translations/languages/ro.d.ts.map +0 -1
  342. package/dist/translations/languages/ro.js +0 -34
  343. package/dist/translations/languages/ro.js.map +0 -1
  344. package/dist/translations/languages/rs.d.ts +0 -31
  345. package/dist/translations/languages/rs.d.ts.map +0 -1
  346. package/dist/translations/languages/rs.js +0 -34
  347. package/dist/translations/languages/rs.js.map +0 -1
  348. package/dist/translations/languages/rsLatin.d.ts +0 -31
  349. package/dist/translations/languages/rsLatin.d.ts.map +0 -1
  350. package/dist/translations/languages/rsLatin.js +0 -34
  351. package/dist/translations/languages/rsLatin.js.map +0 -1
  352. package/dist/translations/languages/ru.d.ts +0 -31
  353. package/dist/translations/languages/ru.d.ts.map +0 -1
  354. package/dist/translations/languages/ru.js +0 -34
  355. package/dist/translations/languages/ru.js.map +0 -1
  356. package/dist/translations/languages/sk.d.ts +0 -31
  357. package/dist/translations/languages/sk.d.ts.map +0 -1
  358. package/dist/translations/languages/sk.js +0 -34
  359. package/dist/translations/languages/sk.js.map +0 -1
  360. package/dist/translations/languages/sl.d.ts +0 -31
  361. package/dist/translations/languages/sl.d.ts.map +0 -1
  362. package/dist/translations/languages/sl.js +0 -34
  363. package/dist/translations/languages/sl.js.map +0 -1
  364. package/dist/translations/languages/sv.d.ts +0 -31
  365. package/dist/translations/languages/sv.d.ts.map +0 -1
  366. package/dist/translations/languages/sv.js +0 -34
  367. package/dist/translations/languages/sv.js.map +0 -1
  368. package/dist/translations/languages/ta.d.ts +0 -31
  369. package/dist/translations/languages/ta.d.ts.map +0 -1
  370. package/dist/translations/languages/ta.js +0 -34
  371. package/dist/translations/languages/ta.js.map +0 -1
  372. package/dist/translations/languages/th.d.ts +0 -31
  373. package/dist/translations/languages/th.d.ts.map +0 -1
  374. package/dist/translations/languages/th.js +0 -34
  375. package/dist/translations/languages/th.js.map +0 -1
  376. package/dist/translations/languages/tr.d.ts +0 -31
  377. package/dist/translations/languages/tr.d.ts.map +0 -1
  378. package/dist/translations/languages/tr.js +0 -34
  379. package/dist/translations/languages/tr.js.map +0 -1
  380. package/dist/translations/languages/uk.d.ts +0 -31
  381. package/dist/translations/languages/uk.d.ts.map +0 -1
  382. package/dist/translations/languages/uk.js +0 -34
  383. package/dist/translations/languages/uk.js.map +0 -1
  384. package/dist/translations/languages/vi.d.ts +0 -31
  385. package/dist/translations/languages/vi.d.ts.map +0 -1
  386. package/dist/translations/languages/vi.js +0 -34
  387. package/dist/translations/languages/vi.js.map +0 -1
  388. package/dist/translations/languages/zh.d.ts +0 -31
  389. package/dist/translations/languages/zh.d.ts.map +0 -1
  390. package/dist/translations/languages/zh.js +0 -34
  391. package/dist/translations/languages/zh.js.map +0 -1
  392. package/dist/translations/languages/zhTw.d.ts +0 -31
  393. package/dist/translations/languages/zhTw.d.ts.map +0 -1
  394. package/dist/translations/languages/zhTw.js +0 -34
  395. package/dist/translations/languages/zhTw.js.map +0 -1
  396. package/dist/translations/types.d.ts +0 -32
  397. package/dist/translations/types.d.ts.map +0 -1
  398. package/dist/translations/types.js +0 -3
  399. package/dist/translations/types.js.map +0 -1
  400. package/dist/utils/getVirtualFieldNames.d.ts +0 -14
  401. package/dist/utils/getVirtualFieldNames.d.ts.map +0 -1
  402. package/dist/utils/getVirtualFieldNames.js +0 -35
  403. package/dist/utils/getVirtualFieldNames.js.map +0 -1
  404. package/dist/utils/localAPIDefaults.d.ts +0 -20
  405. package/dist/utils/localAPIDefaults.d.ts.map +0 -1
  406. package/dist/utils/localAPIDefaults.js +0 -19
  407. package/dist/utils/localAPIDefaults.js.map +0 -1
  408. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +0 -11
  409. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +0 -1
  410. package/dist/utils/schemaConversion/getEntityInputSchema.js +0 -34
  411. package/dist/utils/schemaConversion/getEntityInputSchema.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/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +0 -15
  417. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +0 -1
  418. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +0 -464
  419. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +0 -1
  420. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +0 -158
  421. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +0 -1
  422. package/dist/utils/transformPointDataToPayload.d.ts +0 -7
  423. package/dist/utils/transformPointDataToPayload.d.ts.map +0 -1
  424. package/dist/utils/transformPointDataToPayload.js +0 -28
  425. package/dist/utils/transformPointDataToPayload.js.map +0 -1
  426. package/dist/utils/whereSchema.d.ts +0 -9
  427. package/dist/utils/whereSchema.d.ts.map +0 -1
  428. package/dist/utils/whereSchema.js +0 -13
  429. package/dist/utils/whereSchema.js.map +0 -1
  430. package/src/collection/getAccessField.ts +0 -84
  431. package/src/collection/index.ts +0 -105
  432. package/src/components/APIKeyField/index.client.tsx +0 -68
  433. package/src/components/APIKeyField/index.css +0 -105
  434. package/src/components/APIKeysEmptyState/index.client.tsx +0 -33
  435. package/src/components/AccessField/index.client.tsx +0 -296
  436. package/src/components/AccessField/index.css +0 -99
  437. package/src/components/SettingsMenu/index.client.tsx +0 -30
  438. package/src/mcp/builtin/collections/formatCollectionError.ts +0 -84
  439. package/src/mcp/builtin/validateEntityData.ts +0 -132
  440. package/src/translations/index.ts +0 -105
  441. package/src/translations/languages/ar.ts +0 -38
  442. package/src/translations/languages/az.ts +0 -38
  443. package/src/translations/languages/bg.ts +0 -39
  444. package/src/translations/languages/bnBd.ts +0 -39
  445. package/src/translations/languages/bnIn.ts +0 -39
  446. package/src/translations/languages/ca.ts +0 -39
  447. package/src/translations/languages/cs.ts +0 -39
  448. package/src/translations/languages/da.ts +0 -38
  449. package/src/translations/languages/de.ts +0 -39
  450. package/src/translations/languages/en.ts +0 -39
  451. package/src/translations/languages/es.ts +0 -39
  452. package/src/translations/languages/et.ts +0 -38
  453. package/src/translations/languages/fa.ts +0 -39
  454. package/src/translations/languages/fr.ts +0 -39
  455. package/src/translations/languages/he.ts +0 -37
  456. package/src/translations/languages/hr.ts +0 -39
  457. package/src/translations/languages/hu.ts +0 -39
  458. package/src/translations/languages/hy.ts +0 -39
  459. package/src/translations/languages/id.ts +0 -39
  460. package/src/translations/languages/is.ts +0 -39
  461. package/src/translations/languages/it.ts +0 -39
  462. package/src/translations/languages/ja.ts +0 -39
  463. package/src/translations/languages/ko.ts +0 -39
  464. package/src/translations/languages/lt.ts +0 -39
  465. package/src/translations/languages/lv.ts +0 -38
  466. package/src/translations/languages/my.ts +0 -39
  467. package/src/translations/languages/nb.ts +0 -39
  468. package/src/translations/languages/nl.ts +0 -39
  469. package/src/translations/languages/pl.ts +0 -38
  470. package/src/translations/languages/pt.ts +0 -39
  471. package/src/translations/languages/ro.ts +0 -39
  472. package/src/translations/languages/rs.ts +0 -38
  473. package/src/translations/languages/rsLatin.ts +0 -38
  474. package/src/translations/languages/ru.ts +0 -39
  475. package/src/translations/languages/sk.ts +0 -39
  476. package/src/translations/languages/sl.ts +0 -38
  477. package/src/translations/languages/sv.ts +0 -39
  478. package/src/translations/languages/ta.ts +0 -39
  479. package/src/translations/languages/th.ts +0 -38
  480. package/src/translations/languages/tr.ts +0 -38
  481. package/src/translations/languages/uk.ts +0 -39
  482. package/src/translations/languages/vi.ts +0 -39
  483. package/src/translations/languages/zh.ts +0 -36
  484. package/src/translations/languages/zhTw.ts +0 -36
  485. package/src/translations/types.ts +0 -34
  486. package/src/utils/getVirtualFieldNames.ts +0 -53
  487. package/src/utils/localAPIDefaults.ts +0 -22
  488. package/src/utils/schemaConversion/getEntityInputSchema.ts +0 -78
  489. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
  490. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +0 -103
  491. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +0 -529
  492. package/src/utils/transformPointDataToPayload.ts +0 -40
  493. package/src/utils/whereSchema.ts +0 -24
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/builtinTools.ts"],"sourcesContent":["import type { CollectionTool, GlobalTool, Tool } from '../types.js'\n\nimport {\n authCollectionTool,\n forgotPasswordCollectionTool,\n loginCollectionTool,\n resetPasswordCollectionTool,\n unlockCollectionTool,\n verifyCollectionTool,\n} from './builtin/collections/authTools.js'\nimport { createDocumentTool } from './builtin/collections/createTool.js'\nimport { deleteDocumentsTool } from './builtin/collections/deleteTool.js'\nimport { findDocumentsTool } from './builtin/collections/findTool.js'\nimport { getCollectionSchemaTool } from './builtin/collections/getCollectionSchemaTool.js'\nimport { updateDocumentTool } from './builtin/collections/updateTool.js'\nimport { getConfigInfoTool } from './builtin/getConfigInfoTool.js'\nimport { findGlobalTool } from './builtin/globals/findTool.js'\nimport { getGlobalSchemaTool } from './builtin/globals/getGlobalSchemaTool.js'\nimport { updateGlobalTool } from './builtin/globals/updateTool.js'\n\nexport const TOOL_BUILTINS = {\n getConfigInfo: { mcpName: 'getConfigInfo', tool: getConfigInfoTool },\n} satisfies Record<string, { mcpName: string; tool: Tool }>\n\n/**\n * The static built-in collection CRUD tools. Keys here are the source of truth\n * for `MCPCollectionBuiltinName` — adding/removing an entry updates the type\n * automatically.\n */\nexport const COLLECTION_BUILTINS = {\n create: { mcpName: 'createDocument', tool: createDocumentTool },\n delete: { mcpName: 'deleteDocuments', tool: deleteDocumentsTool },\n find: { mcpName: 'findDocuments', tool: findDocumentsTool },\n getCollectionSchema: { mcpName: 'getCollectionSchema', tool: getCollectionSchemaTool },\n update: { mcpName: 'updateDocument', tool: updateDocumentTool },\n} satisfies Record<string, { mcpName: string; tool: CollectionTool }>\n\n/**\n * The static auth tools surfaced under auth-enabled collections. Keys are the\n * source of truth for `MCPCollectionAuthToolName`.\n */\nexport const COLLECTION_AUTH_BUILTINS = {\n auth: { mcpName: 'auth', tool: authCollectionTool },\n forgotPassword: {\n mcpName: 'forgotPassword',\n tool: forgotPasswordCollectionTool,\n },\n login: { mcpName: 'login', tool: loginCollectionTool },\n resetPassword: {\n mcpName: 'resetPassword',\n tool: resetPasswordCollectionTool,\n },\n unlock: { mcpName: 'unlock', tool: unlockCollectionTool },\n verify: { mcpName: 'verify', tool: verifyCollectionTool },\n} satisfies Record<string, { mcpName: string; tool: CollectionTool }>\n\n/**\n * The static built-in global tools. Keys are the source of truth for\n * `MCPGlobalBuiltinName`.\n */\nexport const GLOBAL_BUILTINS = {\n find: { mcpName: 'findGlobal', tool: findGlobalTool },\n getGlobalSchema: { mcpName: 'getGlobalSchema', tool: getGlobalSchemaTool },\n update: { mcpName: 'updateGlobal', tool: updateGlobalTool },\n} satisfies Record<string, { mcpName: string; tool: GlobalTool }>\n\nexport type MCPCollectionBuiltinName = keyof typeof COLLECTION_BUILTINS\n\nexport type MCPCollectionAuthToolName = keyof typeof COLLECTION_AUTH_BUILTINS\n\nexport type MCPGlobalBuiltinName = keyof typeof GLOBAL_BUILTINS\n\nexport type MCPTopLevelBuiltinName = keyof typeof TOOL_BUILTINS\n\n/**\n * Pre-typed `Object.entries` for each registry. The cast from `string` to the\n * literal key union lives here once so consumers can iterate without their own\n * cast — TypeScript's `Object.entries` always widens keys to `string`, which\n * defeats the narrow type lookups on `MCPCollectionToolsMap`.\n */\nexport const TOOL_BUILTIN_ENTRIES = Object.entries(TOOL_BUILTINS) as Array<\n [MCPTopLevelBuiltinName, (typeof TOOL_BUILTINS)[MCPTopLevelBuiltinName]]\n>\n\nexport const COLLECTION_BUILTIN_ENTRIES = Object.entries(COLLECTION_BUILTINS) as Array<\n [MCPCollectionBuiltinName, (typeof COLLECTION_BUILTINS)[MCPCollectionBuiltinName]]\n>\n\nexport const COLLECTION_AUTH_BUILTIN_ENTRIES = Object.entries(COLLECTION_AUTH_BUILTINS) as Array<\n [MCPCollectionAuthToolName, (typeof COLLECTION_AUTH_BUILTINS)[MCPCollectionAuthToolName]]\n>\n\nexport const GLOBAL_BUILTIN_ENTRIES = Object.entries(GLOBAL_BUILTINS) as Array<\n [MCPGlobalBuiltinName, (typeof GLOBAL_BUILTINS)[MCPGlobalBuiltinName]]\n>\n"],"names":["authCollectionTool","forgotPasswordCollectionTool","loginCollectionTool","resetPasswordCollectionTool","unlockCollectionTool","verifyCollectionTool","createDocumentTool","deleteDocumentsTool","findDocumentsTool","getCollectionSchemaTool","updateDocumentTool","getConfigInfoTool","findGlobalTool","getGlobalSchemaTool","updateGlobalTool","TOOL_BUILTINS","getConfigInfo","mcpName","tool","COLLECTION_BUILTINS","create","delete","find","getCollectionSchema","update","COLLECTION_AUTH_BUILTINS","auth","forgotPassword","login","resetPassword","unlock","verify","GLOBAL_BUILTINS","getGlobalSchema","TOOL_BUILTIN_ENTRIES","Object","entries","COLLECTION_BUILTIN_ENTRIES","COLLECTION_AUTH_BUILTIN_ENTRIES","GLOBAL_BUILTIN_ENTRIES"],"mappings":"AAEA,SACEA,kBAAkB,EAClBC,4BAA4B,EAC5BC,mBAAmB,EACnBC,2BAA2B,EAC3BC,oBAAoB,EACpBC,oBAAoB,QACf,qCAAoC;AAC3C,SAASC,kBAAkB,QAAQ,sCAAqC;AACxE,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,iBAAiB,QAAQ,oCAAmC;AACrE,SAASC,uBAAuB,QAAQ,mDAAkD;AAC1F,SAASC,kBAAkB,QAAQ,sCAAqC;AACxE,SAASC,iBAAiB,QAAQ,iCAAgC;AAClE,SAASC,cAAc,QAAQ,gCAA+B;AAC9D,SAASC,mBAAmB,QAAQ,2CAA0C;AAC9E,SAASC,gBAAgB,QAAQ,kCAAiC;AAElE,OAAO,MAAMC,gBAAgB;IAC3BC,eAAe;QAAEC,SAAS;QAAiBC,MAAMP;IAAkB;AACrE,EAA2D;AAE3D;;;;CAIC,GACD,OAAO,MAAMQ,sBAAsB;IACjCC,QAAQ;QAAEH,SAAS;QAAkBC,MAAMZ;IAAmB;IAC9De,QAAQ;QAAEJ,SAAS;QAAmBC,MAAMX;IAAoB;IAChEe,MAAM;QAAEL,SAAS;QAAiBC,MAAMV;IAAkB;IAC1De,qBAAqB;QAAEN,SAAS;QAAuBC,MAAMT;IAAwB;IACrFe,QAAQ;QAAEP,SAAS;QAAkBC,MAAMR;IAAmB;AAChE,EAAqE;AAErE;;;CAGC,GACD,OAAO,MAAMe,2BAA2B;IACtCC,MAAM;QAAET,SAAS;QAAQC,MAAMlB;IAAmB;IAClD2B,gBAAgB;QACdV,SAAS;QACTC,MAAMjB;IACR;IACA2B,OAAO;QAAEX,SAAS;QAASC,MAAMhB;IAAoB;IACrD2B,eAAe;QACbZ,SAAS;QACTC,MAAMf;IACR;IACA2B,QAAQ;QAAEb,SAAS;QAAUC,MAAMd;IAAqB;IACxD2B,QAAQ;QAAEd,SAAS;QAAUC,MAAMb;IAAqB;AAC1D,EAAqE;AAErE;;;CAGC,GACD,OAAO,MAAM2B,kBAAkB;IAC7BV,MAAM;QAAEL,SAAS;QAAcC,MAAMN;IAAe;IACpDqB,iBAAiB;QAAEhB,SAAS;QAAmBC,MAAML;IAAoB;IACzEW,QAAQ;QAAEP,SAAS;QAAgBC,MAAMJ;IAAiB;AAC5D,EAAiE;AAUjE;;;;;CAKC,GACD,OAAO,MAAMoB,uBAAuBC,OAAOC,OAAO,CAACrB,eAElD;AAED,OAAO,MAAMsB,6BAA6BF,OAAOC,OAAO,CAACjB,qBAExD;AAED,OAAO,MAAMmB,kCAAkCH,OAAOC,OAAO,CAACX,0BAE7D;AAED,OAAO,MAAMc,yBAAyBJ,OAAOC,OAAO,CAACJ,iBAEpD"}
1
+ {"version":3,"sources":["../../src/mcp/builtinTools.ts"],"sourcesContent":["import type { CollectionTool, GlobalTool, Tool } from '../types.js'\n\nimport {\n authCollectionTool,\n forgotPasswordCollectionTool,\n loginCollectionTool,\n resetPasswordCollectionTool,\n unlockCollectionTool,\n verifyCollectionTool,\n} from './builtin/collections/authTools.js'\nimport { countDocumentsTool } from './builtin/collections/countTool.js'\nimport { countVersionsTool } from './builtin/collections/countVersionsTool.js'\nimport { createDocumentsTool } from './builtin/collections/createTool.js'\nimport { deleteDocumentsTool } from './builtin/collections/deleteTool.js'\nimport { duplicateDocumentTool } from './builtin/collections/duplicateTool.js'\nimport { findDistinctTool } from './builtin/collections/findDistinctTool.js'\nimport { findDocumentsTool } from './builtin/collections/findTool.js'\nimport { findVersionByIDTool } from './builtin/collections/findVersionByIDTool.js'\nimport { findVersionsTool } from './builtin/collections/findVersionsTool.js'\nimport { getCollectionSchemaTool } from './builtin/collections/getCollectionSchemaTool.js'\nimport { restoreVersionTool } from './builtin/collections/restoreVersionTool.js'\nimport { updateDocumentTool } from './builtin/collections/updateTool.js'\nimport { getUploadInstructionsTool } from './builtin/collections/uploadInstructionsTool.js'\nimport { getConfigInfoTool } from './builtin/getConfigInfoTool.js'\nimport { countGlobalVersionsTool } from './builtin/globals/countVersionsTool.js'\nimport { findGlobalTool } from './builtin/globals/findTool.js'\nimport { findGlobalVersionByIDTool } from './builtin/globals/findVersionByIDTool.js'\nimport { findGlobalVersionsTool } from './builtin/globals/findVersionsTool.js'\nimport { getGlobalSchemaTool } from './builtin/globals/getGlobalSchemaTool.js'\nimport { restoreGlobalVersionTool } from './builtin/globals/restoreVersionTool.js'\nimport { updateGlobalTool } from './builtin/globals/updateTool.js'\n\ntype CollectionBuiltin = {\n mcpName: string\n requiresDuplicateEnabled?: boolean\n requiresUpload?: boolean\n requiresVersions?: boolean\n tool: CollectionTool\n}\n\ntype GlobalBuiltin = {\n mcpName: string\n requiresVersions?: boolean\n tool: GlobalTool\n}\n\nexport const TOOL_BUILTINS = {\n getConfigInfo: { mcpName: 'getConfigInfo', tool: getConfigInfoTool },\n} satisfies Record<string, { mcpName: string; tool: Tool }>\n\n/**\n * The static built-in collection CRUD tools. Keys here are the source of truth\n * for `MCPCollectionBuiltinName` — adding/removing an entry updates the type\n * automatically.\n */\nexport const COLLECTION_BUILTINS = {\n count: { mcpName: 'countDocuments', tool: countDocumentsTool },\n countVersions: { mcpName: 'countVersions', requiresVersions: true, tool: countVersionsTool },\n create: { mcpName: 'createDocuments', tool: createDocumentsTool },\n delete: { mcpName: 'deleteDocuments', tool: deleteDocumentsTool },\n duplicate: {\n mcpName: 'duplicateDocument',\n requiresDuplicateEnabled: true,\n tool: duplicateDocumentTool,\n },\n find: { mcpName: 'findDocuments', tool: findDocumentsTool },\n findDistinct: { mcpName: 'findDistinct', tool: findDistinctTool },\n findVersionByID: {\n mcpName: 'findVersionByID',\n requiresVersions: true,\n tool: findVersionByIDTool,\n },\n findVersions: { mcpName: 'findVersions', requiresVersions: true, tool: findVersionsTool },\n getCollectionSchema: { mcpName: 'getCollectionSchema', tool: getCollectionSchemaTool },\n getUploadInstructions: {\n mcpName: 'getUploadInstructions',\n requiresUpload: true,\n tool: getUploadInstructionsTool,\n },\n restoreVersion: { mcpName: 'restoreVersion', requiresVersions: true, tool: restoreVersionTool },\n update: { mcpName: 'updateDocument', tool: updateDocumentTool },\n} satisfies Record<string, CollectionBuiltin>\n\n/**\n * The static auth tools surfaced under auth-enabled collections. Keys are the\n * source of truth for `MCPCollectionAuthToolName`.\n */\nexport const COLLECTION_AUTH_BUILTINS = {\n auth: { mcpName: 'auth', tool: authCollectionTool },\n forgotPassword: {\n mcpName: 'forgotPassword',\n tool: forgotPasswordCollectionTool,\n },\n login: { mcpName: 'login', tool: loginCollectionTool },\n resetPassword: {\n mcpName: 'resetPassword',\n tool: resetPasswordCollectionTool,\n },\n unlock: { mcpName: 'unlock', tool: unlockCollectionTool },\n verify: { mcpName: 'verify', tool: verifyCollectionTool },\n} satisfies Record<string, { mcpName: string; tool: CollectionTool }>\n\n/**\n * The static built-in global tools. Keys are the source of truth for\n * `MCPGlobalBuiltinName`.\n */\nexport const GLOBAL_BUILTINS = {\n countGlobalVersions: {\n mcpName: 'countGlobalVersions',\n requiresVersions: true,\n tool: countGlobalVersionsTool,\n },\n find: { mcpName: 'findGlobal', tool: findGlobalTool },\n findGlobalVersionByID: {\n mcpName: 'findGlobalVersionByID',\n requiresVersions: true,\n tool: findGlobalVersionByIDTool,\n },\n findGlobalVersions: {\n mcpName: 'findGlobalVersions',\n requiresVersions: true,\n tool: findGlobalVersionsTool,\n },\n getGlobalSchema: { mcpName: 'getGlobalSchema', tool: getGlobalSchemaTool },\n restoreGlobalVersion: {\n mcpName: 'restoreGlobalVersion',\n requiresVersions: true,\n tool: restoreGlobalVersionTool,\n },\n update: { mcpName: 'updateGlobal', tool: updateGlobalTool },\n} satisfies Record<string, GlobalBuiltin>\n\nexport type MCPCollectionBuiltinName = keyof typeof COLLECTION_BUILTINS\n\nexport type MCPCollectionAuthToolName = keyof typeof COLLECTION_AUTH_BUILTINS\n\nexport type MCPGlobalBuiltinName = keyof typeof GLOBAL_BUILTINS\n\nexport type MCPTopLevelBuiltinName = keyof typeof TOOL_BUILTINS\n\n/**\n * Pre-typed `Object.entries` for each registry. The cast from `string` to the\n * literal key union lives here once so consumers can iterate without their own\n * cast — TypeScript's `Object.entries` always widens keys to `string`, which\n * defeats the narrow type lookups on `MCPCollectionToolsMap`.\n */\nexport const TOOL_BUILTIN_ENTRIES = Object.entries(TOOL_BUILTINS) as Array<\n [MCPTopLevelBuiltinName, (typeof TOOL_BUILTINS)[MCPTopLevelBuiltinName]]\n>\n\nexport const COLLECTION_BUILTIN_ENTRIES = Object.entries(COLLECTION_BUILTINS) as Array<\n [MCPCollectionBuiltinName, CollectionBuiltin]\n>\n\nexport const COLLECTION_AUTH_BUILTIN_ENTRIES = Object.entries(COLLECTION_AUTH_BUILTINS) as Array<\n [MCPCollectionAuthToolName, (typeof COLLECTION_AUTH_BUILTINS)[MCPCollectionAuthToolName]]\n>\n\nexport const GLOBAL_BUILTIN_ENTRIES = Object.entries(GLOBAL_BUILTINS) as Array<\n [MCPGlobalBuiltinName, GlobalBuiltin]\n>\n"],"names":["authCollectionTool","forgotPasswordCollectionTool","loginCollectionTool","resetPasswordCollectionTool","unlockCollectionTool","verifyCollectionTool","countDocumentsTool","countVersionsTool","createDocumentsTool","deleteDocumentsTool","duplicateDocumentTool","findDistinctTool","findDocumentsTool","findVersionByIDTool","findVersionsTool","getCollectionSchemaTool","restoreVersionTool","updateDocumentTool","getUploadInstructionsTool","getConfigInfoTool","countGlobalVersionsTool","findGlobalTool","findGlobalVersionByIDTool","findGlobalVersionsTool","getGlobalSchemaTool","restoreGlobalVersionTool","updateGlobalTool","TOOL_BUILTINS","getConfigInfo","mcpName","tool","COLLECTION_BUILTINS","count","countVersions","requiresVersions","create","delete","duplicate","requiresDuplicateEnabled","find","findDistinct","findVersionByID","findVersions","getCollectionSchema","getUploadInstructions","requiresUpload","restoreVersion","update","COLLECTION_AUTH_BUILTINS","auth","forgotPassword","login","resetPassword","unlock","verify","GLOBAL_BUILTINS","countGlobalVersions","findGlobalVersionByID","findGlobalVersions","getGlobalSchema","restoreGlobalVersion","TOOL_BUILTIN_ENTRIES","Object","entries","COLLECTION_BUILTIN_ENTRIES","COLLECTION_AUTH_BUILTIN_ENTRIES","GLOBAL_BUILTIN_ENTRIES"],"mappings":"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"}
@@ -5,7 +5,6 @@ import type { MCPPluginConfig, SanitizedMCPPluginConfig } from '../types.js';
5
5
  * - Flattens `tools` / `prompts` / `resources` / per-collection / per-global
6
6
  * tool maps into a single `items` array.
7
7
  * - Applies built-in tools for collections and globals, respecting opt-out user overrides.
8
- * - Applies the `userCollection` default
9
8
  *
10
9
  * Called once during plugin init. After that, `plugins['@payloadcms/plugin-mcp']
11
10
  * ?.options` holds the sanitized result
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizeMCPConfig.d.ts","sourceRoot":"","sources":["../../src/mcp/sanitizeMCPConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,MAAM,EAGN,eAAe,EAEhB,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAMV,eAAe,EACf,wBAAwB,EACzB,MAAM,aAAa,CAAA;AAapB;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAAI,2BAG/B;IACD,MAAM,EAAE,MAAM,GAAG,eAAe,CAAA;IAChC,YAAY,EAAE,eAAe,CAAA;CAC9B,KAAG,wBAkEH,CAAA"}
1
+ {"version":3,"file":"sanitizeMCPConfig.d.ts","sourceRoot":"","sources":["../../src/mcp/sanitizeMCPConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,MAAM,EAGN,eAAe,EAEhB,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAMV,eAAe,EACf,wBAAwB,EACzB,MAAM,aAAa,CAAA;AAcpB;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,8BAG3B;IACD,MAAM,EAAE,MAAM,GAAG,eAAe,CAAA;IAChC,YAAY,EAAE,eAAe,CAAA;CAC9B,KAAG,wBA6DH,CAAA"}
@@ -1,10 +1,10 @@
1
+ import { defaultAccess } from '../defaultAccess.js';
1
2
  import { COLLECTION_AUTH_BUILTIN_ENTRIES, COLLECTION_AUTH_BUILTINS, COLLECTION_BUILTIN_ENTRIES, COLLECTION_BUILTINS, GLOBAL_BUILTIN_ENTRIES, GLOBAL_BUILTINS, TOOL_BUILTIN_ENTRIES, TOOL_BUILTINS } from './builtinTools.js';
2
3
  /**
3
4
  * Converts the user-configured `MCPPluginConfig` into a `SanitizedMCPPluginConfig`:
4
5
  * - Flattens `tools` / `prompts` / `resources` / per-collection / per-global
5
6
  * tool maps into a single `items` array.
6
7
  * - Applies built-in tools for collections and globals, respecting opt-out user overrides.
7
- * - Applies the `userCollection` default
8
8
  *
9
9
  * Called once during plugin init. After that, `plugins['@payloadcms/plugin-mcp']
10
10
  * ?.options` holds the sanitized result
@@ -28,7 +28,10 @@ import { COLLECTION_AUTH_BUILTIN_ENTRIES, COLLECTION_AUTH_BUILTINS, COLLECTION_B
28
28
  configKey,
29
29
  label: tool.annotations?.title ?? configKey,
30
30
  mcpName,
31
- tool
31
+ tool: {
32
+ ...tool,
33
+ access: tool.access ?? defaultAccess
34
+ }
32
35
  });
33
36
  }
34
37
  for (const [configKey, tool] of Object.entries(pluginConfig.tools ?? {})){
@@ -40,7 +43,10 @@ import { COLLECTION_AUTH_BUILTIN_ENTRIES, COLLECTION_AUTH_BUILTINS, COLLECTION_B
40
43
  configKey,
41
44
  label: tool.annotations?.title ?? configKey,
42
45
  mcpName: configKey,
43
- tool
46
+ tool: {
47
+ ...tool,
48
+ access: tool.access ?? defaultAccess
49
+ }
44
50
  });
45
51
  }
46
52
  for (const [configKey, prompt] of Object.entries(pluginConfig.prompts ?? {})){
@@ -49,7 +55,10 @@ import { COLLECTION_AUTH_BUILTIN_ENTRIES, COLLECTION_AUTH_BUILTINS, COLLECTION_B
49
55
  configKey,
50
56
  label: prompt.title ?? configKey,
51
57
  mcpName: configKey,
52
- prompt
58
+ prompt: {
59
+ ...prompt,
60
+ access: prompt.access ?? defaultAccess
61
+ }
53
62
  });
54
63
  }
55
64
  for (const [configKey, resource] of Object.entries(pluginConfig.resources ?? {})){
@@ -58,28 +67,38 @@ import { COLLECTION_AUTH_BUILTIN_ENTRIES, COLLECTION_AUTH_BUILTINS, COLLECTION_B
58
67
  configKey,
59
68
  label: resource.title ?? configKey,
60
69
  mcpName: configKey,
61
- resource
70
+ resource: {
71
+ ...resource,
72
+ access: resource.access ?? defaultAccess
73
+ }
62
74
  });
63
75
  }
64
- // Mirror Payload's own admin.user detection (sanitize.ts) since plugins run first.
65
- const firstCollectionWithAuth = config.collections.find(({ auth })=>Boolean(auth));
66
76
  return {
67
77
  disabled: pluginConfig.disabled,
78
+ hooks: pluginConfig.hooks,
68
79
  items,
69
80
  mcp: pluginConfig.mcp,
70
- overrideApiKeyCollection: pluginConfig.overrideApiKeyCollection,
71
- overrideAuth: pluginConfig.overrideAuth,
72
- userCollection: pluginConfig.userCollection ?? config.admin?.user ?? firstCollectionWithAuth?.slug ?? 'users'
81
+ overrideGetAuthorizedMCP: pluginConfig.overrideGetAuthorizedMCP
73
82
  };
74
83
  };
75
84
  const sanitizeCollectionConfig = ({ collection, pluginConfig })=>{
76
- if (collection.slug === 'payload-mcp-api-keys') {
77
- return [];
78
- }
79
85
  const slug = collection.slug;
80
86
  const collectionPluginConfig = pluginConfig.collections?.[slug];
81
87
  const items = [];
82
- for (const [toolKey, { mcpName, tool }] of COLLECTION_BUILTIN_ENTRIES){
88
+ /**
89
+ * Payload disables duplicate for auth collections by default unless the
90
+ * collection explicitly opts back in with `disableDuplicate: false`.
91
+ */ const isDuplicateDisabled = collection.disableDuplicate === true || Boolean(collection.auth) && collection.disableDuplicate !== false;
92
+ for (const [toolKey, { mcpName, requiresDuplicateEnabled, requiresUpload, requiresVersions, tool }] of COLLECTION_BUILTIN_ENTRIES){
93
+ if (requiresVersions && !collection.versions) {
94
+ continue;
95
+ }
96
+ if (requiresDuplicateEnabled && isDuplicateDisabled) {
97
+ continue;
98
+ }
99
+ if (requiresUpload && !collection.upload) {
100
+ continue;
101
+ }
83
102
  const matchedConfigEntry = collectionPluginConfig?.tools?.[toolKey];
84
103
  if (matchedConfigEntry === false) {
85
104
  continue;
@@ -97,6 +116,7 @@ const sanitizeCollectionConfig = ({ collection, pluginConfig })=>{
97
116
  mcpName,
98
117
  tool: {
99
118
  ...tool,
119
+ access: override?.access ?? tool.access ?? defaultAccess,
100
120
  annotations,
101
121
  description: override?.description ?? tool.description,
102
122
  overrideResponse: override?.overrideResponse ?? collectionPluginConfig?.overrideResponse ?? tool.overrideResponse
@@ -123,6 +143,7 @@ const sanitizeCollectionConfig = ({ collection, pluginConfig })=>{
123
143
  mcpName,
124
144
  tool: {
125
145
  ...tool,
146
+ access: override?.access ?? tool.access ?? defaultAccess,
126
147
  annotations,
127
148
  description: override?.description ?? tool.description,
128
149
  overrideResponse: override?.overrideResponse ?? collectionPluginConfig?.overrideResponse ?? tool.overrideResponse
@@ -146,7 +167,10 @@ const sanitizeCollectionConfig = ({ collection, pluginConfig })=>{
146
167
  configKey,
147
168
  label: customTool.annotations?.title ?? configKey,
148
169
  mcpName: configKey,
149
- tool: customTool
170
+ tool: {
171
+ ...customTool,
172
+ access: customTool.access ?? defaultAccess
173
+ }
150
174
  });
151
175
  }
152
176
  return items;
@@ -155,7 +179,10 @@ const sanitizeGlobalConfig = ({ global, pluginConfig })=>{
155
179
  const slug = global.slug;
156
180
  const globalPluginConfig = pluginConfig.globals?.[slug];
157
181
  const items = [];
158
- for (const [toolKey, { mcpName, tool }] of GLOBAL_BUILTIN_ENTRIES){
182
+ for (const [toolKey, { mcpName, requiresVersions, tool }] of GLOBAL_BUILTIN_ENTRIES){
183
+ if (requiresVersions && !global.versions) {
184
+ continue;
185
+ }
159
186
  const matchedConfigEntry = globalPluginConfig?.tools?.[toolKey];
160
187
  if (matchedConfigEntry === false) {
161
188
  continue;
@@ -173,6 +200,7 @@ const sanitizeGlobalConfig = ({ global, pluginConfig })=>{
173
200
  mcpName,
174
201
  tool: {
175
202
  ...tool,
203
+ access: override?.access ?? tool.access ?? defaultAccess,
176
204
  annotations,
177
205
  description: override?.description ?? tool.description,
178
206
  overrideResponse: override?.overrideResponse ?? globalPluginConfig?.overrideResponse ?? tool.overrideResponse
@@ -193,7 +221,10 @@ const sanitizeGlobalConfig = ({ global, pluginConfig })=>{
193
221
  globalSlug: slug,
194
222
  label: customTool.annotations?.title ?? configKey,
195
223
  mcpName: configKey,
196
- tool: customTool
224
+ tool: {
225
+ ...customTool,
226
+ access: customTool.access ?? defaultAccess
227
+ }
197
228
  });
198
229
  }
199
230
  return items;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/sanitizeMCPConfig.ts"],"sourcesContent":["import type {\n CollectionConfig,\n Config,\n GlobalConfig,\n SanitizedCollectionConfig,\n SanitizedConfig,\n SanitizedGlobalConfig,\n} from 'payload'\n\nimport type {\n CollectionMCPItem,\n CollectionTool,\n GlobalMCPItem,\n GlobalTool,\n MCPItem,\n MCPPluginConfig,\n SanitizedMCPPluginConfig,\n} from '../types.js'\n\nimport {\n COLLECTION_AUTH_BUILTIN_ENTRIES,\n COLLECTION_AUTH_BUILTINS,\n COLLECTION_BUILTIN_ENTRIES,\n COLLECTION_BUILTINS,\n GLOBAL_BUILTIN_ENTRIES,\n GLOBAL_BUILTINS,\n TOOL_BUILTIN_ENTRIES,\n TOOL_BUILTINS,\n} from './builtinTools.js'\n\n/**\n * Converts the user-configured `MCPPluginConfig` into a `SanitizedMCPPluginConfig`:\n * - Flattens `tools` / `prompts` / `resources` / per-collection / per-global\n * tool maps into a single `items` array.\n * - Applies built-in tools for collections and globals, respecting opt-out user overrides.\n * - Applies the `userCollection` default\n *\n * Called once during plugin init. After that, `plugins['@payloadcms/plugin-mcp']\n * ?.options` holds the sanitized result\n */\nexport const sanitizeMCPConfig = ({\n config,\n pluginConfig,\n}: {\n config: Config | SanitizedConfig\n pluginConfig: MCPPluginConfig\n}): SanitizedMCPPluginConfig => {\n const items: MCPItem[] = []\n\n for (const collection of config.collections ?? []) {\n items.push(...sanitizeCollectionConfig({ collection, pluginConfig }))\n }\n\n for (const global of config.globals ?? []) {\n items.push(...sanitizeGlobalConfig({ global, pluginConfig }))\n }\n\n for (const [configKey, { mcpName, tool }] of TOOL_BUILTIN_ENTRIES) {\n items.push({\n type: 'tool',\n configKey,\n label: tool.annotations?.title ?? configKey,\n mcpName,\n tool,\n })\n }\n\n for (const [configKey, tool] of Object.entries(pluginConfig.tools ?? {})) {\n if (configKey in TOOL_BUILTINS) {\n continue\n }\n items.push({\n type: 'tool',\n configKey,\n label: tool.annotations?.title ?? configKey,\n mcpName: configKey,\n tool,\n })\n }\n\n for (const [configKey, prompt] of Object.entries(pluginConfig.prompts ?? {})) {\n items.push({\n type: 'prompt',\n configKey,\n label: prompt.title ?? configKey,\n mcpName: configKey,\n prompt,\n })\n }\n\n for (const [configKey, resource] of Object.entries(pluginConfig.resources ?? {})) {\n items.push({\n type: 'resource',\n configKey,\n label: resource.title ?? configKey,\n mcpName: configKey,\n resource,\n })\n }\n\n // Mirror Payload's own admin.user detection (sanitize.ts) since plugins run first.\n const firstCollectionWithAuth = config.collections!.find(({ auth }) => Boolean(auth))\n\n return {\n disabled: pluginConfig.disabled,\n items,\n mcp: pluginConfig.mcp,\n overrideApiKeyCollection: pluginConfig.overrideApiKeyCollection,\n overrideAuth: pluginConfig.overrideAuth,\n userCollection:\n pluginConfig.userCollection ?? config.admin?.user ?? firstCollectionWithAuth?.slug ?? 'users',\n }\n}\n\nconst sanitizeCollectionConfig = ({\n collection,\n pluginConfig,\n}: {\n collection: CollectionConfig | SanitizedCollectionConfig\n pluginConfig: MCPPluginConfig\n}): CollectionMCPItem[] => {\n if (collection.slug === 'payload-mcp-api-keys') {\n return []\n }\n const slug = collection.slug\n const collectionPluginConfig = pluginConfig.collections?.[slug]\n const items: CollectionMCPItem[] = []\n\n for (const [toolKey, { mcpName, tool }] of COLLECTION_BUILTIN_ENTRIES) {\n const matchedConfigEntry = collectionPluginConfig?.tools?.[toolKey]\n if (matchedConfigEntry === false) {\n continue\n }\n const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined\n const annotations = { ...tool.annotations, ...override?.annotations }\n items.push({\n type: 'collectionTool',\n collectionSlug: slug,\n configKey: toolKey,\n label: annotations.title ?? toolKey,\n mcpName,\n tool: {\n ...tool,\n annotations,\n description: override?.description ?? tool.description,\n overrideResponse:\n override?.overrideResponse ??\n collectionPluginConfig?.overrideResponse ??\n tool.overrideResponse,\n },\n })\n }\n\n if (collection.auth) {\n for (const [authToolKey, { mcpName, tool }] of COLLECTION_AUTH_BUILTIN_ENTRIES) {\n const matchedConfigEntry = collectionPluginConfig?.tools?.[authToolKey]\n if (!matchedConfigEntry) {\n continue\n }\n // `true` means \"enable, no override\"; only the object form carries fields.\n const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined\n const annotations = { ...tool.annotations, ...override?.annotations }\n items.push({\n type: 'collectionTool',\n collectionSlug: slug,\n configKey: authToolKey,\n label: annotations.title ?? authToolKey,\n mcpName,\n tool: {\n ...tool,\n annotations,\n description: override?.description ?? tool.description,\n overrideResponse:\n override?.overrideResponse ??\n collectionPluginConfig?.overrideResponse ??\n tool.overrideResponse,\n },\n })\n }\n }\n\n // Cast: builtin keys are filtered out below, so the remaining values are\n // always custom tools (`CollectionTool`) or undefined\n const customEntries = Object.entries(collectionPluginConfig?.tools ?? {}) as Array<\n [string, CollectionTool | undefined]\n >\n for (const [configKey, customTool] of customEntries) {\n if (configKey in COLLECTION_BUILTINS || configKey in COLLECTION_AUTH_BUILTINS) {\n continue\n }\n if (!customTool) {\n continue\n }\n items.push({\n type: 'collectionTool',\n collectionSlug: slug,\n configKey,\n label: customTool.annotations?.title ?? configKey,\n mcpName: configKey,\n tool: customTool,\n })\n }\n\n return items\n}\n\nconst sanitizeGlobalConfig = ({\n global,\n pluginConfig,\n}: {\n global: GlobalConfig | SanitizedGlobalConfig\n pluginConfig: MCPPluginConfig\n}): GlobalMCPItem[] => {\n const slug = global.slug\n const globalPluginConfig = pluginConfig.globals?.[slug]\n const items: GlobalMCPItem[] = []\n\n for (const [toolKey, { mcpName, tool }] of GLOBAL_BUILTIN_ENTRIES) {\n const matchedConfigEntry = globalPluginConfig?.tools?.[toolKey]\n if (matchedConfigEntry === false) {\n continue\n }\n const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined\n const annotations = { ...tool.annotations, ...override?.annotations }\n items.push({\n type: 'globalTool',\n configKey: toolKey,\n globalSlug: slug,\n label: annotations.title ?? toolKey,\n mcpName,\n tool: {\n ...tool,\n annotations,\n description: override?.description ?? tool.description,\n overrideResponse:\n override?.overrideResponse ??\n globalPluginConfig?.overrideResponse ??\n tool.overrideResponse,\n },\n })\n }\n\n const customEntries = Object.entries(globalPluginConfig?.tools ?? {}) as Array<\n [string, GlobalTool | undefined]\n >\n for (const [configKey, customTool] of customEntries) {\n if (configKey in GLOBAL_BUILTINS) {\n continue\n }\n if (!customTool) {\n continue\n }\n items.push({\n type: 'globalTool',\n configKey,\n globalSlug: slug,\n label: customTool.annotations?.title ?? configKey,\n mcpName: configKey,\n tool: customTool,\n })\n }\n\n return items\n}\n"],"names":["COLLECTION_AUTH_BUILTIN_ENTRIES","COLLECTION_AUTH_BUILTINS","COLLECTION_BUILTIN_ENTRIES","COLLECTION_BUILTINS","GLOBAL_BUILTIN_ENTRIES","GLOBAL_BUILTINS","TOOL_BUILTIN_ENTRIES","TOOL_BUILTINS","sanitizeMCPConfig","config","pluginConfig","items","collection","collections","push","sanitizeCollectionConfig","global","globals","sanitizeGlobalConfig","configKey","mcpName","tool","type","label","annotations","title","Object","entries","tools","prompt","prompts","resource","resources","firstCollectionWithAuth","find","auth","Boolean","disabled","mcp","overrideApiKeyCollection","overrideAuth","userCollection","admin","user","slug","collectionPluginConfig","toolKey","matchedConfigEntry","override","undefined","collectionSlug","description","overrideResponse","authToolKey","customEntries","customTool","globalPluginConfig","globalSlug"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/mcp/sanitizeMCPConfig.ts"],"sourcesContent":["import type {\n CollectionConfig,\n Config,\n GlobalConfig,\n SanitizedCollectionConfig,\n SanitizedConfig,\n SanitizedGlobalConfig,\n} from 'payload'\n\nimport type {\n CollectionMCPItem,\n CollectionTool,\n GlobalMCPItem,\n GlobalTool,\n MCPItem,\n MCPPluginConfig,\n SanitizedMCPPluginConfig,\n} from '../types.js'\n\nimport { defaultAccess } from '../defaultAccess.js'\nimport {\n COLLECTION_AUTH_BUILTIN_ENTRIES,\n COLLECTION_AUTH_BUILTINS,\n COLLECTION_BUILTIN_ENTRIES,\n COLLECTION_BUILTINS,\n GLOBAL_BUILTIN_ENTRIES,\n GLOBAL_BUILTINS,\n TOOL_BUILTIN_ENTRIES,\n TOOL_BUILTINS,\n} from './builtinTools.js'\n\n/**\n * Converts the user-configured `MCPPluginConfig` into a `SanitizedMCPPluginConfig`:\n * - Flattens `tools` / `prompts` / `resources` / per-collection / per-global\n * tool maps into a single `items` array.\n * - Applies built-in tools for collections and globals, respecting opt-out user overrides.\n *\n * Called once during plugin init. After that, `plugins['@payloadcms/plugin-mcp']\n * ?.options` holds the sanitized result\n */\nexport const sanitizeMCPConfig = ({\n config,\n pluginConfig,\n}: {\n config: Config | SanitizedConfig\n pluginConfig: MCPPluginConfig\n}): SanitizedMCPPluginConfig => {\n const items: MCPItem[] = []\n\n for (const collection of config.collections ?? []) {\n items.push(...sanitizeCollectionConfig({ collection, pluginConfig }))\n }\n\n for (const global of config.globals ?? []) {\n items.push(...sanitizeGlobalConfig({ global, pluginConfig }))\n }\n\n for (const [configKey, { mcpName, tool }] of TOOL_BUILTIN_ENTRIES) {\n items.push({\n type: 'tool',\n configKey,\n label: tool.annotations?.title ?? configKey,\n mcpName,\n tool: { ...tool, access: tool.access ?? defaultAccess },\n })\n }\n\n for (const [configKey, tool] of Object.entries(pluginConfig.tools ?? {})) {\n if (configKey in TOOL_BUILTINS) {\n continue\n }\n items.push({\n type: 'tool',\n configKey,\n label: tool.annotations?.title ?? configKey,\n mcpName: configKey,\n tool: { ...tool, access: tool.access ?? defaultAccess },\n })\n }\n\n for (const [configKey, prompt] of Object.entries(pluginConfig.prompts ?? {})) {\n items.push({\n type: 'prompt',\n configKey,\n label: prompt.title ?? configKey,\n mcpName: configKey,\n prompt: { ...prompt, access: prompt.access ?? defaultAccess },\n })\n }\n\n for (const [configKey, resource] of Object.entries(pluginConfig.resources ?? {})) {\n items.push({\n type: 'resource',\n configKey,\n label: resource.title ?? configKey,\n mcpName: configKey,\n resource: { ...resource, access: resource.access ?? defaultAccess },\n })\n }\n\n return {\n disabled: pluginConfig.disabled,\n hooks: pluginConfig.hooks,\n items,\n mcp: pluginConfig.mcp,\n overrideGetAuthorizedMCP: pluginConfig.overrideGetAuthorizedMCP,\n }\n}\n\nconst sanitizeCollectionConfig = ({\n collection,\n pluginConfig,\n}: {\n collection: CollectionConfig | SanitizedCollectionConfig\n pluginConfig: MCPPluginConfig\n}): CollectionMCPItem[] => {\n const slug = collection.slug\n const collectionPluginConfig = pluginConfig.collections?.[slug]\n const items: CollectionMCPItem[] = []\n /**\n * Payload disables duplicate for auth collections by default unless the\n * collection explicitly opts back in with `disableDuplicate: false`.\n */\n const isDuplicateDisabled =\n collection.disableDuplicate === true ||\n (Boolean(collection.auth) && collection.disableDuplicate !== false)\n\n for (const [\n toolKey,\n { mcpName, requiresDuplicateEnabled, requiresUpload, requiresVersions, tool },\n ] of COLLECTION_BUILTIN_ENTRIES) {\n if (requiresVersions && !collection.versions) {\n continue\n }\n if (requiresDuplicateEnabled && isDuplicateDisabled) {\n continue\n }\n if (requiresUpload && !collection.upload) {\n continue\n }\n const matchedConfigEntry = collectionPluginConfig?.tools?.[toolKey]\n if (matchedConfigEntry === false) {\n continue\n }\n const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined\n const annotations = { ...tool.annotations, ...override?.annotations }\n items.push({\n type: 'collectionTool',\n collectionSlug: slug,\n configKey: toolKey,\n label: annotations.title ?? toolKey,\n mcpName,\n tool: {\n ...tool,\n access: override?.access ?? tool.access ?? defaultAccess,\n annotations,\n description: override?.description ?? tool.description,\n overrideResponse:\n override?.overrideResponse ??\n collectionPluginConfig?.overrideResponse ??\n tool.overrideResponse,\n },\n })\n }\n\n if (collection.auth) {\n for (const [authToolKey, { mcpName, tool }] of COLLECTION_AUTH_BUILTIN_ENTRIES) {\n const matchedConfigEntry = collectionPluginConfig?.tools?.[authToolKey]\n if (!matchedConfigEntry) {\n continue\n }\n // `true` means \"enable, no override\"; only the object form carries fields.\n const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined\n const annotations = { ...tool.annotations, ...override?.annotations }\n items.push({\n type: 'collectionTool',\n collectionSlug: slug,\n configKey: authToolKey,\n label: annotations.title ?? authToolKey,\n mcpName,\n tool: {\n ...tool,\n access: override?.access ?? tool.access ?? defaultAccess,\n annotations,\n description: override?.description ?? tool.description,\n overrideResponse:\n override?.overrideResponse ??\n collectionPluginConfig?.overrideResponse ??\n tool.overrideResponse,\n },\n })\n }\n }\n\n // Cast: builtin keys are filtered out below, so the remaining values are\n // always custom tools (`CollectionTool`) or undefined\n const customEntries = Object.entries(collectionPluginConfig?.tools ?? {}) as Array<\n [string, CollectionTool | undefined]\n >\n for (const [configKey, customTool] of customEntries) {\n if (configKey in COLLECTION_BUILTINS || configKey in COLLECTION_AUTH_BUILTINS) {\n continue\n }\n if (!customTool) {\n continue\n }\n items.push({\n type: 'collectionTool',\n collectionSlug: slug,\n configKey,\n label: customTool.annotations?.title ?? configKey,\n mcpName: configKey,\n tool: { ...customTool, access: customTool.access ?? defaultAccess },\n })\n }\n\n return items\n}\n\nconst sanitizeGlobalConfig = ({\n global,\n pluginConfig,\n}: {\n global: GlobalConfig | SanitizedGlobalConfig\n pluginConfig: MCPPluginConfig\n}): GlobalMCPItem[] => {\n const slug = global.slug\n const globalPluginConfig = pluginConfig.globals?.[slug]\n const items: GlobalMCPItem[] = []\n\n for (const [toolKey, { mcpName, requiresVersions, tool }] of GLOBAL_BUILTIN_ENTRIES) {\n if (requiresVersions && !global.versions) {\n continue\n }\n const matchedConfigEntry = globalPluginConfig?.tools?.[toolKey]\n if (matchedConfigEntry === false) {\n continue\n }\n const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined\n const annotations = { ...tool.annotations, ...override?.annotations }\n items.push({\n type: 'globalTool',\n configKey: toolKey,\n globalSlug: slug,\n label: annotations.title ?? toolKey,\n mcpName,\n tool: {\n ...tool,\n access: override?.access ?? tool.access ?? defaultAccess,\n annotations,\n description: override?.description ?? tool.description,\n overrideResponse:\n override?.overrideResponse ??\n globalPluginConfig?.overrideResponse ??\n tool.overrideResponse,\n },\n })\n }\n\n const customEntries = Object.entries(globalPluginConfig?.tools ?? {}) as Array<\n [string, GlobalTool | undefined]\n >\n for (const [configKey, customTool] of customEntries) {\n if (configKey in GLOBAL_BUILTINS) {\n continue\n }\n if (!customTool) {\n continue\n }\n items.push({\n type: 'globalTool',\n configKey,\n globalSlug: slug,\n label: customTool.annotations?.title ?? configKey,\n mcpName: configKey,\n tool: { ...customTool, access: customTool.access ?? defaultAccess },\n })\n }\n\n return items\n}\n"],"names":["defaultAccess","COLLECTION_AUTH_BUILTIN_ENTRIES","COLLECTION_AUTH_BUILTINS","COLLECTION_BUILTIN_ENTRIES","COLLECTION_BUILTINS","GLOBAL_BUILTIN_ENTRIES","GLOBAL_BUILTINS","TOOL_BUILTIN_ENTRIES","TOOL_BUILTINS","sanitizeMCPConfig","config","pluginConfig","items","collection","collections","push","sanitizeCollectionConfig","global","globals","sanitizeGlobalConfig","configKey","mcpName","tool","type","label","annotations","title","access","Object","entries","tools","prompt","prompts","resource","resources","disabled","hooks","mcp","overrideGetAuthorizedMCP","slug","collectionPluginConfig","isDuplicateDisabled","disableDuplicate","Boolean","auth","toolKey","requiresDuplicateEnabled","requiresUpload","requiresVersions","versions","upload","matchedConfigEntry","override","undefined","collectionSlug","description","overrideResponse","authToolKey","customEntries","customTool","globalPluginConfig","globalSlug"],"mappings":"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"}
package/dist/stdio.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Stdio adapter for the Payload MCP server.
2
+ * Starts Payload's MCP server over stdin and stdout.
3
3
  *
4
- * Do not use in production. There's no auth; whoever can spawn the process gets
5
- * full access to your local data.
4
+ * Set `PAYLOAD_MCP_AUTHORIZATION` to authenticate. In development,
5
+ * `PAYLOAD_MCP_OVERRIDE_ACCESS=true` skips access checks.
6
6
  */
7
7
  export declare const runMcpStdio: () => Promise<void>;
8
8
  //# sourceMappingURL=stdio.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CA4EhD,CAAA"}
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CA4GhD,CAAA"}
package/dist/stdio.js CHANGED
@@ -1,76 +1,114 @@
1
- /* eslint-disable no-console */ import { StdioServerTransport } from '@modelcontextprotocol/server';
1
+ /* eslint-disable no-console */ import { serveStdio } from '@modelcontextprotocol/server/stdio';
2
2
  import { fileURLToPath, pathToFileURL } from 'node:url';
3
3
  import { createLocalReq, getPayload } from 'payload';
4
- import { findConfig } from 'payload/node';
4
+ import { findConfig, loadEnv } from 'payload/node';
5
+ import { getAuthorizedMCP } from './endpoint/access.js';
5
6
  import { buildMcpServer } from './mcp/buildMcpServer.js';
6
7
  import { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js';
7
8
  import { getPluginConfig } from './utils/getPluginConfig.js';
8
9
  import { resolveProjectRoot } from './utils/resolveProjectRoot.js';
9
10
  /**
10
- * Stdio adapter for the Payload MCP server.
11
+ * Starts Payload's MCP server over stdin and stdout.
11
12
  *
12
- * Do not use in production. There's no auth; whoever can spawn the process gets
13
- * full access to your local data.
13
+ * Set `PAYLOAD_MCP_AUTHORIZATION` to authenticate. In development,
14
+ * `PAYLOAD_MCP_OVERRIDE_ACCESS=true` skips access checks.
14
15
  */ export const runMcpStdio = async ()=>{
15
- /**
16
- * If MCP clients spawn stdio servers from an arbitrary working directory,
17
- * Payload's cwd-anchored `findConfig()` can't locate the project on
18
- * its own. This module always lives inside the project's `node_modules`, so
19
- * we derive the project root from its own path and `chdir` into it.
20
- *
21
- * An absolute `PAYLOAD_CONFIG_PATH` still overrides everything; unusual
22
- * layouts (e.g. a monorepo where the package is hoisted above the app) can
23
- * fall back to it. See the implementation of findConfig for details.
24
- */ const projectRoot = resolveProjectRoot(fileURLToPath(import.meta.url));
16
+ // MCP clients may start this command from another folder. Move to the Payload
17
+ // project so findConfig() can find the config.
18
+ const projectRoot = resolveProjectRoot(fileURLToPath(import.meta.url));
25
19
  if (projectRoot) {
26
20
  process.chdir(projectRoot);
27
21
  }
22
+ loadEnv();
28
23
  const configPath = findConfig();
29
24
  const configModule = await import(pathToFileURL(configPath).toString());
30
25
  const config = await (configModule.default ?? configModule);
26
+ /**
27
+ * stdout is only for MCP messages. The spec says the server must not write
28
+ * logs there and may write them to stderr instead.
29
+ *
30
+ * The 2.0 client library recovers from stray stdout logs, but that behavior is not
31
+ * guaranteed. Move Payload logs to stderr so Payload does not add invalid data
32
+ * to stdout. Keep options from configurable loggers. Replace pre-built loggers
33
+ * because their output cannot be redirected.
34
+ *
35
+ * @see https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#stdio
36
+ */ const loggerConfig = config;
37
+ if (loggerConfig.logger && typeof loggerConfig.logger === 'object' && 'options' in loggerConfig.logger) {
38
+ loggerConfig.logger.destination = process.stderr;
39
+ } else {
40
+ loggerConfig.logger = {
41
+ destination: process.stderr,
42
+ options: {}
43
+ };
44
+ }
31
45
  const payload = await getPayload({
32
- config
46
+ config,
47
+ cron: false,
48
+ disableOnInit: true
33
49
  });
34
- /**
35
- * If the user added `mcpPlugin({...})` to their `plugins` array, read the
36
- * sanitized config they registered. Otherwise fall back to the defaults. That way,
37
- * the mcp works on any project that has `@payloadcms/plugin-mcp` installed,
38
- * even if the plugin is not added to the plugins array.
39
- */ let pluginConfig;
50
+ let pluginConfig;
40
51
  try {
41
52
  pluginConfig = getPluginConfig({
42
53
  config: payload.config
43
54
  });
44
55
  } catch {
56
+ // The command also works when mcpPlugin() is not in the Payload config.
45
57
  pluginConfig = sanitizeMCPConfig({
46
58
  config: payload.config,
47
59
  pluginConfig: {}
48
60
  });
49
- const fakePluginFn = (config)=>config;
50
- fakePluginFn.slug = '@payloadcms/plugin-mcp';
51
- // @ts-expect-error
52
- fakePluginFn.sanitizedOptions = pluginConfig;
53
- (payload.config.plugins ??= []).push(fakePluginFn);
61
+ const fallbackPlugin = (config)=>config;
62
+ Object.assign(fallbackPlugin, {
63
+ slug: '@payloadcms/plugin-mcp',
64
+ sanitizedOptions: pluginConfig
65
+ });
66
+ payload.config.plugins ??= [];
67
+ payload.config.plugins.push(fallbackPlugin);
54
68
  }
55
- const authorizedMCP = {
56
- items: pluginConfig.items,
57
- overrideAccess: true,
58
- user: null
59
- };
60
- const req = await createLocalReq({}, payload);
69
+ const overrideAccessEnv = process.env.PAYLOAD_MCP_OVERRIDE_ACCESS;
70
+ let overrideAccess = false;
71
+ if (overrideAccessEnv === 'true') {
72
+ overrideAccess = true;
73
+ } else if (overrideAccessEnv && overrideAccessEnv !== 'false') {
74
+ throw new Error('PAYLOAD_MCP_OVERRIDE_ACCESS must be "true" or "false".');
75
+ }
76
+ if (overrideAccess && process.env.NODE_ENV !== 'development') {
77
+ throw new Error('PAYLOAD_MCP_OVERRIDE_ACCESS is only available in development.');
78
+ }
79
+ const headers = new Headers();
80
+ if (process.env.PAYLOAD_MCP_AUTHORIZATION) {
81
+ headers.set('Authorization', process.env.PAYLOAD_MCP_AUTHORIZATION);
82
+ }
83
+ const req = await createLocalReq({
84
+ req: {
85
+ headers
86
+ }
87
+ }, payload);
61
88
  req.payloadAPI = 'MCP';
62
- const server = buildMcpServer({
63
- authorizedMCP,
64
- pluginConfig,
89
+ const authorizedMCP = await getAuthorizedMCP({
90
+ overrideAccess,
65
91
  req
66
92
  });
67
- const transport = new StdioServerTransport();
68
- await server.connect(transport);
69
- // Process now lives until stdin closes. Wire graceful shutdown so DB
70
- // connections (and any other Payload-managed resources) get released.
71
- const shutdown = async (code = 0)=>{
93
+ const stdioServer = serveStdio(()=>buildMcpServer({
94
+ authorizedMCP,
95
+ pluginConfig,
96
+ req
97
+ }), {
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
+ });
103
+ // Close the MCP server and Payload when the client disconnects or the process stops.
104
+ let isShuttingDown = false;
105
+ const shutdown = async ()=>{
106
+ if (isShuttingDown) {
107
+ return;
108
+ }
109
+ isShuttingDown = true;
72
110
  try {
73
- await server.close();
111
+ await stdioServer.close();
74
112
  } catch (err) {
75
113
  console.error('[payload-mcp] error closing server:', err);
76
114
  }
@@ -79,11 +117,11 @@ import { resolveProjectRoot } from './utils/resolveProjectRoot.js';
79
117
  } catch (err) {
80
118
  console.error('[payload-mcp] error destroying payload:', err);
81
119
  }
82
- process.exit(code);
120
+ process.exit(0);
83
121
  };
84
- process.on('SIGINT', ()=>void shutdown(0));
85
- process.on('SIGTERM', ()=>void shutdown(0));
86
- process.stdin.on('close', ()=>void shutdown(0));
122
+ process.once('SIGINT', ()=>void shutdown());
123
+ process.once('SIGTERM', ()=>void shutdown());
124
+ process.stdin.once('close', ()=>void shutdown());
87
125
  };
88
126
 
89
127
  //# sourceMappingURL=stdio.js.map
package/dist/stdio.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/stdio.ts"],"sourcesContent":["import type { MaybePromise, Plugin, SanitizedConfig } from 'payload'\n\n/* eslint-disable no-console */\nimport { StdioServerTransport } from '@modelcontextprotocol/server'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { createLocalReq, getPayload } from 'payload'\nimport { findConfig } from 'payload/node'\n\nimport type { AuthorizedMCP, SanitizedMCPPluginConfig } from './types.js'\n\nimport { buildMcpServer } from './mcp/buildMcpServer.js'\nimport { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js'\nimport { getPluginConfig } from './utils/getPluginConfig.js'\nimport { resolveProjectRoot } from './utils/resolveProjectRoot.js'\n\n/**\n * Stdio adapter for the Payload MCP server.\n *\n * Do not use in production. There's no auth; whoever can spawn the process gets\n * full access to your local data.\n */\nexport const runMcpStdio = async (): Promise<void> => {\n /**\n * If MCP clients spawn stdio servers from an arbitrary working directory,\n * Payload's cwd-anchored `findConfig()` can't locate the project on\n * its own. This module always lives inside the project's `node_modules`, so\n * we derive the project root from its own path and `chdir` into it.\n *\n * An absolute `PAYLOAD_CONFIG_PATH` still overrides everything; unusual\n * layouts (e.g. a monorepo where the package is hoisted above the app) can\n * fall back to it. See the implementation of findConfig for details.\n */\n const projectRoot = resolveProjectRoot(fileURLToPath(import.meta.url))\n if (projectRoot) {\n process.chdir(projectRoot)\n }\n\n const configPath = findConfig()\n const configModule = await import(pathToFileURL(configPath).toString())\n const config = (await (configModule.default ?? configModule)) as MaybePromise<SanitizedConfig>\n\n const payload = await getPayload({ config })\n\n /**\n * If the user added `mcpPlugin({...})` to their `plugins` array, read the\n * sanitized config they registered. Otherwise fall back to the defaults. That way,\n * the mcp works on any project that has `@payloadcms/plugin-mcp` installed,\n * even if the plugin is not added to the plugins array.\n */\n let pluginConfig: SanitizedMCPPluginConfig\n try {\n pluginConfig = getPluginConfig({ config: payload.config })\n } catch {\n pluginConfig = sanitizeMCPConfig({ config: payload.config, pluginConfig: {} })\n\n const fakePluginFn: Plugin = (config) => config\n fakePluginFn.slug = '@payloadcms/plugin-mcp'\n // @ts-expect-error\n fakePluginFn.sanitizedOptions = pluginConfig\n\n // Push to payload config, to ensure consecutive calls to `getPluginConfig()` work\n ;(payload.config.plugins ??= []).push(fakePluginFn)\n }\n\n const authorizedMCP: AuthorizedMCP = {\n items: pluginConfig.items,\n overrideAccess: true,\n user: null,\n }\n\n const req = await createLocalReq({}, payload)\n req.payloadAPI = 'MCP' as const\n\n const server = buildMcpServer({ authorizedMCP, pluginConfig, req })\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n // Process now lives until stdin closes. Wire graceful shutdown so DB\n // connections (and any other Payload-managed resources) get released.\n const shutdown = async (code = 0) => {\n try {\n await server.close()\n } catch (err) {\n console.error('[payload-mcp] error closing server:', err)\n }\n try {\n await payload.destroy()\n } catch (err) {\n console.error('[payload-mcp] error destroying payload:', err)\n }\n process.exit(code)\n }\n\n process.on('SIGINT', () => void shutdown(0))\n process.on('SIGTERM', () => void shutdown(0))\n process.stdin.on('close', () => void shutdown(0))\n}\n"],"names":["StdioServerTransport","fileURLToPath","pathToFileURL","createLocalReq","getPayload","findConfig","buildMcpServer","sanitizeMCPConfig","getPluginConfig","resolveProjectRoot","runMcpStdio","projectRoot","url","process","chdir","configPath","configModule","toString","config","default","payload","pluginConfig","fakePluginFn","slug","sanitizedOptions","plugins","push","authorizedMCP","items","overrideAccess","user","req","payloadAPI","server","transport","connect","shutdown","code","close","err","console","error","destroy","exit","on","stdin"],"mappings":"AAEA,6BAA6B,GAC7B,SAASA,oBAAoB,QAAQ,+BAA8B;AACnE,SAASC,aAAa,EAAEC,aAAa,QAAQ,WAAU;AACvD,SAASC,cAAc,EAAEC,UAAU,QAAQ,UAAS;AACpD,SAASC,UAAU,QAAQ,eAAc;AAIzC,SAASC,cAAc,QAAQ,0BAAyB;AACxD,SAASC,iBAAiB,QAAQ,6BAA4B;AAC9D,SAASC,eAAe,QAAQ,6BAA4B;AAC5D,SAASC,kBAAkB,QAAQ,gCAA+B;AAElE;;;;;CAKC,GACD,OAAO,MAAMC,cAAc;IACzB;;;;;;;;;GASC,GACD,MAAMC,cAAcF,mBAAmBR,cAAc,YAAYW,GAAG;IACpE,IAAID,aAAa;QACfE,QAAQC,KAAK,CAACH;IAChB;IAEA,MAAMI,aAAaV;IACnB,MAAMW,eAAe,MAAM,MAAM,CAACd,cAAca,YAAYE,QAAQ;IACpE,MAAMC,SAAU,MAAOF,CAAAA,aAAaG,OAAO,IAAIH,YAAW;IAE1D,MAAMI,UAAU,MAAMhB,WAAW;QAAEc;IAAO;IAE1C;;;;;GAKC,GACD,IAAIG;IACJ,IAAI;QACFA,eAAeb,gBAAgB;YAAEU,QAAQE,QAAQF,MAAM;QAAC;IAC1D,EAAE,OAAM;QACNG,eAAed,kBAAkB;YAAEW,QAAQE,QAAQF,MAAM;YAAEG,cAAc,CAAC;QAAE;QAE5E,MAAMC,eAAuB,CAACJ,SAAWA;QACzCI,aAAaC,IAAI,GAAG;QACpB,mBAAmB;QACnBD,aAAaE,gBAAgB,GAAGH;QAG9BD,CAAAA,QAAQF,MAAM,CAACO,OAAO,KAAK,EAAE,AAAD,EAAGC,IAAI,CAACJ;IACxC;IAEA,MAAMK,gBAA+B;QACnCC,OAAOP,aAAaO,KAAK;QACzBC,gBAAgB;QAChBC,MAAM;IACR;IAEA,MAAMC,MAAM,MAAM5B,eAAe,CAAC,GAAGiB;IACrCW,IAAIC,UAAU,GAAG;IAEjB,MAAMC,SAAS3B,eAAe;QAAEqB;QAAeN;QAAcU;IAAI;IAEjE,MAAMG,YAAY,IAAIlC;IACtB,MAAMiC,OAAOE,OAAO,CAACD;IAErB,qEAAqE;IACrE,sEAAsE;IACtE,MAAME,WAAW,OAAOC,OAAO,CAAC;QAC9B,IAAI;YACF,MAAMJ,OAAOK,KAAK;QACpB,EAAE,OAAOC,KAAK;YACZC,QAAQC,KAAK,CAAC,uCAAuCF;QACvD;QACA,IAAI;YACF,MAAMnB,QAAQsB,OAAO;QACvB,EAAE,OAAOH,KAAK;YACZC,QAAQC,KAAK,CAAC,2CAA2CF;QAC3D;QACA1B,QAAQ8B,IAAI,CAACN;IACf;IAEAxB,QAAQ+B,EAAE,CAAC,UAAU,IAAM,KAAKR,SAAS;IACzCvB,QAAQ+B,EAAE,CAAC,WAAW,IAAM,KAAKR,SAAS;IAC1CvB,QAAQgC,KAAK,CAACD,EAAE,CAAC,SAAS,IAAM,KAAKR,SAAS;AAChD,EAAC"}
1
+ {"version":3,"sources":["../src/stdio.ts"],"sourcesContent":["import type { Config, Plugin, SanitizedConfig } from 'payload'\n\n/* eslint-disable no-console */\nimport { serveStdio } from '@modelcontextprotocol/server/stdio'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { createLocalReq, getPayload } from 'payload'\nimport { findConfig, loadEnv } from 'payload/node'\n\nimport type { SanitizedMCPPluginConfig } from './types.js'\n\nimport { getAuthorizedMCP } from './endpoint/access.js'\nimport { buildMcpServer } from './mcp/buildMcpServer.js'\nimport { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js'\nimport { getPluginConfig } from './utils/getPluginConfig.js'\nimport { resolveProjectRoot } from './utils/resolveProjectRoot.js'\n\n/**\n * Starts Payload's MCP server over stdin and stdout.\n *\n * Set `PAYLOAD_MCP_AUTHORIZATION` to authenticate. In development,\n * `PAYLOAD_MCP_OVERRIDE_ACCESS=true` skips access checks.\n */\nexport const runMcpStdio = async (): Promise<void> => {\n // MCP clients may start this command from another folder. Move to the Payload\n // project so findConfig() can find the config.\n const projectRoot = resolveProjectRoot(fileURLToPath(import.meta.url))\n if (projectRoot) {\n process.chdir(projectRoot)\n }\n\n loadEnv()\n const configPath = findConfig()\n const configModule = await import(pathToFileURL(configPath).toString())\n const config = (await (configModule.default ?? configModule)) as SanitizedConfig\n\n /**\n * stdout is only for MCP messages. The spec says the server must not write\n * logs there and may write them to stderr instead.\n *\n * The 2.0 client library recovers from stray stdout logs, but that behavior is not\n * guaranteed. Move Payload logs to stderr so Payload does not add invalid data\n * to stdout. Keep options from configurable loggers. Replace pre-built loggers\n * because their output cannot be redirected.\n *\n * @see https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#stdio\n */\n const loggerConfig: { logger?: Config['logger'] } = config\n if (\n loggerConfig.logger &&\n typeof loggerConfig.logger === 'object' &&\n 'options' in loggerConfig.logger\n ) {\n loggerConfig.logger.destination = process.stderr\n } else {\n loggerConfig.logger = { destination: process.stderr, options: {} }\n }\n\n const payload = await getPayload({ config, cron: false, disableOnInit: true })\n\n let pluginConfig: SanitizedMCPPluginConfig\n try {\n pluginConfig = getPluginConfig({ config: payload.config })\n } catch {\n // The command also works when mcpPlugin() is not in the Payload config.\n pluginConfig = sanitizeMCPConfig({ config: payload.config, pluginConfig: {} })\n\n const fallbackPlugin: Plugin = (config) => config\n Object.assign(fallbackPlugin, {\n slug: '@payloadcms/plugin-mcp',\n sanitizedOptions: pluginConfig,\n })\n payload.config.plugins ??= []\n payload.config.plugins.push(fallbackPlugin)\n }\n\n const overrideAccessEnv = process.env.PAYLOAD_MCP_OVERRIDE_ACCESS\n let overrideAccess = false\n\n if (overrideAccessEnv === 'true') {\n overrideAccess = true\n } else if (overrideAccessEnv && overrideAccessEnv !== 'false') {\n throw new Error('PAYLOAD_MCP_OVERRIDE_ACCESS must be \"true\" or \"false\".')\n }\n\n if (overrideAccess && process.env.NODE_ENV !== 'development') {\n throw new Error('PAYLOAD_MCP_OVERRIDE_ACCESS is only available in development.')\n }\n\n const headers = new Headers()\n if (process.env.PAYLOAD_MCP_AUTHORIZATION) {\n headers.set('Authorization', process.env.PAYLOAD_MCP_AUTHORIZATION)\n }\n\n const req = await createLocalReq({ req: { headers } }, payload)\n req.payloadAPI = 'MCP' as const\n const authorizedMCP = await getAuthorizedMCP({ overrideAccess, req })\n\n const stdioServer = serveStdio(() => buildMcpServer({ authorizedMCP, pluginConfig, req }), {\n onerror: (err) => {\n // MCP messages use stdout, so write SDK errors to stderr.\n console.error('[payload-mcp] error serving MCP over stdio:', err)\n },\n })\n\n // Close the MCP server and Payload when the client disconnects or the process stops.\n let isShuttingDown = false\n const shutdown = async () => {\n if (isShuttingDown) {\n return\n }\n isShuttingDown = true\n\n try {\n await stdioServer.close()\n } catch (err) {\n console.error('[payload-mcp] error closing server:', err)\n }\n\n try {\n await payload.destroy()\n } catch (err) {\n console.error('[payload-mcp] error destroying payload:', err)\n }\n\n process.exit(0)\n }\n\n process.once('SIGINT', () => void shutdown())\n process.once('SIGTERM', () => void shutdown())\n process.stdin.once('close', () => void shutdown())\n}\n"],"names":["serveStdio","fileURLToPath","pathToFileURL","createLocalReq","getPayload","findConfig","loadEnv","getAuthorizedMCP","buildMcpServer","sanitizeMCPConfig","getPluginConfig","resolveProjectRoot","runMcpStdio","projectRoot","url","process","chdir","configPath","configModule","toString","config","default","loggerConfig","logger","destination","stderr","options","payload","cron","disableOnInit","pluginConfig","fallbackPlugin","Object","assign","slug","sanitizedOptions","plugins","push","overrideAccessEnv","env","PAYLOAD_MCP_OVERRIDE_ACCESS","overrideAccess","Error","NODE_ENV","headers","Headers","PAYLOAD_MCP_AUTHORIZATION","set","req","payloadAPI","authorizedMCP","stdioServer","onerror","err","console","error","isShuttingDown","shutdown","close","destroy","exit","once","stdin"],"mappings":"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"}