@payloadcms/plugin-mcp 4.0.0-internal.fa345ef → 4.0.0-internal.fec2230

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 (182) hide show
  1. package/bin.js +7 -0
  2. package/dist/defaultAccess.d.ts.map +1 -1
  3. package/dist/defineTool.d.ts +8 -8
  4. package/dist/defineTool.d.ts.map +1 -1
  5. package/dist/endpoint/access.d.ts +2 -7
  6. package/dist/endpoint/access.d.ts.map +1 -1
  7. package/dist/endpoint/access.js +6 -13
  8. package/dist/endpoint/access.js.map +1 -1
  9. package/dist/mcp/buildMcpServer.d.ts +1 -1
  10. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  11. package/dist/mcp/buildMcpServer.js +35 -23
  12. package/dist/mcp/buildMcpServer.js.map +1 -1
  13. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -1
  14. package/dist/mcp/builtin/collections/authTools.js +79 -56
  15. package/dist/mcp/builtin/collections/authTools.js.map +1 -1
  16. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -1
  17. package/dist/mcp/builtin/collections/countTool.js +10 -16
  18. package/dist/mcp/builtin/collections/countTool.js.map +1 -1
  19. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -1
  20. package/dist/mcp/builtin/collections/countVersionsTool.js +10 -15
  21. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -1
  22. package/dist/mcp/builtin/collections/createTool.d.ts +1 -1
  23. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
  24. package/dist/mcp/builtin/collections/createTool.js +104 -54
  25. package/dist/mcp/builtin/collections/createTool.js.map +1 -1
  26. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
  27. package/dist/mcp/builtin/collections/deleteTool.js +45 -45
  28. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
  29. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -1
  30. package/dist/mcp/builtin/collections/duplicateTool.js +32 -39
  31. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -1
  32. package/dist/mcp/builtin/collections/fileInput.d.ts +28 -0
  33. package/dist/mcp/builtin/collections/fileInput.d.ts.map +1 -0
  34. package/dist/mcp/builtin/collections/fileInput.js +88 -0
  35. package/dist/mcp/builtin/collections/fileInput.js.map +1 -0
  36. package/dist/mcp/builtin/collections/fileInput.spec.js +86 -0
  37. package/dist/mcp/builtin/collections/fileInput.spec.js.map +1 -0
  38. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -1
  39. package/dist/mcp/builtin/collections/findDistinctTool.js +12 -28
  40. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -1
  41. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  42. package/dist/mcp/builtin/collections/findTool.js +29 -48
  43. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  44. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -1
  45. package/dist/mcp/builtin/collections/findVersionByIDTool.js +18 -28
  46. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -1
  47. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -1
  48. package/dist/mcp/builtin/collections/findVersionsTool.js +17 -32
  49. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -1
  50. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -1
  51. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +51 -11
  52. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -1
  53. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -1
  54. package/dist/mcp/builtin/collections/restoreVersionTool.js +15 -28
  55. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -1
  56. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  57. package/dist/mcp/builtin/collections/updateTool.js +67 -87
  58. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  59. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts +2 -0
  60. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts.map +1 -0
  61. package/dist/mcp/builtin/collections/uploadInstructionsTool.js +55 -0
  62. package/dist/mcp/builtin/collections/uploadInstructionsTool.js.map +1 -0
  63. package/dist/mcp/builtin/formatEntityError.d.ts +16 -0
  64. package/dist/mcp/builtin/formatEntityError.d.ts.map +1 -0
  65. package/dist/mcp/builtin/formatEntityError.js +55 -0
  66. package/dist/mcp/builtin/formatEntityError.js.map +1 -0
  67. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -1
  68. package/dist/mcp/builtin/getConfigInfoTool.js +5 -7
  69. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -1
  70. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -1
  71. package/dist/mcp/builtin/globals/countVersionsTool.js +10 -15
  72. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -1
  73. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  74. package/dist/mcp/builtin/globals/findTool.js +12 -18
  75. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  76. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -1
  77. package/dist/mcp/builtin/globals/findVersionByIDTool.js +14 -26
  78. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -1
  79. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -1
  80. package/dist/mcp/builtin/globals/findVersionsTool.js +14 -31
  81. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -1
  82. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -1
  83. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +28 -10
  84. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -1
  85. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -1
  86. package/dist/mcp/builtin/globals/restoreVersionTool.js +16 -24
  87. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -1
  88. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -1
  89. package/dist/mcp/builtin/globals/updateTool.js +28 -37
  90. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  91. package/dist/mcp/builtinTools.d.ts +6 -0
  92. package/dist/mcp/builtinTools.d.ts.map +1 -1
  93. package/dist/mcp/builtinTools.js +9 -3
  94. package/dist/mcp/builtinTools.js.map +1 -1
  95. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  96. package/dist/mcp/sanitizeMCPConfig.js +4 -1
  97. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  98. package/dist/stdio.d.ts.map +1 -1
  99. package/dist/stdio.js +2 -1
  100. package/dist/stdio.js.map +1 -1
  101. package/dist/types.d.ts +48 -11
  102. package/dist/types.d.ts.map +1 -1
  103. package/dist/types.js +2 -4
  104. package/dist/types.js.map +1 -1
  105. package/dist/utils/camelCase.d.ts.map +1 -1
  106. package/dist/utils/resolveProjectRoot.d.ts.map +1 -1
  107. package/dist/utils/toStandardSchema.d.ts.map +1 -1
  108. package/package.json +5 -7
  109. package/src/endpoint/access.ts +5 -13
  110. package/src/mcp/buildMcpServer.ts +39 -29
  111. package/src/mcp/builtin/collections/authTools.ts +77 -69
  112. package/src/mcp/builtin/collections/countTool.ts +10 -23
  113. package/src/mcp/builtin/collections/countVersionsTool.ts +10 -23
  114. package/src/mcp/builtin/collections/createTool.ts +110 -77
  115. package/src/mcp/builtin/collections/deleteTool.ts +36 -65
  116. package/src/mcp/builtin/collections/duplicateTool.ts +36 -87
  117. package/src/mcp/builtin/collections/fileInput.spec.ts +93 -0
  118. package/src/mcp/builtin/collections/fileInput.ts +127 -0
  119. package/src/mcp/builtin/collections/findDistinctTool.ts +12 -64
  120. package/src/mcp/builtin/collections/findTool.ts +25 -108
  121. package/src/mcp/builtin/collections/findVersionByIDTool.ts +16 -60
  122. package/src/mcp/builtin/collections/findVersionsTool.ts +15 -87
  123. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +48 -14
  124. package/src/mcp/builtin/collections/restoreVersionTool.ts +15 -58
  125. package/src/mcp/builtin/collections/updateTool.ts +63 -101
  126. package/src/mcp/builtin/collections/uploadInstructionsTool.ts +64 -0
  127. package/src/mcp/builtin/formatEntityError.ts +77 -0
  128. package/src/mcp/builtin/getConfigInfoTool.ts +4 -5
  129. package/src/mcp/builtin/globals/countVersionsTool.ts +10 -22
  130. package/src/mcp/builtin/globals/findTool.ts +14 -53
  131. package/src/mcp/builtin/globals/findVersionByIDTool.ts +14 -54
  132. package/src/mcp/builtin/globals/findVersionsTool.ts +15 -94
  133. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +30 -8
  134. package/src/mcp/builtin/globals/restoreVersionTool.ts +17 -48
  135. package/src/mcp/builtin/globals/updateTool.ts +39 -62
  136. package/src/mcp/builtinTools.ts +9 -2
  137. package/src/mcp/sanitizeMCPConfig.ts +4 -1
  138. package/src/stdio.ts +2 -1
  139. package/src/types.ts +47 -11
  140. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +0 -9
  141. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +0 -1
  142. package/dist/mcp/builtin/collections/formatCollectionError.js +0 -60
  143. package/dist/mcp/builtin/collections/formatCollectionError.js.map +0 -1
  144. package/dist/mcp/builtin/validateEntityData.d.ts +0 -14
  145. package/dist/mcp/builtin/validateEntityData.d.ts.map +0 -1
  146. package/dist/mcp/builtin/validateEntityData.js +0 -82
  147. package/dist/mcp/builtin/validateEntityData.js.map +0 -1
  148. package/dist/utils/getVirtualFieldNames.d.ts +0 -14
  149. package/dist/utils/getVirtualFieldNames.d.ts.map +0 -1
  150. package/dist/utils/getVirtualFieldNames.js +0 -35
  151. package/dist/utils/getVirtualFieldNames.js.map +0 -1
  152. package/dist/utils/localAPIDefaults.d.ts +0 -20
  153. package/dist/utils/localAPIDefaults.d.ts.map +0 -1
  154. package/dist/utils/localAPIDefaults.js +0 -19
  155. package/dist/utils/localAPIDefaults.js.map +0 -1
  156. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +0 -11
  157. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +0 -1
  158. package/dist/utils/schemaConversion/getEntityInputSchema.js +0 -32
  159. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +0 -1
  160. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +0 -10
  161. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +0 -1
  162. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +0 -384
  163. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +0 -1
  164. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +0 -133
  165. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +0 -1
  166. package/dist/utils/transformPointDataToPayload.d.ts +0 -7
  167. package/dist/utils/transformPointDataToPayload.d.ts.map +0 -1
  168. package/dist/utils/transformPointDataToPayload.js +0 -28
  169. package/dist/utils/transformPointDataToPayload.js.map +0 -1
  170. package/dist/utils/whereSchema.d.ts +0 -9
  171. package/dist/utils/whereSchema.d.ts.map +0 -1
  172. package/dist/utils/whereSchema.js +0 -13
  173. package/dist/utils/whereSchema.js.map +0 -1
  174. package/src/mcp/builtin/collections/formatCollectionError.ts +0 -84
  175. package/src/mcp/builtin/validateEntityData.ts +0 -132
  176. package/src/utils/getVirtualFieldNames.ts +0 -53
  177. package/src/utils/localAPIDefaults.ts +0 -22
  178. package/src/utils/schemaConversion/getEntityInputSchema.ts +0 -62
  179. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +0 -96
  180. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +0 -432
  181. package/src/utils/transformPointDataToPayload.ts +0 -40
  182. package/src/utils/whereSchema.ts +0 -24
