@payloadcms/plugin-mcp 4.0.0-internal.688c4d0 → 4.0.0-internal.bc5cf8c

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 (420) hide show
  1. package/dist/defaultAccess.d.ts +3 -0
  2. package/dist/defaultAccess.d.ts.map +1 -0
  3. package/dist/defaultAccess.js +3 -0
  4. package/dist/defaultAccess.js.map +1 -0
  5. package/dist/endpoint/access.d.ts +17 -5
  6. package/dist/endpoint/access.d.ts.map +1 -1
  7. package/dist/endpoint/access.js +81 -103
  8. package/dist/endpoint/access.js.map +1 -1
  9. package/dist/endpoint/index.d.ts.map +1 -1
  10. package/dist/endpoint/index.js +11 -0
  11. package/dist/endpoint/index.js.map +1 -1
  12. package/dist/exports/client.d.ts +1 -4
  13. package/dist/exports/client.d.ts.map +1 -1
  14. package/dist/exports/client.js +1 -4
  15. package/dist/exports/client.js.map +1 -1
  16. package/dist/exports/internal.d.ts +2 -0
  17. package/dist/exports/internal.d.ts.map +1 -0
  18. package/dist/exports/internal.js +3 -0
  19. package/dist/exports/internal.js.map +1 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +1 -49
  22. package/dist/index.js.map +1 -1
  23. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  24. package/dist/mcp/buildMcpServer.js +2 -0
  25. package/dist/mcp/buildMcpServer.js.map +1 -1
  26. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -1
  27. package/dist/mcp/builtin/collections/authTools.js +44 -6
  28. package/dist/mcp/builtin/collections/authTools.js.map +1 -1
  29. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  30. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  31. package/dist/mcp/builtin/collections/countTool.js +69 -0
  32. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  33. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  34. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  35. package/dist/mcp/builtin/collections/countVersionsTool.js +65 -0
  36. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  37. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
  38. package/dist/mcp/builtin/collections/createTool.js +12 -19
  39. package/dist/mcp/builtin/collections/createTool.js.map +1 -1
  40. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
  41. package/dist/mcp/builtin/collections/deleteTool.js +9 -0
  42. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
  43. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  44. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  45. package/dist/mcp/builtin/collections/duplicateTool.js +97 -0
  46. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  47. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  48. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  49. package/dist/mcp/builtin/collections/findDistinctTool.js +93 -0
  50. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  51. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  52. package/dist/mcp/builtin/collections/findTool.js +43 -22
  53. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  54. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  55. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  56. package/dist/mcp/builtin/collections/findVersionByIDTool.js +84 -0
  57. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  58. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  59. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  60. package/dist/mcp/builtin/collections/findVersionsTool.js +99 -0
  61. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  62. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +1 -1
  63. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -1
  64. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -1
  65. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -1
  66. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +12 -0
  67. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -1
  68. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  69. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  70. package/dist/mcp/builtin/collections/restoreVersionTool.js +82 -0
  71. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  72. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  73. package/dist/mcp/builtin/collections/updateTool.js +14 -21
  74. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  75. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -1
  76. package/dist/mcp/builtin/getConfigInfoTool.js +27 -5
  77. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -1
  78. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  79. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  80. package/dist/mcp/builtin/globals/countVersionsTool.js +65 -0
  81. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  82. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  83. package/dist/mcp/builtin/globals/findTool.js +17 -20
  84. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  85. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  86. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  87. package/dist/mcp/builtin/globals/findVersionByIDTool.js +80 -0
  88. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  89. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  90. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  91. package/dist/mcp/builtin/globals/findVersionsTool.js +95 -0
  92. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  93. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -1
  94. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +12 -0
  95. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -1
  96. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  97. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  98. package/dist/mcp/builtin/globals/restoreVersionTool.js +78 -0
  99. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  100. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -1
  101. package/dist/mcp/builtin/globals/updateTool.js +12 -19
  102. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  103. package/dist/mcp/builtinTools.d.ts +69 -12
  104. package/dist/mcp/builtinTools.d.ts.map +1 -1
  105. package/dist/mcp/builtinTools.js +66 -10
  106. package/dist/mcp/builtinTools.js.map +1 -1
  107. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  108. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  109. package/dist/mcp/sanitizeMCPConfig.js +68 -27
  110. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  111. package/dist/stdio.d.ts +3 -2
  112. package/dist/stdio.d.ts.map +1 -1
  113. package/dist/stdio.js +27 -8
  114. package/dist/stdio.js.map +1 -1
  115. package/dist/types.d.ts +50 -90
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/types.js +4 -4
  118. package/dist/types.js.map +1 -1
  119. package/dist/utils/getPluginConfig.d.ts +1 -1
  120. package/dist/utils/getPluginConfig.js +1 -1
  121. package/dist/utils/getPluginConfig.js.map +1 -1
  122. package/package.json +9 -13
  123. package/src/defaultAccess.ts +3 -0
  124. package/src/endpoint/access.ts +87 -112
  125. package/src/endpoint/index.ts +14 -1
  126. package/src/exports/client.ts +2 -4
  127. package/src/exports/internal.ts +1 -0
  128. package/src/index.ts +1 -55
  129. package/src/mcp/buildMcpServer.ts +8 -1
  130. package/src/mcp/builtin/collections/authTools.ts +45 -9
  131. package/src/mcp/builtin/collections/countTool.ts +74 -0
  132. package/src/mcp/builtin/collections/countVersionsTool.ts +70 -0
  133. package/src/mcp/builtin/collections/createTool.ts +13 -13
  134. package/src/mcp/builtin/collections/deleteTool.ts +10 -0
  135. package/src/mcp/builtin/collections/duplicateTool.ts +135 -0
  136. package/src/mcp/builtin/collections/findDistinctTool.ts +120 -0
  137. package/src/mcp/builtin/collections/findTool.ts +56 -16
  138. package/src/mcp/builtin/collections/findVersionByIDTool.ts +110 -0
  139. package/src/mcp/builtin/collections/findVersionsTool.ts +155 -0
  140. package/src/mcp/builtin/collections/formatCollectionError.ts +1 -1
  141. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +18 -0
  142. package/src/mcp/builtin/collections/restoreVersionTool.ts +108 -0
  143. package/src/mcp/builtin/collections/updateTool.ts +14 -14
  144. package/src/mcp/builtin/getConfigInfoTool.ts +29 -4
  145. package/src/mcp/builtin/globals/countVersionsTool.ts +69 -0
  146. package/src/mcp/builtin/globals/findTool.ts +25 -16
  147. package/src/mcp/builtin/globals/findVersionByIDTool.ts +104 -0
  148. package/src/mcp/builtin/globals/findVersionsTool.ts +148 -0
  149. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +13 -0
  150. package/src/mcp/builtin/globals/restoreVersionTool.ts +100 -0
  151. package/src/mcp/builtin/globals/updateTool.ts +14 -14
  152. package/src/mcp/builtinTools.ts +72 -16
  153. package/src/mcp/sanitizeMCPConfig.ts +47 -30
  154. package/src/stdio.ts +23 -8
  155. package/src/types.ts +57 -92
  156. package/src/utils/getPluginConfig.ts +1 -1
  157. package/dist/collection/getAccessField.d.ts +0 -12
  158. package/dist/collection/getAccessField.d.ts.map +0 -1
  159. package/dist/collection/getAccessField.js +0 -72
  160. package/dist/collection/getAccessField.js.map +0 -1
  161. package/dist/collection/index.d.ts +0 -6
  162. package/dist/collection/index.d.ts.map +0 -1
  163. package/dist/collection/index.js +0 -105
  164. package/dist/collection/index.js.map +0 -1
  165. package/dist/components/APIKeyField/index.client.d.ts +0 -9
  166. package/dist/components/APIKeyField/index.client.d.ts.map +0 -1
  167. package/dist/components/APIKeyField/index.client.js +0 -85
  168. package/dist/components/APIKeyField/index.client.js.map +0 -1
  169. package/dist/components/APIKeyField/index.css +0 -105
  170. package/dist/components/APIKeysEmptyState/index.client.d.ts +0 -4
  171. package/dist/components/APIKeysEmptyState/index.client.d.ts.map +0 -1
  172. package/dist/components/APIKeysEmptyState/index.client.js +0 -21
  173. package/dist/components/APIKeysEmptyState/index.client.js.map +0 -1
  174. package/dist/components/AccessField/index.client.d.ts +0 -10
  175. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  176. package/dist/components/AccessField/index.client.js +0 -247
  177. package/dist/components/AccessField/index.client.js.map +0 -1
  178. package/dist/components/AccessField/index.css +0 -99
  179. package/dist/components/SettingsMenu/index.client.d.ts +0 -8
  180. package/dist/components/SettingsMenu/index.client.d.ts.map +0 -1
  181. package/dist/components/SettingsMenu/index.client.js +0 -29
  182. package/dist/components/SettingsMenu/index.client.js.map +0 -1
  183. package/dist/translations/index.d.ts +0 -11
  184. package/dist/translations/index.d.ts.map +0 -1
  185. package/dist/translations/index.js +0 -92
  186. package/dist/translations/index.js.map +0 -1
  187. package/dist/translations/languages/ar.d.ts +0 -31
  188. package/dist/translations/languages/ar.d.ts.map +0 -1
  189. package/dist/translations/languages/ar.js +0 -34
  190. package/dist/translations/languages/ar.js.map +0 -1
  191. package/dist/translations/languages/az.d.ts +0 -31
  192. package/dist/translations/languages/az.d.ts.map +0 -1
  193. package/dist/translations/languages/az.js +0 -34
  194. package/dist/translations/languages/az.js.map +0 -1
  195. package/dist/translations/languages/bg.d.ts +0 -31
  196. package/dist/translations/languages/bg.d.ts.map +0 -1
  197. package/dist/translations/languages/bg.js +0 -34
  198. package/dist/translations/languages/bg.js.map +0 -1
  199. package/dist/translations/languages/bnBd.d.ts +0 -31
  200. package/dist/translations/languages/bnBd.d.ts.map +0 -1
  201. package/dist/translations/languages/bnBd.js +0 -34
  202. package/dist/translations/languages/bnBd.js.map +0 -1
  203. package/dist/translations/languages/bnIn.d.ts +0 -31
  204. package/dist/translations/languages/bnIn.d.ts.map +0 -1
  205. package/dist/translations/languages/bnIn.js +0 -34
  206. package/dist/translations/languages/bnIn.js.map +0 -1
  207. package/dist/translations/languages/ca.d.ts +0 -31
  208. package/dist/translations/languages/ca.d.ts.map +0 -1
  209. package/dist/translations/languages/ca.js +0 -34
  210. package/dist/translations/languages/ca.js.map +0 -1
  211. package/dist/translations/languages/cs.d.ts +0 -31
  212. package/dist/translations/languages/cs.d.ts.map +0 -1
  213. package/dist/translations/languages/cs.js +0 -34
  214. package/dist/translations/languages/cs.js.map +0 -1
  215. package/dist/translations/languages/da.d.ts +0 -31
  216. package/dist/translations/languages/da.d.ts.map +0 -1
  217. package/dist/translations/languages/da.js +0 -34
  218. package/dist/translations/languages/da.js.map +0 -1
  219. package/dist/translations/languages/de.d.ts +0 -31
  220. package/dist/translations/languages/de.d.ts.map +0 -1
  221. package/dist/translations/languages/de.js +0 -34
  222. package/dist/translations/languages/de.js.map +0 -1
  223. package/dist/translations/languages/en.d.ts +0 -31
  224. package/dist/translations/languages/en.d.ts.map +0 -1
  225. package/dist/translations/languages/en.js +0 -34
  226. package/dist/translations/languages/en.js.map +0 -1
  227. package/dist/translations/languages/es.d.ts +0 -31
  228. package/dist/translations/languages/es.d.ts.map +0 -1
  229. package/dist/translations/languages/es.js +0 -34
  230. package/dist/translations/languages/es.js.map +0 -1
  231. package/dist/translations/languages/et.d.ts +0 -31
  232. package/dist/translations/languages/et.d.ts.map +0 -1
  233. package/dist/translations/languages/et.js +0 -34
  234. package/dist/translations/languages/et.js.map +0 -1
  235. package/dist/translations/languages/fa.d.ts +0 -31
  236. package/dist/translations/languages/fa.d.ts.map +0 -1
  237. package/dist/translations/languages/fa.js +0 -34
  238. package/dist/translations/languages/fa.js.map +0 -1
  239. package/dist/translations/languages/fr.d.ts +0 -31
  240. package/dist/translations/languages/fr.d.ts.map +0 -1
  241. package/dist/translations/languages/fr.js +0 -34
  242. package/dist/translations/languages/fr.js.map +0 -1
  243. package/dist/translations/languages/he.d.ts +0 -31
  244. package/dist/translations/languages/he.d.ts.map +0 -1
  245. package/dist/translations/languages/he.js +0 -34
  246. package/dist/translations/languages/he.js.map +0 -1
  247. package/dist/translations/languages/hr.d.ts +0 -31
  248. package/dist/translations/languages/hr.d.ts.map +0 -1
  249. package/dist/translations/languages/hr.js +0 -34
  250. package/dist/translations/languages/hr.js.map +0 -1
  251. package/dist/translations/languages/hu.d.ts +0 -31
  252. package/dist/translations/languages/hu.d.ts.map +0 -1
  253. package/dist/translations/languages/hu.js +0 -34
  254. package/dist/translations/languages/hu.js.map +0 -1
  255. package/dist/translations/languages/hy.d.ts +0 -31
  256. package/dist/translations/languages/hy.d.ts.map +0 -1
  257. package/dist/translations/languages/hy.js +0 -34
  258. package/dist/translations/languages/hy.js.map +0 -1
  259. package/dist/translations/languages/id.d.ts +0 -31
  260. package/dist/translations/languages/id.d.ts.map +0 -1
  261. package/dist/translations/languages/id.js +0 -34
  262. package/dist/translations/languages/id.js.map +0 -1
  263. package/dist/translations/languages/is.d.ts +0 -31
  264. package/dist/translations/languages/is.d.ts.map +0 -1
  265. package/dist/translations/languages/is.js +0 -34
  266. package/dist/translations/languages/is.js.map +0 -1
  267. package/dist/translations/languages/it.d.ts +0 -31
  268. package/dist/translations/languages/it.d.ts.map +0 -1
  269. package/dist/translations/languages/it.js +0 -34
  270. package/dist/translations/languages/it.js.map +0 -1
  271. package/dist/translations/languages/ja.d.ts +0 -31
  272. package/dist/translations/languages/ja.d.ts.map +0 -1
  273. package/dist/translations/languages/ja.js +0 -34
  274. package/dist/translations/languages/ja.js.map +0 -1
  275. package/dist/translations/languages/ko.d.ts +0 -31
  276. package/dist/translations/languages/ko.d.ts.map +0 -1
  277. package/dist/translations/languages/ko.js +0 -34
  278. package/dist/translations/languages/ko.js.map +0 -1
  279. package/dist/translations/languages/lt.d.ts +0 -31
  280. package/dist/translations/languages/lt.d.ts.map +0 -1
  281. package/dist/translations/languages/lt.js +0 -34
  282. package/dist/translations/languages/lt.js.map +0 -1
  283. package/dist/translations/languages/lv.d.ts +0 -31
  284. package/dist/translations/languages/lv.d.ts.map +0 -1
  285. package/dist/translations/languages/lv.js +0 -34
  286. package/dist/translations/languages/lv.js.map +0 -1
  287. package/dist/translations/languages/my.d.ts +0 -31
  288. package/dist/translations/languages/my.d.ts.map +0 -1
  289. package/dist/translations/languages/my.js +0 -34
  290. package/dist/translations/languages/my.js.map +0 -1
  291. package/dist/translations/languages/nb.d.ts +0 -31
  292. package/dist/translations/languages/nb.d.ts.map +0 -1
  293. package/dist/translations/languages/nb.js +0 -34
  294. package/dist/translations/languages/nb.js.map +0 -1
  295. package/dist/translations/languages/nl.d.ts +0 -31
  296. package/dist/translations/languages/nl.d.ts.map +0 -1
  297. package/dist/translations/languages/nl.js +0 -34
  298. package/dist/translations/languages/nl.js.map +0 -1
  299. package/dist/translations/languages/pl.d.ts +0 -31
  300. package/dist/translations/languages/pl.d.ts.map +0 -1
  301. package/dist/translations/languages/pl.js +0 -34
  302. package/dist/translations/languages/pl.js.map +0 -1
  303. package/dist/translations/languages/pt.d.ts +0 -31
  304. package/dist/translations/languages/pt.d.ts.map +0 -1
  305. package/dist/translations/languages/pt.js +0 -34
  306. package/dist/translations/languages/pt.js.map +0 -1
  307. package/dist/translations/languages/ro.d.ts +0 -31
  308. package/dist/translations/languages/ro.d.ts.map +0 -1
  309. package/dist/translations/languages/ro.js +0 -34
  310. package/dist/translations/languages/ro.js.map +0 -1
  311. package/dist/translations/languages/rs.d.ts +0 -31
  312. package/dist/translations/languages/rs.d.ts.map +0 -1
  313. package/dist/translations/languages/rs.js +0 -34
  314. package/dist/translations/languages/rs.js.map +0 -1
  315. package/dist/translations/languages/rsLatin.d.ts +0 -31
  316. package/dist/translations/languages/rsLatin.d.ts.map +0 -1
  317. package/dist/translations/languages/rsLatin.js +0 -34
  318. package/dist/translations/languages/rsLatin.js.map +0 -1
  319. package/dist/translations/languages/ru.d.ts +0 -31
  320. package/dist/translations/languages/ru.d.ts.map +0 -1
  321. package/dist/translations/languages/ru.js +0 -34
  322. package/dist/translations/languages/ru.js.map +0 -1
  323. package/dist/translations/languages/sk.d.ts +0 -31
  324. package/dist/translations/languages/sk.d.ts.map +0 -1
  325. package/dist/translations/languages/sk.js +0 -34
  326. package/dist/translations/languages/sk.js.map +0 -1
  327. package/dist/translations/languages/sl.d.ts +0 -31
  328. package/dist/translations/languages/sl.d.ts.map +0 -1
  329. package/dist/translations/languages/sl.js +0 -34
  330. package/dist/translations/languages/sl.js.map +0 -1
  331. package/dist/translations/languages/sv.d.ts +0 -31
  332. package/dist/translations/languages/sv.d.ts.map +0 -1
  333. package/dist/translations/languages/sv.js +0 -34
  334. package/dist/translations/languages/sv.js.map +0 -1
  335. package/dist/translations/languages/ta.d.ts +0 -31
  336. package/dist/translations/languages/ta.d.ts.map +0 -1
  337. package/dist/translations/languages/ta.js +0 -34
  338. package/dist/translations/languages/ta.js.map +0 -1
  339. package/dist/translations/languages/th.d.ts +0 -31
  340. package/dist/translations/languages/th.d.ts.map +0 -1
  341. package/dist/translations/languages/th.js +0 -34
  342. package/dist/translations/languages/th.js.map +0 -1
  343. package/dist/translations/languages/tr.d.ts +0 -31
  344. package/dist/translations/languages/tr.d.ts.map +0 -1
  345. package/dist/translations/languages/tr.js +0 -34
  346. package/dist/translations/languages/tr.js.map +0 -1
  347. package/dist/translations/languages/uk.d.ts +0 -31
  348. package/dist/translations/languages/uk.d.ts.map +0 -1
  349. package/dist/translations/languages/uk.js +0 -34
  350. package/dist/translations/languages/uk.js.map +0 -1
  351. package/dist/translations/languages/vi.d.ts +0 -31
  352. package/dist/translations/languages/vi.d.ts.map +0 -1
  353. package/dist/translations/languages/vi.js +0 -34
  354. package/dist/translations/languages/vi.js.map +0 -1
  355. package/dist/translations/languages/zh.d.ts +0 -31
  356. package/dist/translations/languages/zh.d.ts.map +0 -1
  357. package/dist/translations/languages/zh.js +0 -34
  358. package/dist/translations/languages/zh.js.map +0 -1
  359. package/dist/translations/languages/zhTw.d.ts +0 -31
  360. package/dist/translations/languages/zhTw.d.ts.map +0 -1
  361. package/dist/translations/languages/zhTw.js +0 -34
  362. package/dist/translations/languages/zhTw.js.map +0 -1
  363. package/dist/translations/types.d.ts +0 -32
  364. package/dist/translations/types.d.ts.map +0 -1
  365. package/dist/translations/types.js +0 -3
  366. package/dist/translations/types.js.map +0 -1
  367. package/src/collection/getAccessField.ts +0 -84
  368. package/src/collection/index.ts +0 -105
  369. package/src/components/APIKeyField/index.client.tsx +0 -73
  370. package/src/components/APIKeyField/index.css +0 -105
  371. package/src/components/APIKeysEmptyState/index.client.tsx +0 -36
  372. package/src/components/AccessField/index.client.tsx +0 -299
  373. package/src/components/AccessField/index.css +0 -99
  374. package/src/components/SettingsMenu/index.client.tsx +0 -34
  375. package/src/translations/index.ts +0 -108
  376. package/src/translations/languages/ar.ts +0 -35
  377. package/src/translations/languages/az.ts +0 -35
  378. package/src/translations/languages/bg.ts +0 -35
  379. package/src/translations/languages/bnBd.ts +0 -35
  380. package/src/translations/languages/bnIn.ts +0 -35
  381. package/src/translations/languages/ca.ts +0 -35
  382. package/src/translations/languages/cs.ts +0 -35
  383. package/src/translations/languages/da.ts +0 -35
  384. package/src/translations/languages/de.ts +0 -35
  385. package/src/translations/languages/en.ts +0 -35
  386. package/src/translations/languages/es.ts +0 -35
  387. package/src/translations/languages/et.ts +0 -35
  388. package/src/translations/languages/fa.ts +0 -35
  389. package/src/translations/languages/fr.ts +0 -35
  390. package/src/translations/languages/he.ts +0 -35
  391. package/src/translations/languages/hr.ts +0 -35
  392. package/src/translations/languages/hu.ts +0 -35
  393. package/src/translations/languages/hy.ts +0 -35
  394. package/src/translations/languages/id.ts +0 -35
  395. package/src/translations/languages/is.ts +0 -35
  396. package/src/translations/languages/it.ts +0 -35
  397. package/src/translations/languages/ja.ts +0 -35
  398. package/src/translations/languages/ko.ts +0 -35
  399. package/src/translations/languages/lt.ts +0 -35
  400. package/src/translations/languages/lv.ts +0 -35
  401. package/src/translations/languages/my.ts +0 -35
  402. package/src/translations/languages/nb.ts +0 -35
  403. package/src/translations/languages/nl.ts +0 -35
  404. package/src/translations/languages/pl.ts +0 -35
  405. package/src/translations/languages/pt.ts +0 -35
  406. package/src/translations/languages/ro.ts +0 -35
  407. package/src/translations/languages/rs.ts +0 -35
  408. package/src/translations/languages/rsLatin.ts +0 -35
  409. package/src/translations/languages/ru.ts +0 -35
  410. package/src/translations/languages/sk.ts +0 -35
  411. package/src/translations/languages/sl.ts +0 -35
  412. package/src/translations/languages/sv.ts +0 -35
  413. package/src/translations/languages/ta.ts +0 -35
  414. package/src/translations/languages/th.ts +0 -35
  415. package/src/translations/languages/tr.ts +0 -35
  416. package/src/translations/languages/uk.ts +0 -35
  417. package/src/translations/languages/vi.ts +0 -35
  418. package/src/translations/languages/zh.ts +0 -35
  419. package/src/translations/languages/zhTw.ts +0 -35
  420. package/src/translations/types.ts +0 -34
