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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/README.md +2 -2
  2. package/bin.js +39 -0
  3. package/dist/collection/getAccessField.d.ts +12 -0
  4. package/dist/collection/getAccessField.d.ts.map +1 -0
  5. package/dist/collection/getAccessField.js +57 -0
  6. package/dist/collection/getAccessField.js.map +1 -0
  7. package/dist/collection/index.d.ts +6 -0
  8. package/dist/collection/index.d.ts.map +1 -0
  9. package/dist/collection/index.js +59 -0
  10. package/dist/collection/index.js.map +1 -0
  11. package/dist/components/AccessField/index.client.d.ts +10 -0
  12. package/dist/components/AccessField/index.client.d.ts.map +1 -0
  13. package/dist/components/AccessField/index.client.js +305 -0
  14. package/dist/components/AccessField/index.client.js.map +1 -0
  15. package/dist/components/AccessField/index.css +93 -0
  16. package/dist/defineTool.d.ts +26 -0
  17. package/dist/defineTool.d.ts.map +1 -0
  18. package/dist/defineTool.js +37 -0
  19. package/dist/defineTool.js.map +1 -0
  20. package/dist/endpoint/access.d.ts +10 -0
  21. package/dist/endpoint/access.d.ts.map +1 -0
  22. package/dist/endpoint/access.js +106 -0
  23. package/dist/endpoint/access.js.map +1 -0
  24. package/dist/endpoint/index.d.ts +3 -0
  25. package/dist/endpoint/index.d.ts.map +1 -0
  26. package/dist/endpoint/index.js +36 -0
  27. package/dist/endpoint/index.js.map +1 -0
  28. package/dist/exports/client.d.ts +2 -0
  29. package/dist/exports/client.d.ts.map +1 -0
  30. package/dist/exports/client.js +4 -0
  31. package/dist/exports/client.js.map +1 -0
  32. package/dist/index.d.ts +4 -7
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +44 -67
  35. package/dist/index.js.map +1 -1
  36. package/dist/mcp/buildMcpServer.d.ts +19 -0
  37. package/dist/mcp/buildMcpServer.d.ts.map +1 -0
  38. package/dist/mcp/buildMcpServer.js +163 -0
  39. package/dist/mcp/buildMcpServer.js.map +1 -0
  40. package/dist/mcp/builtin/collections/authTools.d.ts +7 -0
  41. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -0
  42. package/dist/mcp/builtin/collections/authTools.js +250 -0
  43. package/dist/mcp/builtin/collections/authTools.js.map +1 -0
  44. package/dist/mcp/builtin/collections/createTool.d.ts +2 -0
  45. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -0
  46. package/dist/mcp/builtin/collections/createTool.js +87 -0
  47. package/dist/mcp/builtin/collections/createTool.js.map +1 -0
  48. package/dist/mcp/builtin/collections/deleteTool.d.ts +2 -0
  49. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -0
  50. package/dist/mcp/builtin/collections/deleteTool.js +117 -0
  51. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -0
  52. package/dist/mcp/builtin/collections/findTool.d.ts +2 -0
  53. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -0
  54. package/dist/mcp/builtin/collections/findTool.js +159 -0
  55. package/dist/mcp/builtin/collections/findTool.js.map +1 -0
  56. package/dist/mcp/builtin/collections/updateTool.d.ts +2 -0
  57. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -0
  58. package/dist/mcp/builtin/collections/updateTool.js +187 -0
  59. package/dist/mcp/builtin/collections/updateTool.js.map +1 -0
  60. package/dist/mcp/builtin/globals/findTool.d.ts +2 -0
  61. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -0
  62. package/dist/mcp/builtin/globals/findTool.js +76 -0
  63. package/dist/mcp/builtin/globals/findTool.js.map +1 -0
  64. package/dist/mcp/builtin/globals/updateTool.d.ts +2 -0
  65. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -0
  66. package/dist/mcp/builtin/globals/updateTool.js +92 -0
  67. package/dist/mcp/builtin/globals/updateTool.js.map +1 -0
  68. package/dist/mcp/builtinTools.d.ts +37 -0
  69. package/dist/mcp/builtinTools.d.ts.map +1 -0
  70. package/dist/mcp/builtinTools.js +64 -0
  71. package/dist/mcp/builtinTools.js.map +1 -0
  72. package/dist/mcp/sanitizeMCPConfig.d.ts +17 -0
  73. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -0
  74. package/dist/mcp/sanitizeMCPConfig.js +167 -0
  75. package/dist/mcp/sanitizeMCPConfig.js.map +1 -0
  76. package/dist/stdio.d.ts +8 -0
  77. package/dist/stdio.d.ts.map +1 -0
  78. package/dist/stdio.js +89 -0
  79. package/dist/stdio.js.map +1 -0
  80. package/dist/types.d.ts +262 -455
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/types.js +6 -1
  83. package/dist/types.js.map +1 -1
  84. package/dist/utils/camelCase.d.ts.map +1 -1
  85. package/dist/utils/getLogger.d.ts +10 -0
  86. package/dist/utils/getLogger.d.ts.map +1 -0
  87. package/dist/utils/getLogger.js +22 -0
  88. package/dist/utils/getLogger.js.map +1 -0
  89. package/dist/utils/getPluginConfig.d.ts +12 -0
  90. package/dist/utils/getPluginConfig.d.ts.map +1 -0
  91. package/dist/utils/getPluginConfig.js +15 -0
  92. package/dist/utils/getPluginConfig.js.map +1 -0
  93. package/dist/utils/localAPIDefaults.d.ts +20 -0
  94. package/dist/utils/localAPIDefaults.d.ts.map +1 -0
  95. package/dist/utils/localAPIDefaults.js +19 -0
  96. package/dist/utils/localAPIDefaults.js.map +1 -0
  97. package/dist/utils/resolveProjectRoot.d.ts +7 -0
  98. package/dist/utils/resolveProjectRoot.d.ts.map +1 -0
  99. package/dist/utils/resolveProjectRoot.js +15 -0
  100. package/dist/utils/resolveProjectRoot.js.map +1 -0
  101. package/dist/utils/schemaConversion/prepareCollectionSchema.d.ts +7 -0
  102. package/dist/utils/schemaConversion/prepareCollectionSchema.d.ts.map +1 -0
  103. package/dist/utils/schemaConversion/prepareCollectionSchema.js +37 -0
  104. package/dist/utils/schemaConversion/prepareCollectionSchema.js.map +1 -0
  105. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +2 -2
  106. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +1 -1
  107. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +1 -1
  108. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts +2 -2
  109. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts.map +1 -1
  110. package/dist/utils/schemaConversion/sanitizeJsonSchema.js.map +1 -1
  111. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts +2 -2
  112. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts.map +1 -1
  113. package/dist/utils/schemaConversion/simplifyRelationshipFields.js +7 -4
  114. package/dist/utils/schemaConversion/simplifyRelationshipFields.js.map +1 -1
  115. package/dist/utils/schemaConversion/transformPointFields.d.ts +2 -2
  116. package/dist/utils/schemaConversion/transformPointFields.d.ts.map +1 -1
  117. package/dist/utils/schemaConversion/transformPointFields.js +7 -1
  118. package/dist/utils/schemaConversion/transformPointFields.js.map +1 -1
  119. package/dist/utils/toStandardSchema.d.ts +5 -0
  120. package/dist/utils/toStandardSchema.d.ts.map +1 -0
  121. package/dist/utils/toStandardSchema.js +4 -0
  122. package/dist/utils/toStandardSchema.js.map +1 -0
  123. package/package.json +35 -10
  124. package/src/collection/getAccessField.ts +64 -0
  125. package/src/collection/index.ts +63 -0
  126. package/src/components/AccessField/index.client.tsx +344 -0
  127. package/src/components/AccessField/index.css +93 -0
  128. package/src/defineTool.ts +44 -0
  129. package/src/endpoint/access.ts +132 -0
  130. package/src/endpoint/index.ts +35 -0
  131. package/src/exports/client.ts +2 -0
  132. package/src/index.ts +35 -85
  133. package/src/mcp/buildMcpServer.ts +224 -0
  134. package/src/mcp/builtin/collections/authTools.ts +233 -0
  135. package/src/mcp/builtin/collections/createTool.ts +116 -0
  136. package/src/mcp/builtin/collections/deleteTool.ts +123 -0
  137. package/src/mcp/builtin/collections/findTool.ts +187 -0
  138. package/src/mcp/builtin/collections/updateTool.ts +205 -0
  139. package/src/mcp/builtin/globals/findTool.ts +96 -0
  140. package/src/mcp/builtin/globals/updateTool.ts +118 -0
  141. package/src/mcp/builtinTools.ts +84 -0
  142. package/src/mcp/sanitizeMCPConfig.ts +239 -0
  143. package/src/stdio.ts +98 -0
  144. package/src/types.ts +295 -490
  145. package/src/utils/getLogger.ts +22 -0
  146. package/src/utils/getPluginConfig.ts +24 -0
  147. package/src/utils/localAPIDefaults.ts +22 -0
  148. package/src/utils/resolveProjectRoot.ts +17 -0
  149. package/src/utils/schemaConversion/prepareCollectionSchema.ts +39 -0
  150. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +3 -3
  151. package/src/utils/schemaConversion/sanitizeJsonSchema.ts +4 -4
  152. package/src/utils/schemaConversion/simplifyRelationshipFields.ts +11 -6
  153. package/src/utils/schemaConversion/transformPointFields.ts +6 -5
  154. package/src/utils/toStandardSchema.ts +9 -0
  155. package/dist/collections/createApiKeysCollection.d.ts +0 -7
  156. package/dist/collections/createApiKeysCollection.d.ts.map +0 -1
  157. package/dist/collections/createApiKeysCollection.js +0 -317
  158. package/dist/collections/createApiKeysCollection.js.map +0 -1
  159. package/dist/defaults.d.ts +0 -4
  160. package/dist/defaults.d.ts.map +0 -1
  161. package/dist/defaults.js +0 -5
  162. package/dist/defaults.js.map +0 -1
  163. package/dist/endpoints/mcp.d.ts +0 -4
  164. package/dist/endpoints/mcp.d.ts.map +0 -1
  165. package/dist/endpoints/mcp.js +0 -71
  166. package/dist/endpoints/mcp.js.map +0 -1
  167. package/dist/mcp/createRequest.d.ts +0 -3
  168. package/dist/mcp/createRequest.d.ts.map +0 -1
  169. package/dist/mcp/createRequest.js +0 -14
  170. package/dist/mcp/createRequest.js.map +0 -1
  171. package/dist/mcp/getMcpHandler.d.ts +0 -4
  172. package/dist/mcp/getMcpHandler.d.ts.map +0 -1
  173. package/dist/mcp/getMcpHandler.js +0 -231
  174. package/dist/mcp/getMcpHandler.js.map +0 -1
  175. package/dist/mcp/helpers/config.d.ts +0 -22
  176. package/dist/mcp/helpers/config.d.ts.map +0 -1
  177. package/dist/mcp/helpers/config.js +0 -153
  178. package/dist/mcp/helpers/config.js.map +0 -1
  179. package/dist/mcp/helpers/fields.d.ts +0 -19
  180. package/dist/mcp/helpers/fields.d.ts.map +0 -1
  181. package/dist/mcp/helpers/fields.js +0 -102
  182. package/dist/mcp/helpers/fields.js.map +0 -1
  183. package/dist/mcp/helpers/fileValidation.d.ts +0 -67
  184. package/dist/mcp/helpers/fileValidation.d.ts.map +0 -1
  185. package/dist/mcp/helpers/fileValidation.js +0 -267
  186. package/dist/mcp/helpers/fileValidation.js.map +0 -1
  187. package/dist/mcp/registerTool.d.ts +0 -6
  188. package/dist/mcp/registerTool.d.ts.map +0 -1
  189. package/dist/mcp/registerTool.js +0 -18
  190. package/dist/mcp/registerTool.js.map +0 -1
  191. package/dist/mcp/tools/auth/auth.d.ts +0 -4
  192. package/dist/mcp/tools/auth/auth.d.ts.map +0 -1
  193. package/dist/mcp/tools/auth/auth.js +0 -57
  194. package/dist/mcp/tools/auth/auth.js.map +0 -1
  195. package/dist/mcp/tools/auth/forgotPassword.d.ts +0 -4
  196. package/dist/mcp/tools/auth/forgotPassword.d.ts.map +0 -1
  197. package/dist/mcp/tools/auth/forgotPassword.js +0 -48
  198. package/dist/mcp/tools/auth/forgotPassword.js.map +0 -1
  199. package/dist/mcp/tools/auth/login.d.ts +0 -4
  200. package/dist/mcp/tools/auth/login.d.ts.map +0 -1
  201. package/dist/mcp/tools/auth/login.js +0 -51
  202. package/dist/mcp/tools/auth/login.js.map +0 -1
  203. package/dist/mcp/tools/auth/resetPassword.d.ts +0 -4
  204. package/dist/mcp/tools/auth/resetPassword.d.ts.map +0 -1
  205. package/dist/mcp/tools/auth/resetPassword.js +0 -49
  206. package/dist/mcp/tools/auth/resetPassword.js.map +0 -1
  207. package/dist/mcp/tools/auth/unlock.d.ts +0 -4
  208. package/dist/mcp/tools/auth/unlock.d.ts.map +0 -1
  209. package/dist/mcp/tools/auth/unlock.js +0 -48
  210. package/dist/mcp/tools/auth/unlock.js.map +0 -1
  211. package/dist/mcp/tools/auth/verify.d.ts +0 -4
  212. package/dist/mcp/tools/auth/verify.d.ts.map +0 -1
  213. package/dist/mcp/tools/auth/verify.js +0 -45
  214. package/dist/mcp/tools/auth/verify.js.map +0 -1
  215. package/dist/mcp/tools/collection/create.d.ts +0 -10
  216. package/dist/mcp/tools/collection/create.d.ts.map +0 -1
  217. package/dist/mcp/tools/collection/create.js +0 -139
  218. package/dist/mcp/tools/collection/create.js.map +0 -1
  219. package/dist/mcp/tools/collection/delete.d.ts +0 -10
  220. package/dist/mcp/tools/collection/delete.d.ts.map +0 -1
  221. package/dist/mcp/tools/collection/delete.js +0 -154
  222. package/dist/mcp/tools/collection/delete.js.map +0 -1
  223. package/dist/mcp/tools/collection/find.d.ts +0 -10
  224. package/dist/mcp/tools/collection/find.d.ts.map +0 -1
  225. package/dist/mcp/tools/collection/find.js +0 -165
  226. package/dist/mcp/tools/collection/find.js.map +0 -1
  227. package/dist/mcp/tools/collection/update.d.ts +0 -10
  228. package/dist/mcp/tools/collection/update.d.ts.map +0 -1
  229. package/dist/mcp/tools/collection/update.js +0 -209
  230. package/dist/mcp/tools/collection/update.js.map +0 -1
  231. package/dist/mcp/tools/config/find.d.ts +0 -10
  232. package/dist/mcp/tools/config/find.d.ts.map +0 -1
  233. package/dist/mcp/tools/config/find.js +0 -97
  234. package/dist/mcp/tools/config/find.js.map +0 -1
  235. package/dist/mcp/tools/config/update.d.ts +0 -10
  236. package/dist/mcp/tools/config/update.d.ts.map +0 -1
  237. package/dist/mcp/tools/config/update.js +0 -215
  238. package/dist/mcp/tools/config/update.js.map +0 -1
  239. package/dist/mcp/tools/global/find.d.ts +0 -5
  240. package/dist/mcp/tools/global/find.d.ts.map +0 -1
  241. package/dist/mcp/tools/global/find.js +0 -82
  242. package/dist/mcp/tools/global/find.js.map +0 -1
  243. package/dist/mcp/tools/global/update.d.ts +0 -6
  244. package/dist/mcp/tools/global/update.d.ts.map +0 -1
  245. package/dist/mcp/tools/global/update.js +0 -124
  246. package/dist/mcp/tools/global/update.js.map +0 -1
  247. package/dist/mcp/tools/job/create.d.ts +0 -10
  248. package/dist/mcp/tools/job/create.d.ts.map +0 -1
  249. package/dist/mcp/tools/job/create.js +0 -293
  250. package/dist/mcp/tools/job/create.js.map +0 -1
  251. package/dist/mcp/tools/job/run.d.ts +0 -10
  252. package/dist/mcp/tools/job/run.d.ts.map +0 -1
  253. package/dist/mcp/tools/job/run.js +0 -129
  254. package/dist/mcp/tools/job/run.js.map +0 -1
  255. package/dist/mcp/tools/job/update.d.ts +0 -11
  256. package/dist/mcp/tools/job/update.d.ts.map +0 -1
  257. package/dist/mcp/tools/job/update.js +0 -186
  258. package/dist/mcp/tools/job/update.js.map +0 -1
  259. package/dist/mcp/tools/resource/create.d.ts +0 -6
  260. package/dist/mcp/tools/resource/create.d.ts.map +0 -1
  261. package/dist/mcp/tools/resource/create.js +0 -124
  262. package/dist/mcp/tools/resource/create.js.map +0 -1
  263. package/dist/mcp/tools/resource/delete.d.ts +0 -5
  264. package/dist/mcp/tools/resource/delete.d.ts.map +0 -1
  265. package/dist/mcp/tools/resource/delete.js +0 -151
  266. package/dist/mcp/tools/resource/delete.js.map +0 -1
  267. package/dist/mcp/tools/resource/find.d.ts +0 -5
  268. package/dist/mcp/tools/resource/find.d.ts.map +0 -1
  269. package/dist/mcp/tools/resource/find.js +0 -170
  270. package/dist/mcp/tools/resource/find.js.map +0 -1
  271. package/dist/mcp/tools/resource/update.d.ts +0 -6
  272. package/dist/mcp/tools/resource/update.d.ts.map +0 -1
  273. package/dist/mcp/tools/resource/update.js +0 -256
  274. package/dist/mcp/tools/resource/update.js.map +0 -1
  275. package/dist/mcp/tools/schemas.d.ts +0 -457
  276. package/dist/mcp/tools/schemas.d.ts.map +0 -1
  277. package/dist/mcp/tools/schemas.js +0 -243
  278. package/dist/mcp/tools/schemas.js.map +0 -1
  279. package/dist/utils/adminEntitySettings.d.ts +0 -17
  280. package/dist/utils/adminEntitySettings.d.ts.map +0 -1
  281. package/dist/utils/adminEntitySettings.js +0 -41
  282. package/dist/utils/adminEntitySettings.js.map +0 -1
  283. package/dist/utils/createApiKeyFields.d.ts +0 -15
  284. package/dist/utils/createApiKeyFields.d.ts.map +0 -1
  285. package/dist/utils/createApiKeyFields.js +0 -57
  286. package/dist/utils/createApiKeyFields.js.map +0 -1
  287. package/dist/utils/getEnabledSlugs.d.ts +0 -13
  288. package/dist/utils/getEnabledSlugs.d.ts.map +0 -1
  289. package/dist/utils/getEnabledSlugs.js +0 -32
  290. package/dist/utils/getEnabledSlugs.js.map +0 -1
  291. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts +0 -3
  292. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts.map +0 -1
  293. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js +0 -43
  294. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js.map +0 -1
  295. package/src/collections/createApiKeysCollection.ts +0 -373
  296. package/src/defaults.ts +0 -3
  297. package/src/endpoints/mcp.ts +0 -91
  298. package/src/mcp/createRequest.ts +0 -13
  299. package/src/mcp/getMcpHandler.ts +0 -545
  300. package/src/mcp/helpers/config.ts +0 -213
  301. package/src/mcp/helpers/fields.ts +0 -154
  302. package/src/mcp/helpers/fileValidation.ts +0 -362
  303. package/src/mcp/registerTool.ts +0 -22
  304. package/src/mcp/tools/auth/auth.ts +0 -71
  305. package/src/mcp/tools/auth/forgotPassword.ts +0 -70
  306. package/src/mcp/tools/auth/login.ts +0 -72
  307. package/src/mcp/tools/auth/resetPassword.ts +0 -61
  308. package/src/mcp/tools/auth/unlock.ts +0 -64
  309. package/src/mcp/tools/auth/verify.ts +0 -57
  310. package/src/mcp/tools/collection/create.ts +0 -210
  311. package/src/mcp/tools/collection/delete.ts +0 -211
  312. package/src/mcp/tools/collection/find.ts +0 -224
  313. package/src/mcp/tools/collection/update.ts +0 -290
  314. package/src/mcp/tools/config/find.ts +0 -128
  315. package/src/mcp/tools/config/update.ts +0 -280
  316. package/src/mcp/tools/global/find.ts +0 -128
  317. package/src/mcp/tools/global/update.ts +0 -207
  318. package/src/mcp/tools/job/create.ts +0 -416
  319. package/src/mcp/tools/job/run.ts +0 -167
  320. package/src/mcp/tools/job/update.ts +0 -274
  321. package/src/mcp/tools/resource/create.ts +0 -211
  322. package/src/mcp/tools/resource/delete.ts +0 -218
  323. package/src/mcp/tools/resource/find.ts +0 -246
  324. package/src/mcp/tools/resource/update.ts +0 -383
  325. package/src/mcp/tools/schemas.ts +0 -520
  326. package/src/utils/adminEntitySettings.ts +0 -40
  327. package/src/utils/createApiKeyFields.ts +0 -72
  328. package/src/utils/getEnabledSlugs.ts +0 -42
  329. package/src/utils/schemaConversion/convertCollectionSchemaToZod.ts +0 -52
