@payloadcms/plugin-mcp 4.0.0-canary.3 → 4.0.0-internal.17c13d2

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 (418) hide show
  1. package/dist/@types/assets.d.js +2 -0
  2. package/dist/@types/assets.d.js.map +1 -0
  3. package/dist/defaultAccess.d.ts +3 -0
  4. package/dist/defaultAccess.d.ts.map +1 -0
  5. package/dist/defaultAccess.js +3 -0
  6. package/dist/defaultAccess.js.map +1 -0
  7. package/dist/endpoint/access.d.ts +17 -5
  8. package/dist/endpoint/access.d.ts.map +1 -1
  9. package/dist/endpoint/access.js +81 -103
  10. package/dist/endpoint/access.js.map +1 -1
  11. package/dist/endpoint/index.d.ts.map +1 -1
  12. package/dist/endpoint/index.js +11 -0
  13. package/dist/endpoint/index.js.map +1 -1
  14. package/dist/exports/client.d.ts +1 -4
  15. package/dist/exports/client.d.ts.map +1 -1
  16. package/dist/exports/client.js +1 -4
  17. package/dist/exports/client.js.map +1 -1
  18. package/dist/exports/internal.d.ts +2 -0
  19. package/dist/exports/internal.d.ts.map +1 -0
  20. package/dist/exports/internal.js +3 -0
  21. package/dist/exports/internal.js.map +1 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -54
  24. package/dist/index.js.map +1 -1
  25. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  26. package/dist/mcp/buildMcpServer.js.map +1 -1
  27. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  28. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  29. package/dist/mcp/builtin/collections/countTool.js +69 -0
  30. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  31. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  32. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  33. package/dist/mcp/builtin/collections/countVersionsTool.js +65 -0
  34. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  35. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
  36. package/dist/mcp/builtin/collections/createTool.js +2 -0
  37. package/dist/mcp/builtin/collections/createTool.js.map +1 -1
  38. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
  39. package/dist/mcp/builtin/collections/deleteTool.js +2 -0
  40. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
  41. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  42. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  43. package/dist/mcp/builtin/collections/duplicateTool.js +97 -0
  44. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  45. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  46. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  47. package/dist/mcp/builtin/collections/findDistinctTool.js +93 -0
  48. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  49. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  50. package/dist/mcp/builtin/collections/findTool.js +2 -0
  51. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  52. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  53. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  54. package/dist/mcp/builtin/collections/findVersionByIDTool.js +84 -0
  55. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  56. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  57. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  58. package/dist/mcp/builtin/collections/findVersionsTool.js +99 -0
  59. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  60. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +1 -1
  61. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -1
  62. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -1
  63. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -1
  64. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +5 -0
  65. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -1
  66. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  67. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  68. package/dist/mcp/builtin/collections/restoreVersionTool.js +82 -0
  69. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  70. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  71. package/dist/mcp/builtin/collections/updateTool.js +2 -0
  72. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  73. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -1
  74. package/dist/mcp/builtin/getConfigInfoTool.js +20 -5
  75. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -1
  76. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  77. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  78. package/dist/mcp/builtin/globals/countVersionsTool.js +65 -0
  79. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  80. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  81. package/dist/mcp/builtin/globals/findTool.js +2 -0
  82. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  83. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  84. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  85. package/dist/mcp/builtin/globals/findVersionByIDTool.js +80 -0
  86. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  87. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  88. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  89. package/dist/mcp/builtin/globals/findVersionsTool.js +95 -0
  90. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  91. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -1
  92. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +5 -0
  93. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -1
  94. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  95. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  96. package/dist/mcp/builtin/globals/restoreVersionTool.js +78 -0
  97. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  98. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -1
  99. package/dist/mcp/builtin/globals/updateTool.js +2 -0
  100. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  101. package/dist/mcp/builtinTools.d.ts +67 -2
  102. package/dist/mcp/builtinTools.d.ts.map +1 -1
  103. package/dist/mcp/builtinTools.js +64 -0
  104. package/dist/mcp/builtinTools.js.map +1 -1
  105. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  106. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  107. package/dist/mcp/sanitizeMCPConfig.js +44 -17
  108. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  109. package/dist/stdio.d.ts +3 -2
  110. package/dist/stdio.d.ts.map +1 -1
  111. package/dist/stdio.js +27 -8
  112. package/dist/stdio.js.map +1 -1
  113. package/dist/types.d.ts +43 -85
  114. package/dist/types.d.ts.map +1 -1
  115. package/dist/types.js +4 -4
  116. package/dist/types.js.map +1 -1
  117. package/dist/utils/getPluginConfig.d.ts +1 -1
  118. package/dist/utils/getPluginConfig.js +1 -1
  119. package/dist/utils/getPluginConfig.js.map +1 -1
  120. package/package.json +9 -13
  121. package/src/@types/assets.d.ts +3 -0
  122. package/src/defaultAccess.ts +3 -0
  123. package/src/endpoint/access.ts +87 -112
  124. package/src/endpoint/index.ts +14 -1
  125. package/src/exports/client.ts +2 -4
  126. package/src/exports/internal.ts +1 -0
  127. package/src/index.ts +1 -58
  128. package/src/mcp/buildMcpServer.ts +6 -1
  129. package/src/mcp/builtin/collections/countTool.ts +74 -0
  130. package/src/mcp/builtin/collections/countVersionsTool.ts +70 -0
  131. package/src/mcp/builtin/collections/createTool.ts +3 -0
  132. package/src/mcp/builtin/collections/deleteTool.ts +3 -0
  133. package/src/mcp/builtin/collections/duplicateTool.ts +135 -0
  134. package/src/mcp/builtin/collections/findDistinctTool.ts +120 -0
  135. package/src/mcp/builtin/collections/findTool.ts +3 -0
  136. package/src/mcp/builtin/collections/findVersionByIDTool.ts +110 -0
  137. package/src/mcp/builtin/collections/findVersionsTool.ts +155 -0
  138. package/src/mcp/builtin/collections/formatCollectionError.ts +1 -1
  139. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +11 -0
  140. package/src/mcp/builtin/collections/restoreVersionTool.ts +108 -0
  141. package/src/mcp/builtin/collections/updateTool.ts +3 -0
  142. package/src/mcp/builtin/getConfigInfoTool.ts +22 -4
  143. package/src/mcp/builtin/globals/countVersionsTool.ts +69 -0
  144. package/src/mcp/builtin/globals/findTool.ts +3 -0
  145. package/src/mcp/builtin/globals/findVersionByIDTool.ts +104 -0
  146. package/src/mcp/builtin/globals/findVersionsTool.ts +148 -0
  147. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +6 -0
  148. package/src/mcp/builtin/globals/restoreVersionTool.ts +100 -0
  149. package/src/mcp/builtin/globals/updateTool.ts +3 -0
  150. package/src/mcp/builtinTools.ts +63 -4
  151. package/src/mcp/sanitizeMCPConfig.ts +32 -19
  152. package/src/stdio.ts +23 -8
  153. package/src/types.ts +50 -88
  154. package/src/utils/getPluginConfig.ts +1 -1
  155. package/dist/collection/getAccessField.d.ts +0 -12
  156. package/dist/collection/getAccessField.d.ts.map +0 -1
  157. package/dist/collection/getAccessField.js +0 -72
  158. package/dist/collection/getAccessField.js.map +0 -1
  159. package/dist/collection/index.d.ts +0 -6
  160. package/dist/collection/index.d.ts.map +0 -1
  161. package/dist/collection/index.js +0 -105
  162. package/dist/collection/index.js.map +0 -1
  163. package/dist/components/APIKeyField/index.client.d.ts +0 -9
  164. package/dist/components/APIKeyField/index.client.d.ts.map +0 -1
  165. package/dist/components/APIKeyField/index.client.js +0 -85
  166. package/dist/components/APIKeyField/index.client.js.map +0 -1
  167. package/dist/components/APIKeyField/index.css +0 -105
  168. package/dist/components/APIKeysEmptyState/index.client.d.ts +0 -4
  169. package/dist/components/APIKeysEmptyState/index.client.d.ts.map +0 -1
  170. package/dist/components/APIKeysEmptyState/index.client.js +0 -21
  171. package/dist/components/APIKeysEmptyState/index.client.js.map +0 -1
  172. package/dist/components/AccessField/index.client.d.ts +0 -10
  173. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  174. package/dist/components/AccessField/index.client.js +0 -247
  175. package/dist/components/AccessField/index.client.js.map +0 -1
  176. package/dist/components/AccessField/index.css +0 -99
  177. package/dist/components/SettingsMenu/index.client.d.ts +0 -8
  178. package/dist/components/SettingsMenu/index.client.d.ts.map +0 -1
  179. package/dist/components/SettingsMenu/index.client.js +0 -24
  180. package/dist/components/SettingsMenu/index.client.js.map +0 -1
  181. package/dist/translations/index.d.ts +0 -11
  182. package/dist/translations/index.d.ts.map +0 -1
  183. package/dist/translations/index.js +0 -92
  184. package/dist/translations/index.js.map +0 -1
  185. package/dist/translations/languages/ar.d.ts +0 -31
  186. package/dist/translations/languages/ar.d.ts.map +0 -1
  187. package/dist/translations/languages/ar.js +0 -34
  188. package/dist/translations/languages/ar.js.map +0 -1
  189. package/dist/translations/languages/az.d.ts +0 -31
  190. package/dist/translations/languages/az.d.ts.map +0 -1
  191. package/dist/translations/languages/az.js +0 -34
  192. package/dist/translations/languages/az.js.map +0 -1
  193. package/dist/translations/languages/bg.d.ts +0 -31
  194. package/dist/translations/languages/bg.d.ts.map +0 -1
  195. package/dist/translations/languages/bg.js +0 -34
  196. package/dist/translations/languages/bg.js.map +0 -1
  197. package/dist/translations/languages/bnBd.d.ts +0 -31
  198. package/dist/translations/languages/bnBd.d.ts.map +0 -1
  199. package/dist/translations/languages/bnBd.js +0 -34
  200. package/dist/translations/languages/bnBd.js.map +0 -1
  201. package/dist/translations/languages/bnIn.d.ts +0 -31
  202. package/dist/translations/languages/bnIn.d.ts.map +0 -1
  203. package/dist/translations/languages/bnIn.js +0 -34
  204. package/dist/translations/languages/bnIn.js.map +0 -1
  205. package/dist/translations/languages/ca.d.ts +0 -31
  206. package/dist/translations/languages/ca.d.ts.map +0 -1
  207. package/dist/translations/languages/ca.js +0 -34
  208. package/dist/translations/languages/ca.js.map +0 -1
  209. package/dist/translations/languages/cs.d.ts +0 -31
  210. package/dist/translations/languages/cs.d.ts.map +0 -1
  211. package/dist/translations/languages/cs.js +0 -34
  212. package/dist/translations/languages/cs.js.map +0 -1
  213. package/dist/translations/languages/da.d.ts +0 -31
  214. package/dist/translations/languages/da.d.ts.map +0 -1
  215. package/dist/translations/languages/da.js +0 -34
  216. package/dist/translations/languages/da.js.map +0 -1
  217. package/dist/translations/languages/de.d.ts +0 -31
  218. package/dist/translations/languages/de.d.ts.map +0 -1
  219. package/dist/translations/languages/de.js +0 -34
  220. package/dist/translations/languages/de.js.map +0 -1
  221. package/dist/translations/languages/en.d.ts +0 -31
  222. package/dist/translations/languages/en.d.ts.map +0 -1
  223. package/dist/translations/languages/en.js +0 -34
  224. package/dist/translations/languages/en.js.map +0 -1
  225. package/dist/translations/languages/es.d.ts +0 -31
  226. package/dist/translations/languages/es.d.ts.map +0 -1
  227. package/dist/translations/languages/es.js +0 -34
  228. package/dist/translations/languages/es.js.map +0 -1
  229. package/dist/translations/languages/et.d.ts +0 -31
  230. package/dist/translations/languages/et.d.ts.map +0 -1
  231. package/dist/translations/languages/et.js +0 -34
  232. package/dist/translations/languages/et.js.map +0 -1
  233. package/dist/translations/languages/fa.d.ts +0 -31
  234. package/dist/translations/languages/fa.d.ts.map +0 -1
  235. package/dist/translations/languages/fa.js +0 -34
  236. package/dist/translations/languages/fa.js.map +0 -1
  237. package/dist/translations/languages/fr.d.ts +0 -31
  238. package/dist/translations/languages/fr.d.ts.map +0 -1
  239. package/dist/translations/languages/fr.js +0 -34
  240. package/dist/translations/languages/fr.js.map +0 -1
  241. package/dist/translations/languages/he.d.ts +0 -31
  242. package/dist/translations/languages/he.d.ts.map +0 -1
  243. package/dist/translations/languages/he.js +0 -34
  244. package/dist/translations/languages/he.js.map +0 -1
  245. package/dist/translations/languages/hr.d.ts +0 -31
  246. package/dist/translations/languages/hr.d.ts.map +0 -1
  247. package/dist/translations/languages/hr.js +0 -34
  248. package/dist/translations/languages/hr.js.map +0 -1
  249. package/dist/translations/languages/hu.d.ts +0 -31
  250. package/dist/translations/languages/hu.d.ts.map +0 -1
  251. package/dist/translations/languages/hu.js +0 -34
  252. package/dist/translations/languages/hu.js.map +0 -1
  253. package/dist/translations/languages/hy.d.ts +0 -31
  254. package/dist/translations/languages/hy.d.ts.map +0 -1
  255. package/dist/translations/languages/hy.js +0 -34
  256. package/dist/translations/languages/hy.js.map +0 -1
  257. package/dist/translations/languages/id.d.ts +0 -31
  258. package/dist/translations/languages/id.d.ts.map +0 -1
  259. package/dist/translations/languages/id.js +0 -34
  260. package/dist/translations/languages/id.js.map +0 -1
  261. package/dist/translations/languages/is.d.ts +0 -31
  262. package/dist/translations/languages/is.d.ts.map +0 -1
  263. package/dist/translations/languages/is.js +0 -34
  264. package/dist/translations/languages/is.js.map +0 -1
  265. package/dist/translations/languages/it.d.ts +0 -31
  266. package/dist/translations/languages/it.d.ts.map +0 -1
  267. package/dist/translations/languages/it.js +0 -34
  268. package/dist/translations/languages/it.js.map +0 -1
  269. package/dist/translations/languages/ja.d.ts +0 -31
  270. package/dist/translations/languages/ja.d.ts.map +0 -1
  271. package/dist/translations/languages/ja.js +0 -34
  272. package/dist/translations/languages/ja.js.map +0 -1
  273. package/dist/translations/languages/ko.d.ts +0 -31
  274. package/dist/translations/languages/ko.d.ts.map +0 -1
  275. package/dist/translations/languages/ko.js +0 -34
  276. package/dist/translations/languages/ko.js.map +0 -1
  277. package/dist/translations/languages/lt.d.ts +0 -31
  278. package/dist/translations/languages/lt.d.ts.map +0 -1
  279. package/dist/translations/languages/lt.js +0 -34
  280. package/dist/translations/languages/lt.js.map +0 -1
  281. package/dist/translations/languages/lv.d.ts +0 -31
  282. package/dist/translations/languages/lv.d.ts.map +0 -1
  283. package/dist/translations/languages/lv.js +0 -34
  284. package/dist/translations/languages/lv.js.map +0 -1
  285. package/dist/translations/languages/my.d.ts +0 -31
  286. package/dist/translations/languages/my.d.ts.map +0 -1
  287. package/dist/translations/languages/my.js +0 -34
  288. package/dist/translations/languages/my.js.map +0 -1
  289. package/dist/translations/languages/nb.d.ts +0 -31
  290. package/dist/translations/languages/nb.d.ts.map +0 -1
  291. package/dist/translations/languages/nb.js +0 -34
  292. package/dist/translations/languages/nb.js.map +0 -1
  293. package/dist/translations/languages/nl.d.ts +0 -31
  294. package/dist/translations/languages/nl.d.ts.map +0 -1
  295. package/dist/translations/languages/nl.js +0 -34
  296. package/dist/translations/languages/nl.js.map +0 -1
  297. package/dist/translations/languages/pl.d.ts +0 -31
  298. package/dist/translations/languages/pl.d.ts.map +0 -1
  299. package/dist/translations/languages/pl.js +0 -34
  300. package/dist/translations/languages/pl.js.map +0 -1
  301. package/dist/translations/languages/pt.d.ts +0 -31
  302. package/dist/translations/languages/pt.d.ts.map +0 -1
  303. package/dist/translations/languages/pt.js +0 -34
  304. package/dist/translations/languages/pt.js.map +0 -1
  305. package/dist/translations/languages/ro.d.ts +0 -31
  306. package/dist/translations/languages/ro.d.ts.map +0 -1
  307. package/dist/translations/languages/ro.js +0 -34
  308. package/dist/translations/languages/ro.js.map +0 -1
  309. package/dist/translations/languages/rs.d.ts +0 -31
  310. package/dist/translations/languages/rs.d.ts.map +0 -1
  311. package/dist/translations/languages/rs.js +0 -34
  312. package/dist/translations/languages/rs.js.map +0 -1
  313. package/dist/translations/languages/rsLatin.d.ts +0 -31
  314. package/dist/translations/languages/rsLatin.d.ts.map +0 -1
  315. package/dist/translations/languages/rsLatin.js +0 -34
  316. package/dist/translations/languages/rsLatin.js.map +0 -1
  317. package/dist/translations/languages/ru.d.ts +0 -31
  318. package/dist/translations/languages/ru.d.ts.map +0 -1
  319. package/dist/translations/languages/ru.js +0 -34
  320. package/dist/translations/languages/ru.js.map +0 -1
  321. package/dist/translations/languages/sk.d.ts +0 -31
  322. package/dist/translations/languages/sk.d.ts.map +0 -1
  323. package/dist/translations/languages/sk.js +0 -34
  324. package/dist/translations/languages/sk.js.map +0 -1
  325. package/dist/translations/languages/sl.d.ts +0 -31
  326. package/dist/translations/languages/sl.d.ts.map +0 -1
  327. package/dist/translations/languages/sl.js +0 -34
  328. package/dist/translations/languages/sl.js.map +0 -1
  329. package/dist/translations/languages/sv.d.ts +0 -31
  330. package/dist/translations/languages/sv.d.ts.map +0 -1
  331. package/dist/translations/languages/sv.js +0 -34
  332. package/dist/translations/languages/sv.js.map +0 -1
  333. package/dist/translations/languages/ta.d.ts +0 -31
  334. package/dist/translations/languages/ta.d.ts.map +0 -1
  335. package/dist/translations/languages/ta.js +0 -34
  336. package/dist/translations/languages/ta.js.map +0 -1
  337. package/dist/translations/languages/th.d.ts +0 -31
  338. package/dist/translations/languages/th.d.ts.map +0 -1
  339. package/dist/translations/languages/th.js +0 -34
  340. package/dist/translations/languages/th.js.map +0 -1
  341. package/dist/translations/languages/tr.d.ts +0 -31
  342. package/dist/translations/languages/tr.d.ts.map +0 -1
  343. package/dist/translations/languages/tr.js +0 -34
  344. package/dist/translations/languages/tr.js.map +0 -1
  345. package/dist/translations/languages/uk.d.ts +0 -31
  346. package/dist/translations/languages/uk.d.ts.map +0 -1
  347. package/dist/translations/languages/uk.js +0 -34
  348. package/dist/translations/languages/uk.js.map +0 -1
  349. package/dist/translations/languages/vi.d.ts +0 -31
  350. package/dist/translations/languages/vi.d.ts.map +0 -1
  351. package/dist/translations/languages/vi.js +0 -34
  352. package/dist/translations/languages/vi.js.map +0 -1
  353. package/dist/translations/languages/zh.d.ts +0 -31
  354. package/dist/translations/languages/zh.d.ts.map +0 -1
  355. package/dist/translations/languages/zh.js +0 -34
  356. package/dist/translations/languages/zh.js.map +0 -1
  357. package/dist/translations/languages/zhTw.d.ts +0 -31
  358. package/dist/translations/languages/zhTw.d.ts.map +0 -1
  359. package/dist/translations/languages/zhTw.js +0 -34
  360. package/dist/translations/languages/zhTw.js.map +0 -1
  361. package/dist/translations/types.d.ts +0 -32
  362. package/dist/translations/types.d.ts.map +0 -1
  363. package/dist/translations/types.js +0 -3
  364. package/dist/translations/types.js.map +0 -1
  365. package/src/collection/getAccessField.ts +0 -84
  366. package/src/collection/index.ts +0 -105
  367. package/src/components/APIKeyField/index.client.tsx +0 -68
  368. package/src/components/APIKeyField/index.css +0 -105
  369. package/src/components/APIKeysEmptyState/index.client.tsx +0 -33
  370. package/src/components/AccessField/index.client.tsx +0 -296
  371. package/src/components/AccessField/index.css +0 -99
  372. package/src/components/SettingsMenu/index.client.tsx +0 -30
  373. package/src/translations/index.ts +0 -105
  374. package/src/translations/languages/ar.ts +0 -38
  375. package/src/translations/languages/az.ts +0 -38
  376. package/src/translations/languages/bg.ts +0 -39
  377. package/src/translations/languages/bnBd.ts +0 -39
  378. package/src/translations/languages/bnIn.ts +0 -39
  379. package/src/translations/languages/ca.ts +0 -39
  380. package/src/translations/languages/cs.ts +0 -39
  381. package/src/translations/languages/da.ts +0 -38
  382. package/src/translations/languages/de.ts +0 -39
  383. package/src/translations/languages/en.ts +0 -39
  384. package/src/translations/languages/es.ts +0 -39
  385. package/src/translations/languages/et.ts +0 -38
  386. package/src/translations/languages/fa.ts +0 -39
  387. package/src/translations/languages/fr.ts +0 -39
  388. package/src/translations/languages/he.ts +0 -37
  389. package/src/translations/languages/hr.ts +0 -39
  390. package/src/translations/languages/hu.ts +0 -39
  391. package/src/translations/languages/hy.ts +0 -39
  392. package/src/translations/languages/id.ts +0 -39
  393. package/src/translations/languages/is.ts +0 -39
  394. package/src/translations/languages/it.ts +0 -39
  395. package/src/translations/languages/ja.ts +0 -39
  396. package/src/translations/languages/ko.ts +0 -39
  397. package/src/translations/languages/lt.ts +0 -39
  398. package/src/translations/languages/lv.ts +0 -38
  399. package/src/translations/languages/my.ts +0 -39
  400. package/src/translations/languages/nb.ts +0 -39
  401. package/src/translations/languages/nl.ts +0 -39
  402. package/src/translations/languages/pl.ts +0 -38
  403. package/src/translations/languages/pt.ts +0 -39
  404. package/src/translations/languages/ro.ts +0 -39
  405. package/src/translations/languages/rs.ts +0 -38
  406. package/src/translations/languages/rsLatin.ts +0 -38
  407. package/src/translations/languages/ru.ts +0 -39
  408. package/src/translations/languages/sk.ts +0 -39
  409. package/src/translations/languages/sl.ts +0 -38
  410. package/src/translations/languages/sv.ts +0 -39
  411. package/src/translations/languages/ta.ts +0 -39
  412. package/src/translations/languages/th.ts +0 -38
  413. package/src/translations/languages/tr.ts +0 -38
  414. package/src/translations/languages/uk.ts +0 -39
  415. package/src/translations/languages/vi.ts +0 -39
  416. package/src/translations/languages/zh.ts +0 -36
  417. package/src/translations/languages/zhTw.ts +0 -36
  418. package/src/translations/types.ts +0 -34
