@payloadcms/plugin-mcp 4.0.0-internal.a0ef1b8 → 4.0.0-internal.a6582c6

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 (250) hide show
  1. package/LICENSE.md +1 -1
  2. package/bin.js +7 -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/defineTool.d.ts +8 -8
  8. package/dist/defineTool.d.ts.map +1 -1
  9. package/dist/endpoint/access.d.ts +12 -5
  10. package/dist/endpoint/access.d.ts.map +1 -1
  11. package/dist/endpoint/access.js +75 -88
  12. package/dist/endpoint/access.js.map +1 -1
  13. package/dist/endpoint/index.d.ts +1 -1
  14. package/dist/endpoint/index.d.ts.map +1 -1
  15. package/dist/endpoint/index.js +68 -17
  16. package/dist/endpoint/index.js.map +1 -1
  17. package/dist/exports/client.d.ts +1 -1
  18. package/dist/exports/client.d.ts.map +1 -1
  19. package/dist/exports/client.js +1 -1
  20. package/dist/exports/client.js.map +1 -1
  21. package/dist/exports/internal.d.ts +2 -0
  22. package/dist/exports/internal.d.ts.map +1 -0
  23. package/dist/exports/internal.js +3 -0
  24. package/dist/exports/internal.js.map +1 -0
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +15 -20
  28. package/dist/index.js.map +1 -1
  29. package/dist/mcp/buildMcpServer.d.ts +4 -4
  30. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  31. package/dist/mcp/buildMcpServer.js +133 -80
  32. package/dist/mcp/buildMcpServer.js.map +1 -1
  33. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -1
  34. package/dist/mcp/builtin/collections/authTools.js +44 -6
  35. package/dist/mcp/builtin/collections/authTools.js.map +1 -1
  36. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  37. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  38. package/dist/mcp/builtin/collections/countTool.js +68 -0
  39. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  40. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  41. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  42. package/dist/mcp/builtin/collections/countVersionsTool.js +64 -0
  43. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  44. package/dist/mcp/builtin/collections/createTool.d.ts +1 -1
  45. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
  46. package/dist/mcp/builtin/collections/createTool.js +110 -63
  47. package/dist/mcp/builtin/collections/createTool.js.map +1 -1
  48. package/dist/mcp/builtin/collections/deleteTool.d.ts +1 -1
  49. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
  50. package/dist/mcp/builtin/collections/deleteTool.js +15 -22
  51. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
  52. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  53. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  54. package/dist/mcp/builtin/collections/duplicateTool.js +96 -0
  55. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  56. package/dist/mcp/builtin/collections/fileInput.d.ts +28 -0
  57. package/dist/mcp/builtin/collections/fileInput.d.ts.map +1 -0
  58. package/dist/mcp/builtin/collections/fileInput.js +124 -0
  59. package/dist/mcp/builtin/collections/fileInput.js.map +1 -0
  60. package/dist/mcp/builtin/collections/fileInput.spec.js +86 -0
  61. package/dist/mcp/builtin/collections/fileInput.spec.js.map +1 -0
  62. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  63. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  64. package/dist/mcp/builtin/collections/findDistinctTool.js +92 -0
  65. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  66. package/dist/mcp/builtin/collections/findTool.d.ts +1 -1
  67. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  68. package/dist/mcp/builtin/collections/findTool.js +52 -47
  69. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  70. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  71. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  72. package/dist/mcp/builtin/collections/findVersionByIDTool.js +83 -0
  73. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  74. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  75. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  76. package/dist/mcp/builtin/collections/findVersionsTool.js +98 -0
  77. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  78. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +9 -0
  79. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -0
  80. package/dist/mcp/builtin/collections/formatCollectionError.js +60 -0
  81. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -0
  82. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts +2 -0
  83. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -0
  84. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +87 -0
  85. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -0
  86. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  87. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  88. package/dist/mcp/builtin/collections/restoreVersionTool.js +81 -0
  89. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  90. package/dist/mcp/builtin/collections/updateTool.d.ts +1 -1
  91. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  92. package/dist/mcp/builtin/collections/updateTool.js +106 -93
  93. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  94. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts +2 -0
  95. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts.map +1 -0
  96. package/dist/mcp/builtin/collections/uploadInstructionsTool.js +55 -0
  97. package/dist/mcp/builtin/collections/uploadInstructionsTool.js.map +1 -0
  98. package/dist/mcp/builtin/getConfigInfoTool.d.ts +2 -0
  99. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -0
  100. package/dist/mcp/builtin/getConfigInfoTool.js +68 -0
  101. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -0
  102. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  103. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  104. package/dist/mcp/builtin/globals/countVersionsTool.js +64 -0
  105. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  106. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  107. package/dist/mcp/builtin/globals/findTool.js +20 -23
  108. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  109. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  110. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  111. package/dist/mcp/builtin/globals/findVersionByIDTool.js +79 -0
  112. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  113. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  114. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  115. package/dist/mcp/builtin/globals/findVersionsTool.js +94 -0
  116. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  117. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts +2 -0
  118. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -0
  119. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +65 -0
  120. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -0
  121. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  122. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  123. package/dist/mcp/builtin/globals/restoreVersionTool.js +77 -0
  124. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  125. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -1
  126. package/dist/mcp/builtin/globals/updateTool.js +33 -42
  127. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  128. package/dist/mcp/builtin/validateEntityData.d.ts +14 -0
  129. package/dist/mcp/builtin/validateEntityData.d.ts.map +1 -0
  130. package/dist/mcp/builtin/validateEntityData.js +82 -0
  131. package/dist/mcp/builtin/validateEntityData.js.map +1 -0
  132. package/dist/mcp/builtinTools.d.ts +150 -19
  133. package/dist/mcp/builtinTools.d.ts.map +1 -1
  134. package/dist/mcp/builtinTools.js +125 -20
  135. package/dist/mcp/builtinTools.js.map +1 -1
  136. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  137. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  138. package/dist/mcp/sanitizeMCPConfig.js +124 -58
  139. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  140. package/dist/stdio.d.ts +3 -3
  141. package/dist/stdio.d.ts.map +1 -1
  142. package/dist/stdio.js +84 -46
  143. package/dist/stdio.js.map +1 -1
  144. package/dist/types.d.ts +112 -110
  145. package/dist/types.d.ts.map +1 -1
  146. package/dist/types.js +2 -4
  147. package/dist/types.js.map +1 -1
  148. package/dist/utils/camelCase.d.ts.map +1 -1
  149. package/dist/utils/getPluginConfig.d.ts +1 -1
  150. package/dist/utils/getPluginConfig.js +1 -1
  151. package/dist/utils/getPluginConfig.js.map +1 -1
  152. package/dist/utils/resolveProjectRoot.d.ts.map +1 -1
  153. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts +28 -0
  154. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts.map +1 -0
  155. package/dist/utils/schemaConversion/filterFieldsByAccess.js +71 -0
  156. package/dist/utils/schemaConversion/filterFieldsByAccess.js.map +1 -0
  157. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +13 -0
  158. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +1 -0
  159. package/dist/utils/schemaConversion/getEntityInputSchema.js +66 -0
  160. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +1 -0
  161. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +5 -10
  162. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -1
  163. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +15 -95
  164. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -1
  165. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +15 -40
  166. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -1
  167. package/dist/utils/toStandardSchema.d.ts.map +1 -1
  168. package/dist/utils/whereSchema.d.ts +9 -0
  169. package/dist/utils/whereSchema.d.ts.map +1 -0
  170. package/dist/utils/whereSchema.js +13 -0
  171. package/dist/utils/whereSchema.js.map +1 -0
  172. package/package.json +10 -15
  173. package/src/defaultAccess.ts +3 -0
  174. package/src/endpoint/access.ts +81 -101
  175. package/src/endpoint/index.ts +58 -16
  176. package/src/exports/client.ts +2 -1
  177. package/src/exports/internal.ts +1 -0
  178. package/src/index.ts +12 -20
  179. package/src/mcp/buildMcpServer.ts +170 -115
  180. package/src/mcp/builtin/collections/authTools.ts +45 -9
  181. package/src/mcp/builtin/collections/countTool.ts +73 -0
  182. package/src/mcp/builtin/collections/countVersionsTool.ts +69 -0
  183. package/src/mcp/builtin/collections/createTool.ts +130 -78
  184. package/src/mcp/builtin/collections/deleteTool.ts +20 -18
  185. package/src/mcp/builtin/collections/duplicateTool.ts +134 -0
  186. package/src/mcp/builtin/collections/fileInput.spec.ts +93 -0
  187. package/src/mcp/builtin/collections/fileInput.ts +164 -0
  188. package/src/mcp/builtin/collections/findDistinctTool.ts +119 -0
  189. package/src/mcp/builtin/collections/findTool.ts +66 -37
  190. package/src/mcp/builtin/collections/findVersionByIDTool.ts +109 -0
  191. package/src/mcp/builtin/collections/findVersionsTool.ts +154 -0
  192. package/src/mcp/builtin/collections/formatCollectionError.ts +84 -0
  193. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +80 -0
  194. package/src/mcp/builtin/collections/restoreVersionTool.ts +107 -0
  195. package/src/mcp/builtin/collections/updateTool.ts +132 -115
  196. package/src/mcp/builtin/collections/uploadInstructionsTool.ts +64 -0
  197. package/src/mcp/builtin/getConfigInfoTool.ts +67 -0
  198. package/src/mcp/builtin/globals/countVersionsTool.ts +68 -0
  199. package/src/mcp/builtin/globals/findTool.ts +28 -19
  200. package/src/mcp/builtin/globals/findVersionByIDTool.ts +103 -0
  201. package/src/mcp/builtin/globals/findVersionsTool.ts +147 -0
  202. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +63 -0
  203. package/src/mcp/builtin/globals/restoreVersionTool.ts +99 -0
  204. package/src/mcp/builtin/globals/updateTool.ts +52 -57
  205. package/src/mcp/builtin/validateEntityData.ts +132 -0
  206. package/src/mcp/builtinTools.ts +118 -41
  207. package/src/mcp/sanitizeMCPConfig.ts +120 -78
  208. package/src/stdio.ts +79 -46
  209. package/src/types.ts +128 -115
  210. package/src/utils/getPluginConfig.ts +1 -1
  211. package/src/utils/schemaConversion/filterFieldsByAccess.ts +123 -0
  212. package/src/utils/schemaConversion/getEntityInputSchema.ts +96 -0
  213. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +12 -19
  214. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +17 -114
  215. package/src/utils/whereSchema.ts +24 -0
  216. package/dist/@types/assets.d.js +0 -2
  217. package/dist/@types/assets.d.js.map +0 -1
  218. package/dist/collection/getAccessField.d.ts +0 -12
  219. package/dist/collection/getAccessField.d.ts.map +0 -1
  220. package/dist/collection/getAccessField.js +0 -57
  221. package/dist/collection/getAccessField.js.map +0 -1
  222. package/dist/collection/index.d.ts +0 -6
  223. package/dist/collection/index.d.ts.map +0 -1
  224. package/dist/collection/index.js +0 -60
  225. package/dist/collection/index.js.map +0 -1
  226. package/dist/components/AccessField/index.client.d.ts +0 -10
  227. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  228. package/dist/components/AccessField/index.client.js +0 -305
  229. package/dist/components/AccessField/index.client.js.map +0 -1
  230. package/dist/components/AccessField/index.css +0 -93
  231. package/dist/utils/localAPIDefaults.d.ts +0 -20
  232. package/dist/utils/localAPIDefaults.d.ts.map +0 -1
  233. package/dist/utils/localAPIDefaults.js +0 -19
  234. package/dist/utils/localAPIDefaults.js.map +0 -1
  235. package/dist/utils/schemaConversion/buildToolInput.d.ts +0 -29
  236. package/dist/utils/schemaConversion/buildToolInput.d.ts.map +0 -1
  237. package/dist/utils/schemaConversion/buildToolInput.js +0 -51
  238. package/dist/utils/schemaConversion/buildToolInput.js.map +0 -1
  239. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  240. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  241. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  242. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  243. package/src/@types/assets.d.ts +0 -3
  244. package/src/collection/getAccessField.ts +0 -64
  245. package/src/collection/index.ts +0 -64
  246. package/src/components/AccessField/index.client.tsx +0 -344
  247. package/src/components/AccessField/index.css +0 -93
  248. package/src/utils/localAPIDefaults.ts +0 -22
  249. package/src/utils/schemaConversion/buildToolInput.ts +0 -68
  250. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
