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

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 (457) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/defaultAccess.d.ts +3 -0
  3. package/dist/defaultAccess.d.ts.map +1 -0
  4. package/dist/defaultAccess.js +3 -0
  5. package/dist/defaultAccess.js.map +1 -0
  6. package/dist/endpoint/access.d.ts +12 -5
  7. package/dist/endpoint/access.d.ts.map +1 -1
  8. package/dist/endpoint/access.js +74 -103
  9. package/dist/endpoint/access.js.map +1 -1
  10. package/dist/endpoint/index.d.ts +1 -1
  11. package/dist/endpoint/index.d.ts.map +1 -1
  12. package/dist/endpoint/index.js +68 -17
  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 +2 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +3 -51
  25. package/dist/index.js.map +1 -1
  26. package/dist/mcp/buildMcpServer.d.ts +4 -4
  27. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  28. package/dist/mcp/buildMcpServer.js +34 -10
  29. package/dist/mcp/buildMcpServer.js.map +1 -1
  30. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -1
  31. package/dist/mcp/builtin/collections/authTools.js +44 -6
  32. package/dist/mcp/builtin/collections/authTools.js.map +1 -1
  33. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  34. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  35. package/dist/mcp/builtin/collections/countTool.js +68 -0
  36. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  37. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  38. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  39. package/dist/mcp/builtin/collections/countVersionsTool.js +64 -0
  40. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  41. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
  42. package/dist/mcp/builtin/collections/createTool.js +13 -21
  43. package/dist/mcp/builtin/collections/createTool.js.map +1 -1
  44. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
  45. package/dist/mcp/builtin/collections/deleteTool.js +10 -2
  46. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
  47. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  48. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  49. package/dist/mcp/builtin/collections/duplicateTool.js +96 -0
  50. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  51. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  52. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  53. package/dist/mcp/builtin/collections/findDistinctTool.js +92 -0
  54. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  55. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  56. package/dist/mcp/builtin/collections/findTool.js +45 -25
  57. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  58. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  59. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  60. package/dist/mcp/builtin/collections/findVersionByIDTool.js +83 -0
  61. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  62. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  63. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  64. package/dist/mcp/builtin/collections/findVersionsTool.js +98 -0
  65. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  66. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +1 -1
  67. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -1
  68. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -1
  69. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -1
  70. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +32 -2
  71. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -1
  72. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  73. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  74. package/dist/mcp/builtin/collections/restoreVersionTool.js +81 -0
  75. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  76. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  77. package/dist/mcp/builtin/collections/updateTool.js +16 -24
  78. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  79. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -1
  80. package/dist/mcp/builtin/getConfigInfoTool.js +27 -8
  81. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -1
  82. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  83. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  84. package/dist/mcp/builtin/globals/countVersionsTool.js +64 -0
  85. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  86. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  87. package/dist/mcp/builtin/globals/findTool.js +19 -22
  88. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  89. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  90. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  91. package/dist/mcp/builtin/globals/findVersionByIDTool.js +79 -0
  92. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  93. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  94. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  95. package/dist/mcp/builtin/globals/findVersionsTool.js +94 -0
  96. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  97. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -1
  98. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +32 -2
  99. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -1
  100. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  101. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  102. package/dist/mcp/builtin/globals/restoreVersionTool.js +77 -0
  103. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  104. package/dist/mcp/builtin/globals/updateTool.js +14 -21
  105. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  106. package/dist/mcp/builtin/validateEntityData.js +1 -1
  107. package/dist/mcp/builtin/validateEntityData.js.map +1 -1
  108. package/dist/mcp/builtinTools.d.ts +69 -12
  109. package/dist/mcp/builtinTools.d.ts.map +1 -1
  110. package/dist/mcp/builtinTools.js +66 -10
  111. package/dist/mcp/builtinTools.js.map +1 -1
  112. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  113. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  114. package/dist/mcp/sanitizeMCPConfig.js +69 -27
  115. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  116. package/dist/stdio.d.ts +3 -3
  117. package/dist/stdio.d.ts.map +1 -1
  118. package/dist/stdio.js +82 -45
  119. package/dist/stdio.js.map +1 -1
  120. package/dist/types.d.ts +100 -92
  121. package/dist/types.d.ts.map +1 -1
  122. package/dist/types.js +2 -4
  123. package/dist/types.js.map +1 -1
  124. package/dist/utils/getPluginConfig.d.ts +1 -1
  125. package/dist/utils/getPluginConfig.js +1 -1
  126. package/dist/utils/getPluginConfig.js.map +1 -1
  127. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts +28 -0
  128. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts.map +1 -0
  129. package/dist/utils/schemaConversion/filterFieldsByAccess.js +71 -0
  130. package/dist/utils/schemaConversion/filterFieldsByAccess.js.map +1 -0
  131. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +5 -3
  132. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +1 -1
  133. package/dist/utils/schemaConversion/getEntityInputSchema.js +44 -12
  134. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +1 -1
  135. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +5 -10
  136. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -1
  137. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +15 -95
  138. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -1
  139. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +15 -40
  140. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -1
  141. package/package.json +10 -16
  142. package/src/defaultAccess.ts +3 -0
  143. package/src/endpoint/access.ts +80 -112
  144. package/src/endpoint/index.ts +58 -16
  145. package/src/exports/client.ts +2 -4
  146. package/src/exports/internal.ts +1 -0
  147. package/src/index.ts +5 -59
  148. package/src/mcp/buildMcpServer.ts +48 -21
  149. package/src/mcp/builtin/collections/authTools.ts +45 -9
  150. package/src/mcp/builtin/collections/countTool.ts +73 -0
  151. package/src/mcp/builtin/collections/countVersionsTool.ts +69 -0
  152. package/src/mcp/builtin/collections/createTool.ts +14 -15
  153. package/src/mcp/builtin/collections/deleteTool.ts +11 -2
  154. package/src/mcp/builtin/collections/duplicateTool.ts +134 -0
  155. package/src/mcp/builtin/collections/findDistinctTool.ts +119 -0
  156. package/src/mcp/builtin/collections/findTool.ts +58 -19
  157. package/src/mcp/builtin/collections/findVersionByIDTool.ts +109 -0
  158. package/src/mcp/builtin/collections/findVersionsTool.ts +154 -0
  159. package/src/mcp/builtin/collections/formatCollectionError.ts +1 -1
  160. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +37 -2
  161. package/src/mcp/builtin/collections/restoreVersionTool.ts +107 -0
  162. package/src/mcp/builtin/collections/updateTool.ts +16 -17
  163. package/src/mcp/builtin/getConfigInfoTool.ts +27 -4
  164. package/src/mcp/builtin/globals/countVersionsTool.ts +68 -0
  165. package/src/mcp/builtin/globals/findTool.ts +27 -18
  166. package/src/mcp/builtin/globals/findVersionByIDTool.ts +103 -0
  167. package/src/mcp/builtin/globals/findVersionsTool.ts +147 -0
  168. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +37 -2
  169. package/src/mcp/builtin/globals/restoreVersionTool.ts +99 -0
  170. package/src/mcp/builtin/globals/updateTool.ts +16 -16
  171. package/src/mcp/builtin/validateEntityData.ts +1 -1
  172. package/src/mcp/builtinTools.ts +72 -16
  173. package/src/mcp/sanitizeMCPConfig.ts +48 -30
  174. package/src/stdio.ts +77 -45
  175. package/src/types.ts +108 -95
  176. package/src/utils/getPluginConfig.ts +1 -1
  177. package/src/utils/schemaConversion/filterFieldsByAccess.ts +123 -0
  178. package/src/utils/schemaConversion/getEntityInputSchema.ts +45 -27
  179. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +12 -19
  180. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +17 -114
  181. package/dist/@types/assets.d.js +0 -2
  182. package/dist/@types/assets.d.js.map +0 -1
  183. package/dist/collection/getAccessField.d.ts +0 -12
  184. package/dist/collection/getAccessField.d.ts.map +0 -1
  185. package/dist/collection/getAccessField.js +0 -72
  186. package/dist/collection/getAccessField.js.map +0 -1
  187. package/dist/collection/index.d.ts +0 -6
  188. package/dist/collection/index.d.ts.map +0 -1
  189. package/dist/collection/index.js +0 -105
  190. package/dist/collection/index.js.map +0 -1
  191. package/dist/components/APIKeyField/index.client.d.ts +0 -9
  192. package/dist/components/APIKeyField/index.client.d.ts.map +0 -1
  193. package/dist/components/APIKeyField/index.client.js +0 -85
  194. package/dist/components/APIKeyField/index.client.js.map +0 -1
  195. package/dist/components/APIKeyField/index.css +0 -105
  196. package/dist/components/APIKeysEmptyState/index.client.d.ts +0 -4
  197. package/dist/components/APIKeysEmptyState/index.client.d.ts.map +0 -1
  198. package/dist/components/APIKeysEmptyState/index.client.js +0 -21
  199. package/dist/components/APIKeysEmptyState/index.client.js.map +0 -1
  200. package/dist/components/AccessField/index.client.d.ts +0 -10
  201. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  202. package/dist/components/AccessField/index.client.js +0 -247
  203. package/dist/components/AccessField/index.client.js.map +0 -1
  204. package/dist/components/AccessField/index.css +0 -99
  205. package/dist/components/SettingsMenu/index.client.d.ts +0 -8
  206. package/dist/components/SettingsMenu/index.client.d.ts.map +0 -1
  207. package/dist/components/SettingsMenu/index.client.js +0 -29
  208. package/dist/components/SettingsMenu/index.client.js.map +0 -1
  209. package/dist/translations/index.d.ts +0 -11
  210. package/dist/translations/index.d.ts.map +0 -1
  211. package/dist/translations/index.js +0 -92
  212. package/dist/translations/index.js.map +0 -1
  213. package/dist/translations/languages/ar.d.ts +0 -31
  214. package/dist/translations/languages/ar.d.ts.map +0 -1
  215. package/dist/translations/languages/ar.js +0 -34
  216. package/dist/translations/languages/ar.js.map +0 -1
  217. package/dist/translations/languages/az.d.ts +0 -31
  218. package/dist/translations/languages/az.d.ts.map +0 -1
  219. package/dist/translations/languages/az.js +0 -34
  220. package/dist/translations/languages/az.js.map +0 -1
  221. package/dist/translations/languages/bg.d.ts +0 -31
  222. package/dist/translations/languages/bg.d.ts.map +0 -1
  223. package/dist/translations/languages/bg.js +0 -34
  224. package/dist/translations/languages/bg.js.map +0 -1
  225. package/dist/translations/languages/bnBd.d.ts +0 -31
  226. package/dist/translations/languages/bnBd.d.ts.map +0 -1
  227. package/dist/translations/languages/bnBd.js +0 -34
  228. package/dist/translations/languages/bnBd.js.map +0 -1
  229. package/dist/translations/languages/bnIn.d.ts +0 -31
  230. package/dist/translations/languages/bnIn.d.ts.map +0 -1
  231. package/dist/translations/languages/bnIn.js +0 -34
  232. package/dist/translations/languages/bnIn.js.map +0 -1
  233. package/dist/translations/languages/ca.d.ts +0 -31
  234. package/dist/translations/languages/ca.d.ts.map +0 -1
  235. package/dist/translations/languages/ca.js +0 -34
  236. package/dist/translations/languages/ca.js.map +0 -1
  237. package/dist/translations/languages/cs.d.ts +0 -31
  238. package/dist/translations/languages/cs.d.ts.map +0 -1
  239. package/dist/translations/languages/cs.js +0 -34
  240. package/dist/translations/languages/cs.js.map +0 -1
  241. package/dist/translations/languages/da.d.ts +0 -31
  242. package/dist/translations/languages/da.d.ts.map +0 -1
  243. package/dist/translations/languages/da.js +0 -34
  244. package/dist/translations/languages/da.js.map +0 -1
  245. package/dist/translations/languages/de.d.ts +0 -31
  246. package/dist/translations/languages/de.d.ts.map +0 -1
  247. package/dist/translations/languages/de.js +0 -34
  248. package/dist/translations/languages/de.js.map +0 -1
  249. package/dist/translations/languages/en.d.ts +0 -31
  250. package/dist/translations/languages/en.d.ts.map +0 -1
  251. package/dist/translations/languages/en.js +0 -34
  252. package/dist/translations/languages/en.js.map +0 -1
  253. package/dist/translations/languages/es.d.ts +0 -31
  254. package/dist/translations/languages/es.d.ts.map +0 -1
  255. package/dist/translations/languages/es.js +0 -34
  256. package/dist/translations/languages/es.js.map +0 -1
  257. package/dist/translations/languages/et.d.ts +0 -31
  258. package/dist/translations/languages/et.d.ts.map +0 -1
  259. package/dist/translations/languages/et.js +0 -34
  260. package/dist/translations/languages/et.js.map +0 -1
  261. package/dist/translations/languages/fa.d.ts +0 -31
  262. package/dist/translations/languages/fa.d.ts.map +0 -1
  263. package/dist/translations/languages/fa.js +0 -34
  264. package/dist/translations/languages/fa.js.map +0 -1
  265. package/dist/translations/languages/fr.d.ts +0 -31
  266. package/dist/translations/languages/fr.d.ts.map +0 -1
  267. package/dist/translations/languages/fr.js +0 -34
  268. package/dist/translations/languages/fr.js.map +0 -1
  269. package/dist/translations/languages/he.d.ts +0 -31
  270. package/dist/translations/languages/he.d.ts.map +0 -1
  271. package/dist/translations/languages/he.js +0 -34
  272. package/dist/translations/languages/he.js.map +0 -1
  273. package/dist/translations/languages/hr.d.ts +0 -31
  274. package/dist/translations/languages/hr.d.ts.map +0 -1
  275. package/dist/translations/languages/hr.js +0 -34
  276. package/dist/translations/languages/hr.js.map +0 -1
  277. package/dist/translations/languages/hu.d.ts +0 -31
  278. package/dist/translations/languages/hu.d.ts.map +0 -1
  279. package/dist/translations/languages/hu.js +0 -34
  280. package/dist/translations/languages/hu.js.map +0 -1
  281. package/dist/translations/languages/hy.d.ts +0 -31
  282. package/dist/translations/languages/hy.d.ts.map +0 -1
  283. package/dist/translations/languages/hy.js +0 -34
  284. package/dist/translations/languages/hy.js.map +0 -1
  285. package/dist/translations/languages/id.d.ts +0 -31
  286. package/dist/translations/languages/id.d.ts.map +0 -1
  287. package/dist/translations/languages/id.js +0 -34
  288. package/dist/translations/languages/id.js.map +0 -1
  289. package/dist/translations/languages/is.d.ts +0 -31
  290. package/dist/translations/languages/is.d.ts.map +0 -1
  291. package/dist/translations/languages/is.js +0 -34
  292. package/dist/translations/languages/is.js.map +0 -1
  293. package/dist/translations/languages/it.d.ts +0 -31
  294. package/dist/translations/languages/it.d.ts.map +0 -1
  295. package/dist/translations/languages/it.js +0 -34
  296. package/dist/translations/languages/it.js.map +0 -1
  297. package/dist/translations/languages/ja.d.ts +0 -31
  298. package/dist/translations/languages/ja.d.ts.map +0 -1
  299. package/dist/translations/languages/ja.js +0 -34
  300. package/dist/translations/languages/ja.js.map +0 -1
  301. package/dist/translations/languages/ko.d.ts +0 -31
  302. package/dist/translations/languages/ko.d.ts.map +0 -1
  303. package/dist/translations/languages/ko.js +0 -34
  304. package/dist/translations/languages/ko.js.map +0 -1
  305. package/dist/translations/languages/lt.d.ts +0 -31
  306. package/dist/translations/languages/lt.d.ts.map +0 -1
  307. package/dist/translations/languages/lt.js +0 -34
  308. package/dist/translations/languages/lt.js.map +0 -1
  309. package/dist/translations/languages/lv.d.ts +0 -31
  310. package/dist/translations/languages/lv.d.ts.map +0 -1
  311. package/dist/translations/languages/lv.js +0 -34
  312. package/dist/translations/languages/lv.js.map +0 -1
  313. package/dist/translations/languages/my.d.ts +0 -31
  314. package/dist/translations/languages/my.d.ts.map +0 -1
  315. package/dist/translations/languages/my.js +0 -34
  316. package/dist/translations/languages/my.js.map +0 -1
  317. package/dist/translations/languages/nb.d.ts +0 -31
  318. package/dist/translations/languages/nb.d.ts.map +0 -1
  319. package/dist/translations/languages/nb.js +0 -34
  320. package/dist/translations/languages/nb.js.map +0 -1
  321. package/dist/translations/languages/nl.d.ts +0 -31
  322. package/dist/translations/languages/nl.d.ts.map +0 -1
  323. package/dist/translations/languages/nl.js +0 -34
  324. package/dist/translations/languages/nl.js.map +0 -1
  325. package/dist/translations/languages/pl.d.ts +0 -31
  326. package/dist/translations/languages/pl.d.ts.map +0 -1
  327. package/dist/translations/languages/pl.js +0 -34
  328. package/dist/translations/languages/pl.js.map +0 -1
  329. package/dist/translations/languages/pt.d.ts +0 -31
  330. package/dist/translations/languages/pt.d.ts.map +0 -1
  331. package/dist/translations/languages/pt.js +0 -34
  332. package/dist/translations/languages/pt.js.map +0 -1
  333. package/dist/translations/languages/ro.d.ts +0 -31
  334. package/dist/translations/languages/ro.d.ts.map +0 -1
  335. package/dist/translations/languages/ro.js +0 -34
  336. package/dist/translations/languages/ro.js.map +0 -1
  337. package/dist/translations/languages/rs.d.ts +0 -31
  338. package/dist/translations/languages/rs.d.ts.map +0 -1
  339. package/dist/translations/languages/rs.js +0 -34
  340. package/dist/translations/languages/rs.js.map +0 -1
  341. package/dist/translations/languages/rsLatin.d.ts +0 -31
  342. package/dist/translations/languages/rsLatin.d.ts.map +0 -1
  343. package/dist/translations/languages/rsLatin.js +0 -34
  344. package/dist/translations/languages/rsLatin.js.map +0 -1
  345. package/dist/translations/languages/ru.d.ts +0 -31
  346. package/dist/translations/languages/ru.d.ts.map +0 -1
  347. package/dist/translations/languages/ru.js +0 -34
  348. package/dist/translations/languages/ru.js.map +0 -1
  349. package/dist/translations/languages/sk.d.ts +0 -31
  350. package/dist/translations/languages/sk.d.ts.map +0 -1
  351. package/dist/translations/languages/sk.js +0 -34
  352. package/dist/translations/languages/sk.js.map +0 -1
  353. package/dist/translations/languages/sl.d.ts +0 -31
  354. package/dist/translations/languages/sl.d.ts.map +0 -1
  355. package/dist/translations/languages/sl.js +0 -34
  356. package/dist/translations/languages/sl.js.map +0 -1
  357. package/dist/translations/languages/sv.d.ts +0 -31
  358. package/dist/translations/languages/sv.d.ts.map +0 -1
  359. package/dist/translations/languages/sv.js +0 -34
  360. package/dist/translations/languages/sv.js.map +0 -1
  361. package/dist/translations/languages/ta.d.ts +0 -31
  362. package/dist/translations/languages/ta.d.ts.map +0 -1
  363. package/dist/translations/languages/ta.js +0 -34
  364. package/dist/translations/languages/ta.js.map +0 -1
  365. package/dist/translations/languages/th.d.ts +0 -31
  366. package/dist/translations/languages/th.d.ts.map +0 -1
  367. package/dist/translations/languages/th.js +0 -34
  368. package/dist/translations/languages/th.js.map +0 -1
  369. package/dist/translations/languages/tr.d.ts +0 -31
  370. package/dist/translations/languages/tr.d.ts.map +0 -1
  371. package/dist/translations/languages/tr.js +0 -34
  372. package/dist/translations/languages/tr.js.map +0 -1
  373. package/dist/translations/languages/uk.d.ts +0 -31
  374. package/dist/translations/languages/uk.d.ts.map +0 -1
  375. package/dist/translations/languages/uk.js +0 -34
  376. package/dist/translations/languages/uk.js.map +0 -1
  377. package/dist/translations/languages/vi.d.ts +0 -31
  378. package/dist/translations/languages/vi.d.ts.map +0 -1
  379. package/dist/translations/languages/vi.js +0 -34
  380. package/dist/translations/languages/vi.js.map +0 -1
  381. package/dist/translations/languages/zh.d.ts +0 -31
  382. package/dist/translations/languages/zh.d.ts.map +0 -1
  383. package/dist/translations/languages/zh.js +0 -34
  384. package/dist/translations/languages/zh.js.map +0 -1
  385. package/dist/translations/languages/zhTw.d.ts +0 -31
  386. package/dist/translations/languages/zhTw.d.ts.map +0 -1
  387. package/dist/translations/languages/zhTw.js +0 -34
  388. package/dist/translations/languages/zhTw.js.map +0 -1
  389. package/dist/translations/types.d.ts +0 -32
  390. package/dist/translations/types.d.ts.map +0 -1
  391. package/dist/translations/types.js +0 -3
  392. package/dist/translations/types.js.map +0 -1
  393. package/dist/utils/localAPIDefaults.d.ts +0 -20
  394. package/dist/utils/localAPIDefaults.d.ts.map +0 -1
  395. package/dist/utils/localAPIDefaults.js +0 -19
  396. package/dist/utils/localAPIDefaults.js.map +0 -1
  397. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  398. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  399. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  400. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  401. package/src/@types/assets.d.ts +0 -3
  402. package/src/collection/getAccessField.ts +0 -84
  403. package/src/collection/index.ts +0 -105
  404. package/src/components/APIKeyField/index.client.tsx +0 -73
  405. package/src/components/APIKeyField/index.css +0 -105
  406. package/src/components/APIKeysEmptyState/index.client.tsx +0 -36
  407. package/src/components/AccessField/index.client.tsx +0 -299
  408. package/src/components/AccessField/index.css +0 -99
  409. package/src/components/SettingsMenu/index.client.tsx +0 -34
  410. package/src/translations/index.ts +0 -108
  411. package/src/translations/languages/ar.ts +0 -35
  412. package/src/translations/languages/az.ts +0 -35
  413. package/src/translations/languages/bg.ts +0 -35
  414. package/src/translations/languages/bnBd.ts +0 -35
  415. package/src/translations/languages/bnIn.ts +0 -35
  416. package/src/translations/languages/ca.ts +0 -35
  417. package/src/translations/languages/cs.ts +0 -35
  418. package/src/translations/languages/da.ts +0 -35
  419. package/src/translations/languages/de.ts +0 -35
  420. package/src/translations/languages/en.ts +0 -35
  421. package/src/translations/languages/es.ts +0 -35
  422. package/src/translations/languages/et.ts +0 -35
  423. package/src/translations/languages/fa.ts +0 -35
  424. package/src/translations/languages/fr.ts +0 -35
  425. package/src/translations/languages/he.ts +0 -35
  426. package/src/translations/languages/hr.ts +0 -35
  427. package/src/translations/languages/hu.ts +0 -35
  428. package/src/translations/languages/hy.ts +0 -35
  429. package/src/translations/languages/id.ts +0 -35
  430. package/src/translations/languages/is.ts +0 -35
  431. package/src/translations/languages/it.ts +0 -35
  432. package/src/translations/languages/ja.ts +0 -35
  433. package/src/translations/languages/ko.ts +0 -35
  434. package/src/translations/languages/lt.ts +0 -35
  435. package/src/translations/languages/lv.ts +0 -35
  436. package/src/translations/languages/my.ts +0 -35
  437. package/src/translations/languages/nb.ts +0 -35
  438. package/src/translations/languages/nl.ts +0 -35
  439. package/src/translations/languages/pl.ts +0 -35
  440. package/src/translations/languages/pt.ts +0 -35
  441. package/src/translations/languages/ro.ts +0 -35
  442. package/src/translations/languages/rs.ts +0 -35
  443. package/src/translations/languages/rsLatin.ts +0 -35
  444. package/src/translations/languages/ru.ts +0 -35
  445. package/src/translations/languages/sk.ts +0 -35
  446. package/src/translations/languages/sl.ts +0 -35
  447. package/src/translations/languages/sv.ts +0 -35
  448. package/src/translations/languages/ta.ts +0 -35
  449. package/src/translations/languages/th.ts +0 -35
  450. package/src/translations/languages/tr.ts +0 -35
  451. package/src/translations/languages/uk.ts +0 -35
  452. package/src/translations/languages/vi.ts +0 -35
  453. package/src/translations/languages/zh.ts +0 -35
  454. package/src/translations/languages/zhTw.ts +0 -35
  455. package/src/translations/types.ts +0 -34
  456. package/src/utils/localAPIDefaults.ts +0 -22
  457. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