@@ -1,19 +1,15 @@
1
- import type { JoinQuery, PopulateType, SelectType } from 'payload'
2
-
3
- import { z } from 'zod'
1
+ import { findDocumentsInputSchema, parseDocumentID } from 'payload'
4
2
 
5
3
  import { defaultAccess } from '../../../defaultAccess.js'
6
4
  import { defineCollectionTool } from '../../../defineTool.js'
7
5
  import { getLogger } from '../../../utils/getLogger.js'
8
- import { localAPIDefaults } from '../../../utils/localAPIDefaults.js'
9
- import { whereSchema } from '../../../utils/whereSchema.js'
10
6
 
11
7
  const DEFAULT_DESCRIPTION =
12
8
  'Find documents in any collection by passing the collection slug and optional ID or where clause.'
13
9
 
14
10
  export const findDocumentsTool = defineCollectionTool({
15
11
  access: (args) =>
16
- defaultAccess(args) && Boolean(args.permissions?.collections?.[args.collectionSlug]?.read),
12
+ defaultAccess(args) && Boolean(args.permissions?.collections?.[args.slug]?.read),
17
13
  annotations: {
18
14
  destructiveHint: false,
19
15
  idempotentHint: true,
@@ -22,87 +18,8 @@ export const findDocumentsTool = defineCollectionTool({
22
18
  title: 'Find Documents',
23
19
  },
24
20
  description: DEFAULT_DESCRIPTION,
25
- input: z.object({
26
- id: z
27
- .union([z.string(), z.number()])
28
- .describe(
29
- 'Optional: specific document ID to retrieve. If not provided, returns all documents',
30
- )
31
- .optional(),
32
- depth: z
33
- .number()
34
- .int()
35
- .min(0)
36
- .max(10)
37
- .describe('How many levels deep to populate relationships (default: 0)')
38
- .optional()
39
- .default(0),
40
- draft: z
41
- .boolean()
42
- .describe(
43
- 'Optional: whether the document should be queried from the versions table/collection or not.',
44
- )
45
- .optional(),
46
- fallbackLocale: z
47
- .string()
48
- .describe('Optional: fallback locale code to use when requested locale is not available')
49
- .optional(),
50
- joins: z
51
- .union([z.record(z.string(), z.unknown()), z.literal(false)])
52
- .describe('Optional: configure join field queries, or pass false to disable all join fields.')
53
- .optional(),
54
- limit: z
55
- .number()
56
- .int()
57
- .min(1)
58
- .max(100)
59
- .describe('Maximum number of documents to return (default: 10, max: 100)')
60
- .optional()
61
- .default(10),
62
- locale: z
63
- .string()
64
- .describe(
65
- 'Optional: locale code to retrieve data in (e.g., "en", "es"). Use "all" to retrieve all locales for localized fields',
66
- )
67
- .optional(),
68
- page: z
69
- .number()
70
- .int()
71
- .min(1)
72
- .describe('Page number for pagination (default: 1)')
73
- .optional()
74
- .default(1),
75
- pagination: z
76
- .boolean()
77
- .describe('Optional: set to false to skip the count query overhead')
78
- .optional(),
79
- populate: z
80
- .record(z.string(), z.unknown())
81
- .describe(
82
- 'Optional: control which fields to include from populated relationship or upload documents.',
83
- )
84
- .optional(),
85
- select: z
86
- .record(z.string(), z.unknown())
87
- .describe(
88
- 'Optional: define exactly which fields you\'d like to return in the response, e.g., {"title": true}',
89
- )
90
- .optional(),
91
- sort: z
92
- .string()
93
- .describe('Field to sort by (e.g., "createdAt", "-updatedAt" for descending)')
94
- .optional(),
95
- trash: z
96
- .boolean()
97
- .describe('Optional: include soft-deleted documents when trash is enabled on the collection')
98
- .optional(),
99
- where: whereSchema
100
- .describe(
101
- 'Optional: where clause for filtering. Use field names with Payload operators, and/or arrays for grouping. Example: {"title":{"contains":"test"}}',
102
- )
103
- .optional(),
104
- }),
105
- }).handler(async ({ authorizedMCP, collectionSlug, input, req }) => {
21
+ input: findDocumentsInputSchema,
22
+ }).handler(async ({ slug, authorizedMCP, input, req }) => {
106
23
  const payload = req.payload
107
24
  const logger = getLogger({ payload })
108
25
 
@@ -124,23 +41,23 @@ export const findDocumentsTool = defineCollectionTool({
124
41
  } = input
125
42
 
126
43
  logger.info(
127
- `Reading document from collection: ${collectionSlug}${id ? ` with ID: ${id}` : ''}, limit: ${limit}, page: ${page}${locale ? `, locale: ${locale}` : ''}`,
44
+ `Reading document from collection: ${slug}${id ? ` with ID: ${id}` : ''}, limit: ${limit}, page: ${page}${locale ? `, locale: ${locale}` : ''}`,
128
45
  )
129
46
 
130
47
  try {
131
- if (id) {
48
+ if (id !== undefined) {
132
49
  try {
133
50
  const doc = await payload.findByID({
134
- id,
135
- collection: collectionSlug,
51
+ id: parseDocumentID({ id, collectionSlug: slug, payload }),
52
+ collection: slug,
136
53
  depth,
54
+ overrideAccess: authorizedMCP.overrideAccess,
137
55
  req,
138
- ...localAPIDefaults(authorizedMCP),
139
- ...(select && { select: select as SelectType }),
140
- ...(populate && { populate: populate as PopulateType }),
141
- ...(joins !== undefined && { joins: joins as JoinQuery }),
56
+ ...(select && { select }),
57
+ ...(populate && { populate }),
58
+ ...(joins !== undefined && { joins }),
142
59
  ...(locale && { locale }),
143
- ...(fallbackLocale && { fallbackLocale }),
60
+ ...(fallbackLocale !== undefined && { fallbackLocale }),
144
61
  ...(draft !== undefined && { draft }),
145
62
  ...(trash !== undefined && { trash }),
146
63
  })
@@ -149,18 +66,18 @@ export const findDocumentsTool = defineCollectionTool({
149
66
  content: [
150
67
  {
151
68
  type: 'text',
152
- text: `Document from collection "${collectionSlug}":\n${JSON.stringify(doc)}`,
69
+ text: `Document from collection "${slug}":\n${JSON.stringify(doc)}`,
153
70
  },
154
71
  ],
155
72
  doc: doc as Record<string, unknown>,
156
73
  }
157
74
  } catch {
158
- logger.warn(`Document not found with ID: ${id} in collection: ${collectionSlug}`)
75
+ logger.warn(`Document not found with ID: ${id} in collection: ${slug}`)
159
76
  return {
160
77
  content: [
161
78
  {
162
79
  type: 'text',
163
- text: `Error: Document with ID "${id}" not found in collection "${collectionSlug}"`,
80
+ text: `Error: Document with ID "${id}" not found in collection "${slug}"`,
164
81
  },
165
82
  ],
166
83
  }
@@ -168,17 +85,17 @@ export const findDocumentsTool = defineCollectionTool({
168
85
  }
169
86
 
170
87
  const findOptions: Parameters<typeof payload.find>[0] = {
171
- collection: collectionSlug,
88
+ collection: slug,
172
89
  depth,
173
90
  limit,
91
+ overrideAccess: authorizedMCP.overrideAccess,
174
92
  page,
175
93
  req,
176
- ...localAPIDefaults(authorizedMCP),
177
- ...(select && { select: select as SelectType }),
178
- ...(populate && { populate: populate as PopulateType }),
179
- ...(joins !== undefined && { joins: joins as JoinQuery }),
94
+ ...(select && { select }),
95
+ ...(populate && { populate }),
96
+ ...(joins !== undefined && { joins }),
180
97
  ...(locale && { locale }),
181
- ...(fallbackLocale && { fallbackLocale }),
98
+ ...(fallbackLocale !== undefined && { fallbackLocale }),
182
99
  ...(draft !== undefined && { draft }),
183
100
  ...(pagination !== undefined && { pagination }),
184
101
  ...(trash !== undefined && { trash }),
@@ -193,7 +110,7 @@ export const findDocumentsTool = defineCollectionTool({
193
110
 
194
111
  const result = await payload.find(findOptions)
195
112
 
196
- let responseText = `Collection: "${collectionSlug}"\nTotal: ${result.totalDocs} documents\nPage: ${result.page} of ${result.totalPages}\n`
113
+ let responseText = `Collection: "${slug}"\nTotal: ${result.totalDocs} documents\nPage: ${result.page} of ${result.totalPages}\n`
197
114
  for (const doc of result.docs) {
198
115
  responseText += `\n\`\`\`json\n${JSON.stringify(doc)}\n\`\`\``
199
116
  }
@@ -204,12 +121,12 @@ export const findDocumentsTool = defineCollectionTool({
204
121
  }
205
122
  } catch (error) {
206
123
  const errorMessage = error instanceof Error ? error.message : 'Unknown error'
207
- logger.error(`Error reading documents from collection ${collectionSlug}: ${errorMessage}`)
124
+ logger.error(`Error reading documents from collection ${slug}: ${errorMessage}`)
208
125
  return {
209
126
  content: [
210
127
  {
211
128
  type: 'text',
212
- text: `❌ **Error reading documents from collection "${collectionSlug}":** ${errorMessage}`,
129
+ text: `❌ **Error reading documents from collection "${slug}":** ${errorMessage}`,
213
130
  },
214
131
  ],
215
132
  }
@@ -1,19 +1,15 @@
1
- import type { PopulateType, SelectType } from 'payload'
2
-
3
- import { z } from 'zod'
1
+ import { findVersionByIDInputSchema } from 'payload'
4
2
 
5
3
  import { defaultAccess } from '../../../defaultAccess.js'
6
4
  import { defineCollectionTool } from '../../../defineTool.js'
7
5
  import { getLogger } from '../../../utils/getLogger.js'
8
- import { localAPIDefaults } from '../../../utils/localAPIDefaults.js'
9
6
 
10
7
  const DEFAULT_DESCRIPTION =
11
8
  'Find a specific document version in any version-enabled collection by passing the collection slug and version ID.'
12
9
 
13
10
  export const findVersionByIDTool = defineCollectionTool({
14
11
  access: (args) =>
15
- defaultAccess(args) &&
16
- Boolean(args.permissions?.collections?.[args.collectionSlug]?.readVersions),
12
+ defaultAccess(args) && Boolean(args.permissions?.collections?.[args.slug]?.readVersions),
17
13
  annotations: {
18
14
  destructiveHint: false,
19
15
  idempotentHint: true,
@@ -22,66 +18,26 @@ export const findVersionByIDTool = defineCollectionTool({
22
18
  title: 'Find Version By ID',
23
19
  },
24
20
  description: DEFAULT_DESCRIPTION,
25
- input: z.object({
26
- id: z.string().describe('The ID of the version to retrieve'),
27
- depth: z
28
- .number()
29
- .int()
30
- .min(0)
31
- .max(10)
32
- .describe('How many levels deep to populate relationships in the version document')
33
- .optional()
34
- .default(0),
35
- fallbackLocale: z
36
- .string()
37
- .describe('Optional: fallback locale code to use when requested locale is not available')
38
- .optional(),
39
- locale: z
40
- .string()
41
- .describe(
42
- 'Optional: locale code to retrieve data in (e.g., "en", "es"). Use "all" to retrieve all locales for localized fields',
43
- )
44
- .optional(),
45
- populate: z
46
- .record(z.string(), z.unknown())
47
- .describe(
48
- 'Optional: control which fields to include from populated relationship or upload documents.',
49
- )
50
- .optional(),
51
- select: z
52
- .record(z.string(), z.unknown())
53
- .describe(
54
- 'Optional: define exactly which fields you\'d like to return in the response, e.g., {"version.title": true}',
55
- )
56
- .optional(),
57
- showHiddenFields: z
58
- .boolean()
59
- .describe('Optional: include hidden fields in the returned version document')
60
- .optional(),
61
- trash: z
62
- .boolean()
63
- .describe('Optional: include soft-deleted version documents when trash is enabled')
64
- .optional(),
65
- }),
66
- }).handler(async ({ authorizedMCP, collectionSlug, input, req }) => {
21
+ input: findVersionByIDInputSchema,
22
+ }).handler(async ({ slug, authorizedMCP, input, req }) => {
67
23
  const payload = req.payload
68
24
  const logger = getLogger({ payload })
69
- const { id, depth, fallbackLocale, locale, populate, select, showHiddenFields, trash } = input
25
+ const { id, depth, draft, fallbackLocale, locale, populate, select, trash } = input
70
26
 
71
- logger.info(`Finding version in collection: ${collectionSlug} with ID: ${id}`)
27
+ logger.info(`Finding version in collection: ${slug} with ID: ${id}`)
72
28
 
73
29
  try {
74
30
  const result = await payload.findVersionByID({
75
- id,
76
- collection: collectionSlug,
31
+ id: String(id),
32
+ collection: slug,
77
33
  depth,
34
+ overrideAccess: authorizedMCP.overrideAccess,
78
35
  req,
79
- ...localAPIDefaults(authorizedMCP),
80
- ...(fallbackLocale ? { fallbackLocale } : {}),
36
+ ...(draft !== undefined ? { draft } : {}),
37
+ ...(fallbackLocale !== undefined ? { fallbackLocale } : {}),
81
38
  ...(locale ? { locale } : {}),
82
- ...(populate ? { populate: populate as PopulateType } : {}),
83
- ...(select ? { select: select as SelectType } : {}),
84
- ...(showHiddenFields !== undefined ? { showHiddenFields } : {}),
39
+ ...(populate ? { populate } : {}),
40
+ ...(select ? { select } : {}),
85
41
  ...(trash !== undefined ? { trash } : {}),
86
42
  })
87
43
 
@@ -89,19 +45,19 @@ export const findVersionByIDTool = defineCollectionTool({
89
45
  content: [
90
46
  {
91
47
  type: 'text',
92
- text: `Version "${id}" from collection "${collectionSlug}":\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
48
+ text: `Version "${id}" from collection "${slug}":\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
93
49
  },
94
50
  ],
95
51
  doc: result as unknown as Record<string, unknown>,
96
52
  }
97
53
  } catch (error) {
98
54
  const errorMessage = error instanceof Error ? error.message : 'Unknown error'
99
- logger.error(`Error finding version ${id} in ${collectionSlug}: ${errorMessage}`)
55
+ logger.error(`Error finding version ${id} in ${slug}: ${errorMessage}`)
100
56
  return {
101
57
  content: [
102
58
  {
103
59
  type: 'text',
104
- text: `❌ **Error finding version "${id}" in collection "${collectionSlug}":** ${errorMessage}`,
60
+ text: `❌ **Error finding version "${id}" in collection "${slug}":** ${errorMessage}`,
105
61
  },
106
62
  ],
107
63
  isError: true,
@@ -1,20 +1,15 @@
1
- import type { PopulateType, SelectType } from 'payload'
2
-
3
- import { z } from 'zod'
1
+ import { findVersionsInputSchema } from 'payload'
4
2
 
5
3
  import { defaultAccess } from '../../../defaultAccess.js'
6
4
  import { defineCollectionTool } from '../../../defineTool.js'
7
5
  import { getLogger } from '../../../utils/getLogger.js'
8
- import { localAPIDefaults } from '../../../utils/localAPIDefaults.js'
9
- import { whereSchema } from '../../../utils/whereSchema.js'
10
6
 
11
7
  const DEFAULT_DESCRIPTION =
12
8
  'Find document versions in any version-enabled collection by passing the collection slug and optional where clause.'
13
9
 
14
10
  export const findVersionsTool = defineCollectionTool({
15
11
  access: (args) =>
16
- defaultAccess(args) &&
17
- Boolean(args.permissions?.collections?.[args.collectionSlug]?.readVersions),
12
+ defaultAccess(args) && Boolean(args.permissions?.collections?.[args.slug]?.readVersions),
18
13
  annotations: {
19
14
  destructiveHint: false,
20
15
  idempotentHint: true,
@@ -23,79 +18,13 @@ export const findVersionsTool = defineCollectionTool({
23
18
  title: 'Find Versions',
24
19
  },
25
20
  description: DEFAULT_DESCRIPTION,
26
- input: z.object({
27
- depth: z
28
- .number()
29
- .int()
30
- .min(0)
31
- .max(10)
32
- .describe('How many levels deep to populate relationships in version documents')
33
- .optional()
34
- .default(0),
35
- fallbackLocale: z
36
- .string()
37
- .describe('Optional: fallback locale code to use when requested locale is not available')
38
- .optional(),
39
- limit: z
40
- .number()
41
- .int()
42
- .min(1)
43
- .max(100)
44
- .describe('Maximum number of versions to return (default: 10, max: 100)')
45
- .optional()
46
- .default(10),
47
- locale: z
48
- .string()
49
- .describe(
50
- 'Optional: locale code to retrieve data in (e.g., "en", "es"). Use "all" to retrieve all locales for localized fields',
51
- )
52
- .optional(),
53
- page: z
54
- .number()
55
- .int()
56
- .min(1)
57
- .describe('Page number for pagination (default: 1)')
58
- .optional()
59
- .default(1),
60
- pagination: z
61
- .boolean()
62
- .describe('Optional: set to false to skip the count query overhead')
63
- .optional(),
64
- populate: z
65
- .record(z.string(), z.unknown())
66
- .describe(
67
- 'Optional: control which fields to include from populated relationship or upload documents.',
68
- )
69
- .optional(),
70
- select: z
71
- .record(z.string(), z.unknown())
72
- .describe(
73
- 'Optional: define exactly which fields you\'d like to return in the response, e.g., {"version.title": true}',
74
- )
75
- .optional(),
76
- showHiddenFields: z
77
- .boolean()
78
- .describe('Optional: include hidden fields in returned version documents')
79
- .optional(),
80
- sort: z
81
- .string()
82
- .describe('Field to sort by (e.g., "-updatedAt", "-version.updatedAt" for descending)')
83
- .optional(),
84
- trash: z
85
- .boolean()
86
- .describe('Optional: include versions for soft-deleted documents when trash is enabled')
87
- .optional(),
88
- where: whereSchema
89
- .describe(
90
- 'Optional: where clause for filtering versions. Version document fields are usually under "version". Example: {"version.title":{"contains":"test"}}',
91
- )
92
- .optional(),
93
- }),
94
- }).handler(async ({ authorizedMCP, collectionSlug, input, req }) => {
21
+ input: findVersionsInputSchema,
22
+ }).handler(async ({ slug, authorizedMCP, input, req }) => {
95
23
  const payload = req.payload
96
24
  const logger = getLogger({ payload })
97
25
  const {
98
26
  depth,
27
+ draft,
99
28
  fallbackLocale,
100
29
  limit,
101
30
  locale,
@@ -103,28 +32,27 @@ export const findVersionsTool = defineCollectionTool({
103
32
  pagination,
104
33
  populate,
105
34
  select,
106
- showHiddenFields,
107
35
  sort,
108
36
  trash,
109
37
  where,
110
38
  } = input
111
39
 
112
- logger.info(`Finding versions in collection: ${collectionSlug}, limit: ${limit}, page: ${page}`)
40
+ logger.info(`Finding versions in collection: ${slug}, limit: ${limit}, page: ${page}`)
113
41
 
114
42
  try {
115
43
  const result = await payload.findVersions({
116
- collection: collectionSlug,
44
+ collection: slug,
117
45
  depth,
118
46
  limit,
47
+ overrideAccess: authorizedMCP.overrideAccess,
119
48
  page,
120
49
  req,
121
- ...localAPIDefaults(authorizedMCP),
122
- ...(fallbackLocale ? { fallbackLocale } : {}),
50
+ ...(draft !== undefined ? { draft } : {}),
51
+ ...(fallbackLocale !== undefined ? { fallbackLocale } : {}),
123
52
  ...(locale ? { locale } : {}),
124
53
  ...(pagination !== undefined ? { pagination } : {}),
125
- ...(populate ? { populate: populate as PopulateType } : {}),
126
- ...(select ? { select: select as SelectType } : {}),
127
- ...(showHiddenFields !== undefined ? { showHiddenFields } : {}),
54
+ ...(populate ? { populate } : {}),
55
+ ...(select ? { select } : {}),
128
56
  ...(sort ? { sort } : {}),
129
57
  ...(trash !== undefined ? { trash } : {}),
130
58
  ...(where ? { where } : {}),
@@ -134,19 +62,19 @@ export const findVersionsTool = defineCollectionTool({
134
62
  content: [
135
63
  {
136
64
  type: 'text',
137
- text: `Versions for collection "${collectionSlug}":\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
65
+ text: `Versions for collection "${slug}":\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
138
66
  },
139
67
  ],
140
68
  doc: result as unknown as Record<string, unknown>,
141
69
  }
142
70
  } catch (error) {
143
71
  const errorMessage = error instanceof Error ? error.message : 'Unknown error'
144
- logger.error(`Error finding versions in ${collectionSlug}: ${errorMessage}`)
72
+ logger.error(`Error finding versions in ${slug}: ${errorMessage}`)
145
73
  return {
146
74
  content: [
147
75
  {
148
76
  type: 'text',
149
- text: `❌ **Error finding versions in collection "${collectionSlug}":** ${errorMessage}`,
77
+ text: `❌ **Error finding versions in collection "${slug}":** ${errorMessage}`,
150
78
  },
151
79
  ],
152
80
  isError: true,
@@ -1,17 +1,13 @@
1
+ import { getAccessResults, getCollectionInputSchema, getCollectionSchemaInputSchema } from 'payload'
2
+
1
3
  import { defaultAccess } from '../../../defaultAccess.js'
2
4
  import { defineCollectionTool } from '../../../defineTool.js'
3
- import { getCollectionInputSchema } from '../../../utils/schemaConversion/getEntityInputSchema.js'
4
5
 
5
6
  export const getCollectionSchemaTool = defineCollectionTool({
6
7
  access: (args) => {
7
- const permissions = args.permissions?.collections?.[args.collectionSlug]
8
-
9
- return (
10
- defaultAccess(args) &&
11
- Boolean(
12
- permissions?.create || permissions?.delete || permissions?.read || permissions?.update,
13
- )
14
- )
8
+ const permissions = args.permissions?.collections?.[args.slug]
9
+
10
+ return defaultAccess(args) && Boolean(permissions?.create || permissions?.update)
15
11
  },
16
12
  annotations: {
17
13
  destructiveHint: false,
@@ -21,26 +17,64 @@ export const getCollectionSchemaTool = defineCollectionTool({
21
17
  title: 'Get Collection Schema',
22
18
  },
23
19
  description: 'Get the input schema for creating or updating documents in a collection.',
24
- }).handler(({ collectionSlug, req }) => {
25
- const inputSchema = getCollectionInputSchema({ collectionSlug, req })
20
+ input: getCollectionSchemaInputSchema,
21
+ }).handler(async ({ slug, authorizedMCP, req }) => {
22
+ const permissions = authorizedMCP.overrideAccess
23
+ ? null
24
+ : (await getAccessResults({ req })).collections?.[slug]
25
+
26
+ if (!authorizedMCP.overrideAccess && !permissions?.create && !permissions?.update) {
27
+ return {
28
+ content: [
29
+ {
30
+ type: 'text',
31
+ text: `Error: MCP access to "getCollectionSchema" is not enabled for collection "${slug}"`,
32
+ },
33
+ ],
34
+ isError: true,
35
+ }
36
+ }
37
+
38
+ const inputSchema = getCollectionInputSchema({
39
+ collectionSlug: slug,
40
+ req,
41
+ ...(permissions ? { permissions } : {}),
42
+ })
26
43
 
27
44
  if (!inputSchema) {
28
45
  return {
29
- content: [{ type: 'text', text: `Error: Collection "${collectionSlug}" not found` }],
46
+ content: [{ type: 'text', text: `Error: Collection "${slug}" not found` }],
30
47
  isError: true,
31
48
  }
32
49
  }
33
50
 
51
+ const uploadConfig = req.payload.collections[slug]?.config.upload
52
+ const maxFileSize = req.payload.config.upload.limits?.fileSize
53
+ const upload = uploadConfig
54
+ ? {
55
+ enabled: true,
56
+ filesRequiredOnCreate: uploadConfig.filesRequiredOnCreate !== false,
57
+ mimeTypes: uploadConfig.mimeTypes ?? ['*/*'],
58
+ sources: [
59
+ ...(uploadConfig.pasteURL !== false ? ['externalURL'] : []),
60
+ 'base64',
61
+ 'uploadReference',
62
+ ],
63
+ ...(typeof maxFileSize === 'number' && Number.isFinite(maxFileSize) ? { maxFileSize } : {}),
64
+ }
65
+ : { enabled: false }
66
+
34
67
  return {
35
68
  content: [
36
69
  {
37
70
  type: 'text',
38
- text: `Schema for collection "${collectionSlug}":\n\`\`\`json\n${JSON.stringify(inputSchema)}\n\`\`\``,
71
+ text: `Schema for collection "${slug}":\n\`\`\`json\n${JSON.stringify(inputSchema)}\n\`\`\`\nUpload configuration:\n\`\`\`json\n${JSON.stringify(upload)}\n\`\`\``,
39
72
  },
40
73
  ],
41
74
  structuredContent: {
42
- collectionSlug,
75
+ slug,
43
76
  schema: inputSchema,
77
+ upload,
44
78
  },
45
79
  }
46
80
  })