@payloadcms/plugin-mcp 4.0.0-internal.40de3ec → 4.0.0-internal.435b2d6
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.
- package/LICENSE.md +1 -1
- package/bin.js +7 -0
- package/dist/defaultAccess.d.ts +3 -0
- package/dist/defaultAccess.d.ts.map +1 -0
- package/dist/defaultAccess.js +3 -0
- package/dist/defaultAccess.js.map +1 -0
- package/dist/defineTool.d.ts +8 -8
- package/dist/defineTool.d.ts.map +1 -1
- package/dist/endpoint/access.d.ts +12 -5
- package/dist/endpoint/access.d.ts.map +1 -1
- package/dist/endpoint/access.js +75 -88
- package/dist/endpoint/access.js.map +1 -1
- package/dist/endpoint/index.d.ts +1 -1
- package/dist/endpoint/index.d.ts.map +1 -1
- package/dist/endpoint/index.js +68 -17
- package/dist/endpoint/index.js.map +1 -1
- package/dist/exports/client.d.ts +1 -1
- package/dist/exports/client.d.ts.map +1 -1
- package/dist/exports/client.js +1 -1
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/internal.d.ts +2 -0
- package/dist/exports/internal.d.ts.map +1 -0
- package/dist/exports/internal.js +3 -0
- package/dist/exports/internal.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -20
- package/dist/index.js.map +1 -1
- package/dist/mcp/buildMcpServer.d.ts +4 -4
- package/dist/mcp/buildMcpServer.d.ts.map +1 -1
- package/dist/mcp/buildMcpServer.js +133 -80
- package/dist/mcp/buildMcpServer.js.map +1 -1
- package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -1
- package/dist/mcp/builtin/collections/authTools.js +44 -6
- package/dist/mcp/builtin/collections/authTools.js.map +1 -1
- package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/countTool.js +68 -0
- package/dist/mcp/builtin/collections/countTool.js.map +1 -0
- package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/countVersionsTool.js +64 -0
- package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
- package/dist/mcp/builtin/collections/createTool.d.ts +1 -1
- package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
- package/dist/mcp/builtin/collections/createTool.js +50 -45
- package/dist/mcp/builtin/collections/createTool.js.map +1 -1
- package/dist/mcp/builtin/collections/deleteTool.d.ts +1 -1
- package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
- package/dist/mcp/builtin/collections/deleteTool.js +15 -22
- package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
- package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/duplicateTool.js +96 -0
- package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
- package/dist/mcp/builtin/collections/fileInput.d.ts +20 -0
- package/dist/mcp/builtin/collections/fileInput.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/fileInput.js +100 -0
- package/dist/mcp/builtin/collections/fileInput.js.map +1 -0
- package/dist/mcp/builtin/collections/fileInput.spec.js +72 -0
- package/dist/mcp/builtin/collections/fileInput.spec.js.map +1 -0
- package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/findDistinctTool.js +92 -0
- package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
- package/dist/mcp/builtin/collections/findTool.d.ts +1 -1
- package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
- package/dist/mcp/builtin/collections/findTool.js +52 -47
- package/dist/mcp/builtin/collections/findTool.js.map +1 -1
- package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/findVersionByIDTool.js +83 -0
- package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
- package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/findVersionsTool.js +98 -0
- package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
- package/dist/mcp/builtin/collections/formatCollectionError.d.ts +9 -0
- package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/formatCollectionError.js +60 -0
- package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -0
- package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +86 -0
- package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -0
- package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/restoreVersionTool.js +81 -0
- package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
- package/dist/mcp/builtin/collections/updateTool.d.ts +1 -1
- package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
- package/dist/mcp/builtin/collections/updateTool.js +106 -93
- package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
- package/dist/mcp/builtin/getConfigInfoTool.d.ts +2 -0
- package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -0
- package/dist/mcp/builtin/getConfigInfoTool.js +68 -0
- package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -0
- package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
- package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
- package/dist/mcp/builtin/globals/countVersionsTool.js +64 -0
- package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
- package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
- package/dist/mcp/builtin/globals/findTool.js +20 -23
- package/dist/mcp/builtin/globals/findTool.js.map +1 -1
- package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
- package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
- package/dist/mcp/builtin/globals/findVersionByIDTool.js +79 -0
- package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
- package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
- package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
- package/dist/mcp/builtin/globals/findVersionsTool.js +94 -0
- package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
- package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts +2 -0
- package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -0
- package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +65 -0
- package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -0
- package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
- package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
- package/dist/mcp/builtin/globals/restoreVersionTool.js +77 -0
- package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
- package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -1
- package/dist/mcp/builtin/globals/updateTool.js +33 -42
- package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
- package/dist/mcp/builtin/validateEntityData.d.ts +14 -0
- package/dist/mcp/builtin/validateEntityData.d.ts.map +1 -0
- package/dist/mcp/builtin/validateEntityData.js +82 -0
- package/dist/mcp/builtin/validateEntityData.js.map +1 -0
- package/dist/mcp/builtinTools.d.ts +144 -19
- package/dist/mcp/builtinTools.d.ts.map +1 -1
- package/dist/mcp/builtinTools.js +119 -20
- package/dist/mcp/builtinTools.js.map +1 -1
- package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
- package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
- package/dist/mcp/sanitizeMCPConfig.js +121 -58
- package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
- package/dist/stdio.d.ts +3 -3
- package/dist/stdio.d.ts.map +1 -1
- package/dist/stdio.js +82 -45
- package/dist/stdio.js.map +1 -1
- package/dist/types.d.ts +112 -110
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -4
- package/dist/types.js.map +1 -1
- package/dist/utils/camelCase.d.ts.map +1 -1
- package/dist/utils/getPluginConfig.d.ts +1 -1
- package/dist/utils/getPluginConfig.js +1 -1
- package/dist/utils/getPluginConfig.js.map +1 -1
- package/dist/utils/resolveProjectRoot.d.ts.map +1 -1
- package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts +28 -0
- package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts.map +1 -0
- package/dist/utils/schemaConversion/filterFieldsByAccess.js +71 -0
- package/dist/utils/schemaConversion/filterFieldsByAccess.js.map +1 -0
- package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +13 -0
- package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +1 -0
- package/dist/utils/schemaConversion/getEntityInputSchema.js +66 -0
- package/dist/utils/schemaConversion/getEntityInputSchema.js.map +1 -0
- package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +5 -10
- package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -1
- package/dist/utils/schemaConversion/sanitizeEntitySchema.js +15 -95
- package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -1
- package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +15 -40
- package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -1
- package/dist/utils/toStandardSchema.d.ts.map +1 -1
- package/dist/utils/whereSchema.d.ts +9 -0
- package/dist/utils/whereSchema.d.ts.map +1 -0
- package/dist/utils/whereSchema.js +13 -0
- package/dist/utils/whereSchema.js.map +1 -0
- package/package.json +10 -15
- package/src/defaultAccess.ts +3 -0
- package/src/endpoint/access.ts +81 -101
- package/src/endpoint/index.ts +58 -16
- package/src/exports/client.ts +2 -1
- package/src/exports/internal.ts +1 -0
- package/src/index.ts +12 -20
- package/src/mcp/buildMcpServer.ts +170 -115
- package/src/mcp/builtin/collections/authTools.ts +45 -9
- package/src/mcp/builtin/collections/countTool.ts +73 -0
- package/src/mcp/builtin/collections/countVersionsTool.ts +69 -0
- package/src/mcp/builtin/collections/createTool.ts +67 -62
- package/src/mcp/builtin/collections/deleteTool.ts +20 -18
- package/src/mcp/builtin/collections/duplicateTool.ts +134 -0
- package/src/mcp/builtin/collections/fileInput.spec.ts +79 -0
- package/src/mcp/builtin/collections/fileInput.ts +139 -0
- package/src/mcp/builtin/collections/findDistinctTool.ts +119 -0
- package/src/mcp/builtin/collections/findTool.ts +66 -37
- package/src/mcp/builtin/collections/findVersionByIDTool.ts +109 -0
- package/src/mcp/builtin/collections/findVersionsTool.ts +154 -0
- package/src/mcp/builtin/collections/formatCollectionError.ts +84 -0
- package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +76 -0
- package/src/mcp/builtin/collections/restoreVersionTool.ts +107 -0
- package/src/mcp/builtin/collections/updateTool.ts +132 -115
- package/src/mcp/builtin/getConfigInfoTool.ts +67 -0
- package/src/mcp/builtin/globals/countVersionsTool.ts +68 -0
- package/src/mcp/builtin/globals/findTool.ts +28 -19
- package/src/mcp/builtin/globals/findVersionByIDTool.ts +103 -0
- package/src/mcp/builtin/globals/findVersionsTool.ts +147 -0
- package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +63 -0
- package/src/mcp/builtin/globals/restoreVersionTool.ts +99 -0
- package/src/mcp/builtin/globals/updateTool.ts +52 -57
- package/src/mcp/builtin/validateEntityData.ts +132 -0
- package/src/mcp/builtinTools.ts +111 -41
- package/src/mcp/sanitizeMCPConfig.ts +117 -78
- package/src/stdio.ts +77 -45
- package/src/types.ts +128 -115
- package/src/utils/getPluginConfig.ts +1 -1
- package/src/utils/schemaConversion/filterFieldsByAccess.ts +123 -0
- package/src/utils/schemaConversion/getEntityInputSchema.ts +96 -0
- package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +12 -19
- package/src/utils/schemaConversion/sanitizeEntitySchema.ts +17 -114
- package/src/utils/whereSchema.ts +24 -0
- package/dist/@types/assets.d.js +0 -2
- package/dist/@types/assets.d.js.map +0 -1
- package/dist/collection/getAccessField.d.ts +0 -12
- package/dist/collection/getAccessField.d.ts.map +0 -1
- package/dist/collection/getAccessField.js +0 -57
- package/dist/collection/getAccessField.js.map +0 -1
- package/dist/collection/index.d.ts +0 -6
- package/dist/collection/index.d.ts.map +0 -1
- package/dist/collection/index.js +0 -60
- package/dist/collection/index.js.map +0 -1
- package/dist/components/AccessField/index.client.d.ts +0 -10
- package/dist/components/AccessField/index.client.d.ts.map +0 -1
- package/dist/components/AccessField/index.client.js +0 -305
- package/dist/components/AccessField/index.client.js.map +0 -1
- package/dist/components/AccessField/index.css +0 -93
- package/dist/utils/localAPIDefaults.d.ts +0 -20
- package/dist/utils/localAPIDefaults.d.ts.map +0 -1
- package/dist/utils/localAPIDefaults.js +0 -19
- package/dist/utils/localAPIDefaults.js.map +0 -1
- package/dist/utils/schemaConversion/buildToolInput.d.ts +0 -29
- package/dist/utils/schemaConversion/buildToolInput.d.ts.map +0 -1
- package/dist/utils/schemaConversion/buildToolInput.js +0 -51
- package/dist/utils/schemaConversion/buildToolInput.js.map +0 -1
- package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
- package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
- package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
- package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
- package/src/@types/assets.d.ts +0 -3
- package/src/collection/getAccessField.ts +0 -64
- package/src/collection/index.ts +0 -64
- package/src/components/AccessField/index.client.tsx +0 -344
- package/src/components/AccessField/index.css +0 -93
- package/src/utils/localAPIDefaults.ts +0 -22
- package/src/utils/schemaConversion/buildToolInput.ts +0 -68
- package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { getAccessResults } from 'payload'
|
|
2
|
+
|
|
3
|
+
import { defaultAccess } from '../../../defaultAccess.js'
|
|
4
|
+
import { defineCollectionTool } from '../../../defineTool.js'
|
|
5
|
+
import { getCollectionInputSchema } from '../../../utils/schemaConversion/getEntityInputSchema.js'
|
|
6
|
+
|
|
7
|
+
export const getCollectionSchemaTool = defineCollectionTool({
|
|
8
|
+
access: (args) => {
|
|
9
|
+
const permissions = args.permissions?.collections?.[args.collectionSlug]
|
|
10
|
+
|
|
11
|
+
return defaultAccess(args) && Boolean(permissions?.create || permissions?.update)
|
|
12
|
+
},
|
|
13
|
+
annotations: {
|
|
14
|
+
destructiveHint: false,
|
|
15
|
+
idempotentHint: true,
|
|
16
|
+
openWorldHint: false,
|
|
17
|
+
readOnlyHint: true,
|
|
18
|
+
title: 'Get Collection Schema',
|
|
19
|
+
},
|
|
20
|
+
description: 'Get the input schema for creating or updating documents in a collection.',
|
|
21
|
+
}).handler(async ({ authorizedMCP, collectionSlug, req }) => {
|
|
22
|
+
const permissions = authorizedMCP.overrideAccess
|
|
23
|
+
? null
|
|
24
|
+
: (await getAccessResults({ req })).collections?.[collectionSlug]
|
|
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 "${collectionSlug}"`,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
isError: true,
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const inputSchema = getCollectionInputSchema({
|
|
39
|
+
collectionSlug,
|
|
40
|
+
req,
|
|
41
|
+
...(permissions ? { permissions } : {}),
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
if (!inputSchema) {
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: 'text', text: `Error: Collection "${collectionSlug}" not found` }],
|
|
47
|
+
isError: true,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const uploadConfig = req.payload.collections[collectionSlug]?.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: [...(uploadConfig.pasteURL !== false ? ['url'] : []), 'base64'],
|
|
59
|
+
...(typeof maxFileSize === 'number' && Number.isFinite(maxFileSize) ? { maxFileSize } : {}),
|
|
60
|
+
}
|
|
61
|
+
: { enabled: false }
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: 'text',
|
|
67
|
+
text: `Schema for collection "${collectionSlug}":\n\`\`\`json\n${JSON.stringify(inputSchema)}\n\`\`\`\nUpload configuration:\n\`\`\`json\n${JSON.stringify(upload)}\n\`\`\``,
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
structuredContent: {
|
|
71
|
+
collectionSlug,
|
|
72
|
+
schema: inputSchema,
|
|
73
|
+
upload,
|
|
74
|
+
},
|
|
75
|
+
}
|
|
76
|
+
})
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { PopulateType, SelectType } from 'payload'
|
|
2
|
+
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
|
|
5
|
+
import { defaultAccess } from '../../../defaultAccess.js'
|
|
6
|
+
import { defineCollectionTool } from '../../../defineTool.js'
|
|
7
|
+
import { getLogger } from '../../../utils/getLogger.js'
|
|
8
|
+
|
|
9
|
+
const DEFAULT_DESCRIPTION =
|
|
10
|
+
'Restore a document from a previous version in any version-enabled collection.'
|
|
11
|
+
|
|
12
|
+
export const restoreVersionTool = defineCollectionTool({
|
|
13
|
+
access: (args) =>
|
|
14
|
+
defaultAccess(args) && Boolean(args.permissions?.collections?.[args.collectionSlug]?.update),
|
|
15
|
+
annotations: {
|
|
16
|
+
destructiveHint: true,
|
|
17
|
+
idempotentHint: false,
|
|
18
|
+
openWorldHint: false,
|
|
19
|
+
readOnlyHint: false,
|
|
20
|
+
title: 'Restore Version',
|
|
21
|
+
},
|
|
22
|
+
description: DEFAULT_DESCRIPTION,
|
|
23
|
+
input: z.object({
|
|
24
|
+
id: z.string().describe('The ID of the version to restore'),
|
|
25
|
+
depth: z
|
|
26
|
+
.number()
|
|
27
|
+
.int()
|
|
28
|
+
.min(0)
|
|
29
|
+
.max(10)
|
|
30
|
+
.describe('How many levels deep to populate relationships in response')
|
|
31
|
+
.optional()
|
|
32
|
+
.default(0),
|
|
33
|
+
draft: z
|
|
34
|
+
.boolean()
|
|
35
|
+
.describe('Whether to restore the version as a draft')
|
|
36
|
+
.optional()
|
|
37
|
+
.default(false),
|
|
38
|
+
fallbackLocale: z
|
|
39
|
+
.string()
|
|
40
|
+
.describe('Optional: fallback locale code to use when requested locale is not available')
|
|
41
|
+
.optional(),
|
|
42
|
+
locale: z
|
|
43
|
+
.string()
|
|
44
|
+
.describe('Optional: locale code to restore in (e.g., "en", "es")')
|
|
45
|
+
.optional(),
|
|
46
|
+
populate: z
|
|
47
|
+
.record(z.string(), z.unknown())
|
|
48
|
+
.describe(
|
|
49
|
+
'Optional: control which fields to include from populated relationship or upload documents.',
|
|
50
|
+
)
|
|
51
|
+
.optional(),
|
|
52
|
+
select: z
|
|
53
|
+
.record(z.string(), z.unknown())
|
|
54
|
+
.describe(
|
|
55
|
+
'Optional: define exactly which fields you\'d like to return in the response, e.g., {"title": true}',
|
|
56
|
+
)
|
|
57
|
+
.optional(),
|
|
58
|
+
showHiddenFields: z
|
|
59
|
+
.boolean()
|
|
60
|
+
.describe('Optional: include hidden fields in the restored document response')
|
|
61
|
+
.optional(),
|
|
62
|
+
}),
|
|
63
|
+
}).handler(async ({ authorizedMCP, collectionSlug, input, req }) => {
|
|
64
|
+
const payload = req.payload
|
|
65
|
+
const logger = getLogger({ payload })
|
|
66
|
+
const { id, depth, draft, fallbackLocale, locale, populate, select, showHiddenFields } = input
|
|
67
|
+
|
|
68
|
+
logger.info(`Restoring version in collection: ${collectionSlug} with ID: ${id}`)
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const result = await payload.restoreVersion({
|
|
72
|
+
id,
|
|
73
|
+
collection: collectionSlug,
|
|
74
|
+
depth,
|
|
75
|
+
draft,
|
|
76
|
+
overrideAccess: authorizedMCP.overrideAccess,
|
|
77
|
+
req,
|
|
78
|
+
...(fallbackLocale ? { fallbackLocale } : {}),
|
|
79
|
+
...(locale ? { locale } : {}),
|
|
80
|
+
...(populate ? { populate: populate as PopulateType } : {}),
|
|
81
|
+
...(select ? { select: select as SelectType } : {}),
|
|
82
|
+
...(showHiddenFields !== undefined ? { showHiddenFields } : {}),
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
content: [
|
|
87
|
+
{
|
|
88
|
+
type: 'text',
|
|
89
|
+
text: `Version "${id}" restored successfully in collection "${collectionSlug}"!\nRestored document:\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
doc: result as Record<string, unknown>,
|
|
93
|
+
}
|
|
94
|
+
} catch (error) {
|
|
95
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error'
|
|
96
|
+
logger.error(`Error restoring version ${id} in ${collectionSlug}: ${errorMessage}`)
|
|
97
|
+
return {
|
|
98
|
+
content: [
|
|
99
|
+
{
|
|
100
|
+
type: 'text',
|
|
101
|
+
text: `❌ **Error restoring version "${id}" in collection "${collectionSlug}":** ${errorMessage}`,
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
isError: true,
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
})
|
|
@@ -1,83 +1,93 @@
|
|
|
1
|
-
import type { SelectType } from 'payload'
|
|
1
|
+
import type { SelectType, Where } from 'payload'
|
|
2
2
|
|
|
3
3
|
import { z } from 'zod'
|
|
4
4
|
|
|
5
|
+
import { defaultAccess } from '../../../defaultAccess.js'
|
|
5
6
|
import { defineCollectionTool } from '../../../defineTool.js'
|
|
6
7
|
import { getLogger } from '../../../utils/getLogger.js'
|
|
7
8
|
import {
|
|
8
9
|
getCollectionVirtualFieldNames,
|
|
9
10
|
stripVirtualFields,
|
|
10
11
|
} from '../../../utils/getVirtualFieldNames.js'
|
|
11
|
-
import {
|
|
12
|
-
import { buildToolInput } from '../../../utils/schemaConversion/buildToolInput.js'
|
|
13
|
-
import { sanitizeEntitySchema } from '../../../utils/schemaConversion/sanitizeEntitySchema.js'
|
|
12
|
+
import { getCollectionInputSchema } from '../../../utils/schemaConversion/getEntityInputSchema.js'
|
|
14
13
|
import { transformPointDataToPayload } from '../../../utils/transformPointDataToPayload.js'
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
.union([z.string(), z.number()])
|
|
33
|
-
.describe('The ID of the document to update')
|
|
34
|
-
.optional(),
|
|
35
|
-
depth: z
|
|
36
|
-
.number()
|
|
37
|
-
.describe('How many levels deep to populate relationships')
|
|
38
|
-
.optional()
|
|
39
|
-
.default(0),
|
|
40
|
-
draft: z
|
|
41
|
-
.boolean()
|
|
42
|
-
.describe('Whether to update the document as a draft')
|
|
43
|
-
.optional()
|
|
44
|
-
.default(false),
|
|
45
|
-
fallbackLocale: z
|
|
46
|
-
.string()
|
|
47
|
-
.describe('Optional: fallback locale code to use when requested locale is not available')
|
|
48
|
-
.optional(),
|
|
49
|
-
filePath: z.string().describe('File path for file uploads').optional(),
|
|
50
|
-
locale: z
|
|
51
|
-
.string()
|
|
52
|
-
.describe(
|
|
53
|
-
'Optional: locale code to update the document in (e.g., "en", "es"). Defaults to the default locale',
|
|
54
|
-
)
|
|
55
|
-
.optional(),
|
|
56
|
-
overrideLock: z
|
|
57
|
-
.boolean()
|
|
58
|
-
.describe('Whether to override document locks')
|
|
59
|
-
.optional()
|
|
60
|
-
.default(true),
|
|
61
|
-
overwriteExistingFiles: z
|
|
62
|
-
.boolean()
|
|
63
|
-
.describe('Whether to overwrite existing files')
|
|
64
|
-
.optional()
|
|
65
|
-
.default(false),
|
|
66
|
-
select: z
|
|
67
|
-
.string()
|
|
68
|
-
.describe(
|
|
69
|
-
'Optional: define exactly which fields you\'d like to return in the response (JSON), e.g., \'{"title": "My Post"}\'',
|
|
70
|
-
)
|
|
71
|
-
.optional(),
|
|
72
|
-
where: z
|
|
73
|
-
.string()
|
|
74
|
-
.describe('JSON string for where clause to update multiple documents')
|
|
75
|
-
.optional(),
|
|
76
|
-
},
|
|
77
|
-
dataDescription: 'The fields to update',
|
|
78
|
-
dataSchema: partialSchema,
|
|
79
|
-
})
|
|
14
|
+
import { whereSchema } from '../../../utils/whereSchema.js'
|
|
15
|
+
import { validateCollectionData } from '../validateEntityData.js'
|
|
16
|
+
import { fileInputSchema, resolveFileInput } from './fileInput.js'
|
|
17
|
+
import { formatCollectionError } from './formatCollectionError.js'
|
|
18
|
+
|
|
19
|
+
const DEFAULT_DESCRIPTION =
|
|
20
|
+
'Update documents in any collection by passing the collection slug and data.'
|
|
21
|
+
|
|
22
|
+
export const updateDocumentTool = defineCollectionTool({
|
|
23
|
+
access: (args) =>
|
|
24
|
+
defaultAccess(args) && Boolean(args.permissions?.collections?.[args.collectionSlug]?.update),
|
|
25
|
+
annotations: {
|
|
26
|
+
destructiveHint: true,
|
|
27
|
+
idempotentHint: false,
|
|
28
|
+
openWorldHint: false,
|
|
29
|
+
readOnlyHint: false,
|
|
30
|
+
title: 'Update Document',
|
|
80
31
|
},
|
|
32
|
+
description: DEFAULT_DESCRIPTION,
|
|
33
|
+
input: z.object({
|
|
34
|
+
id: z.union([z.string(), z.number()]).describe('The ID of the document to update').optional(),
|
|
35
|
+
data: z
|
|
36
|
+
.record(z.string(), z.unknown())
|
|
37
|
+
.describe(
|
|
38
|
+
'The fields to update. Only include fields permitted by the schema returned by getCollectionSchema.',
|
|
39
|
+
),
|
|
40
|
+
depth: z
|
|
41
|
+
.number()
|
|
42
|
+
.describe('How many levels deep to populate relationships')
|
|
43
|
+
.optional()
|
|
44
|
+
.default(0),
|
|
45
|
+
draft: z
|
|
46
|
+
.boolean()
|
|
47
|
+
.describe(
|
|
48
|
+
'Only if getCollectionSchema includes _status; otherwise _status does not exist. true saves only a draft version; false updates main and versions. data._status: "published" overrides true.',
|
|
49
|
+
)
|
|
50
|
+
.optional()
|
|
51
|
+
.default(false),
|
|
52
|
+
fallbackLocale: z
|
|
53
|
+
.string()
|
|
54
|
+
.describe('Optional: fallback locale code to use when requested locale is not available')
|
|
55
|
+
.optional(),
|
|
56
|
+
file: fileInputSchema.optional(),
|
|
57
|
+
locale: z
|
|
58
|
+
.string()
|
|
59
|
+
.describe(
|
|
60
|
+
'Optional: locale code to update the document in (e.g., "en", "es"). Defaults to the default locale',
|
|
61
|
+
)
|
|
62
|
+
.optional(),
|
|
63
|
+
overrideLock: z
|
|
64
|
+
.boolean()
|
|
65
|
+
.describe('Whether to override document locks')
|
|
66
|
+
.optional()
|
|
67
|
+
.default(true),
|
|
68
|
+
overwriteExistingFiles: z
|
|
69
|
+
.boolean()
|
|
70
|
+
.describe('Whether to overwrite existing files')
|
|
71
|
+
.optional()
|
|
72
|
+
.default(false),
|
|
73
|
+
publishAllLocales: z
|
|
74
|
+
.boolean()
|
|
75
|
+
.describe(
|
|
76
|
+
'For collections with localized publishing status, whether publishing should affect every locale. Set false with locale to publish only that locale.',
|
|
77
|
+
)
|
|
78
|
+
.optional(),
|
|
79
|
+
select: z
|
|
80
|
+
.record(z.string(), z.unknown())
|
|
81
|
+
.describe(
|
|
82
|
+
'Optional: define exactly which fields you\'d like to return in the response, e.g., {"title": true}',
|
|
83
|
+
)
|
|
84
|
+
.optional(),
|
|
85
|
+
where: whereSchema
|
|
86
|
+
.describe(
|
|
87
|
+
'Where clause to update multiple documents. Use field names with Payload operators, and/or arrays for grouping. Example: {"title":{"contains":"test"}}',
|
|
88
|
+
)
|
|
89
|
+
.optional(),
|
|
90
|
+
}),
|
|
81
91
|
}).handler(async ({ authorizedMCP, collectionSlug, input, req }) => {
|
|
82
92
|
const payload = req.payload
|
|
83
93
|
const logger = getLogger({ payload })
|
|
@@ -88,10 +98,11 @@ export const updateCollectionTool = defineCollectionTool({
|
|
|
88
98
|
depth,
|
|
89
99
|
draft,
|
|
90
100
|
fallbackLocale,
|
|
91
|
-
|
|
101
|
+
file: fileInput,
|
|
92
102
|
locale,
|
|
93
103
|
overrideLock,
|
|
94
104
|
overwriteExistingFiles,
|
|
105
|
+
publishAllLocales,
|
|
95
106
|
select,
|
|
96
107
|
where,
|
|
97
108
|
} = input
|
|
@@ -107,48 +118,41 @@ export const updateCollectionTool = defineCollectionTool({
|
|
|
107
118
|
}
|
|
108
119
|
}
|
|
109
120
|
|
|
110
|
-
let parsedData = transformPointDataToPayload(data)
|
|
111
121
|
const virtualFieldNames = getCollectionVirtualFieldNames(payload.config, collectionSlug)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
logger.error(`Invalid where clause JSON: ${where}`)
|
|
120
|
-
return { content: [{ type: 'text', text: 'Error: Invalid JSON in where clause' }] }
|
|
121
|
-
}
|
|
122
|
-
}
|
|
122
|
+
const inputData = stripVirtualFields(data, virtualFieldNames)
|
|
123
|
+
const validationError = validateCollectionData({
|
|
124
|
+
collectionSlug,
|
|
125
|
+
data: inputData,
|
|
126
|
+
partial: true,
|
|
127
|
+
req,
|
|
128
|
+
})
|
|
123
129
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
try {
|
|
127
|
-
selectClause = JSON.parse(select) as SelectType
|
|
128
|
-
} catch {
|
|
129
|
-
logger.warn(`Invalid select clause JSON: ${select}`)
|
|
130
|
-
return { content: [{ type: 'text', text: 'Error: Invalid JSON in select clause' }] }
|
|
131
|
-
}
|
|
130
|
+
if (validationError) {
|
|
131
|
+
return validationError
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
+
const parsedData = transformPointDataToPayload(inputData)
|
|
135
|
+
const file = await resolveFileInput({ collectionSlug, input: fileInput, req })
|
|
136
|
+
|
|
137
|
+
const whereClause: Where = where ?? {}
|
|
138
|
+
|
|
134
139
|
if (id) {
|
|
135
|
-
const
|
|
140
|
+
const result = await payload.update({
|
|
136
141
|
id,
|
|
137
142
|
collection: collectionSlug,
|
|
138
143
|
data: parsedData,
|
|
139
144
|
depth,
|
|
140
145
|
draft,
|
|
146
|
+
overrideAccess: authorizedMCP.overrideAccess,
|
|
141
147
|
overrideLock,
|
|
142
148
|
req,
|
|
143
|
-
...
|
|
144
|
-
...(filePath ? { filePath } : {}),
|
|
149
|
+
...(file ? { file } : {}),
|
|
145
150
|
...(overwriteExistingFiles ? { overwriteExistingFiles } : {}),
|
|
151
|
+
...(publishAllLocales !== undefined ? { publishAllLocales } : {}),
|
|
146
152
|
...(locale ? { locale } : {}),
|
|
147
153
|
...(fallbackLocale ? { fallbackLocale } : {}),
|
|
148
|
-
...(
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const result = await payload.update(updateOptions as any)
|
|
154
|
+
...(select ? { select: select as SelectType } : {}),
|
|
155
|
+
})
|
|
152
156
|
|
|
153
157
|
return {
|
|
154
158
|
content: [
|
|
@@ -161,27 +165,25 @@ export const updateCollectionTool = defineCollectionTool({
|
|
|
161
165
|
}
|
|
162
166
|
}
|
|
163
167
|
|
|
164
|
-
const
|
|
168
|
+
const result = await payload.update({
|
|
165
169
|
collection: collectionSlug,
|
|
166
170
|
data: parsedData,
|
|
167
171
|
depth,
|
|
168
172
|
draft,
|
|
173
|
+
overrideAccess: authorizedMCP.overrideAccess,
|
|
169
174
|
overrideLock,
|
|
170
175
|
req,
|
|
171
|
-
...localAPIDefaults(authorizedMCP),
|
|
172
176
|
where: whereClause,
|
|
173
|
-
...(
|
|
177
|
+
...(file ? { file } : {}),
|
|
174
178
|
...(overwriteExistingFiles ? { overwriteExistingFiles } : {}),
|
|
179
|
+
...(publishAllLocales !== undefined ? { publishAllLocales } : {}),
|
|
175
180
|
...(locale ? { locale } : {}),
|
|
176
181
|
...(fallbackLocale ? { fallbackLocale } : {}),
|
|
177
|
-
...(
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const result = await payload.update(updateOptions as any)
|
|
182
|
+
...(select ? { select: select as SelectType } : {}),
|
|
183
|
+
})
|
|
181
184
|
|
|
182
|
-
const
|
|
183
|
-
const
|
|
184
|
-
const errors = bulkResult.errors || []
|
|
185
|
+
const docs = result.docs || []
|
|
186
|
+
const errors = result.errors || []
|
|
185
187
|
|
|
186
188
|
let responseText = `Multiple documents updated in collection "${collectionSlug}"!\nUpdated: ${docs.length} documents\nErrors: ${errors.length}\n---`
|
|
187
189
|
if (docs.length > 0) {
|
|
@@ -189,6 +191,28 @@ export const updateCollectionTool = defineCollectionTool({
|
|
|
189
191
|
}
|
|
190
192
|
if (errors.length > 0) {
|
|
191
193
|
responseText += `\n\nErrors:\n\`\`\`json\n${JSON.stringify(errors)}\n\`\`\``
|
|
194
|
+
|
|
195
|
+
const errorSchema = getCollectionInputSchema({ collectionSlug, req })
|
|
196
|
+
|
|
197
|
+
if (errorSchema) {
|
|
198
|
+
responseText += `\n\nUse this schema for data:\n\`\`\`json\n${JSON.stringify(errorSchema)}\n\`\`\``
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return {
|
|
202
|
+
content: [{ type: 'text', text: responseText }],
|
|
203
|
+
doc: { docs, errors } as unknown as Record<string, unknown>,
|
|
204
|
+
isError: true,
|
|
205
|
+
...(errorSchema
|
|
206
|
+
? {
|
|
207
|
+
structuredContent: {
|
|
208
|
+
collectionSlug,
|
|
209
|
+
docs,
|
|
210
|
+
errors,
|
|
211
|
+
schema: errorSchema,
|
|
212
|
+
},
|
|
213
|
+
}
|
|
214
|
+
: {}),
|
|
215
|
+
}
|
|
192
216
|
}
|
|
193
217
|
|
|
194
218
|
return {
|
|
@@ -198,13 +222,6 @@ export const updateCollectionTool = defineCollectionTool({
|
|
|
198
222
|
} catch (error) {
|
|
199
223
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error'
|
|
200
224
|
logger.error(`Error updating document in ${collectionSlug}: ${errorMessage}`)
|
|
201
|
-
return {
|
|
202
|
-
content: [
|
|
203
|
-
{
|
|
204
|
-
type: 'text',
|
|
205
|
-
text: `Error updating document in collection "${collectionSlug}": ${errorMessage}`,
|
|
206
|
-
},
|
|
207
|
-
],
|
|
208
|
-
}
|
|
225
|
+
return formatCollectionError({ action: 'updating', collectionSlug, error, req })
|
|
209
226
|
}
|
|
210
227
|
})
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { getAccessResults, isEntityHidden } from 'payload'
|
|
2
|
+
|
|
3
|
+
import { defineTool } from '../../defineTool.js'
|
|
4
|
+
|
|
5
|
+
export const getConfigInfoTool = defineTool({
|
|
6
|
+
annotations: {
|
|
7
|
+
destructiveHint: false,
|
|
8
|
+
idempotentHint: true,
|
|
9
|
+
openWorldHint: false,
|
|
10
|
+
readOnlyHint: true,
|
|
11
|
+
title: 'Config Info',
|
|
12
|
+
},
|
|
13
|
+
description: 'List the Payload collection and global slugs visible to this MCP client.',
|
|
14
|
+
}).handler(async ({ authorizedMCP, req }) => {
|
|
15
|
+
const user = req.user
|
|
16
|
+
const permissions = authorizedMCP.overrideAccess ? null : await getAccessResults({ req })
|
|
17
|
+
const authorizedCollectionSlugs = new Set<string>()
|
|
18
|
+
const authorizedGlobalSlugs = new Set<string>()
|
|
19
|
+
|
|
20
|
+
for (const item of authorizedMCP.items) {
|
|
21
|
+
if (item.type === 'collectionTool') {
|
|
22
|
+
authorizedCollectionSlugs.add(item.collectionSlug)
|
|
23
|
+
} else if (item.type === 'globalTool') {
|
|
24
|
+
authorizedGlobalSlugs.add(item.globalSlug)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const collections: string[] = []
|
|
29
|
+
const globals: string[] = []
|
|
30
|
+
|
|
31
|
+
for (const collection of req.payload.config.collections) {
|
|
32
|
+
if (!authorizedCollectionSlugs.has(collection.slug)) {
|
|
33
|
+
continue
|
|
34
|
+
}
|
|
35
|
+
if (user && isEntityHidden({ hidden: collection.admin.hidden, user })) {
|
|
36
|
+
continue
|
|
37
|
+
}
|
|
38
|
+
if (!authorizedMCP.overrideAccess && !permissions?.collections?.[collection.slug]?.read) {
|
|
39
|
+
continue
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
collections.push(collection.slug)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
for (const global of req.payload.config.globals) {
|
|
46
|
+
if (!authorizedGlobalSlugs.has(global.slug)) {
|
|
47
|
+
continue
|
|
48
|
+
}
|
|
49
|
+
if (user && isEntityHidden({ hidden: global.admin.hidden, user })) {
|
|
50
|
+
continue
|
|
51
|
+
}
|
|
52
|
+
if (!authorizedMCP.overrideAccess && !permissions?.globals?.[global.slug]?.read) {
|
|
53
|
+
continue
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
globals.push(global.slug)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
content: [
|
|
61
|
+
{
|
|
62
|
+
type: 'text',
|
|
63
|
+
text: `Collections: ${collections.join(', ') || 'none'}\nGlobals: ${globals.join(', ') || 'none'}`,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
}
|
|
67
|
+
})
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
import { defaultAccess } from '../../../defaultAccess.js'
|
|
4
|
+
import { defineGlobalTool } from '../../../defineTool.js'
|
|
5
|
+
import { getLogger } from '../../../utils/getLogger.js'
|
|
6
|
+
import { whereSchema } from '../../../utils/whereSchema.js'
|
|
7
|
+
|
|
8
|
+
const DEFAULT_DESCRIPTION =
|
|
9
|
+
'Count global versions in any version-enabled global by passing the global slug and optional where clause.'
|
|
10
|
+
|
|
11
|
+
export const countGlobalVersionsTool = defineGlobalTool({
|
|
12
|
+
access: (args) =>
|
|
13
|
+
defaultAccess(args) && Boolean(args.permissions?.globals?.[args.globalSlug]?.readVersions),
|
|
14
|
+
annotations: {
|
|
15
|
+
destructiveHint: false,
|
|
16
|
+
idempotentHint: true,
|
|
17
|
+
openWorldHint: false,
|
|
18
|
+
readOnlyHint: true,
|
|
19
|
+
title: 'Count Global Versions',
|
|
20
|
+
},
|
|
21
|
+
description: DEFAULT_DESCRIPTION,
|
|
22
|
+
input: z.object({
|
|
23
|
+
locale: z.string().describe('Optional: locale code to count versions in').optional(),
|
|
24
|
+
where: whereSchema
|
|
25
|
+
.describe(
|
|
26
|
+
'Optional: where clause for filtering versions. Version document fields are usually under "version". Example: {"version.siteName":{"contains":"test"}}',
|
|
27
|
+
)
|
|
28
|
+
.optional(),
|
|
29
|
+
}),
|
|
30
|
+
}).handler(async ({ authorizedMCP, globalSlug, input, req }) => {
|
|
31
|
+
const payload = req.payload
|
|
32
|
+
const logger = getLogger({ payload })
|
|
33
|
+
const { locale, where } = input
|
|
34
|
+
|
|
35
|
+
logger.info(`Counting versions for global: ${globalSlug}`)
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
const result = await payload.countGlobalVersions({
|
|
39
|
+
global: globalSlug,
|
|
40
|
+
overrideAccess: authorizedMCP.overrideAccess,
|
|
41
|
+
req,
|
|
42
|
+
...(locale ? { locale } : {}),
|
|
43
|
+
...(where ? { where } : {}),
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
49
|
+
type: 'text',
|
|
50
|
+
text: `Global "${globalSlug}" contains ${result.totalDocs} matching versions.\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
doc: result,
|
|
54
|
+
}
|
|
55
|
+
} catch (error) {
|
|
56
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error'
|
|
57
|
+
logger.error(`Error counting versions for global ${globalSlug}: ${errorMessage}`)
|
|
58
|
+
return {
|
|
59
|
+
content: [
|
|
60
|
+
{
|
|
61
|
+
type: 'text',
|
|
62
|
+
text: `❌ **Error counting versions for global "${globalSlug}":** ${errorMessage}`,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
isError: true,
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
})
|