@@ -0,0 +1,3 @@
1
+ import type { MCPAccessArgs } from './types.js';
2
+ export declare const defaultAccess: ({ req }: MCPAccessArgs) => boolean;
3
+ //# sourceMappingURL=defaultAccess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultAccess.d.ts","sourceRoot":"","sources":["../src/defaultAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,eAAO,MAAM,aAAa,GAAI,SAAS,aAAa,KAAG,OAA4B,CAAA"}
@@ -0,0 +1,3 @@
1
+ export const defaultAccess = ({ req })=>Boolean(req.user);
2
+
3
+ //# sourceMappingURL=defaultAccess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/defaultAccess.ts"],"sourcesContent":["import type { MCPAccessArgs } from './types.js'\n\nexport const defaultAccess = ({ req }: MCPAccessArgs): boolean => Boolean(req.user)\n"],"names":["defaultAccess","req","Boolean","user"],"mappings":"AAEA,OAAO,MAAMA,gBAAgB,CAAC,EAAEC,GAAG,EAAiB,GAAcC,QAAQD,IAAIE,IAAI,EAAC"}
@@ -1,10 +1,22 @@
1
1
  import type { PayloadRequest } from 'payload';
2
- import type { AuthorizedMCP } from '../types.js';
2
+ import type { AuthorizedMCP, MCPItem } from '../types.js';
3
+ export type GetAuthorizedMCPArgs = {
4
+ overrideAccess: boolean;
5
+ req: PayloadRequest;
6
+ };
3
7
  /**
4
- * Resolves the API key (or dev-mode session) and returns the items the caller
5
- * may use. Denied items are dropped from the array.
8
+ * Resolves the MCP caller and returns the MCP surface authorized for that request.
9
+ *
10
+ * Authorization has two layers:
11
+ * 1. Payload collection/global permissions determine whether built-in operation tools are shown.
12
+ * 2. MCP `access` callbacks can further hide any configured tool, prompt, or resource.
13
+ *
14
+ * Like Payload core operations, `overrideAccess` skips both layers.
6
15
  */