@@ -1,280 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
2
- import type { PayloadRequest } from 'payload'
3
-
4
- import { readFileSync, writeFileSync } from 'fs'
5
-
6
- import {
7
- addCollectionToConfig,
8
- removeCollectionFromConfig,
9
- updateAdminConfig,
10
- updateDatabaseConfig,
11
- updatePluginsConfig,
12
- } from '../../helpers/config.js'
13
- import { toolSchemas } from '../schemas.js'
14
-
15
- export const updateConfig = (
16
- req: PayloadRequest,
17
- verboseLogs: boolean,
18
- configFilePath: string,
19
- updateType: string,
20
- collectionName?: string,
21
- adminConfig?: any,
22
- databaseConfig?: any,
23
- pluginUpdates?: any,
24
- newContent?: string,
25
- ) => {
26
- const payload = req.payload
27
- if (verboseLogs) {
28
- payload.logger.info(`[payload-mcp] Updating config with update type: ${updateType}`)
29
- }
30
-
31
- // Security check: ensure we're working with the specified config file
32
- if (!configFilePath.startsWith(process.cwd()) && !configFilePath.startsWith('/')) {
33
- payload.logger.error(`[payload-mcp] Invalid config path attempted: ${configFilePath}`)
34
- return {
35
- content: [
36
- {
37
- type: 'text' as const,
38
- text: '❌ **Error**: Invalid config path',
39
- },
40
- ],
41
- }
42
- }
43
-
44
- try {
45
- // Read current config
46
- let currentContent: string
47
- try {
48
- currentContent = readFileSync(configFilePath, 'utf8')
49
- } catch (_ignore) {
50
- return {
51
- content: [
52
- {
53
- type: 'text' as const,
54
- text: `❌ **Error**: Config file not found: ${configFilePath}`,
55
- },
56
- ],
57
- }
58
- }
59
-
60
- let updatedContent: string
61
- let updateSummary: string[] = []
62
-
63
- switch (updateType) {
64
- case 'add_collection':
65
- if (!collectionName) {
66
- return {
67
- content: [
68
- {
69
- type: 'text' as const,
70
- text: '❌ **Error**: No collection name provided for add_collection update type',
71
- },
72
- ],
73
- }
74
- }
75
- updatedContent = addCollectionToConfig(currentContent, collectionName)
76
- updateSummary = [`Added collection: ${collectionName}`]
77
- break
78
-
79
- case 'remove_collection':
80
- if (!collectionName) {
81
- return {
82
- content: [
83
- {
84
- type: 'text' as const,
85
- text: '❌ **Error**: No collection name provided for remove_collection update type',
86
- },
87
- ],
88
- }
89
- }
90
- updatedContent = removeCollectionFromConfig(currentContent, collectionName)
91
- updateSummary = [`Removed collection: ${collectionName}`]
92
- break
93
-
94
- case 'replace_content':
95
- if (!newContent) {
96
- return {
97
- content: [
98
- {
99
- type: 'text' as const,
100
- text: '❌ **Error**: No new content provided for replace_content update type',
101
- },
102
- ],
103
- }
104
- }
105
- updatedContent = newContent
106
- updateSummary = ['Replaced entire config content']
107
- break
108
-
109
- case 'update_admin':
110
- if (!adminConfig) {
111
- return {
112
- content: [
113
- {
114
- type: 'text' as const,
115
- text: '❌ **Error**: No admin config provided for update_admin update type',
116
- },
117
- ],
118
- }
119
- }
120
- updatedContent = updateAdminConfig(currentContent, adminConfig)
121
- updateSummary = Object.keys(adminConfig).map((key) => `Updated admin config: ${key}`)
122
- break
123
-
124
- case 'update_database':
125
- if (!databaseConfig) {
126
- return {
127
- content: [
128
- {
129
- type: 'text' as const,
130
- text: '❌ **Error**: No database config provided for update_database update type',
131
- },
132
- ],
133
- }
134
- }
135
- updatedContent = updateDatabaseConfig(currentContent, databaseConfig)
136
- updateSummary = Object.keys(databaseConfig).map((key) => `Updated database config: ${key}`)
137
- break
138
-
139
- case 'update_plugins':
140
- if (!pluginUpdates) {
141
- return {
142
- content: [
143
- {
144
- type: 'text' as const,
145
- text: '❌ **Error**: No plugin updates provided for update_plugins update type',
146
- },
147
- ],
148
- }
149
- }
150
- updatedContent = updatePluginsConfig(currentContent, pluginUpdates)
151
- updateSummary = []
152
- if (pluginUpdates.add) {
153
- updateSummary.push(`Added plugins: ${pluginUpdates.add.join(', ')}`)
154
- }
155
- if (pluginUpdates.remove) {
156
- updateSummary.push(`Removed plugins: ${pluginUpdates.remove.join(', ')}`)
157
- }
158
- break
159
-
160
- default:
161
- return {
162
- content: [
163
- {
164
- type: 'text' as const,
165
- text: `❌ **Error**: Unknown update type: ${updateType}`,
166
- },
167
- ],
168
- }
169
- }
170
-
171
- // Write the updated content back to the file
172
- writeFileSync(configFilePath, updatedContent, 'utf8')
173
- if (verboseLogs) {
174
- payload.logger.info(`[payload-mcp] Successfully updated config file: ${configFilePath}`)
175
- }
176
-
177
- return {
178
- content: [
179
- {
180
- type: 'text' as const,
181
- text: `✅ **Config updated successfully!**
182
-
183
- **File**: \`${configFilePath}\`
184
- **Update Type**: ${updateType}
185
-
186
- **Changes Made**:
187
- ${updateSummary.map((summary) => `- ${summary}`).join('\n')}
188
-
189
- **Updated Config Content:**
190
- \`\`\`typescript
191
- ${updatedContent}
192
- \`\`\``,
193
- },
194
- ],
195
- }
196
- } catch (error) {
197
- const errorMessage = (error as Error).message
198
- payload.logger.error(`[payload-mcp] Error updating config: ${errorMessage}`)
199
- return {
200
- content: [
201
- {
202
- type: 'text' as const,
203
- text: `❌ **Error updating config**: ${errorMessage}`,
204
- },
205
- ],
206
- }
207
- }
208
- }
209
-
210
- export const updateConfigTool = (
211
- server: McpServer,
212
- req: PayloadRequest,
213
- verboseLogs: boolean,
214
- configFilePath: string,
215
- ) => {
216
- const tool = ({
217
- adminConfig,
218
- collectionName,
219
- databaseConfig,
220
- newContent,
221
- pluginUpdates,
222
- updateType,
223
- }: {
224
- adminConfig?: any
225
- collectionName?: string
226
- databaseConfig?: any
227
- newContent?: string
228
- pluginUpdates?: any
229
- updateType: string
230
- }) => {
231
- const payload = req.payload
232
-
233
- if (verboseLogs) {
234
- payload.logger.info(`[payload-mcp] Updating config: ${updateType}`)
235
- }
236
-
237
- try {
238
- const result = updateConfig(
239
- req,
240
- verboseLogs,
241
- configFilePath,
242
- updateType,
243
- collectionName,
244
- adminConfig,
245
- databaseConfig,
246
- pluginUpdates,
247
- newContent,
248
- )
249
-
250
- if (verboseLogs) {
251
- payload.logger.info(`[payload-mcp] Config update completed for: ${updateType}`)
252
- }
253
-
254
- return result
255
- } catch (error) {
256
- const errorMessage = error instanceof Error ? error.message : 'Unknown error'
257
- payload.logger.error(`[payload-mcp] Error updating config: ${errorMessage}`)
258
-
259
- return {
260
- content: [
261
- {
262
- type: 'text' as const,
263
- text: `Error updating config: ${errorMessage}`,
264
- },
265
- ],
266
- }
267
- }
268
- }
269
-
270
- server.registerTool(
271
- 'updateConfig',
272
- {
273
- description: toolSchemas.updateConfig.description,
274
- inputSchema: toolSchemas.updateConfig.parameters.shape,
275
- },
276
- (args) => {
277
- return tool(args)
278
- },
279
- )
280
- }
@@ -1,128 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
2
- import type { PayloadRequest, SelectType, TypedUser } from 'payload'
3
-
4
- import type { MCPPluginConfig } from '../../../types.js'
5
-
6
- import { toCamelCase } from '../../../utils/camelCase.js'
7
- import { toolSchemas } from '../schemas.js'
8
-
9
- export const findGlobalTool = (
10
- server: McpServer,
11
- req: PayloadRequest,
12
- user: TypedUser,
13
- verboseLogs: boolean,
14
- globalSlug: string,
15
- globals: MCPPluginConfig['globals'],
16
- ) => {
17
- const tool = async (
18
- depth: number = 0,
19
- locale?: string,
20
- fallbackLocale?: string,
21
- select?: string,
22
- ): Promise<{
23
- content: Array<{
24
- text: string
25
- type: 'text'
26
- }>
27
- }> => {
28
- const payload = req.payload
29
-
30
- if (verboseLogs) {
31
- payload.logger.info(
32
- `[payload-mcp] Reading global: ${globalSlug}, depth: ${depth}${locale ? `, locale: ${locale}` : ''}`,
33
- )
34
- }
35
-
36
- try {
37
- const findOptions: Parameters<typeof payload.findGlobal>[0] = {
38
- slug: globalSlug,
39
- depth,
40
- user,
41
- }
42
-
43
- let selectClause: SelectType | undefined
44
- if (select) {
45
- try {
46
- selectClause = JSON.parse(select) as SelectType
47
- } catch (_parseError) {
48
- payload.logger.warn(`[payload-mcp] Invalid select clause JSON for global: ${select}`)
49
- const response = {
50
- content: [{ type: 'text' as const, text: 'Error: Invalid JSON in select clause' }],
51
- }
52
- return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {
53
- content: Array<{
54
- text: string
55
- type: 'text'
56
- }>
57
- }
58
- }
59
- }
60
-
61
- // Add locale parameters if provided
62
- if (locale) {
63
- findOptions.locale = locale
64
- }
65
- if (fallbackLocale) {
66
- findOptions.fallbackLocale = fallbackLocale
67
- }
68
- if (selectClause) {
69
- findOptions.select = selectClause
70
- }
71
-
72
- const result = await payload.findGlobal(findOptions)
73
-
74
- if (verboseLogs) {
75
- payload.logger.info(`[payload-mcp] Found global: ${globalSlug}`)
76
- }
77
-
78
- const response = {
79
- content: [
80
- {
81
- type: 'text' as const,
82
- text: `Global "${globalSlug}":
83
- \`\`\`json
84
- ${JSON.stringify(result)}
85
- \`\`\``,
86
- },
87
- ],
88
- }
89
-
90
- return (globals?.[globalSlug]?.overrideResponse?.(response, result, req) || response) as {
91
- content: Array<{
92
- text: string
93
- type: 'text'
94
- }>
95
- }
96
- } catch (error) {
97
- const errorMessage = error instanceof Error ? error.message : 'Unknown error'
98
- payload.logger.error(`[payload-mcp] Error reading global ${globalSlug}: ${errorMessage}`)
99
- const response = {
100
- content: [
101
- {
102
- type: 'text' as const,
103
- text: `❌ **Error reading global "${globalSlug}":** ${errorMessage}`,
104
- },
105
- ],
106
- }
107
- return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {
108
- content: Array<{
109
- text: string
110
- type: 'text'
111
- }>
112
- }
113
- }
114
- }
115
-
116
- if (globals?.[globalSlug]?.enabled) {
117
- server.registerTool(
118
- `find${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`,
119
- {
120
- description: `${toolSchemas.findGlobal.description.trim()}\n\n${globals?.[globalSlug]?.description || ''}`,
121
- inputSchema: toolSchemas.findGlobal.parameters.shape,
122
- },
123
- async ({ depth, fallbackLocale, locale, select }) => {
124
- return await tool(depth, locale, fallbackLocale, select)
125
- },
126
- )
127
- }
128
- }
@@ -1,207 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
2
- import type { JSONSchema4 } from 'json-schema'
3
- import type { PayloadRequest, SelectType, TypedUser } from 'payload'
4
-
5
- import { z } from 'zod'
6
-
7
- import type { MCPPluginConfig } from '../../../types.js'
8
-
9
- import { toCamelCase } from '../../../utils/camelCase.js'
10
- import {
11
- getGlobalVirtualFieldNames,
12
- stripVirtualFields,
13
- } from '../../../utils/getVirtualFieldNames.js'
14
- import { convertCollectionSchemaToZod } from '../../../utils/schemaConversion/convertCollectionSchemaToZod.js'
15
- import { toolSchemas } from '../schemas.js'
16
-
17
- export const updateGlobalTool = (
18
- server: McpServer,
19
- req: PayloadRequest,
20
- user: TypedUser,
21
- verboseLogs: boolean,
22
- globalSlug: string,
23
- globals: MCPPluginConfig['globals'],
24
- schema: JSONSchema4,
25
- ) => {
26
- const tool = async (
27
- data: string,
28
- draft: boolean = false,
29
- depth: number = 0,
30
- locale?: string,
31
- fallbackLocale?: string,
32
- select?: string,
33
- ): Promise<{
34
- content: Array<{
35
- text: string
36
- type: 'text'
37
- }>
38
- }> => {
39
- const payload = req.payload
40
-
41
- if (verboseLogs) {
42
- payload.logger.info(
43
- `[payload-mcp] Updating global: ${globalSlug}, draft: ${draft}${locale ? `, locale: ${locale}` : ''}`,
44
- )
45
- }
46
-
47
- try {
48
- // Parse the data JSON
49
- let parsedData: Record<string, unknown>
50
- try {
51
- parsedData = JSON.parse(data)
52
-
53
- const virtualFieldNames = getGlobalVirtualFieldNames(payload.config, globalSlug)
54
- parsedData = stripVirtualFields(parsedData, virtualFieldNames)
55
-
56
- if (verboseLogs) {
57
- payload.logger.info(
58
- `[payload-mcp] Parsed data for ${globalSlug}: ${JSON.stringify(parsedData)}`,
59
- )
60
- }
61
- } catch (_parseError) {
62
- payload.logger.error(`[payload-mcp] Invalid JSON data provided: ${data}`)
63
- const response = {
64
- content: [{ type: 'text' as const, text: 'Error: Invalid JSON data provided' }],
65
- }
66
- return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {
67
- content: Array<{
68
- text: string
69
- type: 'text'
70
- }>
71
- }
72
- }
73
-
74
- let selectClause: SelectType | undefined
75
- if (select) {
76
- try {
77
- selectClause = JSON.parse(select) as SelectType
78
- } catch (_parseError) {
79
- payload.logger.warn(`[payload-mcp] Invalid select clause JSON for global: ${select}`)
80
- const response = {
81
- content: [{ type: 'text' as const, text: 'Error: Invalid JSON in select clause' }],
82
- }
83
- return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {
84
- content: Array<{
85
- text: string
86
- type: 'text'
87
- }>
88
- }
89
- }
90
- }
91
-
92
- const updateOptions: Parameters<typeof payload.updateGlobal>[0] = {
93
- slug: globalSlug,
94
- data: parsedData,
95
- depth,
96
- draft,
97
- user,
98
- }
99
-
100
- // Add locale parameters if provided
101
- if (locale) {
102
- updateOptions.locale = locale
103
- }
104
- if (fallbackLocale) {
105
- updateOptions.fallbackLocale = fallbackLocale
106
- }
107
- if (selectClause) {
108
- updateOptions.select = selectClause
109
- }
110
-
111
- const result = await payload.updateGlobal(updateOptions)
112
-
113
- if (verboseLogs) {
114
- payload.logger.info(`[payload-mcp] Successfully updated global: ${globalSlug}`)
115
- }
116
-
117
- const response = {
118
- content: [
119
- {
120
- type: 'text' as const,
121
- text: `Global "${globalSlug}" updated successfully!
122
- \`\`\`json
123
- ${JSON.stringify(result)}
124
- \`\`\``,
125
- },
126
- ],
127
- }
128
-
129
- return (globals?.[globalSlug]?.overrideResponse?.(response, result, req) || response) as {
130
- content: Array<{
131
- text: string
132
- type: 'text'
133
- }>
134
- }
135
- } catch (error) {
136
- const errorMessage = error instanceof Error ? error.message : 'Unknown error'
137
- payload.logger.error(`[payload-mcp] Error updating global ${globalSlug}: ${errorMessage}`)
138
-
139
- const response = {
140
- content: [
141
- {
142
- type: 'text' as const,
143
- text: `Error updating global "${globalSlug}": ${errorMessage}`,
144
- },
145
- ],
146
- }
147
-
148
- return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {
149
- content: Array<{
150
- text: string
151
- type: 'text'
152
- }>
153
- }
154
- }
155
- }
156
-
157
- if (globals?.[globalSlug]?.enabled) {
158
- const convertedFields = convertCollectionSchemaToZod(schema)
159
-
160
- // Make all fields optional for partial updates (PATCH-style)
161
- const optionalFields = Object.fromEntries(
162
- Object.entries(convertedFields.shape).map(([key, value]) => [key, (value as any).optional()]),
163
- )
164
-
165
- const updateGlobalSchema = z.object({
166
- ...optionalFields,
167
- depth: z.number().optional().describe('Optional: Depth of relationships to populate'),
168
- draft: z.boolean().optional().describe('Optional: Whether to save as draft (default: false)'),
169
- fallbackLocale: z
170
- .string()
171
- .optional()
172
- .describe('Optional: fallback locale code to use when requested locale is not available'),
173
- locale: z
174
- .string()
175
- .optional()
176
- .describe(
177
- 'Optional: locale code to update data in (e.g., "en", "es"). Use "all" to update all locales for localized fields',
178
- ),
179
- select: z
180
- .string()
181
- .optional()
182
- .describe(
183
- 'Optional: define exactly which fields you\'d like to return in the response (JSON), e.g., \'{"siteName": "My Site"}\'',
184
- ),
185
- })
186
-
187
- server.registerTool(
188
- `update${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`,
189
- {
190
- description: `${toolSchemas.updateGlobal.description.trim()}\n\n${globals?.[globalSlug]?.description || ''}`,
191
- inputSchema: updateGlobalSchema.shape,
192
- },
193
- async (params: Record<string, unknown>) => {
194
- const { depth, draft, fallbackLocale, locale, select, ...rest } = params
195
- const data = JSON.stringify(rest)
196
- return await tool(
197
- data,
198
- draft as boolean,
199
- depth as number,
200
- locale as string,
201
- fallbackLocale as string,
202
- select as string | undefined,
203
- )
204
- },
205
- )
206
- }
207
- }