@@ -1,4 +1,4 @@
1
- import type { CollectionTool, GlobalTool } from '../types.js'
1
+ import type { CollectionTool, GlobalTool, Tool } from '../types.js'
2
2
 
3
3
  import {
4
4
  authCollectionTool,
@@ -8,62 +8,135 @@ import {
8
8
  unlockCollectionTool,
9
9
  verifyCollectionTool,
10
10
  } from './builtin/collections/authTools.js'
11
- import { createCollectionTool } from './builtin/collections/createTool.js'
12
- import { deleteCollectionTool } from './builtin/collections/deleteTool.js'
13
- import { findCollectionTool } from './builtin/collections/findTool.js'
14
- import { updateCollectionTool } from './builtin/collections/updateTool.js'
11
+ import { countDocumentsTool } from './builtin/collections/countTool.js'
12
+ import { countVersionsTool } from './builtin/collections/countVersionsTool.js'
13
+ import { createDocumentsTool } from './builtin/collections/createTool.js'
14
+ import { deleteDocumentsTool } from './builtin/collections/deleteTool.js'
15
+ import { duplicateDocumentTool } from './builtin/collections/duplicateTool.js'
16
+ import { findDistinctTool } from './builtin/collections/findDistinctTool.js'
17
+ import { findDocumentsTool } from './builtin/collections/findTool.js'
18
+ import { findVersionByIDTool } from './builtin/collections/findVersionByIDTool.js'
19
+ import { findVersionsTool } from './builtin/collections/findVersionsTool.js'
20
+ import { getCollectionSchemaTool } from './builtin/collections/getCollectionSchemaTool.js'
21
+ import { restoreVersionTool } from './builtin/collections/restoreVersionTool.js'
22
+ import { updateDocumentTool } from './builtin/collections/updateTool.js'
23
+ import { getUploadInstructionsTool } from './builtin/collections/uploadInstructionsTool.js'
24
+ import { getConfigInfoTool } from './builtin/getConfigInfoTool.js'
25
+ import { countGlobalVersionsTool } from './builtin/globals/countVersionsTool.js'
15
26
  import { findGlobalTool } from './builtin/globals/findTool.js'
27
+ import { findGlobalVersionByIDTool } from './builtin/globals/findVersionByIDTool.js'
28
+ import { findGlobalVersionsTool } from './builtin/globals/findVersionsTool.js'
29
+ import { getGlobalSchemaTool } from './builtin/globals/getGlobalSchemaTool.js'
30
+ import { restoreGlobalVersionTool } from './builtin/globals/restoreVersionTool.js'
16
31
  import { updateGlobalTool } from './builtin/globals/updateTool.js'
17
32
 
33
+ type CollectionBuiltin = {
34
+ mcpName: string
35
+ requiresDuplicateEnabled?: boolean
36
+ requiresUpload?: boolean
37
+ requiresVersions?: boolean
38
+ tool: CollectionTool
39
+ }
40
+
41
+ type GlobalBuiltin = {
42
+ mcpName: string
43
+ requiresVersions?: boolean
44
+ tool: GlobalTool
45
+ }
46
+
47
+ export const TOOL_BUILTINS = {
48
+ getConfigInfo: { mcpName: 'getConfigInfo', tool: getConfigInfoTool },
49
+ } satisfies Record<string, { mcpName: string; tool: Tool }>
50
+
18
51
  /**
19
52
  * The static built-in collection CRUD tools. Keys here are the source of truth
20
53
  * for `MCPCollectionBuiltinName` — adding/removing an entry updates the type
21
54
  * automatically.
22
55
  */
23
- export const COLLECTION_BUILTINS: Record<MCPCollectionBuiltinName, CollectionTool> = {
24
- create: createCollectionTool,
25
- delete: deleteCollectionTool,
26
- find: findCollectionTool,
27
- update: updateCollectionTool,
28
- }
56
+ export const COLLECTION_BUILTINS = {
57
+ count: { mcpName: 'countDocuments', tool: countDocumentsTool },
58
+ countVersions: { mcpName: 'countVersions', requiresVersions: true, tool: countVersionsTool },
59
+ create: { mcpName: 'createDocuments', tool: createDocumentsTool },
60
+ delete: { mcpName: 'deleteDocuments', tool: deleteDocumentsTool },
61
+ duplicate: {
62
+ mcpName: 'duplicateDocument',
63
+ requiresDuplicateEnabled: true,
64
+ tool: duplicateDocumentTool,
65
+ },
66
+ find: { mcpName: 'findDocuments', tool: findDocumentsTool },
67
+ findDistinct: { mcpName: 'findDistinct', tool: findDistinctTool },
68
+ findVersionByID: {
69
+ mcpName: 'findVersionByID',
70
+ requiresVersions: true,
71
+ tool: findVersionByIDTool,
72
+ },
73
+ findVersions: { mcpName: 'findVersions', requiresVersions: true, tool: findVersionsTool },
74
+ getCollectionSchema: { mcpName: 'getCollectionSchema', tool: getCollectionSchemaTool },
75
+ getUploadInstructions: {
76
+ mcpName: 'getUploadInstructions',
77
+ requiresUpload: true,
78
+ tool: getUploadInstructionsTool,
79
+ },
80
+ restoreVersion: { mcpName: 'restoreVersion', requiresVersions: true, tool: restoreVersionTool },
81
+ update: { mcpName: 'updateDocument', tool: updateDocumentTool },
82
+ } satisfies Record<string, CollectionBuiltin>
29
83
 
30
84
  /**
31
- * The static auth tools surfaced under auth-enabled collections. Each entry
32
- * carries the admin-UI label alongside the tool. Keys are the source of truth
33
- * for `MCPCollectionAuthToolName`.
85
+ * The static auth tools surfaced under auth-enabled collections. Keys are the
86
+ * source of truth for `MCPCollectionAuthToolName`.
34
87
  */
35
- export const COLLECTION_AUTH_BUILTINS: Record<
36
- MCPCollectionAuthToolName,
37
- { label: string; tool: CollectionTool }
38
- > = {
39
- auth: { label: 'Check Auth Status', tool: authCollectionTool },
40
- forgotPassword: { label: 'Forgot Password', tool: forgotPasswordCollectionTool },
41
- login: { label: 'User Login', tool: loginCollectionTool },
42
- resetPassword: { label: 'Reset Password', tool: resetPasswordCollectionTool },
43
- unlock: { label: 'Unlock Account', tool: unlockCollectionTool },
44
- verify: { label: 'Email Verification', tool: verifyCollectionTool },
45
- }
88
+ export const COLLECTION_AUTH_BUILTINS = {
89
+ auth: { mcpName: 'auth', tool: authCollectionTool },
90
+ forgotPassword: {
91
+ mcpName: 'forgotPassword',
92
+ tool: forgotPasswordCollectionTool,
93
+ },
94
+ login: { mcpName: 'login', tool: loginCollectionTool },
95
+ resetPassword: {
96
+ mcpName: 'resetPassword',
97
+ tool: resetPasswordCollectionTool,
98
+ },
99
+ unlock: { mcpName: 'unlock', tool: unlockCollectionTool },
100
+ verify: { mcpName: 'verify', tool: verifyCollectionTool },
101
+ } satisfies Record<string, { mcpName: string; tool: CollectionTool }>
46
102
 
47
103
  /**
48
104
  * The static built-in global tools. Keys are the source of truth for
49
105
  * `MCPGlobalBuiltinName`.
50
106
  */
51
- export const GLOBAL_BUILTINS: Record<MCPGlobalBuiltinName, GlobalTool> = {
52
- find: findGlobalTool,
53
- update: updateGlobalTool,
54
- }
107
+ export const GLOBAL_BUILTINS = {
108
+ countGlobalVersions: {
109
+ mcpName: 'countGlobalVersions',
110
+ requiresVersions: true,
111
+ tool: countGlobalVersionsTool,
112
+ },
113
+ find: { mcpName: 'findGlobal', tool: findGlobalTool },
114
+ findGlobalVersionByID: {
115
+ mcpName: 'findGlobalVersionByID',
116
+ requiresVersions: true,
117
+ tool: findGlobalVersionByIDTool,
118
+ },
119
+ findGlobalVersions: {
120
+ mcpName: 'findGlobalVersions',
121
+ requiresVersions: true,
122
+ tool: findGlobalVersionsTool,
123
+ },
124
+ getGlobalSchema: { mcpName: 'getGlobalSchema', tool: getGlobalSchemaTool },
125
+ restoreGlobalVersion: {
126
+ mcpName: 'restoreGlobalVersion',
127
+ requiresVersions: true,
128
+ tool: restoreGlobalVersionTool,
129
+ },
130
+ update: { mcpName: 'updateGlobal', tool: updateGlobalTool },
131
+ } satisfies Record<string, GlobalBuiltin>
132
+
133
+ export type MCPCollectionBuiltinName = keyof typeof COLLECTION_BUILTINS
55
134
 
56
- export type MCPCollectionBuiltinName = 'create' | 'delete' | 'find' | 'update'
135
+ export type MCPCollectionAuthToolName = keyof typeof COLLECTION_AUTH_BUILTINS
57
136
 
58
- export type MCPCollectionAuthToolName =
59
- | 'auth'
60
- | 'forgotPassword'
61
- | 'login'
62
- | 'resetPassword'
63
- | 'unlock'
64
- | 'verify'
137
+ export type MCPGlobalBuiltinName = keyof typeof GLOBAL_BUILTINS
65
138
 
66
- export type MCPGlobalBuiltinName = 'find' | 'update'
139
+ export type MCPTopLevelBuiltinName = keyof typeof TOOL_BUILTINS
67
140
 
68
141
  /**
69
142
  * Pre-typed `Object.entries` for each registry. The cast from `string` to the
@@ -71,14 +144,18 @@ export type MCPGlobalBuiltinName = 'find' | 'update'
71
144
  * cast — TypeScript's `Object.entries` always widens keys to `string`, which
72
145
  * defeats the narrow type lookups on `MCPCollectionToolsMap`.
73
146
  */
147
+ export const TOOL_BUILTIN_ENTRIES = Object.entries(TOOL_BUILTINS) as Array<
148
+ [MCPTopLevelBuiltinName, (typeof TOOL_BUILTINS)[MCPTopLevelBuiltinName]]
149
+ >
150
+
74
151
  export const COLLECTION_BUILTIN_ENTRIES = Object.entries(COLLECTION_BUILTINS) as Array<
75
- [MCPCollectionBuiltinName, CollectionTool]
152
+ [MCPCollectionBuiltinName, CollectionBuiltin]
76
153
  >
77
154
 
78
155
  export const COLLECTION_AUTH_BUILTIN_ENTRIES = Object.entries(COLLECTION_AUTH_BUILTINS) as Array<
79
- [MCPCollectionAuthToolName, { label: string; tool: CollectionTool }]
156
+ [MCPCollectionAuthToolName, (typeof COLLECTION_AUTH_BUILTINS)[MCPCollectionAuthToolName]]
80
157
  >
81
158
 
82
159
  export const GLOBAL_BUILTIN_ENTRIES = Object.entries(GLOBAL_BUILTINS) as Array<
83
- [MCPGlobalBuiltinName, GlobalTool]
160
+ [MCPGlobalBuiltinName, GlobalBuiltin]
84
161
  >
@@ -8,16 +8,16 @@ import type {
8
8
  } from 'payload'
9
9
 
10
10
  import type {
11
+ CollectionMCPItem,
11
12
  CollectionTool,
13
+ GlobalMCPItem,
12
14
  GlobalTool,
13
- MCPBuiltInToolOverride,
14
15
  MCPItem,
15
- MCPPluginCollectionConfig,
16
16
  MCPPluginConfig,
17
- MCPPluginGlobalConfig,
18
17
  SanitizedMCPPluginConfig,
19
18
  } from '../types.js'
20
19
 
20
+ import { defaultAccess } from '../defaultAccess.js'
21
21
  import {
22
22
  COLLECTION_AUTH_BUILTIN_ENTRIES,
23
23
  COLLECTION_AUTH_BUILTINS,
@@ -25,6 +25,8 @@ import {
25
25
  COLLECTION_BUILTINS,
26
26
  GLOBAL_BUILTIN_ENTRIES,
27
27
  GLOBAL_BUILTINS,
28
+ TOOL_BUILTIN_ENTRIES,
29
+ TOOL_BUILTINS,
28
30
  } from './builtinTools.js'
29
31
 
30
32
  /**
@@ -32,7 +34,6 @@ import {
32
34
  * - Flattens `tools` / `prompts` / `resources` / per-collection / per-global
33
35
  * tool maps into a single `items` array.
34
36
  * - Applies built-in tools for collections and globals, respecting opt-out user overrides.
35
- * - Applies the `userCollection` default
36
37
  *
37
38
  * Called once during plugin init. After that, `plugins['@payloadcms/plugin-mcp']
38
39
  * ?.options` holds the sanitized result
@@ -54,44 +55,55 @@ export const sanitizeMCPConfig = ({
54
55
  items.push(...sanitizeGlobalConfig({ global, pluginConfig }))
55
56
  }
56
57
 
57
- for (const [key, tool] of Object.entries(pluginConfig.tools ?? {})) {
58
+ for (const [configKey, { mcpName, tool }] of TOOL_BUILTIN_ENTRIES) {
58
59
  items.push({
59
60
  type: 'tool',
60
- key,
61
- label: key,
62
- tool,
61
+ configKey,
62
+ label: tool.annotations?.title ?? configKey,
63
+ mcpName,
64
+ tool: { ...tool, access: tool.access ?? defaultAccess },
63
65
  })
64
66
  }
65
67
 
66
- for (const [key, prompt] of Object.entries(pluginConfig.prompts ?? {})) {
68
+ for (const [configKey, tool] of Object.entries(pluginConfig.tools ?? {})) {
69
+ if (configKey in TOOL_BUILTINS) {
70
+ continue
71
+ }
72
+ items.push({
73
+ type: 'tool',
74
+ configKey,
75
+ label: tool.annotations?.title ?? configKey,
76
+ mcpName: configKey,
77
+ tool: { ...tool, access: tool.access ?? defaultAccess },
78
+ })
79
+ }
80
+
81
+ for (const [configKey, prompt] of Object.entries(pluginConfig.prompts ?? {})) {
67
82
  items.push({
68
83
  type: 'prompt',
69
- key,
70
- label: prompt.title ?? key,
71
- prompt,
84
+ configKey,
85
+ label: prompt.title ?? configKey,
86
+ mcpName: configKey,
87
+ prompt: { ...prompt, access: prompt.access ?? defaultAccess },
72
88
  })
73
89
  }
74
90
 
75
- for (const [key, resource] of Object.entries(pluginConfig.resources ?? {})) {
91
+ for (const [configKey, resource] of Object.entries(pluginConfig.resources ?? {})) {
76
92
  items.push({
77
93
  type: 'resource',
78
- key,
79
- label: resource.title ?? key,
80
- resource,
94
+ configKey,
95
+ label: resource.title ?? configKey,
96
+ mcpName: configKey,
97
+ resource: { ...resource, access: resource.access ?? defaultAccess },
81
98
  })
82
99
  }
83
100
 
84
- // Mirror Payload's own admin.user detection (sanitize.ts) since plugins run first.
85
- const firstCollectionWithAuth = config.collections!.find(({ auth }) => Boolean(auth))
86
-
87
101
  return {
88
102
  disabled: pluginConfig.disabled,
103
+ hooks: pluginConfig.hooks,
89
104
  items,
90
105
  mcp: pluginConfig.mcp,
91
- overrideApiKeyCollection: pluginConfig.overrideApiKeyCollection,
92
- overrideAuth: pluginConfig.overrideAuth,
93
- userCollection:
94
- pluginConfig.userCollection ?? config.admin?.user ?? firstCollectionWithAuth?.slug ?? 'users',
106
+ overrideGetAuthorizedMCP: pluginConfig.overrideGetAuthorizedMCP,
95
107
  }
96
108
  }
97
109
 
@@ -101,42 +113,81 @@ const sanitizeCollectionConfig = ({
101
113
  }: {
102
114
  collection: CollectionConfig | SanitizedCollectionConfig
103
115
  pluginConfig: MCPPluginConfig
104
- }): MCPItem[] => {
105
- if (collection.slug === 'payload-mcp-api-keys') {
106
- return []
107
- }
116
+ }): CollectionMCPItem[] => {
108
117
  const slug = collection.slug
109
118
  const collectionPluginConfig = pluginConfig.collections?.[slug]
110
- const items: MCPItem[] = []
119
+ const items: CollectionMCPItem[] = []
120
+ /**
121
+ * Payload disables duplicate for auth collections by default unless the
122
+ * collection explicitly opts back in with `disableDuplicate: false`.
123
+ */
124
+ const isDuplicateDisabled =
125
+ collection.disableDuplicate === true ||
126
+ (Boolean(collection.auth) && collection.disableDuplicate !== false)
111
127
 
112
- for (const [toolKey, tool] of COLLECTION_BUILTIN_ENTRIES) {
128
+ for (const [
129
+ toolKey,
130
+ { mcpName, requiresDuplicateEnabled, requiresUpload, requiresVersions, tool },
131
+ ] of COLLECTION_BUILTIN_ENTRIES) {
132
+ if (requiresVersions && !collection.versions) {
133
+ continue
134
+ }
135
+ if (requiresDuplicateEnabled && isDuplicateDisabled) {
136
+ continue
137
+ }
138
+ if (requiresUpload && !collection.upload) {
139
+ continue
140
+ }
113
141
  const matchedConfigEntry = collectionPluginConfig?.tools?.[toolKey]
114
142
  if (matchedConfigEntry === false) {
115
143
  continue
116
144
  }
145
+ const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined
146
+ const annotations = { ...tool.annotations, ...override?.annotations }
117
147
  items.push({
118
148
  type: 'collectionTool',
119
149
  collectionSlug: slug,
120
- key: toolKey,
121
- label: capitalize(toolKey),
122
- tool: overrideBuiltinTool(tool, matchedConfigEntry, collectionPluginConfig),
150
+ configKey: toolKey,
151
+ label: annotations.title ?? toolKey,
152
+ mcpName,
153
+ tool: {
154
+ ...tool,
155
+ access: override?.access ?? tool.access ?? defaultAccess,
156
+ annotations,
157
+ description: override?.description ?? tool.description,
158
+ overrideResponse:
159
+ override?.overrideResponse ??
160
+ collectionPluginConfig?.overrideResponse ??
161
+ tool.overrideResponse,
162
+ },
123
163
  })
124
164
  }
125
165
 
126
166
  if (collection.auth) {
127
- for (const [authToolKey, { label, tool }] of COLLECTION_AUTH_BUILTIN_ENTRIES) {
167
+ for (const [authToolKey, { mcpName, tool }] of COLLECTION_AUTH_BUILTIN_ENTRIES) {
128
168
  const matchedConfigEntry = collectionPluginConfig?.tools?.[authToolKey]
129
169
  if (!matchedConfigEntry) {
130
170
  continue
131
171
  }
132
172
  // `true` means "enable, no override"; only the object form carries fields.
133
173
  const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined
174
+ const annotations = { ...tool.annotations, ...override?.annotations }
134
175
  items.push({
135
176
  type: 'collectionTool',
136
177
  collectionSlug: slug,
137
- key: authToolKey,
138
- label,
139
- tool: overrideBuiltinTool(tool, override, collectionPluginConfig),
178
+ configKey: authToolKey,
179
+ label: annotations.title ?? authToolKey,
180
+ mcpName,
181
+ tool: {
182
+ ...tool,
183
+ access: override?.access ?? tool.access ?? defaultAccess,
184
+ annotations,
185
+ description: override?.description ?? tool.description,
186
+ overrideResponse:
187
+ override?.overrideResponse ??
188
+ collectionPluginConfig?.overrideResponse ??
189
+ tool.overrideResponse,
190
+ },
140
191
  })
141
192
  }
142
193
  }
@@ -146,8 +197,8 @@ const sanitizeCollectionConfig = ({
146
197
  const customEntries = Object.entries(collectionPluginConfig?.tools ?? {}) as Array<
147
198
  [string, CollectionTool | undefined]
148
199
  >
149
- for (const [key, customTool] of customEntries) {
150
- if (key in COLLECTION_BUILTINS || key in COLLECTION_AUTH_BUILTINS) {
200
+ for (const [configKey, customTool] of customEntries) {
201
+ if (configKey in COLLECTION_BUILTINS || configKey in COLLECTION_AUTH_BUILTINS) {
151
202
  continue
152
203
  }
153
204
  if (!customTool) {
@@ -156,9 +207,10 @@ const sanitizeCollectionConfig = ({
156
207
  items.push({
157
208
  type: 'collectionTool',
158
209
  collectionSlug: slug,
159
- key,
160
- label: key,
161
- tool: customTool,
210
+ configKey,
211
+ label: customTool.annotations?.title ?? configKey,
212
+ mcpName: configKey,
213
+ tool: { ...customTool, access: customTool.access ?? defaultAccess },
162
214
  })
163
215
  }
164
216
 
@@ -171,30 +223,45 @@ const sanitizeGlobalConfig = ({
171
223
  }: {
172
224
  global: GlobalConfig | SanitizedGlobalConfig
173
225
  pluginConfig: MCPPluginConfig
174
- }): MCPItem[] => {
226
+ }): GlobalMCPItem[] => {
175
227
  const slug = global.slug
176
228
  const globalPluginConfig = pluginConfig.globals?.[slug]
177
- const items: MCPItem[] = []
229
+ const items: GlobalMCPItem[] = []
178
230
 
179
- for (const [toolKey, baseTool] of GLOBAL_BUILTIN_ENTRIES) {
231
+ for (const [toolKey, { mcpName, requiresVersions, tool }] of GLOBAL_BUILTIN_ENTRIES) {
232
+ if (requiresVersions && !global.versions) {
233
+ continue
234
+ }
180
235
  const matchedConfigEntry = globalPluginConfig?.tools?.[toolKey]
181
236
  if (matchedConfigEntry === false) {
182
237
  continue
183
238
  }
239
+ const override = typeof matchedConfigEntry === 'object' ? matchedConfigEntry : undefined
240
+ const annotations = { ...tool.annotations, ...override?.annotations }
184
241
  items.push({
185
242
  type: 'globalTool',
243
+ configKey: toolKey,
186
244
  globalSlug: slug,
187
- key: toolKey,
188
- label: capitalize(toolKey),
189
- tool: overrideBuiltinTool(baseTool, matchedConfigEntry, globalPluginConfig),
245
+ label: annotations.title ?? toolKey,
246
+ mcpName,
247
+ tool: {
248
+ ...tool,
249
+ access: override?.access ?? tool.access ?? defaultAccess,
250
+ annotations,
251
+ description: override?.description ?? tool.description,
252
+ overrideResponse:
253
+ override?.overrideResponse ??
254
+ globalPluginConfig?.overrideResponse ??
255
+ tool.overrideResponse,
256
+ },
190
257
  })
191
258
  }
192
259
 
193
260
  const customEntries = Object.entries(globalPluginConfig?.tools ?? {}) as Array<
194
261
  [string, GlobalTool | undefined]
195
262
  >
196
- for (const [key, customTool] of customEntries) {
197
- if (key in GLOBAL_BUILTINS) {
263
+ for (const [configKey, customTool] of customEntries) {
264
+ if (configKey in GLOBAL_BUILTINS) {
198
265
  continue
199
266
  }
200
267
  if (!customTool) {
@@ -202,38 +269,13 @@ const sanitizeGlobalConfig = ({
202
269
  }
203
270
  items.push({
204
271
  type: 'globalTool',
272
+ configKey,
205
273
  globalSlug: slug,
206
- key,
207
- label: key,
208
- tool: customTool,
274
+ label: customTool.annotations?.title ?? configKey,
275
+ mcpName: configKey,
276
+ tool: { ...customTool, access: customTool.access ?? defaultAccess },
209
277
  })
210
278
  }
211
279
 
212
280
  return items
213
281
  }
214
-
215
- const capitalize = (s: string): string => s.charAt(0).toUpperCase() + s.slice(1)
216
-
217
- /**
218
- * Spread the static built-in tool and apply consumer-side overrides.
219
- * Precedence: per-tool override > scope-level (collection/global) override >
220
- * the static tool's defaults. `toolEntry` is whatever the user put under
221
- * `tools: { find: ... }` — could be `true`, `false`, or an override object —
222
- * so it's narrowed internally.
223
- */
224
- const overrideBuiltinTool = <TTool extends CollectionTool | GlobalTool>(
225
- tool: TTool,
226
- toolOverride?: MCPBuiltInToolOverride,
227
- entityPluginConfig?: TTool extends CollectionTool
228
- ? MCPPluginCollectionConfig<any>
229
- : MCPPluginGlobalConfig,
230
- ): TTool => {
231
- return {
232
- ...tool,
233
- description: toolOverride?.description ?? entityPluginConfig?.description ?? tool.description,
234
- overrideResponse:
235
- toolOverride?.overrideResponse ??
236
- entityPluginConfig?.overrideResponse ??
237
- tool.overrideResponse,
238
- }
239
- }