7
- export declare const getAuthorizedMCP: (args: {
16
+ export declare const getAuthorizedMCP: (args: GetAuthorizedMCPArgs) => Promise<AuthorizedMCP>;
17
+ export declare const filterMCPItems: ({ items, overrideAccess, req, }: {
18
+ items: MCPItem[];
19
+ overrideAccess: boolean;
8
20
  req: PayloadRequest;
9
- }) => Promise<AuthorizedMCP>;
21
+ }) => Promise<MCPItem[]>;
10
22
  //# sourceMappingURL=access.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../src/endpoint/access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,cAAc,EAAa,MAAM,SAAS,CAAA;AAK/E,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAA;AAK/D;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,cAAc,CAAA;CAAE,KAAK,OAAO,CAAC,aAAa,CAiDtF,CAAA"}
1
+ {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../src/endpoint/access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,SAAS,CAAA;AAInE,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAIzD,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,OAAO,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,OAAO,CAAC,aAAa,CAmCnF,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,iCAIlC;IACD,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,cAAc,EAAE,OAAO,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,OAAO,EAAE,CAmBpB,CAAA"}
@@ -1,122 +1,100 @@
1
- import crypto from 'crypto';
2
- import { UnauthorizedError } from 'payload';
3
- import { getLogger } from '../utils/getLogger.js';
1
+ import { getAccessResults, UnauthorizedError } from 'payload';
4
2
  import { getPluginConfig } from '../utils/getPluginConfig.js';
5
3
  /**
6
- * Resolves the API key (or dev-mode session) and returns the items the caller
7
- * may use. Denied items are dropped from the array.
8
- */ export const getAuthorizedMCP = async ({ req })=>{
9
- const logger = getLogger({
10
- payload: req.payload
11
- });
4
+ * Resolves the MCP caller and returns the MCP surface authorized for that request.
5
+ *
6
+ * Authorization has two layers:
7
+ * 1. Payload collection/global permissions determine whether built-in operation tools are shown.
8
+ * 2. MCP `access` callbacks can further hide any configured tool, prompt, or resource.
9
+ *
10
+ * Like Payload core operations, `overrideAccess` skips both layers.
11
+ */ export const getAuthorizedMCP = async ({ overrideAccess, req })=>{
12
12
  const pluginConfig = getPluginConfig({
13
13
  config: req.payload.config
14
14
  });
15
- const authHeader = req.headers.get('Authorization');
16
- const hasBearerToken = authHeader?.startsWith('Bearer ');
17
- const buildAuthorized = (apiKeyDoc)=>({
18
- items: pluginConfig.items.filter((item)=>{
19
- switch(item.type){
20
- case 'collectionTool':
21
- return apiKeyDoc.access.collections?.[item.collectionSlug]?.[item.configKey] !== false;
22
- case 'globalTool':
23
- return apiKeyDoc.access.globals?.[item.globalSlug]?.[item.configKey] !== false;
24
- case 'prompt':
25
- return apiKeyDoc.access.prompts?.[item.configKey] !== false;
26
- case 'resource':
27
- return apiKeyDoc.access.resources?.[item.configKey] !== false;
28
- case 'tool':
29
- return apiKeyDoc.access.tools?.[item.configKey] !== false;
30
- }
31
- }),
32
- overrideAccess: typeof apiKeyDoc.overrideAccess === 'boolean' ? apiKeyDoc.overrideAccess : false,
33
- user: apiKeyDoc.user
34
- });
35
- if (pluginConfig.overrideAuth) {
36
- return await pluginConfig.overrideAuth({
37
- getAPIKeyDoc: (overrideApiKey)=>getAPIKeyDoc({
38
- logger,
39
- overrideApiKey,
40
- pluginConfig,
41
- req
42
- }),
43
- getAuthorizedMCP: ({ apiKeyDoc })=>buildAuthorized(apiKeyDoc),
15
+ if (pluginConfig.overrideGetAuthorizedMCP) {
16
+ return await pluginConfig.overrideGetAuthorizedMCP({
17
+ overrideAccess,
44
18
  pluginConfig,
45
19
  req
46
20
  });
47
21
  }
48
- if (process.env.NODE_ENV === 'development' && !hasBearerToken) {
49
- logger.info('Dev mode: skipping API key check, using session user');
50
- return buildAuthorized({
51
- id: -1,
52
- access: {},
53
- overrideAccess: true,
54
- user: req.user ?? null
55
- });
22
+ if (req.headers) {
23
+ const headers = new Headers(req.headers);
24
+ const hasAuthorization = headers.has('Authorization');
25
+ headers.set('DisableAutologin', 'true');
26
+ req.user = (await req.payload.auth({
27
+ headers,
28
+ req
29
+ })).user;
30
+ if (hasAuthorization && !req.user) {
31
+ throw new UnauthorizedError(req.t);
32
+ }
56
33
  }
57
- return buildAuthorized(await getAPIKeyDoc({
58
- logger,
59
- pluginConfig,
60
- req
61
- }));
34
+ return {
35
+ items: await filterMCPItems({
36
+ items: pluginConfig.items,
37
+ overrideAccess,
38
+ req
39
+ }),
40
+ overrideAccess,
41
+ user: req.user
42
+ };
62
43
  };
63
- const getAPIKeyDoc = async ({ logger, overrideApiKey, pluginConfig, req })=>{
64
- const authHeader = req.headers.get('Authorization');
65
- const hasBearerToken = authHeader?.startsWith('Bearer ');
66
- const apiKey = overrideApiKey ?? (hasBearerToken ? authHeader?.replace('Bearer ', '').trim() || null : null);
67
- if (!apiKey) {
68
- throw new UnauthorizedError();
44
+ export const filterMCPItems = async ({ items, overrideAccess, req })=>{
45
+ // Match Payload core: overrideAccess bypasses access evaluation instead of
46
+ // forcing each access function to return true.
47
+ if (overrideAccess) {
48
+ return items;
69
49
  }
70
- const sha256APIKeyIndex = crypto.createHmac('sha256', req.payload.secret).update(apiKey).digest('hex');
71
- const doc = await req.payload.db.findOne({
72
- collection: 'payload-mcp-api-keys',
73
- req,
74
- where: {
75
- apiKeyIndex: {
76
- equals: sha256APIKeyIndex
77
- }
78
- }
79
- });
80
- if (!doc || !doc.user) {
81
- throw new UnauthorizedError();
82
- }
83
- logger.info('API Key is valid');
84
- const userRef = doc.user;
85
- const userID = typeof userRef === 'object' && userRef !== null && 'id' in userRef ? userRef.id : userRef;
86
- const user = await req.payload.findByID({
87
- id: userID,
88
- collection: pluginConfig.userCollection,
89
- depth: 0,
90
- disableErrors: true,
50
+ const authorizedItems = [];
51
+ const permissions = await getAccessResults({
91
52
  req
92
53
  });
93
- if (!user) {
94
- throw new UnauthorizedError();
54
+ for (const item of items){
55
+ if (!await checkItemAccess({
56
+ item,
57
+ permissions,
58
+ req
59
+ })) {
60
+ continue;
61
+ }
62
+ authorizedItems.push(item);
95
63
  }
96
- try {
97
- await req.payload.db.updateOne({
98
- id: doc.id,
99
- collection: 'payload-mcp-api-keys',
100
- data: {
101
- lastUsed: new Date().toISOString()
102
- },
103
- req,
104
- returning: false
105
- });
106
- } catch (err) {
107
- logger.warn({
108
- err,
109
- msg: 'Failed to update MCP API key last-used timestamp'
110
- });
64
+ return authorizedItems;
65
+ };
66
+ /**
67
+ * Runs MCP item access callbacks
68
+ */ const checkItemAccess = async ({ item, permissions, req })=>{
69
+ switch(item.type){
70
+ case 'collectionTool':
71
+ return !item.tool.access || await item.tool.access({
72
+ collectionSlug: item.collectionSlug,
73
+ permissions,
74
+ req
75
+ });
76
+ case 'globalTool':
77
+ return !item.tool.access || await item.tool.access({
78
+ globalSlug: item.globalSlug,
79
+ permissions,
80
+ req
81
+ });
82
+ case 'prompt':
83
+ return !item.prompt.access || await item.prompt.access({
84
+ permissions,
85
+ req
86
+ });
87
+ case 'resource':
88
+ return !item.resource.access || await item.resource.access({
89
+ permissions,
90
+ req
91
+ });
92
+ case 'tool':
93
+ return !item.tool.access || await item.tool.access({
94
+ permissions,
95
+ req
96
+ });
111
97
  }
112
- return {
113
- ...doc,
114
- user: {
115
- ...user,
116
- _strategy: 'mcp-api-key',
117
- collection: pluginConfig.userCollection
118
- }
119
- };
120
98
  };
121
99
 
122
100
  //# sourceMappingURL=access.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/endpoint/access.ts"],"sourcesContent":["import type { DefaultDocumentIDType, PayloadRequest, TypedUser } from 'payload'\n\nimport crypto from 'crypto'\nimport { UnauthorizedError } from 'payload'\n\nimport type { AuthorizedMCP, MCPAPIKeysDoc } from '../types.js'\n\nimport { getLogger } from '../utils/getLogger.js'\nimport { getPluginConfig } from '../utils/getPluginConfig.js'\n\n/**\n * Resolves the API key (or dev-mode session) and returns the items the caller\n * may use. Denied items are dropped from the array.\n */\nexport const getAuthorizedMCP: (args: { req: PayloadRequest }) => Promise<AuthorizedMCP> = async ({\n req,\n}) => {\n const logger = getLogger({ payload: req.payload })\n const pluginConfig = getPluginConfig({ config: req.payload.config })\n\n const authHeader = req.headers.get('Authorization')\n const hasBearerToken = authHeader?.startsWith('Bearer ')\n\n const buildAuthorized = (apiKeyDoc: MCPAPIKeysDoc): AuthorizedMCP => ({\n items: pluginConfig.items.filter((item) => {\n switch (item.type) {\n case 'collectionTool':\n return apiKeyDoc.access.collections?.[item.collectionSlug]?.[item.configKey] !== false\n case 'globalTool':\n return apiKeyDoc.access.globals?.[item.globalSlug]?.[item.configKey] !== false\n case 'prompt':\n return apiKeyDoc.access.prompts?.[item.configKey] !== false\n case 'resource':\n return apiKeyDoc.access.resources?.[item.configKey] !== false\n case 'tool':\n return apiKeyDoc.access.tools?.[item.configKey] !== false\n }\n }),\n overrideAccess:\n typeof apiKeyDoc.overrideAccess === 'boolean' ? apiKeyDoc.overrideAccess : false,\n user: apiKeyDoc.user,\n })\n\n if (pluginConfig.overrideAuth) {\n return await pluginConfig.overrideAuth({\n getAPIKeyDoc: (overrideApiKey) => getAPIKeyDoc({ logger, overrideApiKey, pluginConfig, req }),\n getAuthorizedMCP: ({ apiKeyDoc }) => buildAuthorized(apiKeyDoc),\n pluginConfig,\n req,\n })\n }\n\n if (process.env.NODE_ENV === 'development' && !hasBearerToken) {\n logger.info('Dev mode: skipping API key check, using session user')\n return buildAuthorized({\n id: -1,\n access: {},\n overrideAccess: true,\n user: req.user ?? null,\n })\n }\n\n return buildAuthorized(await getAPIKeyDoc({ logger, pluginConfig, req }))\n}\n\nconst getAPIKeyDoc = async ({\n logger,\n overrideApiKey,\n pluginConfig,\n req,\n}: {\n logger: ReturnType<typeof getLogger>\n overrideApiKey?: string\n pluginConfig: ReturnType<typeof getPluginConfig>\n req: PayloadRequest\n}): Promise<MCPAPIKeysDoc> => {\n const authHeader = req.headers.get('Authorization')\n const hasBearerToken = authHeader?.startsWith('Bearer ')\n\n const apiKey =\n overrideApiKey ?? (hasBearerToken ? authHeader?.replace('Bearer ', '').trim() || null : null)\n\n if (!apiKey) {\n throw new UnauthorizedError()\n }\n\n const sha256APIKeyIndex = crypto\n .createHmac('sha256', req.payload.secret)\n .update(apiKey)\n .digest('hex')\n\n const doc = await req.payload.db.findOne<MCPAPIKeysDoc>({\n collection: 'payload-mcp-api-keys',\n req,\n where: {\n apiKeyIndex: { equals: sha256APIKeyIndex },\n },\n })\n\n if (!doc || !doc.user) {\n throw new UnauthorizedError()\n }\n\n logger.info('API Key is valid')\n\n const userRef = doc.user\n const userID =\n typeof userRef === 'object' && userRef !== null && 'id' in userRef\n ? userRef.id\n : (userRef as unknown as DefaultDocumentIDType)\n\n const user = (await req.payload.findByID({\n id: userID,\n collection: pluginConfig.userCollection,\n depth: 0,\n disableErrors: true,\n req,\n })) as null | TypedUser\n\n if (!user) {\n throw new UnauthorizedError()\n }\n\n try {\n await req.payload.db.updateOne({\n id: doc.id,\n collection: 'payload-mcp-api-keys',\n data: { lastUsed: new Date().toISOString() },\n req,\n returning: false,\n })\n } catch (err) {\n logger.warn({ err, msg: 'Failed to update MCP API key last-used timestamp' })\n }\n\n return {\n ...doc,\n user: {\n ...user,\n _strategy: 'mcp-api-key' as const,\n collection: pluginConfig.userCollection,\n },\n }\n}\n"],"names":["crypto","UnauthorizedError","getLogger","getPluginConfig","getAuthorizedMCP","req","logger","payload","pluginConfig","config","authHeader","headers","get","hasBearerToken","startsWith","buildAuthorized","apiKeyDoc","items","filter","item","type","access","collections","collectionSlug","configKey","globals","globalSlug","prompts","resources","tools","overrideAccess","user","overrideAuth","getAPIKeyDoc","overrideApiKey","process","env","NODE_ENV","info","id","apiKey","replace","trim","sha256APIKeyIndex","createHmac","secret","update","digest","doc","db","findOne","collection","where","apiKeyIndex","equals","userRef","userID","findByID","userCollection","depth","disableErrors","updateOne","data","lastUsed","Date","toISOString","returning","err","warn","msg","_strategy"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/endpoint/access.ts"],"sourcesContent":["import type { PayloadRequest, SanitizedPermissions } from 'payload'\n\nimport { getAccessResults, UnauthorizedError } from 'payload'\n\nimport type { AuthorizedMCP, MCPItem } from '../types.js'\n\nimport { getPluginConfig } from '../utils/getPluginConfig.js'\n\nexport type GetAuthorizedMCPArgs = {\n overrideAccess: boolean\n req: PayloadRequest\n}\n\n/**\n * Resolves the MCP caller and returns the MCP surface authorized for that request.\n *\n * Authorization has two layers:\n * 1. Payload collection/global permissions determine whether built-in operation tools are shown.\n * 2. MCP `access` callbacks can further hide any configured tool, prompt, or resource.\n *\n * Like Payload core operations, `overrideAccess` skips both layers.\n */\nexport const getAuthorizedMCP: (args: GetAuthorizedMCPArgs) => Promise<AuthorizedMCP> = async ({\n overrideAccess,\n req,\n}) => {\n const pluginConfig = getPluginConfig({ config: req.payload.config })\n\n if (pluginConfig.overrideGetAuthorizedMCP) {\n return await pluginConfig.overrideGetAuthorizedMCP({\n overrideAccess,\n pluginConfig,\n req,\n })\n }\n\n if (req.headers) {\n const headers = new Headers(req.headers)\n const hasAuthorization = headers.has('Authorization')\n\n headers.set('DisableAutologin', 'true')\n req.user = (await req.payload.auth({ headers, req })).user\n\n if (hasAuthorization && !req.user) {\n throw new UnauthorizedError(req.t)\n }\n }\n\n return {\n items: await filterMCPItems({\n items: pluginConfig.items,\n overrideAccess,\n req,\n }),\n overrideAccess,\n user: req.user,\n }\n}\n\nexport const filterMCPItems = async ({\n items,\n overrideAccess,\n req,\n}: {\n items: MCPItem[]\n overrideAccess: boolean\n req: PayloadRequest\n}): Promise<MCPItem[]> => {\n // Match Payload core: overrideAccess bypasses access evaluation instead of\n // forcing each access function to return true.\n if (overrideAccess) {\n return items\n }\n\n const authorizedItems: MCPItem[] = []\n\n const permissions = await getAccessResults({ req })\n\n for (const item of items) {\n if (!(await checkItemAccess({ item, permissions, req }))) {\n continue\n }\n authorizedItems.push(item)\n }\n\n return authorizedItems\n}\n\n/**\n * Runs MCP item access callbacks\n */\nconst checkItemAccess = async ({\n item,\n permissions,\n req,\n}: {\n item: MCPItem\n permissions?: SanitizedPermissions\n req: PayloadRequest\n}): Promise<boolean> => {\n switch (item.type) {\n case 'collectionTool':\n return (\n !item.tool.access ||\n (await item.tool.access({ collectionSlug: item.collectionSlug, permissions, req }))\n )\n case 'globalTool':\n return (\n !item.tool.access ||\n (await item.tool.access({ globalSlug: item.globalSlug, permissions, req }))\n )\n case 'prompt':\n return !item.prompt.access || (await item.prompt.access({ permissions, req }))\n case 'resource':\n return !item.resource.access || (await item.resource.access({ permissions, req }))\n case 'tool':\n return !item.tool.access || (await item.tool.access({ permissions, req }))\n }\n}\n"],"names":["getAccessResults","UnauthorizedError","getPluginConfig","getAuthorizedMCP","overrideAccess","req","pluginConfig","config","payload","overrideGetAuthorizedMCP","headers","Headers","hasAuthorization","has","set","user","auth","t","items","filterMCPItems","authorizedItems","permissions","item","checkItemAccess","push","type","tool","access","collectionSlug","globalSlug","prompt","resource"],"mappings":"AAEA,SAASA,gBAAgB,EAAEC,iBAAiB,QAAQ,UAAS;AAI7D,SAASC,eAAe,QAAQ,8BAA6B;AAO7D;;;;;;;;CAQC,GACD,OAAO,MAAMC,mBAA2E,OAAO,EAC7FC,cAAc,EACdC,GAAG,EACJ;IACC,MAAMC,eAAeJ,gBAAgB;QAAEK,QAAQF,IAAIG,OAAO,CAACD,MAAM;IAAC;IAElE,IAAID,aAAaG,wBAAwB,EAAE;QACzC,OAAO,MAAMH,aAAaG,wBAAwB,CAAC;YACjDL;YACAE;YACAD;QACF;IACF;IAEA,IAAIA,IAAIK,OAAO,EAAE;QACf,MAAMA,UAAU,IAAIC,QAAQN,IAAIK,OAAO;QACvC,MAAME,mBAAmBF,QAAQG,GAAG,CAAC;QAErCH,QAAQI,GAAG,CAAC,oBAAoB;QAChCT,IAAIU,IAAI,GAAG,AAAC,CAAA,MAAMV,IAAIG,OAAO,CAACQ,IAAI,CAAC;YAAEN;YAASL;QAAI,EAAC,EAAGU,IAAI;QAE1D,IAAIH,oBAAoB,CAACP,IAAIU,IAAI,EAAE;YACjC,MAAM,IAAId,kBAAkBI,IAAIY,CAAC;QACnC;IACF;IAEA,OAAO;QACLC,OAAO,MAAMC,eAAe;YAC1BD,OAAOZ,aAAaY,KAAK;YACzBd;YACAC;QACF;QACAD;QACAW,MAAMV,IAAIU,IAAI;IAChB;AACF,EAAC;AAED,OAAO,MAAMI,iBAAiB,OAAO,EACnCD,KAAK,EACLd,cAAc,EACdC,GAAG,EAKJ;IACC,2EAA2E;IAC3E,+CAA+C;IAC/C,IAAID,gBAAgB;QAClB,OAAOc;IACT;IAEA,MAAME,kBAA6B,EAAE;IAErC,MAAMC,cAAc,MAAMrB,iBAAiB;QAAEK;IAAI;IAEjD,KAAK,MAAMiB,QAAQJ,MAAO;QACxB,IAAI,CAAE,MAAMK,gBAAgB;YAAED;YAAMD;YAAahB;QAAI,IAAK;YACxD;QACF;QACAe,gBAAgBI,IAAI,CAACF;IACvB;IAEA,OAAOF;AACT,EAAC;AAED;;CAEC,GACD,MAAMG,kBAAkB,OAAO,EAC7BD,IAAI,EACJD,WAAW,EACXhB,GAAG,EAKJ;IACC,OAAQiB,KAAKG,IAAI;QACf,KAAK;YACH,OACE,CAACH,KAAKI,IAAI,CAACC,MAAM,IAChB,MAAML,KAAKI,IAAI,CAACC,MAAM,CAAC;gBAAEC,gBAAgBN,KAAKM,cAAc;gBAAEP;gBAAahB;YAAI;QAEpF,KAAK;YACH,OACE,CAACiB,KAAKI,IAAI,CAACC,MAAM,IAChB,MAAML,KAAKI,IAAI,CAACC,MAAM,CAAC;gBAAEE,YAAYP,KAAKO,UAAU;gBAAER;gBAAahB;YAAI;QAE5E,KAAK;YACH,OAAO,CAACiB,KAAKQ,MAAM,CAACH,MAAM,IAAK,MAAML,KAAKQ,MAAM,CAACH,MAAM,CAAC;gBAAEN;gBAAahB;YAAI;QAC7E,KAAK;YACH,OAAO,CAACiB,KAAKS,QAAQ,CAACJ,MAAM,IAAK,MAAML,KAAKS,QAAQ,CAACJ,MAAM,CAAC;gBAAEN;gBAAahB;YAAI;QACjF,KAAK;YACH,OAAO,CAACiB,KAAKI,IAAI,CAACC,MAAM,IAAK,MAAML,KAAKI,IAAI,CAACC,MAAM,CAAC;gBAAEN;gBAAahB;YAAI;IAC3E;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/endpoint/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAMvD,eAAO,MAAM,WAAW,EAAE,cA2BzB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/endpoint/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAMvD,eAAO,MAAM,WAAW,EAAE,cAwCzB,CAAA"}
@@ -11,7 +11,18 @@ export const mcpEndpoint = async (req)=>{
11
11
  const pluginConfig = getPluginConfig({
12
12
  config: req.payload.config
13
13
  });
14
+ const overrideAccessParam = new URL(req.url).searchParams.get('overrideAccess');
15
+ if (overrideAccessParam !== null && process.env.NODE_ENV !== 'development') {
16
+ throw new APIError('MCP overrideAccess is only available in development.', 400);
17
+ }
18
+ let overrideAccess = false;
19
+ if (overrideAccessParam === 'true') {
20
+ overrideAccess = true;
21
+ } else if (overrideAccessParam !== null && overrideAccessParam !== 'false') {
22
+ throw new APIError('MCP overrideAccess must be "true" or "false".', 400);
23
+ }
14
24
  const authorizedMCP = await getAuthorizedMCP({
25
+ overrideAccess,
15
26
  req
16
27
  });
17
28
  const server = buildMcpServer({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/endpoint/index.ts"],"sourcesContent":["import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server'\nimport { APIError, type PayloadHandler } from 'payload'\n\nimport { buildMcpServer } from '../mcp/buildMcpServer.js'\nimport { getPluginConfig } from '../utils/getPluginConfig.js'\nimport { getAuthorizedMCP } from './access.js'\n\nexport const mcpEndpoint: PayloadHandler = async (req) => {\n if (!req.url) {\n throw new APIError('Missing request URL', 400)\n }\n\n req.payloadAPI = 'MCP' as const\n\n const pluginConfig = getPluginConfig({ config: req.payload.config })\n const authorizedMCP = await getAuthorizedMCP({ req })\n\n const server = buildMcpServer({ authorizedMCP, pluginConfig, req })\n\n const transport = new WebStandardStreamableHTTPServerTransport({\n enableJsonResponse: true,\n sessionIdGenerator: undefined, // stateless mode\n })\n\n await server.connect(transport)\n\n const mcpRequest = new Request(req.url, {\n body: req.body,\n duplex: 'half',\n headers: req.headers,\n method: req.method,\n } as { duplex: 'half' } & RequestInit)\n\n return await transport.handleRequest(mcpRequest)\n}\n"],"names":["WebStandardStreamableHTTPServerTransport","APIError","buildMcpServer","getPluginConfig","getAuthorizedMCP","mcpEndpoint","req","url","payloadAPI","pluginConfig","config","payload","authorizedMCP","server","transport","enableJsonResponse","sessionIdGenerator","undefined","connect","mcpRequest","Request","body","duplex","headers","method","handleRequest"],"mappings":"AAAA,SAASA,wCAAwC,QAAQ,+BAA8B;AACvF,SAASC,QAAQ,QAA6B,UAAS;AAEvD,SAASC,cAAc,QAAQ,2BAA0B;AACzD,SAASC,eAAe,QAAQ,8BAA6B;AAC7D,SAASC,gBAAgB,QAAQ,cAAa;AAE9C,OAAO,MAAMC,cAA8B,OAAOC;IAChD,IAAI,CAACA,IAAIC,GAAG,EAAE;QACZ,MAAM,IAAIN,SAAS,uBAAuB;IAC5C;IAEAK,IAAIE,UAAU,GAAG;IAEjB,MAAMC,eAAeN,gBAAgB;QAAEO,QAAQJ,IAAIK,OAAO,CAACD,MAAM;IAAC;IAClE,MAAME,gBAAgB,MAAMR,iBAAiB;QAAEE;IAAI;IAEnD,MAAMO,SAASX,eAAe;QAAEU;QAAeH;QAAcH;IAAI;IAEjE,MAAMQ,YAAY,IAAId,yCAAyC;QAC7De,oBAAoB;QACpBC,oBAAoBC;IACtB;IAEA,MAAMJ,OAAOK,OAAO,CAACJ;IAErB,MAAMK,aAAa,IAAIC,QAAQd,IAAIC,GAAG,EAAE;QACtCc,MAAMf,IAAIe,IAAI;QACdC,QAAQ;QACRC,SAASjB,IAAIiB,OAAO;QACpBC,QAAQlB,IAAIkB,MAAM;IACpB;IAEA,OAAO,MAAMV,UAAUW,aAAa,CAACN;AACvC,EAAC"}
1
+ {"version":3,"sources":["../../src/endpoint/index.ts"],"sourcesContent":["import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server'\nimport { APIError, type PayloadHandler } from 'payload'\n\nimport { buildMcpServer } from '../mcp/buildMcpServer.js'\nimport { getPluginConfig } from '../utils/getPluginConfig.js'\nimport { getAuthorizedMCP } from './access.js'\n\nexport const mcpEndpoint: PayloadHandler = async (req) => {\n if (!req.url) {\n throw new APIError('Missing request URL', 400)\n }\n\n req.payloadAPI = 'MCP' as const\n\n const pluginConfig = getPluginConfig({ config: req.payload.config })\n const overrideAccessParam = new URL(req.url).searchParams.get('overrideAccess')\n\n if (overrideAccessParam !== null && process.env.NODE_ENV !== 'development') {\n throw new APIError('MCP overrideAccess is only available in development.', 400)\n }\n\n let overrideAccess = false\n if (overrideAccessParam === 'true') {\n overrideAccess = true\n } else if (overrideAccessParam !== null && overrideAccessParam !== 'false') {\n throw new APIError('MCP overrideAccess must be \"true\" or \"false\".', 400)\n }\n\n const authorizedMCP = await getAuthorizedMCP({ overrideAccess, req })\n\n const server = buildMcpServer({ authorizedMCP, pluginConfig, req })\n\n const transport = new WebStandardStreamableHTTPServerTransport({\n enableJsonResponse: true,\n sessionIdGenerator: undefined, // stateless mode\n })\n\n await server.connect(transport)\n\n const mcpRequest = new Request(req.url, {\n body: req.body,\n duplex: 'half',\n headers: req.headers,\n method: req.method,\n } as { duplex: 'half' } & RequestInit)\n\n return await transport.handleRequest(mcpRequest)\n}\n"],"names":["WebStandardStreamableHTTPServerTransport","APIError","buildMcpServer","getPluginConfig","getAuthorizedMCP","mcpEndpoint","req","url","payloadAPI","pluginConfig","config","payload","overrideAccessParam","URL","searchParams","get","process","env","NODE_ENV","overrideAccess","authorizedMCP","server","transport","enableJsonResponse","sessionIdGenerator","undefined","connect","mcpRequest","Request","body","duplex","headers","method","handleRequest"],"mappings":"AAAA,SAASA,wCAAwC,QAAQ,+BAA8B;AACvF,SAASC,QAAQ,QAA6B,UAAS;AAEvD,SAASC,cAAc,QAAQ,2BAA0B;AACzD,SAASC,eAAe,QAAQ,8BAA6B;AAC7D,SAASC,gBAAgB,QAAQ,cAAa;AAE9C,OAAO,MAAMC,cAA8B,OAAOC;IAChD,IAAI,CAACA,IAAIC,GAAG,EAAE;QACZ,MAAM,IAAIN,SAAS,uBAAuB;IAC5C;IAEAK,IAAIE,UAAU,GAAG;IAEjB,MAAMC,eAAeN,gBAAgB;QAAEO,QAAQJ,IAAIK,OAAO,CAACD,MAAM;IAAC;IAClE,MAAME,sBAAsB,IAAIC,IAAIP,IAAIC,GAAG,EAAEO,YAAY,CAACC,GAAG,CAAC;IAE9D,IAAIH,wBAAwB,QAAQI,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QAC1E,MAAM,IAAIjB,SAAS,wDAAwD;IAC7E;IAEA,IAAIkB,iBAAiB;IACrB,IAAIP,wBAAwB,QAAQ;QAClCO,iBAAiB;IACnB,OAAO,IAAIP,wBAAwB,QAAQA,wBAAwB,SAAS;QAC1E,MAAM,IAAIX,SAAS,iDAAiD;IACtE;IAEA,MAAMmB,gBAAgB,MAAMhB,iBAAiB;QAAEe;QAAgBb;IAAI;IAEnE,MAAMe,SAASnB,eAAe;QAAEkB;QAAeX;QAAcH;IAAI;IAEjE,MAAMgB,YAAY,IAAItB,yCAAyC;QAC7DuB,oBAAoB;QACpBC,oBAAoBC;IACtB;IAEA,MAAMJ,OAAOK,OAAO,CAACJ;IAErB,MAAMK,aAAa,IAAIC,QAAQtB,IAAIC,GAAG,EAAE;QACtCsB,MAAMvB,IAAIuB,IAAI;QACdC,QAAQ;QACRC,SAASzB,IAAIyB,OAAO;QACpBC,QAAQ1B,IAAI0B,MAAM;IACpB;IAEA,OAAO,MAAMV,UAAUW,aAAa,CAACN;AACvC,EAAC"}
@@ -1,5 +1,2 @@
1
- export { AccessField } from '../components/AccessField/index.client.js';
2
- export { APIKeyField } from '../components/APIKeyField/index.client.js';
3
- export { APIKeysEmptyState } from '../components/APIKeysEmptyState/index.client.js';
4
- export { MCPSettingsMenu } from '../components/SettingsMenu/index.client.js';
1
+ export {};
5
2
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAA;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAA"}
@@ -1,7 +1,4 @@
1
1
  'use client';
2
- export { AccessField } from '../components/AccessField/index.client.js';
3
- export { APIKeyField } from '../components/APIKeyField/index.client.js';
4
- export { APIKeysEmptyState } from '../components/APIKeysEmptyState/index.client.js';
5
- export { MCPSettingsMenu } from '../components/SettingsMenu/index.client.js';
2
+ export { };
6
3
 
7
4
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["'use client'\nexport { AccessField } from '../components/AccessField/index.client.js'\nexport { APIKeyField } from '../components/APIKeyField/index.client.js'\nexport { APIKeysEmptyState } from '../components/APIKeysEmptyState/index.client.js'\nexport { MCPSettingsMenu } from '../components/SettingsMenu/index.client.js'\n"],"names":["AccessField","APIKeyField","APIKeysEmptyState","MCPSettingsMenu"],"mappings":"AAAA;AACA,SAASA,WAAW,QAAQ,4CAA2C;AACvE,SAASC,WAAW,QAAQ,4CAA2C;AACvE,SAASC,iBAAiB,QAAQ,kDAAiD;AACnF,SAASC,eAAe,QAAQ,6CAA4C"}
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["'use client'\n\nexport {}\n"],"names":[],"mappings":"AAAA;AAEA,WAAS"}
@@ -0,0 +1,2 @@
1
+ export { filterMCPItems, getAuthorizedMCP } from '../endpoint/access.js';
2
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/exports/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { filterMCPItems, getAuthorizedMCP } from '../endpoint/access.js';
2
+
3
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/internal.ts"],"sourcesContent":["export { filterMCPItems, getAuthorizedMCP } from '../endpoint/access.js'\n"],"names":["filterMCPItems","getAuthorizedMCP"],"mappings":"AAAA,SAASA,cAAc,EAAEC,gBAAgB,QAAQ,wBAAuB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAO1F,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,cAAc;QAC7B,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAA;KACjD;IACD,UAAU,iBAAiB;QACzB,uFAAuF;QACvF,wBAAwB,EAAE,eAAe,CAAA;KAC1C;CACF;AAED,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,CAAA;AAExE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAElG,eAAO,MAAM,SAAS,wDAkFpB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAK1F,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,cAAc;QAC7B,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAA;KACjD;IACD,UAAU,iBAAiB;QACzB,uFAAuF;QACvF,wBAAwB,EAAE,eAAe,CAAA;KAC1C;CACF;AAED,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,CAAA;AAExE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAElG,eAAO,MAAM,SAAS,wDAiCpB,CAAA"}
package/dist/index.js CHANGED
@@ -1,22 +1,11 @@
1
- import { defaultUserCollection, definePlugin } from 'payload';
2
- import { getAPIKeysCollection } from './collection/index.js';
1
+ import { definePlugin } from 'payload';
3
2
  import { mcpEndpoint } from './endpoint/index.js';
4
3
  import { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js';
5
- import { translations } from './translations/index.js';
6
4
  export { defineCollectionTool, defineGlobalTool, definePrompt, defineTool } from './defineTool.js';
7
5
  export const mcpPlugin = definePlugin({
8
6
  slug: '@payloadcms/plugin-mcp',
9
7
  order: 10,
10
8
  plugin: ({ config, plugins, ...rawConfig })=>{
11
- // If a project has no auth collection yet, add the default users collection
12
- // so the relationship target and default `userCollection` exist.
13
- if (!config.admin?.user) {
14
- const firstCollectionWithAuth = (config.collections ?? []).find(({ auth })=>Boolean(auth));
15
- if (!firstCollectionWithAuth) {
16
- ;
17
- (config.collections ??= []).push(defaultUserCollection);
18
- }
19
- }
20
9
  const pluginConfig = sanitizeMCPConfig({
21
10
  config,
22
11
  pluginConfig: rawConfig
@@ -27,48 +16,11 @@ export const mcpPlugin = definePlugin({
27
16
  // @ts-expect-error
28
17
  registered.sanitizedOptions = pluginConfig;
29
18
  }
30
- ;
31
- (config.collections ??= []).push(getAPIKeysCollection({
32
- pluginConfig
33
- }));
34
- if (!config.i18n) {
35
- config.i18n = {};
36
- }
37
- if (!config.i18n.translations) {
38
- config.i18n.translations = {};
39
- }
40
- const supportedLanguageKeys = config.i18n.supportedLanguages ? Object.keys(config.i18n.supportedLanguages) : [
41
- 'en'
42
- ];
43
- for (const lang of supportedLanguageKeys){
44
- const pluginEntry = translations[lang];
45
- if (!pluginEntry) {
46
- continue;
47
- }
48
- const typedLocale = lang;
49
- const existing = config.i18n.translations[typedLocale] ?? {};
50
- config.i18n.translations[typedLocale] = {
51
- ...existing,
52
- 'plugin-mcp': pluginEntry.translations['plugin-mcp']
53
- };
54
- }
55
- // Keep the API-keys collection registered even when disabled, so DB schema
56
- // and generated types don't drift between enabled/disabled environments.
57
19
  if (pluginConfig.disabled) {
58
20
  return config;
59
21
  }
60
22
  return {
61
23
  ...config,
62
- admin: {
63
- ...config.admin,
64
- components: {
65
- ...config.admin?.components,
66
- userMenuSettingsItems: [
67
- ...config.admin?.components?.userMenuSettingsItems ?? [],
68
- '@payloadcms/plugin-mcp/client#MCPSettingsMenu'
69
- ]
70
- }
71
- },
72
24
  endpoints: [
73
25
  ...config.endpoints ?? [],
74
26
  // Payload prefixes /api, so the full path is /api/mcp.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\n\nimport { defaultUserCollection, definePlugin } from 'payload'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig } from './types.js'\n\nimport { getAPIKeysCollection } from './collection/index.js'\nimport { mcpEndpoint } from './endpoint/index.js'\nimport { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js'\nimport { translations } from './translations/index.js'\n\ndeclare module 'payload' {\n export interface PayloadRequest {\n payloadAPI: 'GraphQL' | 'local' | 'MCP' | 'REST'\n }\n interface RegisteredPlugins {\n /** After the plugin's `plugin` callback runs, `options` holds the sanitized config. */\n '@payloadcms/plugin-mcp': MCPPluginConfig\n }\n}\n\nexport type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig }\n\nexport { defineCollectionTool, defineGlobalTool, definePrompt, defineTool } from './defineTool.js'\n\nexport const mcpPlugin = definePlugin<MCPPluginConfig>({\n slug: '@payloadcms/plugin-mcp',\n order: 10,\n plugin: ({ config, plugins, ...rawConfig }) => {\n // If a project has no auth collection yet, add the default users collection\n // so the relationship target and default `userCollection` exist.\n if (!config.admin?.user) {\n const firstCollectionWithAuth = (config.collections ?? []).find(({ auth }) => Boolean(auth))\n if (!firstCollectionWithAuth) {\n ;(config.collections ??= []).push(defaultUserCollection)\n }\n }\n\n const pluginConfig = sanitizeMCPConfig({ config, pluginConfig: rawConfig })\n\n // Stash the sanitized config on plugin options so `getPluginConfig()` reads it.\n const registered = plugins['@payloadcms/plugin-mcp']\n if (registered) {\n // @ts-expect-error\n registered.sanitizedOptions = pluginConfig as unknown as typeof registered.options\n }\n\n ;(config.collections ??= []).push(getAPIKeysCollection({ pluginConfig }))\n\n if (!config.i18n) {\n config.i18n = {}\n }\n\n if (!config.i18n.translations) {\n config.i18n.translations = {}\n }\n\n const supportedLanguageKeys = config.i18n.supportedLanguages\n ? Object.keys(config.i18n.supportedLanguages)\n : ['en']\n\n for (const lang of supportedLanguageKeys) {\n const pluginEntry = translations[lang as keyof typeof translations]\n if (!pluginEntry) {\n continue\n }\n\n const typedLocale = lang as AcceptedLanguages\n const existing = (config.i18n.translations[typedLocale] ?? {}) as Record<string, unknown>\n config.i18n.translations[typedLocale] = {\n ...existing,\n 'plugin-mcp': pluginEntry.translations['plugin-mcp'],\n } as PluginDefaultTranslationsObject\n }\n\n // Keep the API-keys collection registered even when disabled, so DB schema\n // and generated types don't drift between enabled/disabled environments.\n if (pluginConfig.disabled) {\n return config\n }\n\n return {\n ...config,\n admin: {\n ...config.admin,\n components: {\n ...config.admin?.components,\n userMenuSettingsItems: [\n ...(config.admin?.components?.userMenuSettingsItems ?? []),\n '@payloadcms/plugin-mcp/client#MCPSettingsMenu',\n ],\n },\n },\n endpoints: [\n ...(config.endpoints ?? []),\n // Payload prefixes /api, so the full path is /api/mcp.\n { handler: mcpEndpoint, method: 'post', path: '/mcp' },\n // Streamable HTTP's optional server=>client GET stream. We don't offer\n // one, so answer 405 per spec-— clients then skip it cleanly\n {\n handler: () => new Response(null, { headers: { Allow: 'POST' }, status: 405 }),\n method: 'get',\n path: '/mcp',\n },\n ],\n }\n },\n})\n"],"names":["defaultUserCollection","definePlugin","getAPIKeysCollection","mcpEndpoint","sanitizeMCPConfig","translations","defineCollectionTool","defineGlobalTool","definePrompt","defineTool","mcpPlugin","slug","order","plugin","config","plugins","rawConfig","admin","user","firstCollectionWithAuth","collections","find","auth","Boolean","push","pluginConfig","registered","sanitizedOptions","i18n","supportedLanguageKeys","supportedLanguages","Object","keys","lang","pluginEntry","typedLocale","existing","disabled","components","userMenuSettingsItems","endpoints","handler","method","path","Response","headers","Allow","status"],"mappings":"AAEA,SAASA,qBAAqB,EAAEC,YAAY,QAAQ,UAAS;AAK7D,SAASC,oBAAoB,QAAQ,wBAAuB;AAC5D,SAASC,WAAW,QAAQ,sBAAqB;AACjD,SAASC,iBAAiB,QAAQ,6BAA4B;AAC9D,SAASC,YAAY,QAAQ,0BAAyB;AActD,SAASC,oBAAoB,EAAEC,gBAAgB,EAAEC,YAAY,EAAEC,UAAU,QAAQ,kBAAiB;AAElG,OAAO,MAAMC,YAAYT,aAA8B;IACrDU,MAAM;IACNC,OAAO;IACPC,QAAQ,CAAC,EAAEC,MAAM,EAAEC,OAAO,EAAE,GAAGC,WAAW;QACxC,4EAA4E;QAC5E,iEAAiE;QACjE,IAAI,CAACF,OAAOG,KAAK,EAAEC,MAAM;YACvB,MAAMC,0BAA0B,AAACL,CAAAA,OAAOM,WAAW,IAAI,EAAE,AAAD,EAAGC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKC,QAAQD;YACtF,IAAI,CAACH,yBAAyB;;gBAC1BL,CAAAA,OAAOM,WAAW,KAAK,EAAE,AAAD,EAAGI,IAAI,CAACxB;YACpC;QACF;QAEA,MAAMyB,eAAerB,kBAAkB;YAAEU;YAAQW,cAAcT;QAAU;QAEzE,gFAAgF;QAChF,MAAMU,aAAaX,OAAO,CAAC,yBAAyB;QACpD,IAAIW,YAAY;YACd,mBAAmB;YACnBA,WAAWC,gBAAgB,GAAGF;QAChC;;QAEEX,CAAAA,OAAOM,WAAW,KAAK,EAAE,AAAD,EAAGI,IAAI,CAACtB,qBAAqB;YAAEuB;QAAa;QAEtE,IAAI,CAACX,OAAOc,IAAI,EAAE;YAChBd,OAAOc,IAAI,GAAG,CAAC;QACjB;QAEA,IAAI,CAACd,OAAOc,IAAI,CAACvB,YAAY,EAAE;YAC7BS,OAAOc,IAAI,CAACvB,YAAY,GAAG,CAAC;QAC9B;QAEA,MAAMwB,wBAAwBf,OAAOc,IAAI,CAACE,kBAAkB,GACxDC,OAAOC,IAAI,CAAClB,OAAOc,IAAI,CAACE,kBAAkB,IAC1C;YAAC;SAAK;QAEV,KAAK,MAAMG,QAAQJ,sBAAuB;YACxC,MAAMK,cAAc7B,YAAY,CAAC4B,KAAkC;YACnE,IAAI,CAACC,aAAa;gBAChB;YACF;YAEA,MAAMC,cAAcF;YACpB,MAAMG,WAAYtB,OAAOc,IAAI,CAACvB,YAAY,CAAC8B,YAAY,IAAI,CAAC;YAC5DrB,OAAOc,IAAI,CAACvB,YAAY,CAAC8B,YAAY,GAAG;gBACtC,GAAGC,QAAQ;gBACX,cAAcF,YAAY7B,YAAY,CAAC,aAAa;YACtD;QACF;QAEA,2EAA2E;QAC3E,yEAAyE;QACzE,IAAIoB,aAAaY,QAAQ,EAAE;YACzB,OAAOvB;QACT;QAEA,OAAO;YACL,GAAGA,MAAM;YACTG,OAAO;gBACL,GAAGH,OAAOG,KAAK;gBACfqB,YAAY;oBACV,GAAGxB,OAAOG,KAAK,EAAEqB,UAAU;oBAC3BC,uBAAuB;2BACjBzB,OAAOG,KAAK,EAAEqB,YAAYC,yBAAyB,EAAE;wBACzD;qBACD;gBACH;YACF;YACAC,WAAW;mBACL1B,OAAO0B,SAAS,IAAI,EAAE;gBAC1B,uDAAuD;gBACvD;oBAAEC,SAAStC;oBAAauC,QAAQ;oBAAQC,MAAM;gBAAO;gBACrD,uEAAuE;gBACvE,6DAA6D;gBAC7D;oBACEF,SAAS,IAAM,IAAIG,SAAS,MAAM;4BAAEC,SAAS;gCAAEC,OAAO;4BAAO;4BAAGC,QAAQ;wBAAI;oBAC5EL,QAAQ;oBACRC,MAAM;gBACR;aACD;QACH;IACF;AACF,GAAE"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { definePlugin } from 'payload'\n\nimport type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig } from './types.js'\n\nimport { mcpEndpoint } from './endpoint/index.js'\nimport { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js'\n\ndeclare module 'payload' {\n export interface PayloadRequest {\n payloadAPI: 'GraphQL' | 'local' | 'MCP' | 'REST'\n }\n interface RegisteredPlugins {\n /** After the plugin's `plugin` callback runs, `options` holds the sanitized config. */\n '@payloadcms/plugin-mcp': MCPPluginConfig\n }\n}\n\nexport type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig }\n\nexport { defineCollectionTool, defineGlobalTool, definePrompt, defineTool } from './defineTool.js'\n\nexport const mcpPlugin = definePlugin<MCPPluginConfig>({\n slug: '@payloadcms/plugin-mcp',\n order: 10,\n plugin: ({ config, plugins, ...rawConfig }) => {\n const pluginConfig = sanitizeMCPConfig({ config, pluginConfig: rawConfig })\n\n // Stash the sanitized config on plugin options so `getPluginConfig()` reads it.\n const registered = plugins['@payloadcms/plugin-mcp']\n if (registered) {\n // @ts-expect-error\n registered.sanitizedOptions = pluginConfig as unknown as typeof registered.options\n }\n\n if (pluginConfig.disabled) {\n return config\n }\n\n return {\n ...config,\n endpoints: [\n ...(config.endpoints ?? []),\n // Payload prefixes /api, so the full path is /api/mcp.\n { handler: mcpEndpoint, method: 'post', path: '/mcp' },\n // Streamable HTTP's optional server=>client GET stream. We don't offer\n // one, so answer 405 per spec-— clients then skip it cleanly\n {\n handler: () => new Response(null, { headers: { Allow: 'POST' }, status: 405 }),\n method: 'get',\n path: '/mcp',\n },\n ],\n }\n },\n})\n"],"names":["definePlugin","mcpEndpoint","sanitizeMCPConfig","defineCollectionTool","defineGlobalTool","definePrompt","defineTool","mcpPlugin","slug","order","plugin","config","plugins","rawConfig","pluginConfig","registered","sanitizedOptions","disabled","endpoints","handler","method","path","Response","headers","Allow","status"],"mappings":"AAAA,SAASA,YAAY,QAAQ,UAAS;AAItC,SAASC,WAAW,QAAQ,sBAAqB;AACjD,SAASC,iBAAiB,QAAQ,6BAA4B;AAc9D,SAASC,oBAAoB,EAAEC,gBAAgB,EAAEC,YAAY,EAAEC,UAAU,QAAQ,kBAAiB;AAElG,OAAO,MAAMC,YAAYP,aAA8B;IACrDQ,MAAM;IACNC,OAAO;IACPC,QAAQ,CAAC,EAAEC,MAAM,EAAEC,OAAO,EAAE,GAAGC,WAAW;QACxC,MAAMC,eAAeZ,kBAAkB;YAAES;YAAQG,cAAcD;QAAU;QAEzE,gFAAgF;QAChF,MAAME,aAAaH,OAAO,CAAC,yBAAyB;QACpD,IAAIG,YAAY;YACd,mBAAmB;YACnBA,WAAWC,gBAAgB,GAAGF;QAChC;QAEA,IAAIA,aAAaG,QAAQ,EAAE;YACzB,OAAON;QACT;QAEA,OAAO;YACL,GAAGA,MAAM;YACTO,WAAW;mBACLP,OAAOO,SAAS,IAAI,EAAE;gBAC1B,uDAAuD;gBACvD;oBAAEC,SAASlB;oBAAamB,QAAQ;oBAAQC,MAAM;gBAAO;gBACrD,uEAAuE;gBACvE,6DAA6D;gBAC7D;oBACEF,SAAS,IAAM,IAAIG,SAAS,MAAM;4BAAEC,SAAS;gCAAEC,OAAO;4BAAO;4BAAGC,QAAQ;wBAAI;oBAC5EL,QAAQ;oBACRC,MAAM;gBACR;aACD;QACH;IACF;AACF,GAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"buildMcpServer.d.ts","sourceRoot":"","sources":["../../src/mcp/buildMcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,8BAA8B,CAAA;AAC5E,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAGvD,OAAO,KAAK,EACV,aAAa,EAMb,wBAAwB,EAEzB,MAAM,aAAa,CAAA;AAKpB;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GAAI,uCAI5B;IACD,aAAa,EAAE,aAAa,CAAA;IAC5B,YAAY,EAAE,wBAAwB,CAAA;IACtC,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,SAuLH,CAAA"}
1
+ {"version":3,"file":"buildMcpServer.d.ts","sourceRoot":"","sources":["../../src/mcp/buildMcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,8BAA8B,CAAA;AAC5E,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAGvD,OAAO,KAAK,EACV,aAAa,EAMb,wBAAwB,EAEzB,MAAM,aAAa,CAAA;AAKpB;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GAAI,uCAI5B;IACD,aAAa,EAAE,aAAa,CAAA;IAC5B,YAAY,EAAE,wBAAwB,CAAA;IACtC,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,SA8LH,CAAA"}
@@ -94,6 +94,7 @@ import { toStandardSchema } from '../utils/toStandardSchema.js';
94
94
  input: item.tool.input
95
95
  });
96
96
  server.registerTool(item.mcpName, {
97
+ annotations: item.tool.annotations,
97
98
  description: item.tool.description,
98
99
  inputSchema: toStandardSchema(inputSchema)
99
100
  }, async (input, ctx)=>callEntityTool({
@@ -147,6 +148,7 @@ import { toStandardSchema } from '../utils/toStandardSchema.js';
147
148
  {
148
149
  const tool = item.tool;
149
150
  server.registerTool(item.mcpName, {
151
+ annotations: tool.annotations,
150
152
  description: tool.description,
151
153
  inputSchema: tool.input ? toStandardSchema(tool.input) : undefined
152
154
  }, async (input, ctx)=>finalizeToolResponse(await tool.handler({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/buildMcpServer.ts"],"sourcesContent":["import { McpServer, type ServerContext } from '@modelcontextprotocol/server'\nimport { APIError, type PayloadRequest } from 'payload'\nimport { z } from 'zod'\n\nimport type {\n AuthorizedMCP,\n CollectionMCPItem,\n GlobalMCPItem,\n JsonSchemaType,\n MCPResponseOverride,\n MCPToolResponse,\n SanitizedMCPPluginConfig,\n ToolInputSchema,\n} from '../types.js'\n\nimport { getLogger } from '../utils/getLogger.js'\nimport { toStandardSchema } from '../utils/toStandardSchema.js'\n\n/**\n * Transport-agnostic core: registers every authorized MCP item onto a fresh\n * `McpServer` and returns it. The caller is responsible for picking a transport\n * (`WebStandardStreamableHTTPServerTransport`, `StdioServerTransport`, …) and\n * calling `server.connect(transport)`.\n *\n * `req` is the request context handlers see. For HTTP it's the live\n * `PayloadRequest` derived from the incoming HTTP request; for stdio it's a\n * synthesized one built via `createLocalReq`.\n */\nexport const buildMcpServer = ({\n authorizedMCP,\n pluginConfig,\n req,\n}: {\n authorizedMCP: AuthorizedMCP\n pluginConfig: SanitizedMCPPluginConfig\n req: PayloadRequest\n}): McpServer => {\n const serverOptions = pluginConfig.mcp?.serverOptions || {}\n const server = new McpServer(\n { name: 'Payload MCP Server', version: '1.0.0', ...serverOptions.serverInfo },\n serverOptions.options,\n )\n\n const logger = getLogger({ payload: req.payload })\n\n /**\n * Wrap a tool handler's response with the tool's `overrideResponse`, then\n * strip the internal `doc` field so it doesn't leak onto the wire.\n */\n const finalizeToolResponse = (\n response: MCPToolResponse,\n overrideResponse?: MCPResponseOverride,\n ): MCPToolResponse => {\n const overridden = overrideResponse?.(response, response.doc ?? {}, req) ?? response\n const { doc: _doc, ...rest } = overridden\n return rest\n }\n\n /**\n * Runs a collection/global tool call:\n * - reads `collectionSlug` / `globalSlug` from the input\n * - runs access control: errors if `authorizedMCP.items` has no entry for this tool + slug\n * - runs the tool handler and finalizes its response\n */\n const callEntityTool = async ({\n input,\n item,\n serverContext,\n }: {\n input: unknown\n item: CollectionMCPItem | GlobalMCPItem\n serverContext: ServerContext\n }): Promise<MCPToolResponse> => {\n const entity = item.type === 'collectionTool' ? 'collection' : 'global'\n const slugKey = item.type === 'collectionTool' ? 'collectionSlug' : 'globalSlug'\n const toolInput = (input ?? {}) as Record<string, unknown>\n const slug = toolInput[slugKey] as string | undefined\n\n if (!slug) {\n return {\n content: [\n {\n type: 'text',\n text: `Error: \"${item.mcpName}\" requires ${slugKey}. Use getConfigInfo to inspect ${entity} slugs.`,\n },\n ],\n isError: true,\n }\n }\n\n const match = authorizedMCP.items.find(\n (candidate): candidate is CollectionMCPItem | GlobalMCPItem =>\n candidate.type === item.type &&\n candidate.mcpName === item.mcpName &&\n (candidate.type === 'collectionTool'\n ? candidate.collectionSlug === slug\n : candidate.type === 'globalTool' && candidate.globalSlug === slug),\n )\n\n if (!match) {\n return {\n content: [\n {\n type: 'text',\n text: `Error: MCP access to \"${item.mcpName}\" is not enabled for ${entity} \"${slug}\"`,\n },\n ],\n isError: true,\n }\n }\n\n const handlerArgs = { authorizedMCP, input: toolInput, req, serverContext }\n const response = await (match.type === 'collectionTool'\n ? match.tool.handler({ ...handlerArgs, collectionSlug: slug })\n : match.tool.handler({ ...handlerArgs, globalSlug: slug }))\n\n return finalizeToolResponse(response, match.tool.overrideResponse)\n }\n\n try {\n const registeredEntityTools = new Set<string>()\n\n for (const item of authorizedMCP.items) {\n switch (item.type) {\n case 'collectionTool':\n case 'globalTool': {\n if (registeredEntityTools.has(item.mcpName)) {\n break\n }\n registeredEntityTools.add(item.mcpName)\n\n const inputSchema = withSlugInput({\n name: item.type === 'collectionTool' ? 'collectionSlug' : 'globalSlug',\n input: item.tool.input,\n })\n\n server.registerTool(\n item.mcpName,\n {\n description: item.tool.description,\n inputSchema: toStandardSchema(inputSchema),\n },\n async (input: unknown, ctx: ServerContext) =>\n callEntityTool({ input, item, serverContext: ctx }),\n )\n logger.info(`✅ Tool: ${item.mcpName} Registered.`)\n break\n }\n case 'prompt': {\n const prompt = item.prompt\n server.registerPrompt(\n item.mcpName,\n {\n argsSchema: prompt.argsSchema ? toStandardSchema(prompt.argsSchema) : undefined,\n description: prompt.description,\n title: prompt.title,\n },\n async (input: unknown, ctx: ServerContext) =>\n prompt.handler({\n input: (input ?? {}) as Record<string, unknown>,\n req,\n serverContext: ctx,\n }),\n )\n logger.info(`✅ Prompt: ${prompt.title} Registered.`)\n break\n }\n case 'resource': {\n const resource = item.resource\n server.registerResource(\n item.mcpName,\n // @ts-expect-error - Overload type ambiguity (string OR ResourceTemplate is valid)\n resource.uri,\n {\n description: resource.description,\n mimeType: resource.mimeType,\n title: resource.title,\n },\n // Static URIs call (uri, ctx); ResourceTemplates call (uri, params, ctx).\n // The rest-params shape lets us collect either signature uniformly.\n async (...sdkArgs: unknown[]) => {\n const ctx = sdkArgs[sdkArgs.length - 1] as ServerContext\n const uri = sdkArgs[0] as URL\n const params = (sdkArgs.length > 2 ? sdkArgs[1] : {}) as Record<string, string>\n return resource.handler({ params, req, serverContext: ctx, uri })\n },\n )\n logger.info(`✅ Resource: ${resource.title} Registered.`)\n break\n }\n case 'tool': {\n const tool = item.tool\n server.registerTool(\n item.mcpName,\n {\n description: tool.description,\n inputSchema: tool.input ? toStandardSchema(tool.input) : undefined,\n },\n async (input: unknown, ctx: ServerContext) =>\n finalizeToolResponse(\n await tool.handler({\n authorizedMCP,\n input: (input ?? {}) as Record<string, unknown>,\n req,\n serverContext: ctx,\n }),\n tool.overrideResponse,\n ),\n )\n logger.info(`✅ Tool: ${item.mcpName} Registered.`)\n break\n }\n }\n }\n } catch (error) {\n throw new APIError(`Error initializing MCP handler: ${String(error)}`, 500)\n }\n\n return server\n}\n\nconst withSlugInput = ({\n name,\n input,\n}: {\n input?: ToolInputSchema\n name: 'collectionSlug' | 'globalSlug'\n}): ToolInputSchema => {\n const description = name === 'collectionSlug' ? 'The collection slug' : 'The global slug'\n const slugSchema = z.string().describe(description)\n\n if (!input) {\n return z.object({ [name]: slugSchema })\n }\n\n if (input instanceof z.ZodObject) {\n return input.extend({ [name]: slugSchema })\n }\n\n const schema = input as {\n properties?: Record<string, JsonSchemaType>\n required?: string[]\n } & JsonSchemaType\n\n return {\n ...schema,\n type: 'object',\n properties: {\n ...schema.properties,\n [name]: {\n type: 'string',\n description,\n },\n },\n required: Array.from(new Set([name, ...(schema.required ?? [])])),\n }\n}\n"],"names":["McpServer","APIError","z","getLogger","toStandardSchema","buildMcpServer","authorizedMCP","pluginConfig","req","serverOptions","mcp","server","name","version","serverInfo","options","logger","payload","finalizeToolResponse","response","overrideResponse","overridden","doc","_doc","rest","callEntityTool","input","item","serverContext","entity","type","slugKey","toolInput","slug","content","text","mcpName","isError","match","items","find","candidate","collectionSlug","globalSlug","handlerArgs","tool","handler","registeredEntityTools","Set","has","add","inputSchema","withSlugInput","registerTool","description","ctx","info","prompt","registerPrompt","argsSchema","undefined","title","resource","registerResource","uri","mimeType","sdkArgs","length","params","error","String","slugSchema","string","describe","object","ZodObject","extend","schema","properties","required","Array","from"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/mcp/buildMcpServer.ts"],"sourcesContent":["import { McpServer, type ServerContext } from '@modelcontextprotocol/server'\nimport { APIError, type PayloadRequest } from 'payload'\nimport { z } from 'zod'\n\nimport type {\n AuthorizedMCP,\n CollectionMCPItem,\n GlobalMCPItem,\n JsonSchemaType,\n MCPResponseOverride,\n MCPToolResponse,\n SanitizedMCPPluginConfig,\n ToolInputSchema,\n} from '../types.js'\n\nimport { getLogger } from '../utils/getLogger.js'\nimport { toStandardSchema } from '../utils/toStandardSchema.js'\n\n/**\n * Transport-agnostic core: registers every authorized MCP item onto a fresh\n * `McpServer` and returns it. The caller is responsible for picking a transport\n * (`WebStandardStreamableHTTPServerTransport`, `StdioServerTransport`, …) and\n * calling `server.connect(transport)`.\n *\n * `req` is the request context handlers see. For HTTP it's the live\n * `PayloadRequest` derived from the incoming HTTP request; for stdio it's a\n * synthesized one built via `createLocalReq`.\n */\nexport const buildMcpServer = ({\n authorizedMCP,\n pluginConfig,\n req,\n}: {\n authorizedMCP: AuthorizedMCP\n pluginConfig: SanitizedMCPPluginConfig\n req: PayloadRequest\n}): McpServer => {\n const serverOptions = pluginConfig.mcp?.serverOptions || {}\n const server = new McpServer(\n { name: 'Payload MCP Server', version: '1.0.0', ...serverOptions.serverInfo },\n serverOptions.options,\n )\n\n const logger = getLogger({ payload: req.payload })\n\n /**\n * Wrap a tool handler's response with the tool's `overrideResponse`, then\n * strip the internal `doc` field so it doesn't leak onto the wire.\n */\n const finalizeToolResponse = (\n response: MCPToolResponse,\n overrideResponse?: MCPResponseOverride,\n ): MCPToolResponse => {\n const overridden = overrideResponse?.(response, response.doc ?? {}, req) ?? response\n const { doc: _doc, ...rest } = overridden\n return rest\n }\n\n /**\n * Runs a collection/global tool call:\n * - reads `collectionSlug` / `globalSlug` from the input\n * - runs access control: errors if `authorizedMCP.items` has no entry for this tool + slug\n * - runs the tool handler and finalizes its response\n */\n const callEntityTool = async ({\n input,\n item,\n serverContext,\n }: {\n input: unknown\n item: CollectionMCPItem | GlobalMCPItem\n serverContext: ServerContext\n }): Promise<MCPToolResponse> => {\n const entity = item.type === 'collectionTool' ? 'collection' : 'global'\n const slugKey = item.type === 'collectionTool' ? 'collectionSlug' : 'globalSlug'\n const toolInput = (input ?? {}) as Record<string, unknown>\n const slug = toolInput[slugKey] as string | undefined\n\n if (!slug) {\n return {\n content: [\n {\n type: 'text',\n text: `Error: \"${item.mcpName}\" requires ${slugKey}. Use getConfigInfo to inspect ${entity} slugs.`,\n },\n ],\n isError: true,\n }\n }\n\n const match = authorizedMCP.items.find(\n (candidate): candidate is CollectionMCPItem | GlobalMCPItem =>\n candidate.type === item.type &&\n candidate.mcpName === item.mcpName &&\n (candidate.type === 'collectionTool'\n ? candidate.collectionSlug === slug\n : candidate.type === 'globalTool' && candidate.globalSlug === slug),\n )\n\n if (!match) {\n return {\n content: [\n {\n type: 'text',\n text: `Error: MCP access to \"${item.mcpName}\" is not enabled for ${entity} \"${slug}\"`,\n },\n ],\n isError: true,\n }\n }\n\n const handlerArgs = {\n authorizedMCP,\n input: toolInput,\n req,\n serverContext,\n }\n const response = await (match.type === 'collectionTool'\n ? match.tool.handler({ ...handlerArgs, collectionSlug: slug })\n : match.tool.handler({ ...handlerArgs, globalSlug: slug }))\n\n return finalizeToolResponse(response, match.tool.overrideResponse)\n }\n\n try {\n const registeredEntityTools = new Set<string>()\n\n for (const item of authorizedMCP.items) {\n switch (item.type) {\n case 'collectionTool':\n case 'globalTool': {\n if (registeredEntityTools.has(item.mcpName)) {\n break\n }\n registeredEntityTools.add(item.mcpName)\n\n const inputSchema = withSlugInput({\n name: item.type === 'collectionTool' ? 'collectionSlug' : 'globalSlug',\n input: item.tool.input,\n })\n\n server.registerTool(\n item.mcpName,\n {\n annotations: item.tool.annotations,\n description: item.tool.description,\n inputSchema: toStandardSchema(inputSchema),\n },\n async (input: unknown, ctx: ServerContext) =>\n callEntityTool({ input, item, serverContext: ctx }),\n )\n logger.info(`✅ Tool: ${item.mcpName} Registered.`)\n break\n }\n case 'prompt': {\n const prompt = item.prompt\n server.registerPrompt(\n item.mcpName,\n {\n argsSchema: prompt.argsSchema ? toStandardSchema(prompt.argsSchema) : undefined,\n description: prompt.description,\n title: prompt.title,\n },\n async (input: unknown, ctx: ServerContext) =>\n prompt.handler({\n input: (input ?? {}) as Record<string, unknown>,\n req,\n serverContext: ctx,\n }),\n )\n logger.info(`✅ Prompt: ${prompt.title} Registered.`)\n break\n }\n case 'resource': {\n const resource = item.resource\n server.registerResource(\n item.mcpName,\n // @ts-expect-error - Overload type ambiguity (string OR ResourceTemplate is valid)\n resource.uri,\n {\n description: resource.description,\n mimeType: resource.mimeType,\n title: resource.title,\n },\n // Static URIs call (uri, ctx); ResourceTemplates call (uri, params, ctx).\n // The rest-params shape lets us collect either signature uniformly.\n async (...sdkArgs: unknown[]) => {\n const ctx = sdkArgs[sdkArgs.length - 1] as ServerContext\n const uri = sdkArgs[0] as URL\n const params = (sdkArgs.length > 2 ? sdkArgs[1] : {}) as Record<string, string>\n return resource.handler({ params, req, serverContext: ctx, uri })\n },\n )\n logger.info(`✅ Resource: ${resource.title} Registered.`)\n break\n }\n case 'tool': {\n const tool = item.tool\n server.registerTool(\n item.mcpName,\n {\n annotations: tool.annotations,\n description: tool.description,\n inputSchema: tool.input ? toStandardSchema(tool.input) : undefined,\n },\n async (input: unknown, ctx: ServerContext) =>\n finalizeToolResponse(\n await tool.handler({\n authorizedMCP,\n input: (input ?? {}) as Record<string, unknown>,\n req,\n serverContext: ctx,\n }),\n tool.overrideResponse,\n ),\n )\n logger.info(`✅ Tool: ${item.mcpName} Registered.`)\n break\n }\n }\n }\n } catch (error) {\n throw new APIError(`Error initializing MCP handler: ${String(error)}`, 500)\n }\n\n return server\n}\n\nconst withSlugInput = ({\n name,\n input,\n}: {\n input?: ToolInputSchema\n name: 'collectionSlug' | 'globalSlug'\n}): ToolInputSchema => {\n const description = name === 'collectionSlug' ? 'The collection slug' : 'The global slug'\n const slugSchema = z.string().describe(description)\n\n if (!input) {\n return z.object({ [name]: slugSchema })\n }\n\n if (input instanceof z.ZodObject) {\n return input.extend({ [name]: slugSchema })\n }\n\n const schema = input as {\n properties?: Record<string, JsonSchemaType>\n required?: string[]\n } & JsonSchemaType\n\n return {\n ...schema,\n type: 'object',\n properties: {\n ...schema.properties,\n [name]: {\n type: 'string',\n description,\n },\n },\n required: Array.from(new Set([name, ...(schema.required ?? [])])),\n }\n}\n"],"names":["McpServer","APIError","z","getLogger","toStandardSchema","buildMcpServer","authorizedMCP","pluginConfig","req","serverOptions","mcp","server","name","version","serverInfo","options","logger","payload","finalizeToolResponse","response","overrideResponse","overridden","doc","_doc","rest","callEntityTool","input","item","serverContext","entity","type","slugKey","toolInput","slug","content","text","mcpName","isError","match","items","find","candidate","collectionSlug","globalSlug","handlerArgs","tool","handler","registeredEntityTools","Set","has","add","inputSchema","withSlugInput","registerTool","annotations","description","ctx","info","prompt","registerPrompt","argsSchema","undefined","title","resource","registerResource","uri","mimeType","sdkArgs","length","params","error","String","slugSchema","string","describe","object","ZodObject","extend","schema","properties","required","Array","from"],"mappings":"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"}