@payloadcms/plugin-mcp 3.86.0-internal.ac46214 → 4.0.0-internal.1f9ae9a

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 (329) hide show
  1. package/README.md +2 -2
  2. package/bin.js +39 -0
  3. package/dist/collection/getAccessField.d.ts +12 -0
  4. package/dist/collection/getAccessField.d.ts.map +1 -0
  5. package/dist/collection/getAccessField.js +57 -0
  6. package/dist/collection/getAccessField.js.map +1 -0
  7. package/dist/collection/index.d.ts +6 -0
  8. package/dist/collection/index.d.ts.map +1 -0
  9. package/dist/collection/index.js +59 -0
  10. package/dist/collection/index.js.map +1 -0
  11. package/dist/components/AccessField/index.client.d.ts +10 -0
  12. package/dist/components/AccessField/index.client.d.ts.map +1 -0
  13. package/dist/components/AccessField/index.client.js +305 -0
  14. package/dist/components/AccessField/index.client.js.map +1 -0
  15. package/dist/components/AccessField/index.css +93 -0
  16. package/dist/defineTool.d.ts +26 -0
  17. package/dist/defineTool.d.ts.map +1 -0
  18. package/dist/defineTool.js +37 -0
  19. package/dist/defineTool.js.map +1 -0
  20. package/dist/endpoint/access.d.ts +10 -0
  21. package/dist/endpoint/access.d.ts.map +1 -0
  22. package/dist/endpoint/access.js +106 -0
  23. package/dist/endpoint/access.js.map +1 -0
  24. package/dist/endpoint/index.d.ts +3 -0
  25. package/dist/endpoint/index.d.ts.map +1 -0
  26. package/dist/endpoint/index.js +36 -0
  27. package/dist/endpoint/index.js.map +1 -0
  28. package/dist/exports/client.d.ts +2 -0
  29. package/dist/exports/client.d.ts.map +1 -0
  30. package/dist/exports/client.js +4 -0
  31. package/dist/exports/client.js.map +1 -0
  32. package/dist/index.d.ts +4 -7
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +44 -67
  35. package/dist/index.js.map +1 -1
  36. package/dist/mcp/buildMcpServer.d.ts +19 -0
  37. package/dist/mcp/buildMcpServer.d.ts.map +1 -0
  38. package/dist/mcp/buildMcpServer.js +163 -0
  39. package/dist/mcp/buildMcpServer.js.map +1 -0
  40. package/dist/mcp/builtin/collections/authTools.d.ts +7 -0
  41. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -0
  42. package/dist/mcp/builtin/collections/authTools.js +250 -0
  43. package/dist/mcp/builtin/collections/authTools.js.map +1 -0
  44. package/dist/mcp/builtin/collections/createTool.d.ts +2 -0
  45. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -0
  46. package/dist/mcp/builtin/collections/createTool.js +87 -0
  47. package/dist/mcp/builtin/collections/createTool.js.map +1 -0
  48. package/dist/mcp/builtin/collections/deleteTool.d.ts +2 -0
  49. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -0
  50. package/dist/mcp/builtin/collections/deleteTool.js +117 -0
  51. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -0
  52. package/dist/mcp/builtin/collections/findTool.d.ts +2 -0
  53. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -0
  54. package/dist/mcp/builtin/collections/findTool.js +159 -0
  55. package/dist/mcp/builtin/collections/findTool.js.map +1 -0
  56. package/dist/mcp/builtin/collections/updateTool.d.ts +2 -0
  57. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -0
  58. package/dist/mcp/builtin/collections/updateTool.js +187 -0
  59. package/dist/mcp/builtin/collections/updateTool.js.map +1 -0
  60. package/dist/mcp/builtin/globals/findTool.d.ts +2 -0
  61. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -0
  62. package/dist/mcp/builtin/globals/findTool.js +76 -0
  63. package/dist/mcp/builtin/globals/findTool.js.map +1 -0
  64. package/dist/mcp/builtin/globals/updateTool.d.ts +2 -0
  65. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -0
  66. package/dist/mcp/builtin/globals/updateTool.js +92 -0
  67. package/dist/mcp/builtin/globals/updateTool.js.map +1 -0
  68. package/dist/mcp/builtinTools.d.ts +37 -0
  69. package/dist/mcp/builtinTools.d.ts.map +1 -0
  70. package/dist/mcp/builtinTools.js +64 -0
  71. package/dist/mcp/builtinTools.js.map +1 -0
  72. package/dist/mcp/sanitizeMCPConfig.d.ts +17 -0
  73. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -0
  74. package/dist/mcp/sanitizeMCPConfig.js +167 -0
  75. package/dist/mcp/sanitizeMCPConfig.js.map +1 -0
  76. package/dist/stdio.d.ts +8 -0
  77. package/dist/stdio.d.ts.map +1 -0
  78. package/dist/stdio.js +89 -0
  79. package/dist/stdio.js.map +1 -0
  80. package/dist/types.d.ts +262 -455
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/types.js +6 -1
  83. package/dist/types.js.map +1 -1
  84. package/dist/utils/camelCase.d.ts.map +1 -1
  85. package/dist/utils/getLogger.d.ts +10 -0
  86. package/dist/utils/getLogger.d.ts.map +1 -0
  87. package/dist/utils/getLogger.js +22 -0
  88. package/dist/utils/getLogger.js.map +1 -0
  89. package/dist/utils/getPluginConfig.d.ts +12 -0
  90. package/dist/utils/getPluginConfig.d.ts.map +1 -0
  91. package/dist/utils/getPluginConfig.js +15 -0
  92. package/dist/utils/getPluginConfig.js.map +1 -0
  93. package/dist/utils/localAPIDefaults.d.ts +20 -0
  94. package/dist/utils/localAPIDefaults.d.ts.map +1 -0
  95. package/dist/utils/localAPIDefaults.js +19 -0
  96. package/dist/utils/localAPIDefaults.js.map +1 -0
  97. package/dist/utils/resolveProjectRoot.d.ts +7 -0
  98. package/dist/utils/resolveProjectRoot.d.ts.map +1 -0
  99. package/dist/utils/resolveProjectRoot.js +15 -0
  100. package/dist/utils/resolveProjectRoot.js.map +1 -0
  101. package/dist/utils/schemaConversion/prepareCollectionSchema.d.ts +7 -0
  102. package/dist/utils/schemaConversion/prepareCollectionSchema.d.ts.map +1 -0
  103. package/dist/utils/schemaConversion/prepareCollectionSchema.js +37 -0
  104. package/dist/utils/schemaConversion/prepareCollectionSchema.js.map +1 -0
  105. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +2 -2
  106. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +1 -1
  107. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +1 -1
  108. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts +2 -2
  109. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts.map +1 -1
  110. package/dist/utils/schemaConversion/sanitizeJsonSchema.js.map +1 -1
  111. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts +2 -2
  112. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts.map +1 -1
  113. package/dist/utils/schemaConversion/simplifyRelationshipFields.js +7 -4
  114. package/dist/utils/schemaConversion/simplifyRelationshipFields.js.map +1 -1
  115. package/dist/utils/schemaConversion/transformPointFields.d.ts +2 -2
  116. package/dist/utils/schemaConversion/transformPointFields.d.ts.map +1 -1
  117. package/dist/utils/schemaConversion/transformPointFields.js +7 -1
  118. package/dist/utils/schemaConversion/transformPointFields.js.map +1 -1
  119. package/dist/utils/toStandardSchema.d.ts +5 -0
  120. package/dist/utils/toStandardSchema.d.ts.map +1 -0
  121. package/dist/utils/toStandardSchema.js +4 -0
  122. package/dist/utils/toStandardSchema.js.map +1 -0
  123. package/package.json +35 -10
  124. package/src/collection/getAccessField.ts +64 -0
  125. package/src/collection/index.ts +63 -0
  126. package/src/components/AccessField/index.client.tsx +344 -0
  127. package/src/components/AccessField/index.css +93 -0
  128. package/src/defineTool.ts +44 -0
  129. package/src/endpoint/access.ts +132 -0
  130. package/src/endpoint/index.ts +35 -0
  131. package/src/exports/client.ts +2 -0
  132. package/src/index.ts +35 -85
  133. package/src/mcp/buildMcpServer.ts +224 -0
  134. package/src/mcp/builtin/collections/authTools.ts +233 -0
  135. package/src/mcp/builtin/collections/createTool.ts +116 -0
  136. package/src/mcp/builtin/collections/deleteTool.ts +123 -0
  137. package/src/mcp/builtin/collections/findTool.ts +187 -0
  138. package/src/mcp/builtin/collections/updateTool.ts +205 -0
  139. package/src/mcp/builtin/globals/findTool.ts +96 -0
  140. package/src/mcp/builtin/globals/updateTool.ts +118 -0
  141. package/src/mcp/builtinTools.ts +84 -0
  142. package/src/mcp/sanitizeMCPConfig.ts +239 -0
  143. package/src/stdio.ts +98 -0
  144. package/src/types.ts +295 -490
  145. package/src/utils/getLogger.ts +22 -0
  146. package/src/utils/getPluginConfig.ts +24 -0
  147. package/src/utils/localAPIDefaults.ts +22 -0
  148. package/src/utils/resolveProjectRoot.ts +17 -0
  149. package/src/utils/schemaConversion/prepareCollectionSchema.ts +39 -0
  150. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +3 -3
  151. package/src/utils/schemaConversion/sanitizeJsonSchema.ts +4 -4
  152. package/src/utils/schemaConversion/simplifyRelationshipFields.ts +11 -6
  153. package/src/utils/schemaConversion/transformPointFields.ts +6 -5
  154. package/src/utils/toStandardSchema.ts +9 -0
  155. package/dist/collections/createApiKeysCollection.d.ts +0 -7
  156. package/dist/collections/createApiKeysCollection.d.ts.map +0 -1
  157. package/dist/collections/createApiKeysCollection.js +0 -317
  158. package/dist/collections/createApiKeysCollection.js.map +0 -1
  159. package/dist/defaults.d.ts +0 -4
  160. package/dist/defaults.d.ts.map +0 -1
  161. package/dist/defaults.js +0 -5
  162. package/dist/defaults.js.map +0 -1
  163. package/dist/endpoints/mcp.d.ts +0 -4
  164. package/dist/endpoints/mcp.d.ts.map +0 -1
  165. package/dist/endpoints/mcp.js +0 -71
  166. package/dist/endpoints/mcp.js.map +0 -1
  167. package/dist/mcp/createRequest.d.ts +0 -3
  168. package/dist/mcp/createRequest.d.ts.map +0 -1
  169. package/dist/mcp/createRequest.js +0 -14
  170. package/dist/mcp/createRequest.js.map +0 -1
  171. package/dist/mcp/getMcpHandler.d.ts +0 -4
  172. package/dist/mcp/getMcpHandler.d.ts.map +0 -1
  173. package/dist/mcp/getMcpHandler.js +0 -231
  174. package/dist/mcp/getMcpHandler.js.map +0 -1
  175. package/dist/mcp/helpers/config.d.ts +0 -22
  176. package/dist/mcp/helpers/config.d.ts.map +0 -1
  177. package/dist/mcp/helpers/config.js +0 -153
  178. package/dist/mcp/helpers/config.js.map +0 -1
  179. package/dist/mcp/helpers/fields.d.ts +0 -19
  180. package/dist/mcp/helpers/fields.d.ts.map +0 -1
  181. package/dist/mcp/helpers/fields.js +0 -102
  182. package/dist/mcp/helpers/fields.js.map +0 -1
  183. package/dist/mcp/helpers/fileValidation.d.ts +0 -67
  184. package/dist/mcp/helpers/fileValidation.d.ts.map +0 -1
  185. package/dist/mcp/helpers/fileValidation.js +0 -267
  186. package/dist/mcp/helpers/fileValidation.js.map +0 -1
  187. package/dist/mcp/registerTool.d.ts +0 -6
  188. package/dist/mcp/registerTool.d.ts.map +0 -1
  189. package/dist/mcp/registerTool.js +0 -18
  190. package/dist/mcp/registerTool.js.map +0 -1
  191. package/dist/mcp/tools/auth/auth.d.ts +0 -4
  192. package/dist/mcp/tools/auth/auth.d.ts.map +0 -1
  193. package/dist/mcp/tools/auth/auth.js +0 -57
  194. package/dist/mcp/tools/auth/auth.js.map +0 -1
  195. package/dist/mcp/tools/auth/forgotPassword.d.ts +0 -4
  196. package/dist/mcp/tools/auth/forgotPassword.d.ts.map +0 -1
  197. package/dist/mcp/tools/auth/forgotPassword.js +0 -48
  198. package/dist/mcp/tools/auth/forgotPassword.js.map +0 -1
  199. package/dist/mcp/tools/auth/login.d.ts +0 -4
  200. package/dist/mcp/tools/auth/login.d.ts.map +0 -1
  201. package/dist/mcp/tools/auth/login.js +0 -51
  202. package/dist/mcp/tools/auth/login.js.map +0 -1
  203. package/dist/mcp/tools/auth/resetPassword.d.ts +0 -4
  204. package/dist/mcp/tools/auth/resetPassword.d.ts.map +0 -1
  205. package/dist/mcp/tools/auth/resetPassword.js +0 -49
  206. package/dist/mcp/tools/auth/resetPassword.js.map +0 -1
  207. package/dist/mcp/tools/auth/unlock.d.ts +0 -4
  208. package/dist/mcp/tools/auth/unlock.d.ts.map +0 -1
  209. package/dist/mcp/tools/auth/unlock.js +0 -48
  210. package/dist/mcp/tools/auth/unlock.js.map +0 -1
  211. package/dist/mcp/tools/auth/verify.d.ts +0 -4
  212. package/dist/mcp/tools/auth/verify.d.ts.map +0 -1
  213. package/dist/mcp/tools/auth/verify.js +0 -45
  214. package/dist/mcp/tools/auth/verify.js.map +0 -1
  215. package/dist/mcp/tools/collection/create.d.ts +0 -10
  216. package/dist/mcp/tools/collection/create.d.ts.map +0 -1
  217. package/dist/mcp/tools/collection/create.js +0 -139
  218. package/dist/mcp/tools/collection/create.js.map +0 -1
  219. package/dist/mcp/tools/collection/delete.d.ts +0 -10
  220. package/dist/mcp/tools/collection/delete.d.ts.map +0 -1
  221. package/dist/mcp/tools/collection/delete.js +0 -154
  222. package/dist/mcp/tools/collection/delete.js.map +0 -1
  223. package/dist/mcp/tools/collection/find.d.ts +0 -10
  224. package/dist/mcp/tools/collection/find.d.ts.map +0 -1
  225. package/dist/mcp/tools/collection/find.js +0 -165
  226. package/dist/mcp/tools/collection/find.js.map +0 -1
  227. package/dist/mcp/tools/collection/update.d.ts +0 -10
  228. package/dist/mcp/tools/collection/update.d.ts.map +0 -1
  229. package/dist/mcp/tools/collection/update.js +0 -209
  230. package/dist/mcp/tools/collection/update.js.map +0 -1
  231. package/dist/mcp/tools/config/find.d.ts +0 -10
  232. package/dist/mcp/tools/config/find.d.ts.map +0 -1
  233. package/dist/mcp/tools/config/find.js +0 -97
  234. package/dist/mcp/tools/config/find.js.map +0 -1
  235. package/dist/mcp/tools/config/update.d.ts +0 -10
  236. package/dist/mcp/tools/config/update.d.ts.map +0 -1
  237. package/dist/mcp/tools/config/update.js +0 -215
  238. package/dist/mcp/tools/config/update.js.map +0 -1
  239. package/dist/mcp/tools/global/find.d.ts +0 -5
  240. package/dist/mcp/tools/global/find.d.ts.map +0 -1
  241. package/dist/mcp/tools/global/find.js +0 -82
  242. package/dist/mcp/tools/global/find.js.map +0 -1
  243. package/dist/mcp/tools/global/update.d.ts +0 -6
  244. package/dist/mcp/tools/global/update.d.ts.map +0 -1
  245. package/dist/mcp/tools/global/update.js +0 -124
  246. package/dist/mcp/tools/global/update.js.map +0 -1
  247. package/dist/mcp/tools/job/create.d.ts +0 -10
  248. package/dist/mcp/tools/job/create.d.ts.map +0 -1
  249. package/dist/mcp/tools/job/create.js +0 -293
  250. package/dist/mcp/tools/job/create.js.map +0 -1
  251. package/dist/mcp/tools/job/run.d.ts +0 -10
  252. package/dist/mcp/tools/job/run.d.ts.map +0 -1
  253. package/dist/mcp/tools/job/run.js +0 -129
  254. package/dist/mcp/tools/job/run.js.map +0 -1
  255. package/dist/mcp/tools/job/update.d.ts +0 -11
  256. package/dist/mcp/tools/job/update.d.ts.map +0 -1
  257. package/dist/mcp/tools/job/update.js +0 -186
  258. package/dist/mcp/tools/job/update.js.map +0 -1
  259. package/dist/mcp/tools/resource/create.d.ts +0 -6
  260. package/dist/mcp/tools/resource/create.d.ts.map +0 -1
  261. package/dist/mcp/tools/resource/create.js +0 -124
  262. package/dist/mcp/tools/resource/create.js.map +0 -1
  263. package/dist/mcp/tools/resource/delete.d.ts +0 -5
  264. package/dist/mcp/tools/resource/delete.d.ts.map +0 -1
  265. package/dist/mcp/tools/resource/delete.js +0 -151
  266. package/dist/mcp/tools/resource/delete.js.map +0 -1
  267. package/dist/mcp/tools/resource/find.d.ts +0 -5
  268. package/dist/mcp/tools/resource/find.d.ts.map +0 -1
  269. package/dist/mcp/tools/resource/find.js +0 -170
  270. package/dist/mcp/tools/resource/find.js.map +0 -1
  271. package/dist/mcp/tools/resource/update.d.ts +0 -6
  272. package/dist/mcp/tools/resource/update.d.ts.map +0 -1
  273. package/dist/mcp/tools/resource/update.js +0 -256
  274. package/dist/mcp/tools/resource/update.js.map +0 -1
  275. package/dist/mcp/tools/schemas.d.ts +0 -457
  276. package/dist/mcp/tools/schemas.d.ts.map +0 -1
  277. package/dist/mcp/tools/schemas.js +0 -243
  278. package/dist/mcp/tools/schemas.js.map +0 -1
  279. package/dist/utils/adminEntitySettings.d.ts +0 -17
  280. package/dist/utils/adminEntitySettings.d.ts.map +0 -1
  281. package/dist/utils/adminEntitySettings.js +0 -41
  282. package/dist/utils/adminEntitySettings.js.map +0 -1
  283. package/dist/utils/createApiKeyFields.d.ts +0 -15
  284. package/dist/utils/createApiKeyFields.d.ts.map +0 -1
  285. package/dist/utils/createApiKeyFields.js +0 -57
  286. package/dist/utils/createApiKeyFields.js.map +0 -1
  287. package/dist/utils/getEnabledSlugs.d.ts +0 -13
  288. package/dist/utils/getEnabledSlugs.d.ts.map +0 -1
  289. package/dist/utils/getEnabledSlugs.js +0 -32
  290. package/dist/utils/getEnabledSlugs.js.map +0 -1
  291. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts +0 -3
  292. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts.map +0 -1
  293. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js +0 -43
  294. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js.map +0 -1
  295. package/src/collections/createApiKeysCollection.ts +0 -373
  296. package/src/defaults.ts +0 -3
  297. package/src/endpoints/mcp.ts +0 -91
  298. package/src/mcp/createRequest.ts +0 -13
  299. package/src/mcp/getMcpHandler.ts +0 -545
  300. package/src/mcp/helpers/config.ts +0 -213
  301. package/src/mcp/helpers/fields.ts +0 -154
  302. package/src/mcp/helpers/fileValidation.ts +0 -362
  303. package/src/mcp/registerTool.ts +0 -22
  304. package/src/mcp/tools/auth/auth.ts +0 -71
  305. package/src/mcp/tools/auth/forgotPassword.ts +0 -70
  306. package/src/mcp/tools/auth/login.ts +0 -72
  307. package/src/mcp/tools/auth/resetPassword.ts +0 -61
  308. package/src/mcp/tools/auth/unlock.ts +0 -64
  309. package/src/mcp/tools/auth/verify.ts +0 -57
  310. package/src/mcp/tools/collection/create.ts +0 -210
  311. package/src/mcp/tools/collection/delete.ts +0 -211
  312. package/src/mcp/tools/collection/find.ts +0 -224
  313. package/src/mcp/tools/collection/update.ts +0 -290
  314. package/src/mcp/tools/config/find.ts +0 -128
  315. package/src/mcp/tools/config/update.ts +0 -280
  316. package/src/mcp/tools/global/find.ts +0 -128
  317. package/src/mcp/tools/global/update.ts +0 -207
  318. package/src/mcp/tools/job/create.ts +0 -416
  319. package/src/mcp/tools/job/run.ts +0 -167
  320. package/src/mcp/tools/job/update.ts +0 -274
  321. package/src/mcp/tools/resource/create.ts +0 -211
  322. package/src/mcp/tools/resource/delete.ts +0 -218
  323. package/src/mcp/tools/resource/find.ts +0 -246
  324. package/src/mcp/tools/resource/update.ts +0 -383
  325. package/src/mcp/tools/schemas.ts +0 -520
  326. package/src/utils/adminEntitySettings.ts +0 -40
  327. package/src/utils/createApiKeyFields.ts +0 -72
  328. package/src/utils/getEnabledSlugs.ts +0 -42
  329. package/src/utils/schemaConversion/convertCollectionSchemaToZod.ts +0 -52
