@payloadcms/plugin-mcp 4.0.0-internal.011fd46 → 4.0.0-internal.0731f09

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 (502) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/defaultAccess.d.ts +3 -0
  3. package/dist/defaultAccess.d.ts.map +1 -0
  4. package/dist/defaultAccess.js +3 -0
  5. package/dist/defaultAccess.js.map +1 -0
  6. package/dist/defineTool.d.ts +8 -8
  7. package/dist/defineTool.d.ts.map +1 -1
  8. package/dist/endpoint/access.d.ts +12 -5
  9. package/dist/endpoint/access.d.ts.map +1 -1
  10. package/dist/endpoint/access.js +86 -103
  11. package/dist/endpoint/access.js.map +1 -1
  12. package/dist/endpoint/index.d.ts +1 -1
  13. package/dist/endpoint/index.d.ts.map +1 -1
  14. package/dist/endpoint/index.js +109 -16
  15. package/dist/endpoint/index.js.map +1 -1
  16. package/dist/endpoint/oauth.d.ts +39 -0
  17. package/dist/endpoint/oauth.d.ts.map +1 -0
  18. package/dist/endpoint/oauth.js +92 -0
  19. package/dist/endpoint/oauth.js.map +1 -0
  20. package/dist/endpoint/oauthServer.d.ts +11 -0
  21. package/dist/endpoint/oauthServer.d.ts.map +1 -0
  22. package/dist/endpoint/oauthServer.js +351 -0
  23. package/dist/endpoint/oauthServer.js.map +1 -0
  24. package/dist/exports/client.d.ts +1 -4
  25. package/dist/exports/client.d.ts.map +1 -1
  26. package/dist/exports/client.js +1 -4
  27. package/dist/exports/client.js.map +1 -1
  28. package/dist/exports/internal.d.ts +2 -0
  29. package/dist/exports/internal.d.ts.map +1 -0
  30. package/dist/exports/internal.js +3 -0
  31. package/dist/exports/internal.js.map +1 -0
  32. package/dist/index.d.ts +12 -4
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +18 -58
  35. package/dist/index.js.map +1 -1
  36. package/dist/mcp/buildMcpServer.d.ts +6 -6
  37. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  38. package/dist/mcp/buildMcpServer.js +68 -34
  39. package/dist/mcp/buildMcpServer.js.map +1 -1
  40. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -1
  41. package/dist/mcp/builtin/collections/authTools.js +80 -56
  42. package/dist/mcp/builtin/collections/authTools.js.map +1 -1
  43. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  44. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  45. package/dist/mcp/builtin/collections/countTool.js +63 -0
  46. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  47. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  48. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  49. package/dist/mcp/builtin/collections/countVersionsTool.js +60 -0
  50. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  51. package/dist/mcp/builtin/collections/createTool.d.ts +1 -1
  52. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
  53. package/dist/mcp/builtin/collections/createTool.js +105 -53
  54. package/dist/mcp/builtin/collections/createTool.js.map +1 -1
  55. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
  56. package/dist/mcp/builtin/collections/deleteTool.js +46 -44
  57. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
  58. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  59. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  60. package/dist/mcp/builtin/collections/duplicateTool.js +90 -0
  61. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  62. package/dist/mcp/builtin/collections/fileInput.d.ts +28 -0
  63. package/dist/mcp/builtin/collections/fileInput.d.ts.map +1 -0
  64. package/dist/mcp/builtin/collections/fileInput.js +88 -0
  65. package/dist/mcp/builtin/collections/fileInput.js.map +1 -0
  66. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  67. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  68. package/dist/mcp/builtin/collections/findDistinctTool.js +77 -0
  69. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  70. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  71. package/dist/mcp/builtin/collections/findTool.js +31 -48
  72. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  73. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  74. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  75. package/dist/mcp/builtin/collections/findVersionByIDTool.js +74 -0
  76. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  77. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  78. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  79. package/dist/mcp/builtin/collections/findVersionsTool.js +84 -0
  80. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  81. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -1
  82. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +71 -10
  83. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -1
  84. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  85. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  86. package/dist/mcp/builtin/collections/restoreVersionTool.js +69 -0
  87. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  88. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  89. package/dist/mcp/builtin/collections/updateTool.js +68 -86
  90. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  91. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts +2 -0
  92. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts.map +1 -0
  93. package/dist/mcp/builtin/collections/uploadInstructionsTool.js +55 -0
  94. package/dist/mcp/builtin/collections/uploadInstructionsTool.js.map +1 -0
  95. package/dist/mcp/builtin/formatEntityError.d.ts +16 -0
  96. package/dist/mcp/builtin/formatEntityError.d.ts.map +1 -0
  97. package/dist/mcp/builtin/formatEntityError.js +55 -0
  98. package/dist/mcp/builtin/formatEntityError.js.map +1 -0
  99. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -1
  100. package/dist/mcp/builtin/getConfigInfoTool.js +23 -10
  101. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -1
  102. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  103. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  104. package/dist/mcp/builtin/globals/countVersionsTool.js +60 -0
  105. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  106. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  107. package/dist/mcp/builtin/globals/findTool.js +13 -17
  108. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  109. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  110. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  111. package/dist/mcp/builtin/globals/findVersionByIDTool.js +68 -0
  112. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  113. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  114. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  115. package/dist/mcp/builtin/globals/findVersionsTool.js +78 -0
  116. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  117. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -1
  118. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +49 -10
  119. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -1
  120. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  121. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  122. package/dist/mcp/builtin/globals/restoreVersionTool.js +70 -0
  123. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  124. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -1
  125. package/dist/mcp/builtin/globals/updateTool.js +29 -36
  126. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  127. package/dist/mcp/builtinTools.d.ts +73 -2
  128. package/dist/mcp/builtinTools.d.ts.map +1 -1
  129. package/dist/mcp/builtinTools.js +73 -3
  130. package/dist/mcp/builtinTools.js.map +1 -1
  131. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  132. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  133. package/dist/mcp/sanitizeMCPConfig.js +51 -17
  134. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  135. package/dist/stdio.d.ts +3 -3
  136. package/dist/stdio.d.ts.map +1 -1
  137. package/dist/stdio.js +86 -47
  138. package/dist/stdio.js.map +1 -1
  139. package/dist/types.d.ts +170 -92
  140. package/dist/types.d.ts.map +1 -1
  141. package/dist/types.js +2 -4
  142. package/dist/types.js.map +1 -1
  143. package/dist/utils/camelCase.d.ts.map +1 -1
  144. package/dist/utils/getPluginConfig.d.ts +1 -1
  145. package/dist/utils/getPluginConfig.js +1 -1
  146. package/dist/utils/getPluginConfig.js.map +1 -1
  147. package/dist/utils/resolveProjectRoot.d.ts.map +1 -1
  148. package/dist/utils/toStandardSchema.d.ts.map +1 -1
  149. package/dist/utils/toStandardSchema.js.map +1 -1
  150. package/package.json +27 -38
  151. package/src/defaultAccess.ts +3 -0
  152. package/src/endpoint/access.ts +88 -112
  153. package/src/endpoint/index.ts +95 -15
  154. package/src/endpoint/oauth.ts +91 -0
  155. package/src/endpoint/oauthServer.ts +386 -0
  156. package/src/exports/client.ts +2 -4
  157. package/src/exports/internal.ts +1 -0
  158. package/src/index.ts +43 -67
  159. package/src/mcp/buildMcpServer.ts +86 -51
  160. package/src/mcp/builtin/collections/authTools.ts +82 -71
  161. package/src/mcp/builtin/collections/countTool.ts +61 -0
  162. package/src/mcp/builtin/collections/countVersionsTool.ts +60 -0
  163. package/src/mcp/builtin/collections/createTool.ts +110 -76
  164. package/src/mcp/builtin/collections/deleteTool.ts +39 -65
  165. package/src/mcp/builtin/collections/duplicateTool.ts +84 -0
  166. package/src/mcp/builtin/collections/fileInput.spec.ts +93 -0
  167. package/src/mcp/builtin/collections/fileInput.ts +127 -0
  168. package/src/mcp/builtin/collections/findDistinctTool.ts +67 -0
  169. package/src/mcp/builtin/collections/findTool.ts +28 -108
  170. package/src/mcp/builtin/collections/findVersionByIDTool.ts +66 -0
  171. package/src/mcp/builtin/collections/findVersionsTool.ts +83 -0
  172. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +63 -7
  173. package/src/mcp/builtin/collections/restoreVersionTool.ts +65 -0
  174. package/src/mcp/builtin/collections/updateTool.ts +65 -100
  175. package/src/mcp/builtin/collections/uploadInstructionsTool.ts +64 -0
  176. package/src/mcp/builtin/formatEntityError.ts +77 -0
  177. package/src/mcp/builtin/getConfigInfoTool.ts +22 -5
  178. package/src/mcp/builtin/globals/countVersionsTool.ts +60 -0
  179. package/src/mcp/builtin/globals/findTool.ts +16 -52
  180. package/src/mcp/builtin/globals/findVersionByIDTool.ts +64 -0
  181. package/src/mcp/builtin/globals/findVersionsTool.ts +69 -0
  182. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +45 -7
  183. package/src/mcp/builtin/globals/restoreVersionTool.ts +68 -0
  184. package/src/mcp/builtin/globals/updateTool.ts +41 -61
  185. package/src/mcp/builtinTools.ts +72 -6
  186. package/src/mcp/sanitizeMCPConfig.ts +37 -19
  187. package/src/stdio.ts +80 -47
  188. package/src/types.ts +177 -95
  189. package/src/utils/getPluginConfig.ts +1 -1
  190. package/src/utils/toStandardSchema.ts +1 -1
  191. package/dist/collection/getAccessField.d.ts +0 -12
  192. package/dist/collection/getAccessField.d.ts.map +0 -1
  193. package/dist/collection/getAccessField.js +0 -72
  194. package/dist/collection/getAccessField.js.map +0 -1
  195. package/dist/collection/index.d.ts +0 -6
  196. package/dist/collection/index.d.ts.map +0 -1
  197. package/dist/collection/index.js +0 -105
  198. package/dist/collection/index.js.map +0 -1
  199. package/dist/components/APIKeyField/index.client.d.ts +0 -9
  200. package/dist/components/APIKeyField/index.client.d.ts.map +0 -1
  201. package/dist/components/APIKeyField/index.client.js +0 -85
  202. package/dist/components/APIKeyField/index.client.js.map +0 -1
  203. package/dist/components/APIKeyField/index.css +0 -105
  204. package/dist/components/APIKeysEmptyState/index.client.d.ts +0 -4
  205. package/dist/components/APIKeysEmptyState/index.client.d.ts.map +0 -1
  206. package/dist/components/APIKeysEmptyState/index.client.js +0 -21
  207. package/dist/components/APIKeysEmptyState/index.client.js.map +0 -1
  208. package/dist/components/AccessField/index.client.d.ts +0 -10
  209. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  210. package/dist/components/AccessField/index.client.js +0 -247
  211. package/dist/components/AccessField/index.client.js.map +0 -1
  212. package/dist/components/AccessField/index.css +0 -99
  213. package/dist/components/SettingsMenu/index.client.d.ts +0 -8
  214. package/dist/components/SettingsMenu/index.client.d.ts.map +0 -1
  215. package/dist/components/SettingsMenu/index.client.js +0 -24
  216. package/dist/components/SettingsMenu/index.client.js.map +0 -1
  217. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +0 -9
  218. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +0 -1
  219. package/dist/mcp/builtin/collections/formatCollectionError.js +0 -60
  220. package/dist/mcp/builtin/collections/formatCollectionError.js.map +0 -1
  221. package/dist/mcp/builtin/validateEntityData.d.ts +0 -14
  222. package/dist/mcp/builtin/validateEntityData.d.ts.map +0 -1
  223. package/dist/mcp/builtin/validateEntityData.js +0 -82
  224. package/dist/mcp/builtin/validateEntityData.js.map +0 -1
  225. package/dist/translations/index.d.ts +0 -11
  226. package/dist/translations/index.d.ts.map +0 -1
  227. package/dist/translations/index.js +0 -92
  228. package/dist/translations/index.js.map +0 -1
  229. package/dist/translations/languages/ar.d.ts +0 -31
  230. package/dist/translations/languages/ar.d.ts.map +0 -1
  231. package/dist/translations/languages/ar.js +0 -34
  232. package/dist/translations/languages/ar.js.map +0 -1
  233. package/dist/translations/languages/az.d.ts +0 -31
  234. package/dist/translations/languages/az.d.ts.map +0 -1
  235. package/dist/translations/languages/az.js +0 -34
  236. package/dist/translations/languages/az.js.map +0 -1
  237. package/dist/translations/languages/bg.d.ts +0 -31
  238. package/dist/translations/languages/bg.d.ts.map +0 -1
  239. package/dist/translations/languages/bg.js +0 -34
  240. package/dist/translations/languages/bg.js.map +0 -1
  241. package/dist/translations/languages/bnBd.d.ts +0 -31
  242. package/dist/translations/languages/bnBd.d.ts.map +0 -1
  243. package/dist/translations/languages/bnBd.js +0 -34
  244. package/dist/translations/languages/bnBd.js.map +0 -1
  245. package/dist/translations/languages/bnIn.d.ts +0 -31
  246. package/dist/translations/languages/bnIn.d.ts.map +0 -1
  247. package/dist/translations/languages/bnIn.js +0 -34
  248. package/dist/translations/languages/bnIn.js.map +0 -1
  249. package/dist/translations/languages/ca.d.ts +0 -31
  250. package/dist/translations/languages/ca.d.ts.map +0 -1
  251. package/dist/translations/languages/ca.js +0 -34
  252. package/dist/translations/languages/ca.js.map +0 -1
  253. package/dist/translations/languages/cs.d.ts +0 -31
  254. package/dist/translations/languages/cs.d.ts.map +0 -1
  255. package/dist/translations/languages/cs.js +0 -34
  256. package/dist/translations/languages/cs.js.map +0 -1
  257. package/dist/translations/languages/da.d.ts +0 -31
  258. package/dist/translations/languages/da.d.ts.map +0 -1
  259. package/dist/translations/languages/da.js +0 -34
  260. package/dist/translations/languages/da.js.map +0 -1
  261. package/dist/translations/languages/de.d.ts +0 -31
  262. package/dist/translations/languages/de.d.ts.map +0 -1
  263. package/dist/translations/languages/de.js +0 -34
  264. package/dist/translations/languages/de.js.map +0 -1
  265. package/dist/translations/languages/en.d.ts +0 -31
  266. package/dist/translations/languages/en.d.ts.map +0 -1
  267. package/dist/translations/languages/en.js +0 -34
  268. package/dist/translations/languages/en.js.map +0 -1
  269. package/dist/translations/languages/es.d.ts +0 -31
  270. package/dist/translations/languages/es.d.ts.map +0 -1
  271. package/dist/translations/languages/es.js +0 -34
  272. package/dist/translations/languages/es.js.map +0 -1
  273. package/dist/translations/languages/et.d.ts +0 -31
  274. package/dist/translations/languages/et.d.ts.map +0 -1
  275. package/dist/translations/languages/et.js +0 -34
  276. package/dist/translations/languages/et.js.map +0 -1
  277. package/dist/translations/languages/fa.d.ts +0 -31
  278. package/dist/translations/languages/fa.d.ts.map +0 -1
  279. package/dist/translations/languages/fa.js +0 -34
  280. package/dist/translations/languages/fa.js.map +0 -1
  281. package/dist/translations/languages/fr.d.ts +0 -31
  282. package/dist/translations/languages/fr.d.ts.map +0 -1
  283. package/dist/translations/languages/fr.js +0 -34
  284. package/dist/translations/languages/fr.js.map +0 -1
  285. package/dist/translations/languages/he.d.ts +0 -31
  286. package/dist/translations/languages/he.d.ts.map +0 -1
  287. package/dist/translations/languages/he.js +0 -34
  288. package/dist/translations/languages/he.js.map +0 -1
  289. package/dist/translations/languages/hr.d.ts +0 -31
  290. package/dist/translations/languages/hr.d.ts.map +0 -1
  291. package/dist/translations/languages/hr.js +0 -34
  292. package/dist/translations/languages/hr.js.map +0 -1
  293. package/dist/translations/languages/hu.d.ts +0 -31
  294. package/dist/translations/languages/hu.d.ts.map +0 -1
  295. package/dist/translations/languages/hu.js +0 -34
  296. package/dist/translations/languages/hu.js.map +0 -1
  297. package/dist/translations/languages/hy.d.ts +0 -31
  298. package/dist/translations/languages/hy.d.ts.map +0 -1
  299. package/dist/translations/languages/hy.js +0 -34
  300. package/dist/translations/languages/hy.js.map +0 -1
  301. package/dist/translations/languages/id.d.ts +0 -31
  302. package/dist/translations/languages/id.d.ts.map +0 -1
  303. package/dist/translations/languages/id.js +0 -34
  304. package/dist/translations/languages/id.js.map +0 -1
  305. package/dist/translations/languages/is.d.ts +0 -31
  306. package/dist/translations/languages/is.d.ts.map +0 -1
  307. package/dist/translations/languages/is.js +0 -34
  308. package/dist/translations/languages/is.js.map +0 -1
  309. package/dist/translations/languages/it.d.ts +0 -31
  310. package/dist/translations/languages/it.d.ts.map +0 -1
  311. package/dist/translations/languages/it.js +0 -34
  312. package/dist/translations/languages/it.js.map +0 -1
  313. package/dist/translations/languages/ja.d.ts +0 -31
  314. package/dist/translations/languages/ja.d.ts.map +0 -1
  315. package/dist/translations/languages/ja.js +0 -34
  316. package/dist/translations/languages/ja.js.map +0 -1
  317. package/dist/translations/languages/ko.d.ts +0 -31
  318. package/dist/translations/languages/ko.d.ts.map +0 -1
  319. package/dist/translations/languages/ko.js +0 -34
  320. package/dist/translations/languages/ko.js.map +0 -1
  321. package/dist/translations/languages/lt.d.ts +0 -31
  322. package/dist/translations/languages/lt.d.ts.map +0 -1
  323. package/dist/translations/languages/lt.js +0 -34
  324. package/dist/translations/languages/lt.js.map +0 -1
  325. package/dist/translations/languages/lv.d.ts +0 -31
  326. package/dist/translations/languages/lv.d.ts.map +0 -1
  327. package/dist/translations/languages/lv.js +0 -34
  328. package/dist/translations/languages/lv.js.map +0 -1
  329. package/dist/translations/languages/my.d.ts +0 -31
  330. package/dist/translations/languages/my.d.ts.map +0 -1
  331. package/dist/translations/languages/my.js +0 -34
  332. package/dist/translations/languages/my.js.map +0 -1
  333. package/dist/translations/languages/nb.d.ts +0 -31
  334. package/dist/translations/languages/nb.d.ts.map +0 -1
  335. package/dist/translations/languages/nb.js +0 -34
  336. package/dist/translations/languages/nb.js.map +0 -1
  337. package/dist/translations/languages/nl.d.ts +0 -31
  338. package/dist/translations/languages/nl.d.ts.map +0 -1
  339. package/dist/translations/languages/nl.js +0 -34
  340. package/dist/translations/languages/nl.js.map +0 -1
  341. package/dist/translations/languages/pl.d.ts +0 -31
  342. package/dist/translations/languages/pl.d.ts.map +0 -1
  343. package/dist/translations/languages/pl.js +0 -34
  344. package/dist/translations/languages/pl.js.map +0 -1
  345. package/dist/translations/languages/pt.d.ts +0 -31
  346. package/dist/translations/languages/pt.d.ts.map +0 -1
  347. package/dist/translations/languages/pt.js +0 -34
  348. package/dist/translations/languages/pt.js.map +0 -1
  349. package/dist/translations/languages/ro.d.ts +0 -31
  350. package/dist/translations/languages/ro.d.ts.map +0 -1
  351. package/dist/translations/languages/ro.js +0 -34
  352. package/dist/translations/languages/ro.js.map +0 -1
  353. package/dist/translations/languages/rs.d.ts +0 -31
  354. package/dist/translations/languages/rs.d.ts.map +0 -1
  355. package/dist/translations/languages/rs.js +0 -34
  356. package/dist/translations/languages/rs.js.map +0 -1
  357. package/dist/translations/languages/rsLatin.d.ts +0 -31
  358. package/dist/translations/languages/rsLatin.d.ts.map +0 -1
  359. package/dist/translations/languages/rsLatin.js +0 -34
  360. package/dist/translations/languages/rsLatin.js.map +0 -1
  361. package/dist/translations/languages/ru.d.ts +0 -31
  362. package/dist/translations/languages/ru.d.ts.map +0 -1
  363. package/dist/translations/languages/ru.js +0 -34
  364. package/dist/translations/languages/ru.js.map +0 -1
  365. package/dist/translations/languages/sk.d.ts +0 -31
  366. package/dist/translations/languages/sk.d.ts.map +0 -1
  367. package/dist/translations/languages/sk.js +0 -34
  368. package/dist/translations/languages/sk.js.map +0 -1
  369. package/dist/translations/languages/sl.d.ts +0 -31
  370. package/dist/translations/languages/sl.d.ts.map +0 -1
  371. package/dist/translations/languages/sl.js +0 -34
  372. package/dist/translations/languages/sl.js.map +0 -1
  373. package/dist/translations/languages/sv.d.ts +0 -31
  374. package/dist/translations/languages/sv.d.ts.map +0 -1
  375. package/dist/translations/languages/sv.js +0 -34
  376. package/dist/translations/languages/sv.js.map +0 -1
  377. package/dist/translations/languages/ta.d.ts +0 -31
  378. package/dist/translations/languages/ta.d.ts.map +0 -1
  379. package/dist/translations/languages/ta.js +0 -34
  380. package/dist/translations/languages/ta.js.map +0 -1
  381. package/dist/translations/languages/th.d.ts +0 -31
  382. package/dist/translations/languages/th.d.ts.map +0 -1
  383. package/dist/translations/languages/th.js +0 -34
  384. package/dist/translations/languages/th.js.map +0 -1
  385. package/dist/translations/languages/tr.d.ts +0 -31
  386. package/dist/translations/languages/tr.d.ts.map +0 -1
  387. package/dist/translations/languages/tr.js +0 -34
  388. package/dist/translations/languages/tr.js.map +0 -1
  389. package/dist/translations/languages/uk.d.ts +0 -31
  390. package/dist/translations/languages/uk.d.ts.map +0 -1
  391. package/dist/translations/languages/uk.js +0 -34
  392. package/dist/translations/languages/uk.js.map +0 -1
  393. package/dist/translations/languages/vi.d.ts +0 -31
  394. package/dist/translations/languages/vi.d.ts.map +0 -1
  395. package/dist/translations/languages/vi.js +0 -34
  396. package/dist/translations/languages/vi.js.map +0 -1
  397. package/dist/translations/languages/zh.d.ts +0 -31
  398. package/dist/translations/languages/zh.d.ts.map +0 -1
  399. package/dist/translations/languages/zh.js +0 -34
  400. package/dist/translations/languages/zh.js.map +0 -1
  401. package/dist/translations/languages/zhTw.d.ts +0 -31
  402. package/dist/translations/languages/zhTw.d.ts.map +0 -1
  403. package/dist/translations/languages/zhTw.js +0 -34
  404. package/dist/translations/languages/zhTw.js.map +0 -1
  405. package/dist/translations/types.d.ts +0 -32
  406. package/dist/translations/types.d.ts.map +0 -1
  407. package/dist/translations/types.js +0 -3
  408. package/dist/translations/types.js.map +0 -1
  409. package/dist/utils/getVirtualFieldNames.d.ts +0 -14
  410. package/dist/utils/getVirtualFieldNames.d.ts.map +0 -1
  411. package/dist/utils/getVirtualFieldNames.js +0 -35
  412. package/dist/utils/getVirtualFieldNames.js.map +0 -1
  413. package/dist/utils/localAPIDefaults.d.ts +0 -20
  414. package/dist/utils/localAPIDefaults.d.ts.map +0 -1
  415. package/dist/utils/localAPIDefaults.js +0 -19
  416. package/dist/utils/localAPIDefaults.js.map +0 -1
  417. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +0 -11
  418. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +0 -1
  419. package/dist/utils/schemaConversion/getEntityInputSchema.js +0 -34
  420. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +0 -1
  421. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  422. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  423. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  424. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  425. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +0 -15
  426. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +0 -1
  427. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +0 -464
  428. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +0 -1
  429. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +0 -158
  430. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +0 -1
  431. package/dist/utils/transformPointDataToPayload.d.ts +0 -7
  432. package/dist/utils/transformPointDataToPayload.d.ts.map +0 -1
  433. package/dist/utils/transformPointDataToPayload.js +0 -28
  434. package/dist/utils/transformPointDataToPayload.js.map +0 -1
  435. package/dist/utils/whereSchema.d.ts +0 -9
  436. package/dist/utils/whereSchema.d.ts.map +0 -1
  437. package/dist/utils/whereSchema.js +0 -13
  438. package/dist/utils/whereSchema.js.map +0 -1
  439. package/src/collection/getAccessField.ts +0 -84
  440. package/src/collection/index.ts +0 -105
  441. package/src/components/APIKeyField/index.client.tsx +0 -68
  442. package/src/components/APIKeyField/index.css +0 -105
  443. package/src/components/APIKeysEmptyState/index.client.tsx +0 -33
  444. package/src/components/AccessField/index.client.tsx +0 -296
  445. package/src/components/AccessField/index.css +0 -99
  446. package/src/components/SettingsMenu/index.client.tsx +0 -30
  447. package/src/mcp/builtin/collections/formatCollectionError.ts +0 -84
  448. package/src/mcp/builtin/validateEntityData.ts +0 -132
  449. package/src/translations/index.ts +0 -105
  450. package/src/translations/languages/ar.ts +0 -38
  451. package/src/translations/languages/az.ts +0 -38
  452. package/src/translations/languages/bg.ts +0 -39
  453. package/src/translations/languages/bnBd.ts +0 -39
  454. package/src/translations/languages/bnIn.ts +0 -39
  455. package/src/translations/languages/ca.ts +0 -39
  456. package/src/translations/languages/cs.ts +0 -39
  457. package/src/translations/languages/da.ts +0 -38
  458. package/src/translations/languages/de.ts +0 -39
  459. package/src/translations/languages/en.ts +0 -39
  460. package/src/translations/languages/es.ts +0 -39
  461. package/src/translations/languages/et.ts +0 -38
  462. package/src/translations/languages/fa.ts +0 -39
  463. package/src/translations/languages/fr.ts +0 -39
  464. package/src/translations/languages/he.ts +0 -37
  465. package/src/translations/languages/hr.ts +0 -39
  466. package/src/translations/languages/hu.ts +0 -39
  467. package/src/translations/languages/hy.ts +0 -39
  468. package/src/translations/languages/id.ts +0 -39
  469. package/src/translations/languages/is.ts +0 -39
  470. package/src/translations/languages/it.ts +0 -39
  471. package/src/translations/languages/ja.ts +0 -39
  472. package/src/translations/languages/ko.ts +0 -39
  473. package/src/translations/languages/lt.ts +0 -39
  474. package/src/translations/languages/lv.ts +0 -38
  475. package/src/translations/languages/my.ts +0 -39
  476. package/src/translations/languages/nb.ts +0 -39
  477. package/src/translations/languages/nl.ts +0 -39
  478. package/src/translations/languages/pl.ts +0 -38
  479. package/src/translations/languages/pt.ts +0 -39
  480. package/src/translations/languages/ro.ts +0 -39
  481. package/src/translations/languages/rs.ts +0 -38
  482. package/src/translations/languages/rsLatin.ts +0 -38
  483. package/src/translations/languages/ru.ts +0 -39
  484. package/src/translations/languages/sk.ts +0 -39
  485. package/src/translations/languages/sl.ts +0 -38
  486. package/src/translations/languages/sv.ts +0 -39
  487. package/src/translations/languages/ta.ts +0 -39
  488. package/src/translations/languages/th.ts +0 -38
  489. package/src/translations/languages/tr.ts +0 -38
  490. package/src/translations/languages/uk.ts +0 -39
  491. package/src/translations/languages/vi.ts +0 -39
  492. package/src/translations/languages/zh.ts +0 -36
  493. package/src/translations/languages/zhTw.ts +0 -36
  494. package/src/translations/types.ts +0 -34
  495. package/src/utils/getVirtualFieldNames.ts +0 -53
  496. package/src/utils/localAPIDefaults.ts +0 -22
  497. package/src/utils/schemaConversion/getEntityInputSchema.ts +0 -78
  498. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
  499. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +0 -103
  500. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +0 -529
  501. package/src/utils/transformPointDataToPayload.ts +0 -40
  502. package/src/utils/whereSchema.ts +0 -24