@@ -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,73 +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 {
7
- PluginMCPTranslationKeys,
8
- PluginMCPTranslations,
9
- } from '../../translations/index.js'
10
-
11
- import './index.css'
12
-
13
- const baseClass = 'mcp-api-key-field'
14
-
15
- /**
16
- * Custom component for the MCP API-keys collection's `apiKey` field:
17
- * - no key yet: a "Generate new key" button
18
- * - key set: a dismissible privacy warning + the shared masked-key input
19
- */
20
- export const APIKeyField: React.FC = () => {
21
- const { setValue: setApiKey, value: apiKey } = useField<string>({ path: 'apiKey' })
22
- const { t } = useTranslation<PluginMCPTranslations, PluginMCPTranslationKeys>()
23
- const [isWarningDismissed, setIsWarningDismissed] = useState(false)
24
-
25
- const generateKey = () => {
26
- setApiKey(crypto.randomUUID())
27
- setIsWarningDismissed(false)
28
- }
29
-
30
- return (
31
- <div className={baseClass}>
32
- <p className={`${baseClass}__description`}>
33
- {t('plugin-mcp:apiKeyDescription')}
34
- </p>
35
- <div className={`${baseClass}__panel`}>
36
- <div className={`${baseClass}__header`}>
37
- <span className={`${baseClass}__title`}>{t('authentication:apiKey')}</span>
38
- {!apiKey && (
39
- <Button
40
- buttonStyle="primary"
41
- className={`${baseClass}__generate`}
42
- onClick={generateKey}
43
- >
44
- {t('authentication:generateNewAPIKey')}
45
- </Button>
46
- )}
47
- </div>
48
- {Boolean(apiKey) && (
49
- <div className={`${baseClass}__body`}>
50
- {!isWarningDismissed && (
51
- <div className={`${baseClass}__warning`}>
52
- <WarningTriangleIcon className={`${baseClass}__warning-icon`} />
53
- <p className={`${baseClass}__warning-text`}>
54
- <strong>{t('plugin-mcp:keepKeyPrivate')}</strong>
55
- {` ${t('plugin-mcp:keyPrivateDescription')}`}
56
- </p>
57
- <button
58
- aria-label={t('plugin-mcp:dismiss')}
59
- className={`${baseClass}__warning-dismiss`}
60
- onClick={() => setIsWarningDismissed(true)}
61
- type="button"
62
- >
63
- &times;
64
- </button>
65
- </div>
66
- )}
67
- <APIKeyInput aria-label={t('authentication:apiKey')} value={apiKey} />
68
- </div>
69
- )}
70
- </div>
71
- </div>
72
- )
73
- }
@@ -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,36 +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 {
9
- PluginMCPTranslationKeys,
10
- PluginMCPTranslations,
11
- } from '../../translations/index.js'
12
-
13
- export const APIKeysEmptyState: React.FC<NoResultsClientProps> = ({
14
- hasCreatePermission,
15
- newDocumentURL,
16
- viewType,
17
- }) => {
18
- const { t } = useTranslation<PluginMCPTranslations, PluginMCPTranslationKeys>()
19
-
20
- return (
21
- <NoListResults
22
- Actions={
23
- hasCreatePermission && newDocumentURL && viewType !== 'trash'
24
- ? [
25
- <Button el="link" key="create" to={newDocumentURL}>
26
- {t('authentication:generateNewAPIKey')}
27
- </Button>,
28
- ]
29
- : []
30
- }
31
- description={t('plugin-mcp:apiKeyDescription')}
32
- title={t('plugin-mcp:noAPIKeys')}
33
- withMargin
34
- />
35
- )
36
- }
@@ -1,299 +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 {
9
- PluginMCPTranslationKeys,
10
- PluginMCPTranslations,
11
- } from '../../translations/index.js'
12
- import type { ClientMCPPluginConfig, MCPAPIKeysDocAccessTree } from '../../types.js'
13
-
14
- import './index.css'
15
-
16
- const baseClass = 'mcp-access-field'
17
-
18
- type ClientItem = ClientMCPPluginConfig['items'][number]
19
- type ScopeKey = 'collections' | 'globals'
20
- type FlatKey = 'prompts' | 'resources' | 'tools'
21
- type TabKey = 'collections' | 'globals' | 'server'
22
-
23
- const LEAF_GROUP_KEYS = ['operations', 'auth', 'custom'] as const
24
-
25
- type LeafGroupKey = (typeof LEAF_GROUP_KEYS)[number]
26
-
27
- type Props = {
28
- pluginConfig: ClientMCPPluginConfig
29
- } & JSONFieldClientProps
30
-
31
- /** Drop a key from an object and return a new object — or `undefined` if it'd be empty. */
32
- const without = <T extends Record<string, unknown>>(
33
- obj: T | undefined,
34
- key: string,
35
- ): T | undefined => {
36
- if (!obj || !(key in obj)) {
37
- return obj
38
- }
39
- const { [key]: _omitted, ...rest } = obj
40
- return Object.keys(rest).length === 0 ? undefined : (rest as T)
41
- }
42
-
43
- const setKey = <T extends Record<string, unknown>>(
44
- obj: T | undefined,
45
- key: string,
46
- value: unknown,
47
- ): T => ({ ...(obj ?? {}), [key]: value }) as T
48
-
49
- export const AccessField: React.FC<Props> = ({ path, pluginConfig }) => {
50
- const { setValue, value } = useField<MCPAPIKeysDocAccessTree>({ path })
51
- const { t } = useTranslation<PluginMCPTranslations, PluginMCPTranslationKeys>()
52
- const [activeTab, setActiveTab] = useState<null | TabKey>(null)
53
- const access = value ?? {}
54
- const leafGroupLabels: Record<LeafGroupKey, string> = {
55
- auth: t('plugin-mcp:authentication'),
56
- custom: t('general:custom'),
57
- operations: t('plugin-mcp:operations'),
58
- }
59
-
60
- const collectionsBySlug: Record<string, ClientItem[]> = {}
61
- const globalsBySlug: Record<string, ClientItem[]> = {}
62
- const prompts: ClientItem[] = []
63
- const resources: ClientItem[] = []
64
- const tools: ClientItem[] = []
65
-
66
- for (const item of pluginConfig.items) {
67
- switch (item.type) {
68
- case 'collectionTool':
69
- ;(collectionsBySlug[item.collectionSlug!] ??= []).push(item)
70
- break
71
- case 'globalTool':
72
- ;(globalsBySlug[item.globalSlug!] ??= []).push(item)
73
- break
74
- case 'prompt':
75
- prompts.push(item)
76
- break
77
- case 'resource':
78
- resources.push(item)
79
- break
80
- case 'tool':
81
- tools.push(item)
82
- break
83
- }
84
- }
85
-
86
- const isScopedAllowed = (scope: ScopeKey, slug: string, configKey: string): boolean =>
87
- access[scope]?.[slug]?.[configKey] !== false
88
-
89
- const isFlatAllowed = (scope: FlatKey, configKey: string): boolean =>
90
- access[scope]?.[configKey] !== false
91
-
92
- const toggleScoped = (scope: ScopeKey, slug: string, configKey: string, allow: boolean) => {
93
- if (allow) {
94
- const slugBucket = without(access[scope]?.[slug], configKey)
95
- const scopeBucket = slugBucket
96
- ? setKey(access[scope], slug, slugBucket)
97
- : without(access[scope], slug)
98
- setValue(scopeBucket ? setKey(access, scope, scopeBucket) : (without(access, scope) ?? {}))
99
- } else {
100
- setValue(
101
- setKey(
102
- access,
103
- scope,
104
- setKey(access[scope], slug, setKey(access[scope]?.[slug], configKey, false)),
105
- ),
106
- )
107
- }
108
- }
109
-
110
- const toggleFlat = (scope: FlatKey, configKey: string, allow: boolean) => {
111
- if (allow) {
112
- const bucket = without(access[scope], configKey)
113
- setValue(bucket ? setKey(access, scope, bucket) : (without(access, scope) ?? {}))
114
- } else {
115
- setValue(setKey(access, scope, setKey(access[scope], configKey, false)))
116
- }
117
- }
118
-
119
- const setAllScoped = (scope: ScopeKey, slug: string, leaves: ClientItem[], allow: boolean) => {
120
- if (allow) {
121
- const scopeBucket = without(access[scope], slug)
122
- setValue(scopeBucket ? setKey(access, scope, scopeBucket) : (without(access, scope) ?? {}))
123
- } else {
124
- const slugBucket = leaves.reduce<Record<string, boolean>>(
125
- (acc, leaf) => ({ ...acc, [leaf.configKey]: false }),
126
- {},
127
- )
128
- setValue(setKey(access, scope, setKey(access[scope], slug, slugBucket)))
129
- }
130
- }
131
-
132
- const setAllFlat = (scope: FlatKey, leaves: ClientItem[], allow: boolean) => {
133
- if (allow) {
134
- setValue(without(access, scope) ?? {})
135
- } else {
136
- const bucket = leaves.reduce<Record<string, boolean>>(
137
- (acc, leaf) => ({ ...acc, [leaf.configKey]: false }),
138
- {},
139
- )
140
- setValue(setKey(access, scope, bucket))
141
- }
142
- }
143
-
144
- const renderLeaf = (
145
- leaf: ClientItem,
146
- id: string,
147
- checked: boolean,
148
- onToggle: (allow: boolean) => void,
149
- ) => (
150
- <li className={`${baseClass}__leaf`} key={leaf.configKey}>
151
- <CheckboxInput
152
- checked={checked}
153
- id={id}
154
- label={leaf.label}
155
- onToggle={(e) => onToggle(e.target.checked)}
156
- />
157
- {leaf.description && <p className={`${baseClass}__leaf-description`}>{leaf.description}</p>}
158
- </li>
159
- )
160
-
161
- const renderCard = ({
162
- id,
163
- isLeafAllowed,
164
- label,
165
- leaves,
166
- onSetAll,
167
- onToggleLeaf,
168
- }: {
169
- id: string
170
- isLeafAllowed: (leaf: ClientItem) => boolean
171
- label: string
172
- leaves: ClientItem[]
173
- onSetAll: (allow: boolean) => void
174
- onToggleLeaf: (leaf: ClientItem, allow: boolean) => void
175
- }) => {
176
- const allowedCount = leaves.filter(isLeafAllowed).length
177
- const groups = LEAF_GROUP_KEYS.map((key) => ({
178
- key,
179
- label: leafGroupLabels[key],
180
- leaves: leaves.filter((leaf) => (leaf.group ?? 'custom') === key),
181
- })).filter((group) => group.leaves.length > 0)
182
- const hasGroupLabels = groups.length > 1
183
-
184
- return (
185
- <Collapsible
186
- className={`${baseClass}__card`}
187
- header={
188
- // Keep header clicks on the checkbox from also toggling the collapsible.
189
- <span
190
- className={`${baseClass}__card-checkbox`}
191
- onClick={(e) => e.stopPropagation()}
192
- role="presentation"
193
- >
194
- <CheckboxInput
195
- checked={allowedCount === leaves.length}
196
- id={`${id}._all`}
197
- label={label}
198
- onToggle={() => onSetAll(allowedCount < leaves.length)}
199
- partialChecked={allowedCount > 0 && allowedCount < leaves.length}
200
- />
201
- </span>
202
- }
203
- initCollapsed
204
- key={id}
205
- >
206
- <div className={`${baseClass}__card-groups`}>
207
- {groups.map((group) => (
208
- <div className={`${baseClass}__leaf-group`} key={group.key}>
209
- {hasGroupLabels && <p className={`${baseClass}__leaf-group-label`}>{group.label}</p>}
210
- <ul className={`${baseClass}__list`}>
211
- {group.leaves.map((leaf) =>
212
- renderLeaf(leaf, `${id}.${leaf.configKey}`, isLeafAllowed(leaf), (allow) =>
213
- onToggleLeaf(leaf, allow),
214
- ),
215
- )}
216
- </ul>
217
- </div>
218
- ))}
219
- </div>
220
- </Collapsible>
221
- )
222
- }
223
-
224
- const renderScope = (scope: ScopeKey, bySlug: Record<string, ClientItem[]>) =>
225
- Object.entries(bySlug).map(([slug, leaves]) =>
226
- renderCard({
227
- id: `${path}.${scope}.${slug}`,
228
- isLeafAllowed: (leaf) => isScopedAllowed(scope, slug, leaf.configKey),
229
- label: titleCase(slug),
230
- leaves,
231
- onSetAll: (allow) => setAllScoped(scope, slug, leaves, allow),
232
- onToggleLeaf: (leaf, allow) => toggleScoped(scope, slug, leaf.configKey, allow),
233
- }),
234
- )
235
-
236
- const renderFlat = (scope: FlatKey, label: string, leaves: ClientItem[]) =>
237
- leaves.length > 0 &&
238
- renderCard({
239
- id: `${path}.${scope}`,
240
- isLeafAllowed: (leaf) => isFlatAllowed(scope, leaf.configKey),
241
- label,
242
- leaves,
243
- onSetAll: (allow) => setAllFlat(scope, leaves, allow),
244
- onToggleLeaf: (leaf, allow) => toggleFlat(scope, leaf.configKey, allow),
245
- })
246
-
247
- const tabs: Array<{ key: TabKey; label: string }> = [
248
- ...(Object.keys(collectionsBySlug).length > 0
249
- ? [{ key: 'collections' as const, label: t('general:collections') }]
250
- : []),
251
- ...(Object.keys(globalsBySlug).length > 0
252
- ? [{ key: 'globals' as const, label: t('general:globals') }]
253
- : []),
254
- ...(prompts.length > 0 || resources.length > 0 || tools.length > 0
255
- ? [{ key: 'server' as const, label: t('plugin-mcp:server') }]
256
- : []),
257
- ]
258
- if (tabs.length === 0) {
259
- return null
260
- }
261
-
262
- const currentTab = activeTab ?? tabs[0]!.key
263
-
264
- return (
265
- <div className={baseClass}>
266
- <header className={`${baseClass}__header`}>
267
- <h4>{t('plugin-mcp:permissions')}</h4>
268
- <p>{t('plugin-mcp:permissionsDescription')}</p>
269
- </header>
270
- <div className={`${baseClass}__tabbed-content`}>
271
- <Tabs
272
- className={`${baseClass}__tabs`}
273
- onChange={setActiveTab}
274
- tabs={tabs.map((tab) => ({
275
- label: tab.label,
276
- value: tab.key,
277
- }))}
278
- value={currentTab}
279
- />
280
- <div className={`${baseClass}__cards`}>
281
- {currentTab === 'collections' && renderScope('collections', collectionsBySlug)}
282
- {currentTab === 'globals' && renderScope('globals', globalsBySlug)}
283
- {currentTab === 'server' && (
284
- <>
285
- {renderFlat('prompts', t('plugin-mcp:prompts'), prompts)}
286
- {renderFlat('resources', t('plugin-mcp:resources'), resources)}
287
- {renderFlat('tools', t('plugin-mcp:tools'), tools)}
288
- </>
289
- )}
290
- </div>
291
- </div>
292
- </div>
293
- )
294
- }
295
-
296
- const titleCase = (slug: string): string =>
297
- slug.replace(/(^|[-_])(.)/g, (_, sep: string, ch: string) =>
298
- sep ? ` ${ch.toUpperCase()}` : ch.toUpperCase(),
299
- )