package/README.md CHANGED
@@ -2,6 +2,6 @@
2
2
 
3
3
  A plugin for [Payload](https://github.com/payloadcms/payload). This plugin adds [Model Context Protocol](https://modelcontextprotocol.io/docs/getting-started/intro) capabilities.
4
4
 
5
- - [Source code](https://github.com/payloadcms/payload/tree/3.x/packages/plugin-mcp)
5
+ - [Source code](https://github.com/payloadcms/payload/tree/main/packages/plugin-mcp)
6
6
  - [Documentation](https://payloadcms.com/docs/plugins/mcp)
7
- - [Documentation source](https://github.com/payloadcms/payload/tree/3.x/docs/plugins/mcp.mdx)
7
+ - [Documentation source](https://github.com/payloadcms/payload/tree/main/docs/plugins/mcp.mdx)
package/bin.js ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * stdio MCP server for Payload.
4
+ *
5
+ * Loads the project's `payload.config.{ts,js}` (via `findConfig`), boots Payload,
6
+ * and serves MCP over stdin/stdout. Intended for local-dev MCP clients (Claude
7
+ * Desktop, IDEs) that spawn stdio MCP servers - no running Next.js dev server required.
8
+ *
9
+ * Mirrors `payload/bin.js`: by default, transpiles TS on the fly via `tsx`. Pass
10
+ * `--disable-transpile` if your config is already JS (or you've registered your
11
+ * own loader).
12
+ */
13
+ import path from 'path'
14
+ import { fileURLToPath, pathToFileURL } from 'url'
15
+
16
+ const disableTranspile = process.argv.includes('--disable-transpile')
17
+
18
+ const filename = fileURLToPath(import.meta.url)
19
+ const dirname = path.dirname(filename)
20
+ const baseURL = pathToFileURL(dirname).toString() + '/'
21
+
22
+ const start = async () => {
23
+ if (disableTranspile) {
24
+ process.argv = process.argv.filter((arg) => arg !== '--disable-transpile')
25
+ const { runMcpStdio } = await import('./dist/stdio.js')
26
+ await runMcpStdio()
27
+ return
28
+ }
29
+
30
+ const { tsImport } = await import('tsx/esm/api')
31
+ const { runMcpStdio } = await tsImport('./dist/stdio.js', baseURL)
32
+ await runMcpStdio()
33
+ }
34
+
35
+ start().catch((err) => {
36
+ // eslint-disable-next-line no-console
37
+ console.error('[payload-mcp] error:', err)
38
+ process.exit(1)
39
+ })
@@ -0,0 +1,12 @@
1
+ import type { JSONField } from 'payload';
2
+ import type { SanitizedMCPPluginConfig } from '../types.js';
3
+ /**
4
+ * Returns the API key collection's `access` field — a JSON field whose value
5
+ * is the `MCPAPIKeysDocAccessTree` the endpoint consults. The actual UI is
6
+ * a custom client component (`AccessField`) which renders a permissions
7
+ * matrix; the field's stored shape is just the runtime access tree.
8
+ */
9
+ export declare const getAccessField: ({ pluginConfig, }: {
10
+ pluginConfig: SanitizedMCPPluginConfig;
11
+ }) => JSONField;
12
+ //# sourceMappingURL=getAccessField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAccessField.d.ts","sourceRoot":"","sources":["../../src/collection/getAccessField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC,OAAO,KAAK,EAAkC,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAE3F;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,mBAE5B;IACD,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,SAqBH,CAAA"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Returns the API key collection's `access` field — a JSON field whose value
3
+ * is the `MCPAPIKeysDocAccessTree` the endpoint consults. The actual UI is
4
+ * a custom client component (`AccessField`) which renders a permissions
5
+ * matrix; the field's stored shape is just the runtime access tree.
6
+ */ export const getAccessField = ({ pluginConfig })=>{
7
+ const clientPluginConfig = sanitizeClientPluginConfig(pluginConfig);
8
+ return {
9
+ name: 'access',
10
+ type: 'json',
11
+ admin: {
12
+ components: {
13
+ Field: {
14
+ clientProps: {
15
+ pluginConfig: clientPluginConfig
16
+ },
17
+ path: '@payloadcms/plugin-mcp/client#AccessField'
18
+ }
19
+ },
20
+ // TODO: needs i18n once design is finalized
21
+ description: 'Access for this API key — uncheck to revoke individual tools.',
22
+ position: 'sidebar'
23
+ },
24
+ defaultValue: {},
25
+ // TODO: needs i18n once design is finalized
26
+ label: 'Access'
27
+ };
28
+ };
29
+ /**
30
+ * Strips the non-serializable parts of `SanitizedMCPPluginConfig` (handlers,
31
+ * input/argsSchema functions, etc.) so the result is safe to thread to a
32
+ * client component via `clientProps`.
33
+ */ const sanitizeClientPluginConfig = (pluginConfig)=>({
34
+ items: pluginConfig.items.map((item)=>({
35
+ ...item.type === 'collectionTool' ? {
36
+ collectionSlug: item.collectionSlug
37
+ } : {},
38
+ ...item.type === 'globalTool' ? {
39
+ globalSlug: item.globalSlug
40
+ } : {},
41
+ type: item.type,
42
+ description: itemDescription(item),
43
+ key: item.key,
44
+ label: item.label
45
+ }))
46
+ });
47
+ const itemDescription = (item)=>{
48
+ if (item.type === 'prompt') {
49
+ return item.prompt.description;
50
+ }
51
+ if (item.type === 'resource') {
52
+ return item.resource.description;
53
+ }
54
+ return item.tool.description;
55
+ };
56
+
57
+ //# sourceMappingURL=getAccessField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/collection/getAccessField.ts"],"sourcesContent":["import type { JSONField } from 'payload'\n\nimport type { ClientMCPPluginConfig, MCPItem, SanitizedMCPPluginConfig } from '../types.js'\n\n/**\n * Returns the API key collection's `access` field — a JSON field whose value\n * is the `MCPAPIKeysDocAccessTree` the endpoint consults. The actual UI is\n * a custom client component (`AccessField`) which renders a permissions\n * matrix; the field's stored shape is just the runtime access tree.\n */\nexport const getAccessField = ({\n pluginConfig,\n}: {\n pluginConfig: SanitizedMCPPluginConfig\n}): JSONField => {\n const clientPluginConfig = sanitizeClientPluginConfig(pluginConfig)\n\n return {\n name: 'access',\n type: 'json',\n admin: {\n components: {\n Field: {\n clientProps: { pluginConfig: clientPluginConfig },\n path: '@payloadcms/plugin-mcp/client#AccessField',\n },\n },\n // TODO: needs i18n once design is finalized\n description: 'Access for this API key — uncheck to revoke individual tools.',\n position: 'sidebar',\n },\n defaultValue: {},\n // TODO: needs i18n once design is finalized\n label: 'Access',\n }\n}\n\n/**\n * Strips the non-serializable parts of `SanitizedMCPPluginConfig` (handlers,\n * input/argsSchema functions, etc.) so the result is safe to thread to a\n * client component via `clientProps`.\n */\nconst sanitizeClientPluginConfig = (\n pluginConfig: SanitizedMCPPluginConfig,\n): ClientMCPPluginConfig => ({\n items: pluginConfig.items.map((item) => ({\n ...(item.type === 'collectionTool' ? { collectionSlug: item.collectionSlug } : {}),\n ...(item.type === 'globalTool' ? { globalSlug: item.globalSlug } : {}),\n type: item.type,\n description: itemDescription(item),\n key: item.key,\n label: item.label,\n })),\n})\n\nconst itemDescription = (item: MCPItem): string => {\n if (item.type === 'prompt') {\n return item.prompt.description\n }\n if (item.type === 'resource') {\n return item.resource.description\n }\n return item.tool.description\n}\n"],"names":["getAccessField","pluginConfig","clientPluginConfig","sanitizeClientPluginConfig","name","type","admin","components","Field","clientProps","path","description","position","defaultValue","label","items","map","item","collectionSlug","globalSlug","itemDescription","key","prompt","resource","tool"],"mappings":"AAIA;;;;;CAKC,GACD,OAAO,MAAMA,iBAAiB,CAAC,EAC7BC,YAAY,EAGb;IACC,MAAMC,qBAAqBC,2BAA2BF;IAEtD,OAAO;QACLG,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBAAER,cAAcC;oBAAmB;oBAChDQ,MAAM;gBACR;YACF;YACA,4CAA4C;YAC5CC,aAAa;YACbC,UAAU;QACZ;QACAC,cAAc,CAAC;QACf,4CAA4C;QAC5CC,OAAO;IACT;AACF,EAAC;AAED;;;;CAIC,GACD,MAAMX,6BAA6B,CACjCF,eAC2B,CAAA;QAC3Bc,OAAOd,aAAac,KAAK,CAACC,GAAG,CAAC,CAACC,OAAU,CAAA;gBACvC,GAAIA,KAAKZ,IAAI,KAAK,mBAAmB;oBAAEa,gBAAgBD,KAAKC,cAAc;gBAAC,IAAI,CAAC,CAAC;gBACjF,GAAID,KAAKZ,IAAI,KAAK,eAAe;oBAAEc,YAAYF,KAAKE,UAAU;gBAAC,IAAI,CAAC,CAAC;gBACrEd,MAAMY,KAAKZ,IAAI;gBACfM,aAAaS,gBAAgBH;gBAC7BI,KAAKJ,KAAKI,GAAG;gBACbP,OAAOG,KAAKH,KAAK;YACnB,CAAA;IACF,CAAA;AAEA,MAAMM,kBAAkB,CAACH;IACvB,IAAIA,KAAKZ,IAAI,KAAK,UAAU;QAC1B,OAAOY,KAAKK,MAAM,CAACX,WAAW;IAChC;IACA,IAAIM,KAAKZ,IAAI,KAAK,YAAY;QAC5B,OAAOY,KAAKM,QAAQ,CAACZ,WAAW;IAClC;IACA,OAAOM,KAAKO,IAAI,CAACb,WAAW;AAC9B"}
@@ -0,0 +1,6 @@
1
+ import type { CollectionConfig } from 'payload';
2
+ import type { SanitizedMCPPluginConfig } from '../types.js';
3
+ export declare const getAPIKeysCollection: ({ pluginConfig, }: {
4
+ pluginConfig: SanitizedMCPPluginConfig;
5
+ }) => CollectionConfig;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collection/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAI3D,eAAO,MAAM,oBAAoB,GAAI,mBAElC;IACD,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,gBAoDH,CAAA"}
@@ -0,0 +1,59 @@
1
+ import { getAccessField } from './getAccessField.js';
2
+ export const getAPIKeysCollection = ({ pluginConfig })=>{
3
+ const collection = {
4
+ slug: 'payload-mcp-api-keys',
5
+ admin: {
6
+ description: 'API keys control which collections, resources, tools, and prompts MCP clients can access',
7
+ group: 'MCP',
8
+ useAsTitle: 'label'
9
+ },
10
+ auth: {
11
+ disableLocalStrategy: true,
12
+ useAPIKey: true
13
+ },
14
+ fields: [
15
+ {
16
+ name: 'user',
17
+ type: 'relationship',
18
+ admin: {
19
+ description: 'The user that the API key is associated with.'
20
+ },
21
+ relationTo: pluginConfig.userCollection,
22
+ required: true
23
+ },
24
+ {
25
+ name: 'label',
26
+ type: 'text',
27
+ admin: {
28
+ description: 'A useful label for the API key.'
29
+ }
30
+ },
31
+ {
32
+ name: 'description',
33
+ type: 'text',
34
+ admin: {
35
+ description: 'The purpose of the API key.'
36
+ }
37
+ },
38
+ {
39
+ name: 'overrideAccess',
40
+ type: 'checkbox',
41
+ admin: {
42
+ description: 'When checked, this key bypasses Payload access control on every operation it performs. Leave unchecked unless you have a specific reason.'
43
+ },
44
+ defaultValue: false,
45
+ label: 'Override access control'
46
+ },
47
+ getAccessField({
48
+ pluginConfig
49
+ })
50
+ ],
51
+ labels: {
52
+ plural: 'API Keys',
53
+ singular: 'API Key'
54
+ }
55
+ };
56
+ return pluginConfig.overrideApiKeyCollection ? pluginConfig.overrideApiKeyCollection(collection) : collection;
57
+ };
58
+
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/collection/index.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport type { SanitizedMCPPluginConfig } from '../types.js'\n\nimport { getAccessField } from './getAccessField.js'\n\nexport const getAPIKeysCollection = ({\n pluginConfig,\n}: {\n pluginConfig: SanitizedMCPPluginConfig\n}): CollectionConfig => {\n const collection: CollectionConfig = {\n slug: 'payload-mcp-api-keys',\n admin: {\n description:\n 'API keys control which collections, resources, tools, and prompts MCP clients can access',\n group: 'MCP',\n useAsTitle: 'label',\n },\n auth: {\n disableLocalStrategy: true,\n useAPIKey: true,\n },\n fields: [\n {\n name: 'user',\n type: 'relationship',\n admin: { description: 'The user that the API key is associated with.' },\n relationTo: pluginConfig.userCollection,\n required: true,\n },\n {\n name: 'label',\n type: 'text',\n admin: { description: 'A useful label for the API key.' },\n },\n {\n name: 'description',\n type: 'text',\n admin: { description: 'The purpose of the API key.' },\n },\n {\n name: 'overrideAccess',\n type: 'checkbox',\n admin: {\n description:\n 'When checked, this key bypasses Payload access control on every operation it performs. Leave unchecked unless you have a specific reason.',\n },\n defaultValue: false,\n label: 'Override access control',\n },\n getAccessField({ pluginConfig }),\n ],\n labels: {\n plural: 'API Keys',\n singular: 'API Key',\n },\n }\n\n return pluginConfig.overrideApiKeyCollection\n ? pluginConfig.overrideApiKeyCollection(collection)\n : collection\n}\n"],"names":["getAccessField","getAPIKeysCollection","pluginConfig","collection","slug","admin","description","group","useAsTitle","auth","disableLocalStrategy","useAPIKey","fields","name","type","relationTo","userCollection","required","defaultValue","label","labels","plural","singular","overrideApiKeyCollection"],"mappings":"AAIA,SAASA,cAAc,QAAQ,sBAAqB;AAEpD,OAAO,MAAMC,uBAAuB,CAAC,EACnCC,YAAY,EAGb;IACC,MAAMC,aAA+B;QACnCC,MAAM;QACNC,OAAO;YACLC,aACE;YACFC,OAAO;YACPC,YAAY;QACd;QACAC,MAAM;YACJC,sBAAsB;YACtBC,WAAW;QACb;QACAC,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBAAEC,aAAa;gBAAgD;gBACtES,YAAYb,aAAac,cAAc;gBACvCC,UAAU;YACZ;YACA;gBACEJ,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBAAEC,aAAa;gBAAkC;YAC1D;YACA;gBACEO,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBAAEC,aAAa;gBAA8B;YACtD;YACA;gBACEO,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBACLC,aACE;gBACJ;gBACAY,cAAc;gBACdC,OAAO;YACT;YACAnB,eAAe;gBAAEE;YAAa;SAC/B;QACDkB,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;IACF;IAEA,OAAOpB,aAAaqB,wBAAwB,GACxCrB,aAAaqB,wBAAwB,CAACpB,cACtCA;AACN,EAAC"}
@@ -0,0 +1,10 @@
1
+ import type { JSONFieldClientProps } from 'payload';
2
+ import React from 'react';
3
+ import type { ClientMCPPluginConfig } from '../../types.js';
4
+ import './index.css';
5
+ type Props = {
6
+ pluginConfig: ClientMCPPluginConfig;
7
+ } & JSONFieldClientProps;
8
+ export declare const AccessField: React.FC<Props>;
9
+ export {};
10
+ //# sourceMappingURL=index.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/AccessField/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAGnD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,qBAAqB,EAA2B,MAAM,gBAAgB,CAAA;AAEpF,OAAO,aAAa,CAAA;AAQpB,KAAK,KAAK,GAAG;IACX,YAAY,EAAE,qBAAqB,CAAA;CACpC,GAAG,oBAAoB,CAAA;AAoBxB,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA0QvC,CAAA"}
@@ -0,0 +1,305 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { CheckboxInput, Collapsible, useField } from '@payloadcms/ui';
4
+ import React from 'react';
5
+ import './index.css';
6
+ const baseClass = 'mcp-access-field';
7
+ /** Drop a key from an object and return a new object — or `undefined` if it'd be empty. */ const without = (obj, key)=>{
8
+ if (!obj || !(key in obj)) {
9
+ return obj;
10
+ }
11
+ const { [key]: _omitted, ...rest } = obj;
12
+ return Object.keys(rest).length === 0 ? undefined : rest;
13
+ };
14
+ const setKey = (obj, key, value)=>({
15
+ ...obj ?? {},
16
+ [key]: value
17
+ });
18
+ export const AccessField = ({ path, pluginConfig })=>{
19
+ const { setValue, value } = useField({
20
+ path
21
+ });
22
+ const access = value ?? {};
23
+ // Bucket items for rendering. (Bucketing is cheap and runs once per render;
24
+ // memoizing would mean managing inputs/refs for marginal benefit.)
25
+ const collectionsBySlug = {};
26
+ const globalsBySlug = {};
27
+ const tools = [];
28
+ const prompts = [];
29
+ const resources = [];
30
+ for (const item of pluginConfig.items){
31
+ switch(item.type){
32
+ case 'collectionTool':
33
+ ;
34
+ (collectionsBySlug[item.collectionSlug] ??= []).push(item);
35
+ break;
36
+ case 'globalTool':
37
+ ;
38
+ (globalsBySlug[item.globalSlug] ??= []).push(item);
39
+ break;
40
+ case 'prompt':
41
+ prompts.push(item);
42
+ break;
43
+ case 'resource':
44
+ resources.push(item);
45
+ break;
46
+ case 'tool':
47
+ tools.push(item);
48
+ break;
49
+ }
50
+ }
51
+ const isScopedAllowed = (scope, slug, key)=>access[scope]?.[slug]?.[key] !== false;
52
+ const isFlatAllowed = (scope, key)=>access[scope]?.[key] !== false;
53
+ const toggleScoped = (scope, slug, key, allow)=>{
54
+ if (allow) {
55
+ const slugBucket = without(access[scope]?.[slug], key);
56
+ const scopeBucket = slugBucket ? setKey(access[scope], slug, slugBucket) : without(access[scope], slug);
57
+ setValue(scopeBucket ? setKey(access, scope, scopeBucket) : without(access, scope) ?? {});
58
+ } else {
59
+ setValue(setKey(access, scope, setKey(access[scope], slug, setKey(access[scope]?.[slug], key, false))));
60
+ }
61
+ };
62
+ const toggleFlat = (scope, key, allow)=>{
63
+ if (allow) {
64
+ const bucket = without(access[scope], key);
65
+ setValue(bucket ? setKey(access, scope, bucket) : without(access, scope) ?? {});
66
+ } else {
67
+ setValue(setKey(access, scope, setKey(access[scope], key, false)));
68
+ }
69
+ };
70
+ const setAllScoped = (scope, slug, leaves, allow)=>{
71
+ if (allow) {
72
+ const scopeBucket = without(access[scope], slug);
73
+ setValue(scopeBucket ? setKey(access, scope, scopeBucket) : without(access, scope) ?? {});
74
+ } else {
75
+ const slugBucket = leaves.reduce((acc, leaf)=>({
76
+ ...acc,
77
+ [leaf.key]: false
78
+ }), {});
79
+ setValue(setKey(access, scope, setKey(access[scope], slug, slugBucket)));
80
+ }
81
+ };
82
+ const setAllFlat = (scope, leaves, allow)=>{
83
+ if (allow) {
84
+ setValue(without(access, scope) ?? {});
85
+ } else {
86
+ const bucket = leaves.reduce((acc, leaf)=>({
87
+ ...acc,
88
+ [leaf.key]: false
89
+ }), {});
90
+ setValue(setKey(access, scope, bucket));
91
+ }
92
+ };
93
+ const collectionSlugs = Object.keys(collectionsBySlug);
94
+ const globalSlugs = Object.keys(globalsBySlug);
95
+ return /*#__PURE__*/ _jsxs("div", {
96
+ className: baseClass,
97
+ children: [
98
+ collectionSlugs.length > 0 && /*#__PURE__*/ _jsxs("section", {
99
+ className: `${baseClass}__section`,
100
+ children: [
101
+ /*#__PURE__*/ _jsxs("header", {
102
+ className: `${baseClass}__section-header`,
103
+ children: [
104
+ /*#__PURE__*/ _jsx("h4", {
105
+ children: "Collection-level permissions"
106
+ }),
107
+ /*#__PURE__*/ _jsx("p", {
108
+ children: "Allow MCP clients to perform the following actions within these collections:"
109
+ })
110
+ ]
111
+ }),
112
+ collectionSlugs.map((slug)=>{
113
+ const leaves = collectionsBySlug[slug];
114
+ return /*#__PURE__*/ _jsx(Collapsible, {
115
+ actions: /*#__PURE__*/ _jsx(GroupActions, {
116
+ onSetAll: (allow)=>setAllScoped('collections', slug, leaves, allow)
117
+ }),
118
+ className: `${baseClass}__group`,
119
+ header: /*#__PURE__*/ _jsx("span", {
120
+ className: `${baseClass}__group-label`,
121
+ children: titleCase(slug)
122
+ }),
123
+ initCollapsed: true,
124
+ children: /*#__PURE__*/ _jsx("ul", {
125
+ className: `${baseClass}__list`,
126
+ children: leaves.map((leaf)=>/*#__PURE__*/ _jsx("li", {
127
+ children: /*#__PURE__*/ _jsx(CheckboxInput, {
128
+ checked: isScopedAllowed('collections', slug, leaf.key),
129
+ id: `${path}.collections.${slug}.${leaf.key}`,
130
+ label: leaf.label,
131
+ onToggle: (e)=>toggleScoped('collections', slug, leaf.key, e.target.checked),
132
+ tooltip: leaf.description
133
+ })
134
+ }, leaf.key))
135
+ })
136
+ }, `collection-${slug}`);
137
+ })
138
+ ]
139
+ }),
140
+ globalSlugs.length > 0 && /*#__PURE__*/ _jsxs("section", {
141
+ className: `${baseClass}__section`,
142
+ children: [
143
+ /*#__PURE__*/ _jsxs("header", {
144
+ className: `${baseClass}__section-header`,
145
+ children: [
146
+ /*#__PURE__*/ _jsx("h4", {
147
+ children: "Global-level permissions"
148
+ }),
149
+ /*#__PURE__*/ _jsx("p", {
150
+ children: "Allow MCP clients to perform the following actions on these globals:"
151
+ })
152
+ ]
153
+ }),
154
+ globalSlugs.map((slug)=>{
155
+ const leaves = globalsBySlug[slug];
156
+ return /*#__PURE__*/ _jsx(Collapsible, {
157
+ actions: /*#__PURE__*/ _jsx(GroupActions, {
158
+ onSetAll: (allow)=>setAllScoped('globals', slug, leaves, allow)
159
+ }),
160
+ className: `${baseClass}__group`,
161
+ header: /*#__PURE__*/ _jsx("span", {
162
+ className: `${baseClass}__group-label`,
163
+ children: titleCase(slug)
164
+ }),
165
+ initCollapsed: true,
166
+ children: /*#__PURE__*/ _jsx("ul", {
167
+ className: `${baseClass}__list`,
168
+ children: leaves.map((leaf)=>/*#__PURE__*/ _jsx("li", {
169
+ children: /*#__PURE__*/ _jsx(CheckboxInput, {
170
+ checked: isScopedAllowed('globals', slug, leaf.key),
171
+ id: `${path}.globals.${slug}.${leaf.key}`,
172
+ label: leaf.label,
173
+ onToggle: (e)=>toggleScoped('globals', slug, leaf.key, e.target.checked),
174
+ tooltip: leaf.description
175
+ })
176
+ }, leaf.key))
177
+ })
178
+ }, `global-${slug}`);
179
+ })
180
+ ]
181
+ }),
182
+ (tools.length > 0 || prompts.length > 0 || resources.length > 0) && /*#__PURE__*/ _jsxs("section", {
183
+ className: `${baseClass}__section`,
184
+ children: [
185
+ /*#__PURE__*/ _jsxs("header", {
186
+ className: `${baseClass}__section-header`,
187
+ children: [
188
+ /*#__PURE__*/ _jsx("h4", {
189
+ children: "Project-level permissions"
190
+ }),
191
+ /*#__PURE__*/ _jsx("p", {
192
+ children: "Cross-cutting tools, prompts, and resources not scoped to a single collection."
193
+ })
194
+ ]
195
+ }),
196
+ tools.length > 0 && /*#__PURE__*/ _jsx(Collapsible, {
197
+ actions: /*#__PURE__*/ _jsx(GroupActions, {
198
+ onSetAll: (allow)=>setAllFlat('tools', tools, allow)
199
+ }),
200
+ className: `${baseClass}__group`,
201
+ header: /* TODO: needs i18n once design is finalized */ /*#__PURE__*/ _jsx("span", {
202
+ className: `${baseClass}__group-label`,
203
+ children: "Tools"
204
+ }),
205
+ initCollapsed: true,
206
+ children: /*#__PURE__*/ _jsx("ul", {
207
+ className: `${baseClass}__list`,
208
+ children: tools.map((leaf)=>/*#__PURE__*/ _jsx("li", {
209
+ children: /*#__PURE__*/ _jsx(CheckboxInput, {
210
+ checked: isFlatAllowed('tools', leaf.key),
211
+ id: `${path}.tools.${leaf.key}`,
212
+ label: leaf.label,
213
+ onToggle: (e)=>toggleFlat('tools', leaf.key, e.target.checked),
214
+ tooltip: leaf.description
215
+ })
216
+ }, leaf.key))
217
+ })
218
+ }),
219
+ prompts.length > 0 && /*#__PURE__*/ _jsx(Collapsible, {
220
+ actions: /*#__PURE__*/ _jsx(GroupActions, {
221
+ onSetAll: (allow)=>setAllFlat('prompts', prompts, allow)
222
+ }),
223
+ className: `${baseClass}__group`,
224
+ header: /* TODO: needs i18n once design is finalized */ /*#__PURE__*/ _jsx("span", {
225
+ className: `${baseClass}__group-label`,
226
+ children: "Prompts"
227
+ }),
228
+ initCollapsed: true,
229
+ children: /*#__PURE__*/ _jsx("ul", {
230
+ className: `${baseClass}__list`,
231
+ children: prompts.map((leaf)=>/*#__PURE__*/ _jsx("li", {
232
+ children: /*#__PURE__*/ _jsx(CheckboxInput, {
233
+ checked: isFlatAllowed('prompts', leaf.key),
234
+ id: `${path}.prompts.${leaf.key}`,
235
+ label: leaf.label,
236
+ onToggle: (e)=>toggleFlat('prompts', leaf.key, e.target.checked),
237
+ tooltip: leaf.description
238
+ })
239
+ }, leaf.key))
240
+ })
241
+ }),
242
+ resources.length > 0 && /*#__PURE__*/ _jsx(Collapsible, {
243
+ actions: /*#__PURE__*/ _jsx(GroupActions, {
244
+ onSetAll: (allow)=>setAllFlat('resources', resources, allow)
245
+ }),
246
+ className: `${baseClass}__group`,
247
+ header: /* TODO: needs i18n once design is finalized */ /*#__PURE__*/ _jsx("span", {
248
+ className: `${baseClass}__group-label`,
249
+ children: "Resources"
250
+ }),
251
+ initCollapsed: true,
252
+ children: /*#__PURE__*/ _jsx("ul", {
253
+ className: `${baseClass}__list`,
254
+ children: resources.map((leaf)=>/*#__PURE__*/ _jsx("li", {
255
+ children: /*#__PURE__*/ _jsx(CheckboxInput, {
256
+ checked: isFlatAllowed('resources', leaf.key),
257
+ id: `${path}.resources.${leaf.key}`,
258
+ label: leaf.label,
259
+ onToggle: (e)=>toggleFlat('resources', leaf.key, e.target.checked),
260
+ tooltip: leaf.description
261
+ })
262
+ }, leaf.key))
263
+ })
264
+ })
265
+ ]
266
+ })
267
+ ]
268
+ });
269
+ };
270
+ const GroupActions = ({ onSetAll })=>// TODO: button labels + aria-labels need i18n once design is finalized
271
+ /*#__PURE__*/ _jsxs("div", {
272
+ className: `${baseClass}__group-actions`,
273
+ children: [
274
+ /*#__PURE__*/ _jsx("button", {
275
+ "aria-label": "Select all",
276
+ className: `${baseClass}__action`,
277
+ onClick: (e)=>{
278
+ e.stopPropagation();
279
+ onSetAll(true);
280
+ },
281
+ title: "Select all",
282
+ type: "button",
283
+ children: "all"
284
+ }),
285
+ /*#__PURE__*/ _jsx("span", {
286
+ "aria-hidden": true,
287
+ className: `${baseClass}__action-sep`,
288
+ children: "/"
289
+ }),
290
+ /*#__PURE__*/ _jsx("button", {
291
+ "aria-label": "Clear all",
292
+ className: `${baseClass}__action`,
293
+ onClick: (e)=>{
294
+ e.stopPropagation();
295
+ onSetAll(false);
296
+ },
297
+ title: "Clear all",
298
+ type: "button",
299
+ children: "none"
300
+ })
301
+ ]
302
+ });
303
+ const titleCase = (slug)=>slug.replace(/(^|[-_])(.)/g, (_, sep, ch)=>sep ? ` ${ch.toUpperCase()}` : ch.toUpperCase());
304
+
305
+ //# sourceMappingURL=index.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/AccessField/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { JSONFieldClientProps } from 'payload'\n\nimport { CheckboxInput, Collapsible, useField } from '@payloadcms/ui'\nimport React from 'react'\n\nimport type { ClientMCPPluginConfig, MCPAPIKeysDocAccessTree } from '../../types.js'\n\nimport './index.css'\n\nconst baseClass = 'mcp-access-field'\n\ntype ClientItem = ClientMCPPluginConfig['items'][number]\ntype ScopeKey = 'collections' | 'globals'\ntype FlatKey = 'prompts' | 'resources' | 'tools'\n\ntype Props = {\n pluginConfig: ClientMCPPluginConfig\n} & JSONFieldClientProps\n\n/** Drop a key from an object and return a new object — or `undefined` if it'd be empty. */\nconst without = <T extends Record<string, unknown>>(\n obj: T | undefined,\n key: string,\n): T | undefined => {\n if (!obj || !(key in obj)) {\n return obj\n }\n const { [key]: _omitted, ...rest } = obj\n return Object.keys(rest).length === 0 ? undefined : (rest as T)\n}\n\nconst setKey = <T extends Record<string, unknown>>(\n obj: T | undefined,\n key: string,\n value: unknown,\n): T => ({ ...(obj ?? {}), [key]: value }) as T\n\nexport const AccessField: React.FC<Props> = ({ path, pluginConfig }) => {\n const { setValue, value } = useField<MCPAPIKeysDocAccessTree>({ path })\n const access = value ?? {}\n\n // Bucket items for rendering. (Bucketing is cheap and runs once per render;\n // memoizing would mean managing inputs/refs for marginal benefit.)\n const collectionsBySlug: Record<string, ClientItem[]> = {}\n const globalsBySlug: Record<string, ClientItem[]> = {}\n const tools: ClientItem[] = []\n const prompts: ClientItem[] = []\n const resources: ClientItem[] = []\n for (const item of pluginConfig.items) {\n switch (item.type) {\n case 'collectionTool':\n ;(collectionsBySlug[item.collectionSlug!] ??= []).push(item)\n break\n case 'globalTool':\n ;(globalsBySlug[item.globalSlug!] ??= []).push(item)\n break\n case 'prompt':\n prompts.push(item)\n break\n case 'resource':\n resources.push(item)\n break\n case 'tool':\n tools.push(item)\n break\n }\n }\n\n const isScopedAllowed = (scope: ScopeKey, slug: string, key: string): boolean =>\n access[scope]?.[slug]?.[key] !== false\n\n const isFlatAllowed = (scope: FlatKey, key: string): boolean => access[scope]?.[key] !== false\n\n const toggleScoped = (scope: ScopeKey, slug: string, key: string, allow: boolean) => {\n if (allow) {\n const slugBucket = without(access[scope]?.[slug], key)\n const scopeBucket = slugBucket\n ? setKey(access[scope], slug, slugBucket)\n : without(access[scope], slug)\n setValue(scopeBucket ? setKey(access, scope, scopeBucket) : (without(access, scope) ?? {}))\n } else {\n setValue(\n setKey(\n access,\n scope,\n setKey(access[scope], slug, setKey(access[scope]?.[slug], key, false)),\n ),\n )\n }\n }\n\n const toggleFlat = (scope: FlatKey, key: string, allow: boolean) => {\n if (allow) {\n const bucket = without(access[scope], key)\n setValue(bucket ? setKey(access, scope, bucket) : (without(access, scope) ?? {}))\n } else {\n setValue(setKey(access, scope, setKey(access[scope], key, false)))\n }\n }\n\n const setAllScoped = (scope: ScopeKey, slug: string, leaves: ClientItem[], allow: boolean) => {\n if (allow) {\n const scopeBucket = without(access[scope], slug)\n setValue(scopeBucket ? setKey(access, scope, scopeBucket) : (without(access, scope) ?? {}))\n } else {\n const slugBucket = leaves.reduce<Record<string, boolean>>(\n (acc, leaf) => ({ ...acc, [leaf.key]: false }),\n {},\n )\n setValue(setKey(access, scope, setKey(access[scope], slug, slugBucket)))\n }\n }\n\n const setAllFlat = (scope: FlatKey, leaves: ClientItem[], allow: boolean) => {\n if (allow) {\n setValue(without(access, scope) ?? {})\n } else {\n const bucket = leaves.reduce<Record<string, boolean>>(\n (acc, leaf) => ({ ...acc, [leaf.key]: false }),\n {},\n )\n setValue(setKey(access, scope, bucket))\n }\n }\n\n const collectionSlugs = Object.keys(collectionsBySlug)\n const globalSlugs = Object.keys(globalsBySlug)\n\n return (\n <div className={baseClass}>\n {collectionSlugs.length > 0 && (\n <section className={`${baseClass}__section`}>\n <header className={`${baseClass}__section-header`}>\n {/* TODO: needs i18n once design is finalized */}\n <h4>Collection-level permissions</h4>\n {/* TODO: needs i18n once design is finalized */}\n <p>Allow MCP clients to perform the following actions within these collections:</p>\n </header>\n {collectionSlugs.map((slug) => {\n const leaves = collectionsBySlug[slug]!\n return (\n <Collapsible\n actions={\n <GroupActions\n onSetAll={(allow) => setAllScoped('collections', slug, leaves, allow)}\n />\n }\n className={`${baseClass}__group`}\n header={<span className={`${baseClass}__group-label`}>{titleCase(slug)}</span>}\n initCollapsed\n key={`collection-${slug}`}\n >\n <ul className={`${baseClass}__list`}>\n {leaves.map((leaf) => (\n <li key={leaf.key}>\n <CheckboxInput\n checked={isScopedAllowed('collections', slug, leaf.key)}\n id={`${path}.collections.${slug}.${leaf.key}`}\n label={leaf.label}\n onToggle={(e) =>\n toggleScoped('collections', slug, leaf.key, e.target.checked)\n }\n tooltip={leaf.description}\n />\n </li>\n ))}\n </ul>\n </Collapsible>\n )\n })}\n </section>\n )}\n\n {globalSlugs.length > 0 && (\n <section className={`${baseClass}__section`}>\n <header className={`${baseClass}__section-header`}>\n {/* TODO: needs i18n once design is finalized */}\n <h4>Global-level permissions</h4>\n {/* TODO: needs i18n once design is finalized */}\n <p>Allow MCP clients to perform the following actions on these globals:</p>\n </header>\n {globalSlugs.map((slug) => {\n const leaves = globalsBySlug[slug]!\n return (\n <Collapsible\n actions={\n <GroupActions\n onSetAll={(allow) => setAllScoped('globals', slug, leaves, allow)}\n />\n }\n className={`${baseClass}__group`}\n header={<span className={`${baseClass}__group-label`}>{titleCase(slug)}</span>}\n initCollapsed\n key={`global-${slug}`}\n >\n <ul className={`${baseClass}__list`}>\n {leaves.map((leaf) => (\n <li key={leaf.key}>\n <CheckboxInput\n checked={isScopedAllowed('globals', slug, leaf.key)}\n id={`${path}.globals.${slug}.${leaf.key}`}\n label={leaf.label}\n onToggle={(e) => toggleScoped('globals', slug, leaf.key, e.target.checked)}\n tooltip={leaf.description}\n />\n </li>\n ))}\n </ul>\n </Collapsible>\n )\n })}\n </section>\n )}\n\n {(tools.length > 0 || prompts.length > 0 || resources.length > 0) && (\n <section className={`${baseClass}__section`}>\n <header className={`${baseClass}__section-header`}>\n {/* TODO: needs i18n once design is finalized */}\n <h4>Project-level permissions</h4>\n {/* TODO: needs i18n once design is finalized */}\n <p>Cross-cutting tools, prompts, and resources not scoped to a single collection.</p>\n </header>\n {tools.length > 0 && (\n <Collapsible\n actions={<GroupActions onSetAll={(allow) => setAllFlat('tools', tools, allow)} />}\n className={`${baseClass}__group`}\n header={\n /* TODO: needs i18n once design is finalized */\n <span className={`${baseClass}__group-label`}>Tools</span>\n }\n initCollapsed\n >\n <ul className={`${baseClass}__list`}>\n {tools.map((leaf) => (\n <li key={leaf.key}>\n <CheckboxInput\n checked={isFlatAllowed('tools', leaf.key)}\n id={`${path}.tools.${leaf.key}`}\n label={leaf.label}\n onToggle={(e) => toggleFlat('tools', leaf.key, e.target.checked)}\n tooltip={leaf.description}\n />\n </li>\n ))}\n </ul>\n </Collapsible>\n )}\n {prompts.length > 0 && (\n <Collapsible\n actions={<GroupActions onSetAll={(allow) => setAllFlat('prompts', prompts, allow)} />}\n className={`${baseClass}__group`}\n header={\n /* TODO: needs i18n once design is finalized */\n <span className={`${baseClass}__group-label`}>Prompts</span>\n }\n initCollapsed\n >\n <ul className={`${baseClass}__list`}>\n {prompts.map((leaf) => (\n <li key={leaf.key}>\n <CheckboxInput\n checked={isFlatAllowed('prompts', leaf.key)}\n id={`${path}.prompts.${leaf.key}`}\n label={leaf.label}\n onToggle={(e) => toggleFlat('prompts', leaf.key, e.target.checked)}\n tooltip={leaf.description}\n />\n </li>\n ))}\n </ul>\n </Collapsible>\n )}\n {resources.length > 0 && (\n <Collapsible\n actions={\n <GroupActions onSetAll={(allow) => setAllFlat('resources', resources, allow)} />\n }\n className={`${baseClass}__group`}\n header={\n /* TODO: needs i18n once design is finalized */\n <span className={`${baseClass}__group-label`}>Resources</span>\n }\n initCollapsed\n >\n <ul className={`${baseClass}__list`}>\n {resources.map((leaf) => (\n <li key={leaf.key}>\n <CheckboxInput\n checked={isFlatAllowed('resources', leaf.key)}\n id={`${path}.resources.${leaf.key}`}\n label={leaf.label}\n onToggle={(e) => toggleFlat('resources', leaf.key, e.target.checked)}\n tooltip={leaf.description}\n />\n </li>\n ))}\n </ul>\n </Collapsible>\n )}\n </section>\n )}\n </div>\n )\n}\n\nconst GroupActions: React.FC<{ onSetAll: (allow: boolean) => void }> = ({ onSetAll }) => (\n // TODO: button labels + aria-labels need i18n once design is finalized\n <div className={`${baseClass}__group-actions`}>\n <button\n aria-label=\"Select all\"\n className={`${baseClass}__action`}\n onClick={(e) => {\n e.stopPropagation()\n onSetAll(true)\n }}\n title=\"Select all\"\n type=\"button\"\n >\n all\n </button>\n <span aria-hidden className={`${baseClass}__action-sep`}>\n /\n </span>\n <button\n aria-label=\"Clear all\"\n className={`${baseClass}__action`}\n onClick={(e) => {\n e.stopPropagation()\n onSetAll(false)\n }}\n title=\"Clear all\"\n type=\"button\"\n >\n none\n </button>\n </div>\n)\n\nconst titleCase = (slug: string): string =>\n slug.replace(/(^|[-_])(.)/g, (_, sep: string, ch: string) =>\n sep ? ` ${ch.toUpperCase()}` : ch.toUpperCase(),\n )\n"],"names":["CheckboxInput","Collapsible","useField","React","baseClass","without","obj","key","_omitted","rest","Object","keys","length","undefined","setKey","value","AccessField","path","pluginConfig","setValue","access","collectionsBySlug","globalsBySlug","tools","prompts","resources","item","items","type","collectionSlug","push","globalSlug","isScopedAllowed","scope","slug","isFlatAllowed","toggleScoped","allow","slugBucket","scopeBucket","toggleFlat","bucket","setAllScoped","leaves","reduce","acc","leaf","setAllFlat","collectionSlugs","globalSlugs","div","className","section","header","h4","p","map","actions","GroupActions","onSetAll","span","titleCase","initCollapsed","ul","li","checked","id","label","onToggle","e","target","tooltip","description","button","aria-label","onClick","stopPropagation","title","aria-hidden","replace","_","sep","ch","toUpperCase"],"mappings":"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"}