@@ -0,0 +1,92 @@
1
+ import { bearerAuthChallengeResponse, OAuthError, OAuthErrorCode } from '@modelcontextprotocol/server';
2
+ import { createPayloadRequest, getPayload } from 'payload';
3
+ import { getPluginConfig } from '../utils/getPluginConfig.js';
4
+ /**
5
+ * Serves the OAuth protected resource metadata (RFC 9728) at `/api/mcp/oauth-protected-resource`.
6
+ * The OAuth challenge links here, so MCP clients find the authorization server without setup.
7
+ */ export const oauthProtectedResourceEndpoint = (req)=>getMetadataResponse({
8
+ req
9
+ });
10
+ /**
11
+ * Serves the same metadata for clients that ignore the challenge's link and only look at
12
+ * `/.well-known/oauth-protected-resource`. Mount it at the site root, e.g. in Next.js at
13
+ * `app/.well-known/oauth-protected-resource/[[...path]]/route.ts`:
14
+ *
15
+ * ```ts
16
+ * import config from '@payload-config'
17
+ * import { oauthProtectedResourceHandler } from '@payloadcms/plugin-mcp'
18
+ *
19
+ * export const GET = oauthProtectedResourceHandler(config)
20
+ * ```
21
+ */ export const oauthProtectedResourceHandler = (config)=>async (request)=>getMetadataResponse({
22
+ req: await createPayloadRequest({
23
+ payload: await getPayload({
24
+ config
25
+ }),
26
+ req: request
27
+ })
28
+ });
29
+ /**
30
+ * Answers an unauthenticated MCP request with a challenge linking to the protected resource
31
+ * metadata, which starts the client's OAuth flow.
32
+ */ export const oauthChallenge = ({ req })=>{
33
+ const { oauth } = getPluginConfig({
34
+ config: req.payload.config
35
+ });
36
+ const response = bearerAuthChallengeResponse(new OAuthError(OAuthErrorCode.InvalidToken, req.t('error:unauthorized')), {
37
+ requiredScopes: oauth?.type === 'external' ? oauth.scopes : undefined,
38
+ resourceMetadataUrl: `${getMCPURL({
39
+ config: req.payload.config,
40
+ url: req.url
41
+ })}/oauth-protected-resource`
42
+ });
43
+ // Lets browser-based MCP clients read the challenge, when Payload's `cors` setting allows them
44
+ response.headers.set('Access-Control-Expose-Headers', 'WWW-Authenticate');
45
+ return response;
46
+ };
47
+ /**
48
+ * The MCP endpoint's address, as advertised in the metadata's `resource`. Clients send it when
49
+ * they sign in, and authorization servers that support it put it in the access token's audience.
50
+ */ export const getMCPResource = ({ config, url })=>getPluginConfig({
51
+ config
52
+ }).oauth?.resource ?? getMCPURL({
53
+ config,
54
+ url
55
+ });
56
+ export const getMCPURL = ({ config, url })=>new URL(`${config.routes.api}/mcp`, config.serverURL || url).href;
57
+ const getMetadataResponse = async ({ req })=>{
58
+ const { config } = req.payload;
59
+ const { oauth } = getPluginConfig({
60
+ config
61
+ });
62
+ if (!oauth) {
63
+ return new Response(null, {
64
+ status: 404
65
+ });
66
+ }
67
+ return Response.json({
68
+ authorization_servers: oauth.type === 'builtin' ? [
69
+ `${getMCPURL({
70
+ config,
71
+ url: req.url
72
+ })}/oauth`
73
+ ] : typeof oauth.authorizationServers === 'function' ? await oauth.authorizationServers({
74
+ req
75
+ }) : oauth.authorizationServers,
76
+ bearer_methods_supported: [
77
+ 'header'
78
+ ],
79
+ resource: getMCPResource({
80
+ config,
81
+ url: req.url
82
+ }),
83
+ scopes_supported: oauth.type === 'external' ? oauth.scopes : undefined
84
+ }, // Public document, readable by browser-based MCP clients on any origin
85
+ {
86
+ headers: {
87
+ 'Access-Control-Allow-Origin': '*'
88
+ }
89
+ });
90
+ };
91
+
92
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoint/oauth.ts"],"sourcesContent":["import type { OAuthProtectedResourceMetadata } from '@modelcontextprotocol/server'\nimport type { PayloadHandler, PayloadRequest, SanitizedConfig } from 'payload'\n\nimport {\n bearerAuthChallengeResponse,\n OAuthError,\n OAuthErrorCode,\n} from '@modelcontextprotocol/server'\nimport { createPayloadRequest, getPayload } from 'payload'\n\nimport { getPluginConfig } from '../utils/getPluginConfig.js'\n\n/**\n * Serves the OAuth protected resource metadata (RFC 9728) at `/api/mcp/oauth-protected-resource`.\n * The OAuth challenge links here, so MCP clients find the authorization server without setup.\n */\nexport const oauthProtectedResourceEndpoint: PayloadHandler = (req) => getMetadataResponse({ req })\n\n/**\n * Serves the same metadata for clients that ignore the challenge's link and only look at\n * `/.well-known/oauth-protected-resource`. Mount it at the site root, e.g. in Next.js at\n * `app/.well-known/oauth-protected-resource/[[...path]]/route.ts`:\n *\n * ```ts\n * import config from '@payload-config'\n * import { oauthProtectedResourceHandler } from '@payloadcms/plugin-mcp'\n *\n * export const GET = oauthProtectedResourceHandler(config)\n * ```\n */\nexport const oauthProtectedResourceHandler =\n (config: Promise<SanitizedConfig> | SanitizedConfig) =>\n async (request: Request): Promise<Response> =>\n getMetadataResponse({\n req: await createPayloadRequest({ payload: await getPayload({ config }), req: request }),\n })\n\n/**\n * Answers an unauthenticated MCP request with a challenge linking to the protected resource\n * metadata, which starts the client's OAuth flow.\n */\nexport const oauthChallenge = ({ req }: { req: PayloadRequest }): Response => {\n const { oauth } = getPluginConfig({ config: req.payload.config })\n const response = bearerAuthChallengeResponse(\n new OAuthError(OAuthErrorCode.InvalidToken, req.t('error:unauthorized')),\n {\n requiredScopes: oauth?.type === 'external' ? oauth.scopes : undefined,\n resourceMetadataUrl: `${getMCPURL({ config: req.payload.config, url: req.url! })}/oauth-protected-resource`,\n },\n )\n\n // Lets browser-based MCP clients read the challenge, when Payload's `cors` setting allows them\n response.headers.set('Access-Control-Expose-Headers', 'WWW-Authenticate')\n\n return response\n}\n\n/**\n * The MCP endpoint's address, as advertised in the metadata's `resource`. Clients send it when\n * they sign in, and authorization servers that support it put it in the access token's audience.\n */\nexport const getMCPResource = ({ config, url }: { config: SanitizedConfig; url: string }): string =>\n getPluginConfig({ config }).oauth?.resource ?? getMCPURL({ config, url })\n\nexport const getMCPURL = ({ config, url }: { config: SanitizedConfig; url: string }): string =>\n new URL(`${config.routes.api}/mcp`, config.serverURL || url).href\n\nconst getMetadataResponse = async ({ req }: { req: PayloadRequest }): Promise<Response> => {\n const { config } = req.payload\n const { oauth } = getPluginConfig({ config })\n\n if (!oauth) {\n return new Response(null, { status: 404 })\n }\n\n return Response.json(\n {\n authorization_servers:\n oauth.type === 'builtin'\n ? [`${getMCPURL({ config, url: req.url! })}/oauth`]\n : typeof oauth.authorizationServers === 'function'\n ? await oauth.authorizationServers({ req })\n : oauth.authorizationServers,\n bearer_methods_supported: ['header'],\n resource: getMCPResource({ config, url: req.url! }),\n scopes_supported: oauth.type === 'external' ? oauth.scopes : undefined,\n } satisfies OAuthProtectedResourceMetadata,\n // Public document, readable by browser-based MCP clients on any origin\n { headers: { 'Access-Control-Allow-Origin': '*' } },\n )\n}\n"],"names":["bearerAuthChallengeResponse","OAuthError","OAuthErrorCode","createPayloadRequest","getPayload","getPluginConfig","oauthProtectedResourceEndpoint","req","getMetadataResponse","oauthProtectedResourceHandler","config","request","payload","oauthChallenge","oauth","response","InvalidToken","t","requiredScopes","type","scopes","undefined","resourceMetadataUrl","getMCPURL","url","headers","set","getMCPResource","resource","URL","routes","api","serverURL","href","Response","status","json","authorization_servers","authorizationServers","bearer_methods_supported","scopes_supported"],"mappings":"AAGA,SACEA,2BAA2B,EAC3BC,UAAU,EACVC,cAAc,QACT,+BAA8B;AACrC,SAASC,oBAAoB,EAAEC,UAAU,QAAQ,UAAS;AAE1D,SAASC,eAAe,QAAQ,8BAA6B;AAE7D;;;CAGC,GACD,OAAO,MAAMC,iCAAiD,CAACC,MAAQC,oBAAoB;QAAED;IAAI,GAAE;AAEnG;;;;;;;;;;;CAWC,GACD,OAAO,MAAME,gCACX,CAACC,SACD,OAAOC,UACLH,oBAAoB;YAClBD,KAAK,MAAMJ,qBAAqB;gBAAES,SAAS,MAAMR,WAAW;oBAAEM;gBAAO;gBAAIH,KAAKI;YAAQ;QACxF,GAAE;AAEN;;;CAGC,GACD,OAAO,MAAME,iBAAiB,CAAC,EAAEN,GAAG,EAA2B;IAC7D,MAAM,EAAEO,KAAK,EAAE,GAAGT,gBAAgB;QAAEK,QAAQH,IAAIK,OAAO,CAACF,MAAM;IAAC;IAC/D,MAAMK,WAAWf,4BACf,IAAIC,WAAWC,eAAec,YAAY,EAAET,IAAIU,CAAC,CAAC,wBAClD;QACEC,gBAAgBJ,OAAOK,SAAS,aAAaL,MAAMM,MAAM,GAAGC;QAC5DC,qBAAqB,GAAGC,UAAU;YAAEb,QAAQH,IAAIK,OAAO,CAACF,MAAM;YAAEc,KAAKjB,IAAIiB,GAAG;QAAE,GAAG,yBAAyB,CAAC;IAC7G;IAGF,+FAA+F;IAC/FT,SAASU,OAAO,CAACC,GAAG,CAAC,iCAAiC;IAEtD,OAAOX;AACT,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMY,iBAAiB,CAAC,EAAEjB,MAAM,EAAEc,GAAG,EAA4C,GACtFnB,gBAAgB;QAAEK;IAAO,GAAGI,KAAK,EAAEc,YAAYL,UAAU;QAAEb;QAAQc;IAAI,GAAE;AAE3E,OAAO,MAAMD,YAAY,CAAC,EAAEb,MAAM,EAAEc,GAAG,EAA4C,GACjF,IAAIK,IAAI,GAAGnB,OAAOoB,MAAM,CAACC,GAAG,CAAC,IAAI,CAAC,EAAErB,OAAOsB,SAAS,IAAIR,KAAKS,IAAI,CAAA;AAEnE,MAAMzB,sBAAsB,OAAO,EAAED,GAAG,EAA2B;IACjE,MAAM,EAAEG,MAAM,EAAE,GAAGH,IAAIK,OAAO;IAC9B,MAAM,EAAEE,KAAK,EAAE,GAAGT,gBAAgB;QAAEK;IAAO;IAE3C,IAAI,CAACI,OAAO;QACV,OAAO,IAAIoB,SAAS,MAAM;YAAEC,QAAQ;QAAI;IAC1C;IAEA,OAAOD,SAASE,IAAI,CAClB;QACEC,uBACEvB,MAAMK,IAAI,KAAK,YACX;YAAC,GAAGI,UAAU;gBAAEb;gBAAQc,KAAKjB,IAAIiB,GAAG;YAAE,GAAG,MAAM,CAAC;SAAC,GACjD,OAAOV,MAAMwB,oBAAoB,KAAK,aACpC,MAAMxB,MAAMwB,oBAAoB,CAAC;YAAE/B;QAAI,KACvCO,MAAMwB,oBAAoB;QAClCC,0BAA0B;YAAC;SAAS;QACpCX,UAAUD,eAAe;YAAEjB;YAAQc,KAAKjB,IAAIiB,GAAG;QAAE;QACjDgB,kBAAkB1B,MAAMK,IAAI,KAAK,aAAaL,MAAMM,MAAM,GAAGC;IAC/D,GACA,uEAAuE;IACvE;QAAEI,SAAS;YAAE,+BAA+B;QAAI;IAAE;AAEtD"}
@@ -0,0 +1,11 @@
1
+ import type { Endpoint } from 'payload';
2
+ /**
3
+ * Turns Payload into the OAuth authorization server for MCP clients when `oauth.type` is
4
+ * `'builtin'`. Clients register, the user allows them after logging in to the admin panel, and
5
+ * the client receives the access token `issueToken` creates.
6
+ *
7
+ * Clients, consent forms, and authorization codes are encrypted and handed to the client instead
8
+ * of being stored, so nothing is written to the database.
9
+ */
10
+ export declare const oauthServerEndpoints: Endpoint[];
11
+ //# sourceMappingURL=oauthServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthServer.d.ts","sourceRoot":"","sources":["../../src/endpoint/oauthServer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAkC,MAAM,SAAS,CAAA;AA+BvE;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,EAqC1C,CAAA"}
@@ -0,0 +1,351 @@
1
+ import { OAuthErrorCode } from '@modelcontextprotocol/server';
2
+ import { createHash } from 'crypto';
3
+ import { APIError, createAuthToken } from 'payload';
4
+ import { formatAdminURL } from 'payload/shared';
5
+ import { getPluginConfig } from '../utils/getPluginConfig.js';
6
+ import { getMCPURL } from './oauth.js';
7
+ /**
8
+ * Turns Payload into the OAuth authorization server for MCP clients when `oauth.type` is
9
+ * `'builtin'`. Clients register, the user allows them after logging in to the admin panel, and
10
+ * the client receives the access token `issueToken` creates.
11
+ *
12
+ * Clients, consent forms, and authorization codes are encrypted and handed to the client instead
13
+ * of being stored, so nothing is written to the database.
14
+ */ export const oauthServerEndpoints = [
15
+ {
16
+ disableAuth: true,
17
+ handler: (req)=>withIssuer(req, (issuer)=>metadataResponse(issuer)),
18
+ method: 'get',
19
+ // OpenID discovery is the only metadata location MCP clients check below the issuer's path,
20
+ // which lets this work under /api without a route at the site root
21
+ path: '/mcp/oauth/.well-known/openid-configuration'
22
+ },
23
+ {
24
+ disableAuth: true,
25
+ handler: (req)=>withIssuer(req, ()=>Response.json({
26
+ keys: []
27
+ })),
28
+ method: 'get',
29
+ path: '/mcp/oauth/jwks'
30
+ },
31
+ {
32
+ disableAuth: true,
33
+ handler: (req)=>withIssuer(req, ()=>register(req)),
34
+ method: 'post',
35
+ path: '/mcp/oauth/register'
36
+ },
37
+ {
38
+ handler: (req)=>withIssuer(req, ()=>authorize(req)),
39
+ method: 'get',
40
+ path: '/mcp/oauth/authorize'
41
+ },
42
+ {
43
+ handler: (req)=>withIssuer(req, ()=>approve(req)),
44
+ method: 'post',
45
+ path: '/mcp/oauth/authorize'
46
+ },
47
+ {
48
+ disableAuth: true,
49
+ handler: (req)=>withIssuer(req, ()=>token(req)),
50
+ method: 'post',
51
+ path: '/mcp/oauth/token'
52
+ }
53
+ ];
54
+ /** The authorization server URL, or `undefined` when Payload isn't the authorization server. */ const getIssuer = (req)=>getPluginConfig({
55
+ config: req.payload.config
56
+ }).oauth?.type === 'builtin' ? `${getMCPURL({
57
+ config: req.payload.config,
58
+ url: req.url
59
+ })}/oauth` : undefined;
60
+ const withIssuer = (req, handler)=>{
61
+ const issuer = getIssuer(req);
62
+ return issuer ? handler(issuer) : new Response(null, {
63
+ status: 404
64
+ });
65
+ };
66
+ const metadataResponse = (issuer)=>Response.json({
67
+ authorization_endpoint: `${issuer}/authorize`,
68
+ code_challenge_methods_supported: [
69
+ 'S256'
70
+ ],
71
+ grant_types_supported: [
72
+ 'authorization_code'
73
+ ],
74
+ // Required by OpenID discovery. No ID tokens are issued.
75
+ id_token_signing_alg_values_supported: [
76
+ 'RS256'
77
+ ],
78
+ issuer,
79
+ jwks_uri: `${issuer}/jwks`,
80
+ registration_endpoint: `${issuer}/register`,
81
+ response_types_supported: [
82
+ 'code'
83
+ ],
84
+ subject_types_supported: [
85
+ 'public'
86
+ ],
87
+ token_endpoint: `${issuer}/token`,
88
+ token_endpoint_auth_methods_supported: [
89
+ 'none'
90
+ ]
91
+ }, {
92
+ headers: {
93
+ 'Access-Control-Allow-Origin': '*'
94
+ }
95
+ });
96
+ const register = async (req)=>{
97
+ const { client_name, redirect_uris } = await req.json().catch(()=>({}));
98
+ if (!Array.isArray(redirect_uris) || !redirect_uris.length || !redirect_uris.every((uri)=>typeof uri === 'string' && URL.canParse(uri) && !uri.includes('#'))) {
99
+ return Response.json({
100
+ error: OAuthErrorCode.InvalidRedirectUri
101
+ }, {
102
+ status: 400
103
+ });
104
+ }
105
+ const client = {
106
+ name: typeof client_name === 'string' ? client_name : 'An MCP client',
107
+ redirectURIs: redirect_uris
108
+ };
109
+ return Response.json({
110
+ client_id: seal({
111
+ type: 'client',
112
+ data: client,
113
+ req
114
+ }),
115
+ client_name: client.name,
116
+ grant_types: [
117
+ 'authorization_code'
118
+ ],
119
+ redirect_uris: client.redirectURIs,
120
+ response_types: [
121
+ 'code'
122
+ ],
123
+ token_endpoint_auth_method: 'none'
124
+ }, {
125
+ status: 201
126
+ });
127
+ };
128
+ const authorize = (req)=>{
129
+ const url = new URL(req.url);
130
+ const params = url.searchParams;
131
+ const clientID = params.get('client_id');
132
+ const client = unseal({
133
+ type: 'client',
134
+ req,
135
+ value: clientID
136
+ });
137
+ const redirectURI = params.get('redirect_uri');
138
+ // Never redirect to an address the client didn't register
139
+ if (!client || !redirectURI || !client.redirectURIs.includes(redirectURI)) {
140
+ return page({
141
+ content: '<p>Start the sign-in again from your MCP client.</p>',
142
+ status: 400,
143
+ title: 'This sign-in link is invalid'
144
+ });
145
+ }
146
+ const state = params.get('state');
147
+ const codeChallenge = params.get('code_challenge');
148
+ if (params.get('response_type') !== 'code' || params.get('code_challenge_method') !== 'S256' || !codeChallenge) {
149
+ return redirect({
150
+ params: {
151
+ error: OAuthErrorCode.InvalidRequest,
152
+ state
153
+ },
154
+ redirectURI
155
+ });
156
+ }
157
+ if (!req.user) {
158
+ const loginURL = formatAdminURL({
159
+ adminRoute: req.payload.config.routes.admin,
160
+ path: '/login'
161
+ });
162
+ return new Response(null, {
163
+ headers: {
164
+ Location: `${loginURL}?redirect=${encodeURIComponent(url.pathname + url.search)}`
165
+ },
166
+ status: 302
167
+ });
168
+ }
169
+ const consent = {
170
+ clientID: clientID,
171
+ codeChallenge,
172
+ collection: req.user.collection,
173
+ redirectURI,
174
+ state,
175
+ userID: req.user.id
176
+ };
177
+ return page({
178
+ content: `<p>It will be able to use this app's MCP tools as ${escapeHTML(String(req.user.email ?? req.user.id))}, and you will return to ${escapeHTML(new URL(redirectURI).host || redirectURI)}.</p>
179
+ <form method="post">
180
+ <input name="consent" type="hidden" value="${seal({
181
+ type: 'consent',
182
+ data: consent,
183
+ expiresIn: 20 * 60 * 60,
184
+ req
185
+ })}">
186
+ <button name="decision" type="submit" value="allow">Allow</button>
187
+ <button name="decision" type="submit" value="deny">Deny</button>
188
+ </form>`,
189
+ status: 200,
190
+ title: `Allow ${client.name} to use your account?`
191
+ });
192
+ };
193
+ const approve = async (req)=>{
194
+ const form = new URLSearchParams(await req.text());
195
+ const consent = unseal({
196
+ type: 'consent',
197
+ req,
198
+ value: form.get('consent')
199
+ });
200
+ // The form is only valid for the user it was shown to
201
+ if (!consent || req.user?.id !== consent.userID || req.user.collection !== consent.collection) {
202
+ return page({
203
+ content: '<p>Start the sign-in again from your MCP client.</p>',
204
+ status: 400,
205
+ title: 'This sign-in request expired'
206
+ });
207
+ }
208
+ const { clientID, codeChallenge, redirectURI, state } = consent;
209
+ if (form.get('decision') !== 'allow') {
210
+ return redirect({
211
+ params: {
212
+ error: OAuthErrorCode.AccessDenied,
213
+ state
214
+ },
215
+ redirectURI
216
+ });
217
+ }
218
+ const { issueToken = issueLoginToken } = getPluginConfig({
219
+ config: req.payload.config
220
+ }).oauth;
221
+ const { accessToken, expiresIn } = await issueToken({
222
+ req
223
+ });
224
+ const code = {
225
+ accessToken,
226
+ clientID,
227
+ codeChallenge,
228
+ expiresIn,
229
+ redirectURI
230
+ };
231
+ return redirect({
232
+ params: {
233
+ code: seal({
234
+ type: 'code',
235
+ data: code,
236
+ expiresIn: 60,
237
+ req
238
+ }),
239
+ state
240
+ },
241
+ redirectURI
242
+ });
243
+ };
244
+ const token = async (req)=>{
245
+ const form = new URLSearchParams(await req.text());
246
+ const code = unseal({
247
+ type: 'code',
248
+ req,
249
+ value: form.get('code')
250
+ });
251
+ if (form.get('grant_type') !== 'authorization_code' || !code || code.clientID !== form.get('client_id') || code.redirectURI !== form.get('redirect_uri') || // PKCE: only the client that started the sign-in knows the verifier
252
+ createHash('sha256').update(form.get('code_verifier') ?? '').digest('base64url') !== code.codeChallenge) {
253
+ return Response.json({
254
+ error: OAuthErrorCode.InvalidGrant
255
+ }, {
256
+ status: 400
257
+ });
258
+ }
259
+ return Response.json({
260
+ access_token: code.accessToken,
261
+ expires_in: code.expiresIn,
262
+ token_type: 'Bearer'
263
+ }, {
264
+ headers: {
265
+ 'Cache-Control': 'no-store'
266
+ }
267
+ });
268
+ };
269
+ /** The default `issueToken`: a Payload login token, which Payload's JWT strategy accepts. */ const issueLoginToken = async ({ req })=>{
270
+ const collection = req.payload.collections[req.user.collection];
271
+ if (collection.config.auth.disableLocalStrategy) {
272
+ throw new APIError(`The "${collection.config.slug}" collection has its local strategy disabled, so MCP clients can't get Payload login tokens for it. Pass oauth.issueToken to the MCP plugin.`);
273
+ }
274
+ // The full document, like the one a password login starts the session on
275
+ const user = await req.payload.db.findOne({
276
+ collection: collection.config.slug,
277
+ req,
278
+ where: {
279
+ id: {
280
+ equals: req.user.id
281
+ }
282
+ }
283
+ });
284
+ const { token } = await createAuthToken({
285
+ collectionConfig: collection.config,
286
+ email: user.email,
287
+ req,
288
+ user
289
+ });
290
+ return {
291
+ accessToken: token,
292
+ expiresIn: collection.config.auth.tokenExpiration
293
+ };
294
+ };
295
+ /**
296
+ * Encrypts data for the client to hold, so it doesn't need to be stored. `type` keeps one kind
297
+ * from being used as another, e.g. a client ID as an authorization code.
298
+ */ const seal = ({ type, data, expiresIn, req })=>req.payload.encrypt(JSON.stringify({
299
+ ...data,
300
+ type,
301
+ exp: expiresIn && Date.now() + expiresIn * 1000
302
+ }));
303
+ const unseal = ({ type, req, value })=>{
304
+ // Only the v1 format is authenticated. Older formats decrypt anything without an error.
305
+ if (!value?.startsWith('v1:')) {
306
+ return undefined;
307
+ }
308
+ try {
309
+ const data = JSON.parse(req.payload.decrypt(value));
310
+ return data.type === type && (!data.exp || data.exp > Date.now()) ? data : undefined;
311
+ } catch {
312
+ return undefined;
313
+ }
314
+ };
315
+ const redirect = ({ params, redirectURI })=>{
316
+ const location = new URL(redirectURI);
317
+ for (const [key, value] of Object.entries(params)){
318
+ if (value) {
319
+ location.searchParams.set(key, value);
320
+ }
321
+ }
322
+ return new Response(null, {
323
+ headers: {
324
+ Location: location.href
325
+ },
326
+ status: 302
327
+ });
328
+ };
329
+ const page = ({ content, status, title })=>new Response(`<!doctype html>
330
+ <html lang="en">
331
+ <head>
332
+ <meta charset="utf-8">
333
+ <meta name="viewport" content="width=device-width, initial-scale=1">
334
+ <title>${escapeHTML(title)}</title>
335
+ <style>
336
+ body { font-family: system-ui, sans-serif; margin: 4rem auto; max-width: 32rem; overflow-wrap: anywhere; padding: 0 1rem }
337
+ button { font: inherit; margin-inline-end: 0.5rem; padding: 0.5rem 1rem }
338
+ </style>
339
+ </head>
340
+ <body><h1>${escapeHTML(title)}</h1>${content}</body>
341
+ </html>`, {
342
+ headers: {
343
+ // Stop other sites from framing the page to trick users into clicking Allow
344
+ 'Content-Security-Policy': "frame-ancestors 'none'",
345
+ 'Content-Type': 'text/html; charset=utf-8'
346
+ },
347
+ status
348
+ });
349
+ const escapeHTML = (value)=>value.replace(/[&<>"']/g, (character)=>`&#${character.charCodeAt(0)};`);
350
+
351
+ //# sourceMappingURL=oauthServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoint/oauthServer.ts"],"sourcesContent":["import type {\n OAuthClientInformationFull,\n OAuthTokens,\n OpenIdProviderDiscoveryMetadata,\n} from '@modelcontextprotocol/server'\nimport type { Endpoint, PayloadHandler, PayloadRequest } from 'payload'\n\nimport { OAuthErrorCode } from '@modelcontextprotocol/server'\nimport { createHash } from 'crypto'\nimport { APIError, createAuthToken } from 'payload'\nimport { formatAdminURL } from 'payload/shared'\n\nimport type { MCPBuiltinOAuthConfig } from '../types.js'\n\nimport { getPluginConfig } from '../utils/getPluginConfig.js'\nimport { getMCPURL } from './oauth.js'\n\ntype Client = { name: string; redirectURIs: string[] }\n\ntype Consent = {\n clientID: string\n codeChallenge: string\n collection: string\n redirectURI: string\n state: null | string\n userID: number | string\n}\n\ntype Code = {\n accessToken: string\n clientID: string\n codeChallenge: string\n expiresIn?: number\n redirectURI: string\n}\n\n/**\n * Turns Payload into the OAuth authorization server for MCP clients when `oauth.type` is\n * `'builtin'`. Clients register, the user allows them after logging in to the admin panel, and\n * the client receives the access token `issueToken` creates.\n *\n * Clients, consent forms, and authorization codes are encrypted and handed to the client instead\n * of being stored, so nothing is written to the database.\n */\nexport const oauthServerEndpoints: Endpoint[] = [\n {\n disableAuth: true,\n handler: (req) => withIssuer(req, (issuer) => metadataResponse(issuer)),\n method: 'get',\n // OpenID discovery is the only metadata location MCP clients check below the issuer's path,\n // which lets this work under /api without a route at the site root\n path: '/mcp/oauth/.well-known/openid-configuration',\n },\n {\n disableAuth: true,\n handler: (req) => withIssuer(req, () => Response.json({ keys: [] })),\n method: 'get',\n path: '/mcp/oauth/jwks',\n },\n {\n disableAuth: true,\n handler: (req) => withIssuer(req, () => register(req)),\n method: 'post',\n path: '/mcp/oauth/register',\n },\n {\n handler: (req) => withIssuer(req, () => authorize(req)),\n method: 'get',\n path: '/mcp/oauth/authorize',\n },\n {\n handler: (req) => withIssuer(req, () => approve(req)),\n method: 'post',\n path: '/mcp/oauth/authorize',\n },\n {\n disableAuth: true,\n handler: (req) => withIssuer(req, () => token(req)),\n method: 'post',\n path: '/mcp/oauth/token',\n },\n]\n\n/** The authorization server URL, or `undefined` when Payload isn't the authorization server. */\nconst getIssuer = (req: PayloadRequest): string | undefined =>\n getPluginConfig({ config: req.payload.config }).oauth?.type === 'builtin'\n ? `${getMCPURL({ config: req.payload.config, url: req.url! })}/oauth`\n : undefined\n\nconst withIssuer = (\n req: PayloadRequest,\n handler: (issuer: string) => Promise<Response> | Response,\n): Promise<Response> | Response => {\n const issuer = getIssuer(req)\n return issuer ? handler(issuer) : new Response(null, { status: 404 })\n}\n\nconst metadataResponse = (issuer: string): Response =>\n Response.json(\n {\n authorization_endpoint: `${issuer}/authorize`,\n code_challenge_methods_supported: ['S256'],\n grant_types_supported: ['authorization_code'],\n // Required by OpenID discovery. No ID tokens are issued.\n id_token_signing_alg_values_supported: ['RS256'],\n issuer,\n jwks_uri: `${issuer}/jwks`,\n registration_endpoint: `${issuer}/register`,\n response_types_supported: ['code'],\n subject_types_supported: ['public'],\n token_endpoint: `${issuer}/token`,\n token_endpoint_auth_methods_supported: ['none'],\n } satisfies OpenIdProviderDiscoveryMetadata,\n { headers: { 'Access-Control-Allow-Origin': '*' } },\n )\n\nconst register: PayloadHandler = async (req) => {\n const { client_name, redirect_uris } = await req.json!().catch(() => ({}))\n\n if (\n !Array.isArray(redirect_uris) ||\n !redirect_uris.length ||\n !redirect_uris.every(\n (uri) => typeof uri === 'string' && URL.canParse(uri) && !uri.includes('#'),\n )\n ) {\n return Response.json({ error: OAuthErrorCode.InvalidRedirectUri }, { status: 400 })\n }\n\n const client: Client = {\n name: typeof client_name === 'string' ? client_name : 'An MCP client',\n redirectURIs: redirect_uris,\n }\n\n return Response.json(\n {\n client_id: seal({ type: 'client', data: client, req }),\n client_name: client.name,\n grant_types: ['authorization_code'],\n redirect_uris: client.redirectURIs,\n response_types: ['code'],\n token_endpoint_auth_method: 'none',\n } satisfies OAuthClientInformationFull,\n { status: 201 },\n )\n}\n\nconst authorize: PayloadHandler = (req) => {\n const url = new URL(req.url!)\n const params = url.searchParams\n const clientID = params.get('client_id')\n const client = unseal<Client>({ type: 'client', req, value: clientID })\n const redirectURI = params.get('redirect_uri')\n\n // Never redirect to an address the client didn't register\n if (!client || !redirectURI || !client.redirectURIs.includes(redirectURI)) {\n return page({\n content: '<p>Start the sign-in again from your MCP client.</p>',\n status: 400,\n title: 'This sign-in link is invalid',\n })\n }\n\n const state = params.get('state')\n const codeChallenge = params.get('code_challenge')\n\n if (\n params.get('response_type') !== 'code' ||\n params.get('code_challenge_method') !== 'S256' ||\n !codeChallenge\n ) {\n return redirect({ params: { error: OAuthErrorCode.InvalidRequest, state }, redirectURI })\n }\n\n if (!req.user) {\n const loginURL = formatAdminURL({ adminRoute: req.payload.config.routes.admin, path: '/login' })\n\n return new Response(null, {\n headers: {\n Location: `${loginURL}?redirect=${encodeURIComponent(url.pathname + url.search)}`,\n },\n status: 302,\n })\n }\n\n const consent: Consent = {\n clientID: clientID!,\n codeChallenge,\n collection: req.user.collection,\n redirectURI,\n state,\n userID: req.user.id,\n }\n\n return page({\n content: `<p>It will be able to use this app's MCP tools as ${escapeHTML(String(req.user.email ?? req.user.id))}, and you will return to ${escapeHTML(new URL(redirectURI).host || redirectURI)}.</p>\n<form method=\"post\">\n<input name=\"consent\" type=\"hidden\" value=\"${seal({ type: 'consent', data: consent, expiresIn: 20 * 60 * 60, req })}\">\n<button name=\"decision\" type=\"submit\" value=\"allow\">Allow</button>\n<button name=\"decision\" type=\"submit\" value=\"deny\">Deny</button>\n</form>`,\n status: 200,\n title: `Allow ${client.name} to use your account?`,\n })\n}\n\nconst approve: PayloadHandler = async (req) => {\n const form = new URLSearchParams(await req.text!())\n const consent = unseal<Consent>({ type: 'consent', req, value: form.get('consent') })\n\n // The form is only valid for the user it was shown to\n if (!consent || req.user?.id !== consent.userID || req.user.collection !== consent.collection) {\n return page({\n content: '<p>Start the sign-in again from your MCP client.</p>',\n status: 400,\n title: 'This sign-in request expired',\n })\n }\n\n const { clientID, codeChallenge, redirectURI, state } = consent\n\n if (form.get('decision') !== 'allow') {\n return redirect({ params: { error: OAuthErrorCode.AccessDenied, state }, redirectURI })\n }\n\n const { issueToken = issueLoginToken } = getPluginConfig({ config: req.payload.config })\n .oauth as MCPBuiltinOAuthConfig\n const { accessToken, expiresIn } = await issueToken({ req })\n\n const code: Code = { accessToken, clientID, codeChallenge, expiresIn, redirectURI }\n\n return redirect({\n params: { code: seal({ type: 'code', data: code, expiresIn: 60, req }), state },\n redirectURI,\n })\n}\n\nconst token: PayloadHandler = async (req) => {\n const form = new URLSearchParams(await req.text!())\n const code = unseal<Code>({ type: 'code', req, value: form.get('code') })\n\n if (\n form.get('grant_type') !== 'authorization_code' ||\n !code ||\n code.clientID !== form.get('client_id') ||\n code.redirectURI !== form.get('redirect_uri') ||\n // PKCE: only the client that started the sign-in knows the verifier\n createHash('sha256')\n .update(form.get('code_verifier') ?? '')\n .digest('base64url') !== code.codeChallenge\n ) {\n return Response.json({ error: OAuthErrorCode.InvalidGrant }, { status: 400 })\n }\n\n return Response.json(\n {\n access_token: code.accessToken,\n expires_in: code.expiresIn,\n token_type: 'Bearer',\n } satisfies OAuthTokens,\n { headers: { 'Cache-Control': 'no-store' } },\n )\n}\n\n/** The default `issueToken`: a Payload login token, which Payload's JWT strategy accepts. */\nconst issueLoginToken: NonNullable<MCPBuiltinOAuthConfig['issueToken']> = async ({ req }) => {\n const collection = req.payload.collections[req.user!.collection]!\n\n if (collection.config.auth.disableLocalStrategy) {\n throw new APIError(\n `The \"${collection.config.slug}\" collection has its local strategy disabled, so MCP clients can't get Payload login tokens for it. Pass oauth.issueToken to the MCP plugin.`,\n )\n }\n\n // The full document, like the one a password login starts the session on\n const user = (await req.payload.db.findOne<NonNullable<PayloadRequest['user']>>({\n collection: collection.config.slug,\n req,\n where: { id: { equals: req.user!.id } },\n }))!\n\n const { token } = await createAuthToken({\n collectionConfig: collection.config,\n email: user.email!,\n req,\n user,\n })\n\n return { accessToken: token, expiresIn: collection.config.auth.tokenExpiration }\n}\n\n/**\n * Encrypts data for the client to hold, so it doesn't need to be stored. `type` keeps one kind\n * from being used as another, e.g. a client ID as an authorization code.\n */\nconst seal = ({\n type,\n data,\n expiresIn,\n req,\n}: {\n data: object\n /** Seconds */\n expiresIn?: number\n req: PayloadRequest\n type: string\n}): string =>\n req.payload.encrypt(\n JSON.stringify({ ...data, type, exp: expiresIn && Date.now() + expiresIn * 1000 }),\n )\n\nconst unseal = <T>({\n type,\n req,\n value,\n}: {\n req: PayloadRequest\n type: string\n value: null | string\n}): T | undefined => {\n // Only the v1 format is authenticated. Older formats decrypt anything without an error.\n if (!value?.startsWith('v1:')) {\n return undefined\n }\n\n try {\n const data = JSON.parse(req.payload.decrypt(value))\n return data.type === type && (!data.exp || data.exp > Date.now()) ? data : undefined\n } catch {\n return undefined\n }\n}\n\nconst redirect = ({\n params,\n redirectURI,\n}: {\n params: Record<string, null | string>\n redirectURI: string\n}): Response => {\n const location = new URL(redirectURI)\n\n for (const [key, value] of Object.entries(params)) {\n if (value) {\n location.searchParams.set(key, value)\n }\n }\n\n return new Response(null, { headers: { Location: location.href }, status: 302 })\n}\n\nconst page = ({\n content,\n status,\n title,\n}: {\n content: string\n status: number\n title: string\n}): Response =>\n new Response(\n `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>${escapeHTML(title)}</title>\n<style>\nbody { font-family: system-ui, sans-serif; margin: 4rem auto; max-width: 32rem; overflow-wrap: anywhere; padding: 0 1rem }\nbutton { font: inherit; margin-inline-end: 0.5rem; padding: 0.5rem 1rem }\n</style>\n</head>\n<body><h1>${escapeHTML(title)}</h1>${content}</body>\n</html>`,\n {\n headers: {\n // Stop other sites from framing the page to trick users into clicking Allow\n 'Content-Security-Policy': \"frame-ancestors 'none'\",\n 'Content-Type': 'text/html; charset=utf-8',\n },\n status,\n },\n )\n\nconst escapeHTML = (value: string): string =>\n value.replace(/[&<>\"']/g, (character) => `&#${character.charCodeAt(0)};`)\n"],"names":["OAuthErrorCode","createHash","APIError","createAuthToken","formatAdminURL","getPluginConfig","getMCPURL","oauthServerEndpoints","disableAuth","handler","req","withIssuer","issuer","metadataResponse","method","path","Response","json","keys","register","authorize","approve","token","getIssuer","config","payload","oauth","type","url","undefined","status","authorization_endpoint","code_challenge_methods_supported","grant_types_supported","id_token_signing_alg_values_supported","jwks_uri","registration_endpoint","response_types_supported","subject_types_supported","token_endpoint","token_endpoint_auth_methods_supported","headers","client_name","redirect_uris","catch","Array","isArray","length","every","uri","URL","canParse","includes","error","InvalidRedirectUri","client","name","redirectURIs","client_id","seal","data","grant_types","response_types","token_endpoint_auth_method","params","searchParams","clientID","get","unseal","value","redirectURI","page","content","title","state","codeChallenge","redirect","InvalidRequest","user","loginURL","adminRoute","routes","admin","Location","encodeURIComponent","pathname","search","consent","collection","userID","id","escapeHTML","String","email","host","expiresIn","form","URLSearchParams","text","AccessDenied","issueToken","issueLoginToken","accessToken","code","update","digest","InvalidGrant","access_token","expires_in","token_type","collections","auth","disableLocalStrategy","slug","db","findOne","where","equals","collectionConfig","tokenExpiration","encrypt","JSON","stringify","exp","Date","now","startsWith","parse","decrypt","location","key","Object","entries","set","href","replace","character","charCodeAt"],"mappings":"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"}
@@ -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"}
package/dist/index.d.ts CHANGED
@@ -1,14 +1,22 @@
1
- import type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig } from './types.js';
1
+ import type { AuthorizedMCP, MCPBuiltinOAuthConfig, MCPExternalOAuthConfig, MCPOAuthConfig, MCPPluginConfig, SanitizedMCPPluginConfig } from './types.js';
2
2
  declare module 'payload' {
3
- interface PayloadRequest {
4
- payloadAPI: 'GraphQL' | 'local' | 'MCP' | 'REST';
3
+ interface PayloadRequestAPI {
4
+ MCP: true;
5
5
  }
6
6
  interface RegisteredPlugins {
7
7
  /** After the plugin's `plugin` callback runs, `options` holds the sanitized config. */
8
8
  '@payloadcms/plugin-mcp': MCPPluginConfig;
9
9
  }
10
+ interface RequestContext {
11
+ /** Set on MCP requests before they're authenticated. */
12
+ mcp?: {
13
+ /** The MCP endpoint's address, which OAuth access tokens for MCP are issued for. */
14
+ resource: string;
15
+ };
16
+ }
10
17
  }
11
- export type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig };
18
+ export type { AuthorizedMCP, MCPBuiltinOAuthConfig, MCPExternalOAuthConfig, MCPOAuthConfig, MCPPluginConfig, SanitizedMCPPluginConfig, };
12
19
  export { defineCollectionTool, defineGlobalTool, definePrompt, defineTool } from './defineTool.js';
20
+ export { oauthProtectedResourceHandler } from './endpoint/oauth.js';
13
21
  export declare const mcpPlugin: (options: MCPPluginConfig) => import("payload").Plugin;
14
22
  //# sourceMappingURL=index.d.ts.map
@@ -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,wDAqFpB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,wBAAwB,EACzB,MAAM,YAAY,CAAA;AAOnB,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,iBAAiB;QAChC,GAAG,EAAE,IAAI,CAAA;KACV;IACD,UAAU,iBAAiB;QACzB,uFAAuF;QACvF,wBAAwB,EAAE,eAAe,CAAA;KAC1C;IACD,UAAiB,cAAc;QAC7B,wDAAwD;QACxD,GAAG,CAAC,EAAE;YACJ,oFAAoF;YACpF,QAAQ,EAAE,MAAM,CAAA;SACjB,CAAA;KACF;CACF;AAED,YAAY,EACV,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,wBAAwB,GACzB,CAAA;AAED,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAClG,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAA;AAEnE,eAAO,MAAM,SAAS,wDA0CpB,CAAA"}