@@ -1,84 +0,0 @@
1
- import type { JSONField } from 'payload'
2
-
3
- import type { ClientMCPPluginConfig, MCPItem, SanitizedMCPPluginConfig } from '../types.js'
4
-
5
- import {
6
- COLLECTION_AUTH_BUILTINS,
7
- COLLECTION_BUILTINS,
8
- GLOBAL_BUILTINS,
9
- } from '../mcp/builtinTools.js'
10
-
11
- /**
12
- * Returns the API key collection's `access` field — a JSON field whose value
13
- * is the `MCPAPIKeysDocAccessTree` the endpoint consults. The actual UI is
14
- * a custom client component (`AccessField`) which renders a permissions
15
- * matrix; the field's stored shape is just the runtime access tree.
16
- */
17
- export const getAccessField = ({
18
- pluginConfig,
19
- }: {
20
- pluginConfig: SanitizedMCPPluginConfig
21
- }): JSONField => {
22
- const clientPluginConfig = sanitizeClientPluginConfig(pluginConfig)
23
-
24
- return {
25
- name: 'access',
26
- type: 'json',
27
- admin: {
28
- components: {
29
- Field: {
30
- clientProps: { pluginConfig: clientPluginConfig },
31
- path: '@payloadcms/plugin-mcp/client#AccessField',
32
- },
33
- },
34
- },
35
- defaultValue: {},
36
- label: false,
37
- }
38
- }
39
-
40
- /**
41
- * Strips the non-serializable parts of `SanitizedMCPPluginConfig` (handlers,
42
- * input/argsSchema functions, etc.) so the result is safe to thread to a
43
- * client component via `clientProps`.
44
- */
45
- const sanitizeClientPluginConfig = (
46
- pluginConfig: SanitizedMCPPluginConfig,
47
- ): ClientMCPPluginConfig => ({
48
- items: pluginConfig.items.map((item) => {
49
- const group = itemGroup(item)
50
-
51
- return {
52
- ...(item.type === 'collectionTool' ? { collectionSlug: item.collectionSlug } : {}),
53
- ...(item.type === 'globalTool' ? { globalSlug: item.globalSlug } : {}),
54
- type: item.type,
55
- configKey: item.configKey,
56
- ...(group === 'operations' ? {} : { description: itemDescription(item) }),
57
- group,
58
- label: item.label,
59
- }
60
- }),
61
- })
62
-
63
- const itemDescription = (item: MCPItem): string => {
64
- if (item.type === 'prompt') {
65
- return item.prompt.description
66
- }
67
- if (item.type === 'resource') {
68
- return item.resource.description
69
- }
70
- return item.tool.description
71
- }
72
-
73
- const itemGroup = (item: MCPItem): 'auth' | 'custom' | 'operations' | undefined => {
74
- if (item.type === 'collectionTool') {
75
- if (item.configKey in COLLECTION_BUILTINS) {
76
- return 'operations'
77
- }
78
- return item.configKey in COLLECTION_AUTH_BUILTINS ? 'auth' : 'custom'
79
- }
80
- if (item.type === 'globalTool') {
81
- return item.configKey in GLOBAL_BUILTINS ? 'operations' : 'custom'
82
- }
83
- return undefined
84
- }
@@ -1,105 +0,0 @@
1
- import type { CollectionConfig } from 'payload'
2
-
3
- import { createAPIKeyFields } from 'payload'
4
-
5
- import type { SanitizedMCPPluginConfig } from '../types.js'
6
-
7
- import { getAccessField } from './getAccessField.js'
8
-
9
- const apiKeyStorageFields = createAPIKeyFields({
10
- apiKeyField: {
11
- admin: {
12
- components: { Field: '@payloadcms/plugin-mcp/client#APIKeyField' },
13
- },
14
- required: true,
15
- },
16
- apiKeyIndexField: {
17
- index: true,
18
- required: true,
19
- },
20
- includeEnableAPIKey: false,
21
- })
22
-
23
- export const getAPIKeysCollection = ({
24
- pluginConfig,
25
- }: {
26
- pluginConfig: SanitizedMCPPluginConfig
27
- }): CollectionConfig => {
28
- const collection: CollectionConfig = {
29
- slug: 'payload-mcp-api-keys',
30
- admin: {
31
- components: {
32
- views: {
33
- list: {
34
- NoResults: '@payloadcms/plugin-mcp/client#APIKeysEmptyState',
35
- },
36
- },
37
- },
38
- defaultColumns: ['label', 'lastUsed', 'user'],
39
- // Kept out of the main nav — reachable through the user menu's settings instead.
40
- group: false,
41
- useAsTitle: 'label',
42
- },
43
- fields: [
44
- ...apiKeyStorageFields,
45
- getAccessField({ pluginConfig }),
46
- {
47
- name: 'label',
48
- type: 'text',
49
- admin: {
50
- description: ({ t }) => t('plugin-mcp:titleDescription'),
51
- position: 'sidebar',
52
- },
53
- label: ({ t }) => t('plugin-mcp:title'),
54
- },
55
- {
56
- name: 'description',
57
- type: 'text',
58
- admin: {
59
- description: ({ t }) => t('plugin-mcp:descriptionDescription'),
60
- position: 'sidebar',
61
- },
62
- label: ({ t }) => t('plugin-mcp:description'),
63
- },
64
- {
65
- name: 'lastUsed',
66
- type: 'date',
67
- admin: {
68
- date: { pickerAppearance: 'dayAndTime' },
69
- disabled: { field: true },
70
- },
71
- label: ({ t }) => t('plugin-mcp:lastUsed'),
72
- },
73
- {
74
- name: 'user',
75
- type: 'relationship',
76
- admin: {
77
- description: ({ t }) => t('plugin-mcp:userDescription'),
78
- position: 'sidebar',
79
- },
80
- label: ({ t }) => t('general:user'),
81
- relationTo: pluginConfig.userCollection,
82
- required: true,
83
- },
84
- {
85
- name: 'overrideAccess',
86
- type: 'checkbox',
87
- admin: {
88
- description: ({ t }) => t('plugin-mcp:overrideAccessDescription'),
89
- position: 'sidebar',
90
- },
91
- defaultValue: false,
92
- label: ({ t }) => t('plugin-mcp:overrideAccess'),
93
- },
94
- ],
95
- labels: {
96
- plural: ({ t }) => `${t('plugin-mcp:mcp')} ${t('plugin-mcp:apiKeys')}`,
97
- singular: ({ t }) => `${t('plugin-mcp:mcp')} ${t('authentication:apiKey')}`,
98
- },
99
- versions: false,
100
- }
101
-
102
- return pluginConfig.overrideApiKeyCollection
103
- ? pluginConfig.overrideApiKeyCollection(collection)
104
- : collection
105
- }
@@ -1,68 +0,0 @@
1
- 'use client'
2
-
3
- import { APIKeyInput, Button, useField, useTranslation, WarningTriangleIcon } from '@payloadcms/ui'
4
- import React, { useState } from 'react'
5
-
6
- import type { PluginMCPTranslationKeys, PluginMCPTranslations } from '../../translations/index.js'
7
-
8
- import './index.css'
9
-
10
- const baseClass = 'mcp-api-key-field'
11
-
12
- /**
13
- * Custom component for the MCP API-keys collection's `apiKey` field:
14
- * - no key yet: a "Generate new key" button
15
- * - key set: a dismissible privacy warning + the shared masked-key input
16
- */
17
- export const APIKeyField: React.FC = () => {
18
- const { setValue: setApiKey, value: apiKey } = useField<string>({ path: 'apiKey' })
19
- const { t } = useTranslation<PluginMCPTranslations, PluginMCPTranslationKeys>()
20
- const [isWarningDismissed, setIsWarningDismissed] = useState(false)
21
-
22
- const generateKey = () => {
23
- setApiKey(crypto.randomUUID())
24
- setIsWarningDismissed(false)
25
- }
26
-
27
- return (
28
- <div className={baseClass}>
29
- <p className={`${baseClass}__description`}>{t('plugin-mcp:apiKeyDescription')}</p>
30
- <div className={`${baseClass}__panel`}>
31
- <div className={`${baseClass}__header`}>
32
- <span className={`${baseClass}__title`}>{t('authentication:apiKey')}</span>
33
- {!apiKey && (
34
- <Button
35
- buttonStyle="primary"
36
- className={`${baseClass}__generate`}
37
- onClick={generateKey}
38
- >
39
- {t('authentication:generateNewAPIKey')}
40
- </Button>
41
- )}
42
- </div>
43
- {Boolean(apiKey) && (
44
- <div className={`${baseClass}__body`}>
45
- {!isWarningDismissed && (
46
- <div className={`${baseClass}__warning`}>
47
- <WarningTriangleIcon className={`${baseClass}__warning-icon`} />
48
- <p className={`${baseClass}__warning-text`}>
49
- <strong>{t('plugin-mcp:keepKeyPrivate')}</strong>
50
- {` ${t('plugin-mcp:keyPrivateDescription')}`}
51
- </p>
52
- <button
53
- aria-label={t('plugin-mcp:dismiss')}
54
- className={`${baseClass}__warning-dismiss`}
55
- onClick={() => setIsWarningDismissed(true)}
56
- type="button"
57
- >
58
- &times;
59
- </button>
60
- </div>
61
- )}
62
- <APIKeyInput aria-label={t('authentication:apiKey')} value={apiKey} />
63
- </div>
64
- )}
65
- </div>
66
- </div>
67
- )
68
- }
@@ -1,105 +0,0 @@
1
- @layer payload-default {
2
- /* Section wrapper: description + panel, closed off by a full-bleed divider
3
- that spans the fields column past its horizontal gutter. */
4
- .mcp-api-key-field {
5
- display: flex;
6
- flex-direction: column;
7
- gap: var(--base);
8
- margin-inline: calc(-1 * var(--gutter-h));
9
- padding-inline: var(--gutter-h);
10
- padding-block-end: var(--spacer-4);
11
- border-block-end: var(--stroke-width-small) solid var(--color-border);
12
- }
13
-
14
- .mcp-api-key-field__description {
15
- margin: 0;
16
- color: var(--color-text);
17
- font-family: var(--text-body-medium-font-family);
18
- font-size: var(--text-body-medium-font-size);
19
- font-weight: var(--text-body-medium-font-weight);
20
- line-height: var(--text-body-medium-line-height);
21
- letter-spacing: var(--text-body-medium-letter-spacing);
22
- }
23
-
24
- .mcp-api-key-field__panel {
25
- overflow: hidden;
26
- background: var(--color-bg);
27
- border: var(--stroke-width-small) solid var(--color-border);
28
- border-radius: var(--button-radius);
29
- }
30
-
31
- .mcp-api-key-field__header {
32
- display: flex;
33
- align-items: center;
34
- justify-content: space-between;
35
- gap: var(--spacer-2);
36
- min-height: var(--spacer-5);
37
- padding: var(--spacer-2) var(--spacer-3);
38
- background: var(--color-bg-secondary);
39
- }
40
-
41
- /* Holds the warning + key row; its top border is the full-width divider
42
- under the header. Only rendered once a key exists. */
43
- .mcp-api-key-field__body {
44
- display: flex;
45
- flex-direction: column;
46
- gap: var(--spacer-2);
47
- padding: var(--spacer-3);
48
- border-block-start: var(--stroke-width-small) solid var(--color-border);
49
- }
50
-
51
- .mcp-api-key-field__title {
52
- color: var(--color-text);
53
- font-family: var(--text-body-medium-strong-font-family);
54
- font-size: var(--text-body-medium-strong-font-size);
55
- font-weight: var(--text-body-medium-strong-font-weight);
56
- line-height: var(--text-body-medium-strong-line-height);
57
- }
58
-
59
- .mcp-api-key-field__generate {
60
- margin: 0;
61
- }
62
-
63
- /* Matches the core Banner's warning treatment: theme-adaptive warning-tertiary
64
- bg with regular --color-text (NOT --color-text-onwarning, which is only
65
- defined for light mode and reads as muddy dark-on-dark in dark mode). */
66
- .mcp-api-key-field__warning {
67
- display: flex;
68
- align-items: center;
69
- gap: calc(var(--base) / 2);
70
- padding: calc(var(--spacer-2) + (var(--spacer-1) / 2)) calc(var(--base) / 2);
71
- background: var(--color-bg-warning-tertiary);
72
- border: none;
73
- border-radius: var(--radius-medium);
74
- color: var(--color-text);
75
- }
76
-
77
- .mcp-api-key-field__warning-icon {
78
- flex-shrink: 0;
79
- width: 15px;
80
- height: 13px;
81
- }
82
-
83
- .mcp-api-key-field__warning-text {
84
- flex-grow: 1;
85
- margin: 0;
86
- font-family: var(--text-body-medium-font-family);
87
- font-size: var(--text-body-medium-font-size);
88
- line-height: var(--text-body-medium-line-height);
89
- }
90
-
91
- .mcp-api-key-field__warning-text strong {
92
- font-weight: var(--text-body-medium-strong-font-weight);
93
- }
94
-
95
- .mcp-api-key-field__warning-dismiss {
96
- appearance: none;
97
- background: none;
98
- border: none;
99
- cursor: pointer;
100
- color: inherit;
101
- font-size: 1rem;
102
- line-height: 1;
103
- padding: 0;
104
- }
105
- }
@@ -1,33 +0,0 @@
1
- 'use client'
2
-
3
- import type { NoResultsClientProps } from 'payload'
4
-
5
- import { Button, NoListResults, useTranslation } from '@payloadcms/ui'
6
- import React from 'react'
7
-
8
- import type { PluginMCPTranslationKeys, PluginMCPTranslations } from '../../translations/index.js'
9
-
10
- export const APIKeysEmptyState: React.FC<NoResultsClientProps> = ({
11
- hasCreatePermission,
12
- newDocumentURL,
13
- viewType,
14
- }) => {
15
- const { t } = useTranslation<PluginMCPTranslations, PluginMCPTranslationKeys>()
16
-
17
- return (
18
- <NoListResults
19
- Actions={
20
- hasCreatePermission && newDocumentURL && viewType !== 'trash'
21
- ? [
22
- <Button el="link" key="create" to={newDocumentURL}>
23
- {t('authentication:generateNewAPIKey')}
24
- </Button>,
25
- ]
26
- : []
27
- }
28
- description={t('plugin-mcp:apiKeyDescription')}
29
- title={t('plugin-mcp:noAPIKeys')}
30
- withMargin
31
- />
32
- )
33
- }
@@ -1,296 +0,0 @@
1
- 'use client'
2
-
3
- import type { JSONFieldClientProps } from 'payload'
4
-
5
- import { CheckboxInput, Collapsible, Tabs, useField, useTranslation } from '@payloadcms/ui'
6
- import React, { useState } from 'react'
7
-
8
- import type { PluginMCPTranslationKeys, PluginMCPTranslations } from '../../translations/index.js'
9
- import type { ClientMCPPluginConfig, MCPAPIKeysDocAccessTree } from '../../types.js'
10
-
11
- import './index.css'
12
-
13
- const baseClass = 'mcp-access-field'
14
-
15
- type ClientItem = ClientMCPPluginConfig['items'][number]
16
- type ScopeKey = 'collections' | 'globals'
17
- type FlatKey = 'prompts' | 'resources' | 'tools'
18
- type TabKey = 'collections' | 'globals' | 'server'
19
-
20
- const LEAF_GROUP_KEYS = ['operations', 'auth', 'custom'] as const
21
-
22
- type LeafGroupKey = (typeof LEAF_GROUP_KEYS)[number]
23
-
24
- type Props = {
25
- pluginConfig: ClientMCPPluginConfig
26
- } & JSONFieldClientProps
27
-
28
- /** Drop a key from an object and return a new object — or `undefined` if it'd be empty. */
29
- const without = <T extends Record<string, unknown>>(
30
- obj: T | undefined,
31
- key: string,
32
- ): T | undefined => {
33
- if (!obj || !(key in obj)) {
34
- return obj
35
- }
36
- const { [key]: _omitted, ...rest } = obj
37
- return Object.keys(rest).length === 0 ? undefined : (rest as T)
38
- }
39
-
40
- const setKey = <T extends Record<string, unknown>>(
41
- obj: T | undefined,
42
- key: string,
43
- value: unknown,
44
- ): T => ({ ...(obj ?? {}), [key]: value }) as T
45
-
46
- export const AccessField: React.FC<Props> = ({ path, pluginConfig }) => {
47
- const { setValue, value } = useField<MCPAPIKeysDocAccessTree>({ path })
48
- const { t } = useTranslation<PluginMCPTranslations, PluginMCPTranslationKeys>()
49
- const [activeTab, setActiveTab] = useState<null | TabKey>(null)
50
- const access = value ?? {}
51
- const leafGroupLabels: Record<LeafGroupKey, string> = {
52
- auth: t('plugin-mcp:authentication'),
53
- custom: t('general:custom'),
54
- operations: t('plugin-mcp:operations'),
55
- }
56
-
57
- const collectionsBySlug: Record<string, ClientItem[]> = {}
58
- const globalsBySlug: Record<string, ClientItem[]> = {}
59
- const prompts: ClientItem[] = []
60
- const resources: ClientItem[] = []
61
- const tools: ClientItem[] = []
62
-
63
- for (const item of pluginConfig.items) {
64
- switch (item.type) {
65
- case 'collectionTool':
66
- ;(collectionsBySlug[item.collectionSlug!] ??= []).push(item)
67
- break
68
- case 'globalTool':
69
- ;(globalsBySlug[item.globalSlug!] ??= []).push(item)
70
- break
71
- case 'prompt':
72
- prompts.push(item)
73
- break
74
- case 'resource':
75
- resources.push(item)
76
- break
77
- case 'tool':
78
- tools.push(item)
79
- break
80
- }
81
- }
82
-
83
- const isScopedAllowed = (scope: ScopeKey, slug: string, configKey: string): boolean =>
84
- access[scope]?.[slug]?.[configKey] !== false
85
-
86
- const isFlatAllowed = (scope: FlatKey, configKey: string): boolean =>
87
- access[scope]?.[configKey] !== false
88
-
89
- const toggleScoped = (scope: ScopeKey, slug: string, configKey: string, allow: boolean) => {
90
- if (allow) {
91
- const slugBucket = without(access[scope]?.[slug], configKey)
92
- const scopeBucket = slugBucket
93
- ? setKey(access[scope], slug, slugBucket)
94
- : without(access[scope], slug)
95
- setValue(scopeBucket ? setKey(access, scope, scopeBucket) : (without(access, scope) ?? {}))
96
- } else {
97
- setValue(
98
- setKey(
99
- access,
100
- scope,
101
- setKey(access[scope], slug, setKey(access[scope]?.[slug], configKey, false)),
102
- ),
103
- )
104
- }
105
- }
106
-
107
- const toggleFlat = (scope: FlatKey, configKey: string, allow: boolean) => {
108
- if (allow) {
109
- const bucket = without(access[scope], configKey)
110
- setValue(bucket ? setKey(access, scope, bucket) : (without(access, scope) ?? {}))
111
- } else {
112
- setValue(setKey(access, scope, setKey(access[scope], configKey, false)))
113
- }
114
- }
115
-
116
- const setAllScoped = (scope: ScopeKey, slug: string, leaves: ClientItem[], allow: boolean) => {
117
- if (allow) {
118
- const scopeBucket = without(access[scope], slug)
119
- setValue(scopeBucket ? setKey(access, scope, scopeBucket) : (without(access, scope) ?? {}))
120
- } else {
121
- const slugBucket = leaves.reduce<Record<string, boolean>>(
122
- (acc, leaf) => ({ ...acc, [leaf.configKey]: false }),
123
- {},
124
- )
125
- setValue(setKey(access, scope, setKey(access[scope], slug, slugBucket)))
126
- }
127
- }
128
-
129
- const setAllFlat = (scope: FlatKey, leaves: ClientItem[], allow: boolean) => {
130
- if (allow) {
131
- setValue(without(access, scope) ?? {})
132
- } else {
133
- const bucket = leaves.reduce<Record<string, boolean>>(
134
- (acc, leaf) => ({ ...acc, [leaf.configKey]: false }),
135
- {},
136
- )
137
- setValue(setKey(access, scope, bucket))
138
- }
139
- }
140
-
141
- const renderLeaf = (
142
- leaf: ClientItem,
143
- id: string,
144
- checked: boolean,
145
- onToggle: (allow: boolean) => void,
146
- ) => (
147
- <li className={`${baseClass}__leaf`} key={leaf.configKey}>
148
- <CheckboxInput
149
- checked={checked}
150
- id={id}
151
- label={leaf.label}
152
- onToggle={(e) => onToggle(e.target.checked)}
153
- />
154
- {leaf.description && <p className={`${baseClass}__leaf-description`}>{leaf.description}</p>}
155
- </li>
156
- )
157
-
158
- const renderCard = ({
159
- id,
160
- isLeafAllowed,
161
- label,
162
- leaves,
163
- onSetAll,
164
- onToggleLeaf,
165
- }: {
166
- id: string
167
- isLeafAllowed: (leaf: ClientItem) => boolean
168
- label: string
169
- leaves: ClientItem[]
170
- onSetAll: (allow: boolean) => void
171
- onToggleLeaf: (leaf: ClientItem, allow: boolean) => void
172
- }) => {
173
- const allowedCount = leaves.filter(isLeafAllowed).length
174
- const groups = LEAF_GROUP_KEYS.map((key) => ({
175
- key,
176
- label: leafGroupLabels[key],
177
- leaves: leaves.filter((leaf) => (leaf.group ?? 'custom') === key),
178
- })).filter((group) => group.leaves.length > 0)
179
- const hasGroupLabels = groups.length > 1
180
-
181
- return (
182
- <Collapsible
183
- className={`${baseClass}__card`}
184
- header={
185
- // Keep header clicks on the checkbox from also toggling the collapsible.
186
- <span
187
- className={`${baseClass}__card-checkbox`}
188
- onClick={(e) => e.stopPropagation()}
189
- role="presentation"
190
- >
191
- <CheckboxInput
192
- checked={allowedCount === leaves.length}
193
- id={`${id}._all`}
194
- label={label}
195
- onToggle={() => onSetAll(allowedCount < leaves.length)}
196
- partialChecked={allowedCount > 0 && allowedCount < leaves.length}
197
- />
198
- </span>
199
- }
200
- initCollapsed
201
- key={id}
202
- >
203
- <div className={`${baseClass}__card-groups`}>
204
- {groups.map((group) => (
205
- <div className={`${baseClass}__leaf-group`} key={group.key}>
206
- {hasGroupLabels && <p className={`${baseClass}__leaf-group-label`}>{group.label}</p>}
207
- <ul className={`${baseClass}__list`}>
208
- {group.leaves.map((leaf) =>
209
- renderLeaf(leaf, `${id}.${leaf.configKey}`, isLeafAllowed(leaf), (allow) =>
210
- onToggleLeaf(leaf, allow),
211
- ),
212
- )}
213
- </ul>
214
- </div>
215
- ))}
216
- </div>
217
- </Collapsible>
218
- )
219
- }
220
-
221
- const renderScope = (scope: ScopeKey, bySlug: Record<string, ClientItem[]>) =>
222
- Object.entries(bySlug).map(([slug, leaves]) =>
223
- renderCard({
224
- id: `${path}.${scope}.${slug}`,
225
- isLeafAllowed: (leaf) => isScopedAllowed(scope, slug, leaf.configKey),
226
- label: titleCase(slug),
227
- leaves,
228
- onSetAll: (allow) => setAllScoped(scope, slug, leaves, allow),
229
- onToggleLeaf: (leaf, allow) => toggleScoped(scope, slug, leaf.configKey, allow),
230
- }),
231
- )
232
-
233
- const renderFlat = (scope: FlatKey, label: string, leaves: ClientItem[]) =>
234
- leaves.length > 0 &&
235
- renderCard({
236
- id: `${path}.${scope}`,
237
- isLeafAllowed: (leaf) => isFlatAllowed(scope, leaf.configKey),
238
- label,
239
- leaves,
240
- onSetAll: (allow) => setAllFlat(scope, leaves, allow),
241
- onToggleLeaf: (leaf, allow) => toggleFlat(scope, leaf.configKey, allow),
242
- })
243
-
244
- const tabs: Array<{ key: TabKey; label: string }> = [
245
- ...(Object.keys(collectionsBySlug).length > 0
246
- ? [{ key: 'collections' as const, label: t('general:collections') }]
247
- : []),
248
- ...(Object.keys(globalsBySlug).length > 0
249
- ? [{ key: 'globals' as const, label: t('general:globals') }]
250
- : []),
251
- ...(prompts.length > 0 || resources.length > 0 || tools.length > 0
252
- ? [{ key: 'server' as const, label: t('plugin-mcp:server') }]
253
- : []),
254
- ]
255
- if (tabs.length === 0) {
256
- return null
257
- }
258
-
259
- const currentTab = activeTab ?? tabs[0]!.key
260
-
261
- return (
262
- <div className={baseClass}>
263
- <header className={`${baseClass}__header`}>
264
- <h4>{t('plugin-mcp:permissions')}</h4>
265
- <p>{t('plugin-mcp:permissionsDescription')}</p>
266
- </header>
267
- <div className={`${baseClass}__tabbed-content`}>
268
- <Tabs
269
- className={`${baseClass}__tabs`}
270
- onChange={setActiveTab}
271
- tabs={tabs.map((tab) => ({
272
- label: tab.label,
273
- value: tab.key,
274
- }))}
275
- value={currentTab}
276
- />
277
- <div className={`${baseClass}__cards`}>
278
- {currentTab === 'collections' && renderScope('collections', collectionsBySlug)}
279
- {currentTab === 'globals' && renderScope('globals', globalsBySlug)}
280
- {currentTab === 'server' && (
281
- <>
282
- {renderFlat('prompts', t('plugin-mcp:prompts'), prompts)}
283
- {renderFlat('resources', t('plugin-mcp:resources'), resources)}
284
- {renderFlat('tools', t('plugin-mcp:tools'), tools)}
285
- </>
286
- )}
287
- </div>
288
- </div>
289
- </div>
290
- )
291
- }
292
-
293
- const titleCase = (slug: string): string =>
294
- slug.replace(/(^|[-_])(.)/g, (_, sep: string, ch: string) =>
295
- sep ? ` ${ch.toUpperCase()}` : ch.toUpperCase(),
296
- )