@payloadcms/plugin-mcp 3.73.0-canary.5 → 3.73.0-canary.6
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/dist/mcp/getMcpHandler.js +1 -1
- package/dist/mcp/getMcpHandler.js.map +1 -1
- package/dist/mcp/tools/global/find.d.ts.map +1 -1
- package/dist/mcp/tools/global/find.js +23 -3
- package/dist/mcp/tools/global/find.js.map +1 -1
- package/dist/mcp/tools/global/update.d.ts.map +1 -1
- package/dist/mcp/tools/global/update.js +25 -4
- package/dist/mcp/tools/global/update.js.map +1 -1
- package/dist/mcp/tools/resource/create.d.ts.map +1 -1
- package/dist/mcp/tools/resource/create.js +25 -4
- package/dist/mcp/tools/resource/create.js.map +1 -1
- package/dist/mcp/tools/resource/find.d.ts.map +1 -1
- package/dist/mcp/tools/resource/find.js +27 -3
- package/dist/mcp/tools/resource/find.js.map +1 -1
- package/dist/mcp/tools/resource/update.d.ts.map +1 -1
- package/dist/mcp/tools/resource/update.js +27 -3
- package/dist/mcp/tools/resource/update.js.map +1 -1
- package/dist/mcp/tools/schemas.d.ts +15 -0
- package/dist/mcp/tools/schemas.d.ts.map +1 -1
- package/dist/mcp/tools/schemas.js +8 -3
- package/dist/mcp/tools/schemas.js.map +1 -1
- package/package.json +3 -3
- package/src/mcp/getMcpHandler.ts +1 -1
- package/src/mcp/tools/global/find.ts +25 -3
- package/src/mcp/tools/global/update.ts +31 -2
- package/src/mcp/tools/resource/create.ts +30 -2
- package/src/mcp/tools/resource/find.ts +37 -3
- package/src/mcp/tools/resource/update.ts +31 -1
- package/src/mcp/tools/schemas.ts +30 -0
|
@@ -204,7 +204,7 @@ export const getMCPHandler = (pluginOptions, mcpAccessSettings, req)=>{
|
|
|
204
204
|
}, {
|
|
205
205
|
serverInfo: serverOptions.serverInfo
|
|
206
206
|
}, {
|
|
207
|
-
basePath: MCPHandlerOptions.basePath || '/api',
|
|
207
|
+
basePath: MCPHandlerOptions.basePath || payload.config.routes?.api || '/api',
|
|
208
208
|
maxDuration: MCPHandlerOptions.maxDuration || 60,
|
|
209
209
|
// INFO: Disabled until developer clarity is reached for server side streaming and we have an auth pattern for all SSE patterns
|
|
210
210
|
// redisUrl: MCPHandlerOptions.redisUrl || process.env.REDIS_URL,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/getMcpHandler.ts"],"sourcesContent":["import type { JSONSchema4 } from 'json-schema'\n\nimport { createMcpHandler } from '@vercel/mcp-adapter'\nimport { join } from 'path'\nimport { APIError, configToJSONSchema, type PayloadRequest, type TypedUser } from 'payload'\n\nimport type { MCPAccessSettings, PluginMCPServerConfig } from '../types.js'\n\nimport { toCamelCase } from '../utils/camelCase.js'\nimport { getEnabledSlugs } from '../utils/getEnabledSlugs.js'\nimport { registerTool } from './registerTool.js'\n\n// Tools\nimport { findGlobalTool } from './tools/global/find.js'\nimport { updateGlobalTool } from './tools/global/update.js'\nimport { createResourceTool } from './tools/resource/create.js'\nimport { deleteResourceTool } from './tools/resource/delete.js'\nimport { findResourceTool } from './tools/resource/find.js'\nimport { updateResourceTool } from './tools/resource/update.js'\n\n// Experimental Tools\n/**\n * @experimental This tools are experimental and may change or be removed in the future.\n */\nimport { authTool } from './tools/auth/auth.js'\nimport { forgotPasswordTool } from './tools/auth/forgotPassword.js'\nimport { loginTool } from './tools/auth/login.js'\nimport { resetPasswordTool } from './tools/auth/resetPassword.js'\nimport { unlockTool } from './tools/auth/unlock.js'\nimport { verifyTool } from './tools/auth/verify.js'\nimport { createCollectionTool } from './tools/collection/create.js'\nimport { deleteCollectionTool } from './tools/collection/delete.js'\nimport { findCollectionTool } from './tools/collection/find.js'\nimport { updateCollectionTool } from './tools/collection/update.js'\nimport { findConfigTool } from './tools/config/find.js'\nimport { updateConfigTool } from './tools/config/update.js'\nimport { createJobTool } from './tools/job/create.js'\nimport { runJobTool } from './tools/job/run.js'\nimport { updateJobTool } from './tools/job/update.js'\n\nexport const getMCPHandler = (\n pluginOptions: PluginMCPServerConfig,\n mcpAccessSettings: MCPAccessSettings,\n req: PayloadRequest,\n) => {\n const { payload } = req\n const configSchema = configToJSONSchema(payload.config, payload.db.defaultIDType, req.i18n)\n\n // Handler wrapper that injects req before the _extra argument\n const wrapHandler = (handler: (...args: any[]) => any) => {\n return async (...args: any[]) => {\n const _extra = args[args.length - 1]\n const handlerArgs = args.slice(0, -1)\n return await handler(...handlerArgs, req, _extra)\n }\n }\n\n const payloadToolHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['tools']>[number]['handler'],\n ) => wrapHandler(handler)\n\n const payloadPromptHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['prompts']>[number]['handler'],\n ) => wrapHandler(handler)\n\n const payloadResourceHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['resources']>[number]['handler'],\n ) => wrapHandler(handler)\n\n // User\n const user = mcpAccessSettings.user\n\n // MCP Server and Handler Options\n const MCPOptions = pluginOptions.mcp || {}\n const customMCPTools = MCPOptions.tools || []\n const customMCPPrompts = MCPOptions.prompts || []\n const customMCPResources = MCPOptions.resources || []\n const MCPHandlerOptions = MCPOptions.handlerOptions || {}\n const serverOptions = MCPOptions.serverOptions || {}\n const useVerboseLogs = MCPHandlerOptions.verboseLogs ?? false\n\n // Experimental MCP Tool Requirements\n const isDevelopment = process.env.NODE_ENV === 'development'\n const experimentalTools: NonNullable<PluginMCPServerConfig['experimental']>['tools'] =\n pluginOptions?.experimental?.tools || {}\n const collectionsPluginConfig = pluginOptions.collections || {}\n const globalsPluginConfig = pluginOptions.globals || {}\n const collectionsDirPath =\n experimentalTools && experimentalTools.collections?.collectionsDirPath\n ? experimentalTools.collections.collectionsDirPath\n : join(process.cwd(), 'src/collections')\n const configFilePath =\n experimentalTools && experimentalTools.config?.configFilePath\n ? experimentalTools.config.configFilePath\n : join(process.cwd(), 'src/payload.config.ts')\n const jobsDirPath =\n experimentalTools && experimentalTools.jobs?.jobsDirPath\n ? experimentalTools.jobs.jobsDirPath\n : join(process.cwd(), 'src/jobs')\n\n try {\n return createMcpHandler(\n (server) => {\n // Get enabled collections\n const enabledCollectionSlugs = getEnabledSlugs(collectionsPluginConfig, 'collection')\n\n // Collection Operation Tools\n enabledCollectionSlugs.forEach((enabledCollectionSlug) => {\n try {\n const schema = configSchema.definitions?.[enabledCollectionSlug] as JSONSchema4\n\n const toolCapabilities = mcpAccessSettings?.[\n `${toCamelCase(enabledCollectionSlug)}`\n ] as Record<string, unknown>\n const allowCreate: boolean | undefined = toolCapabilities?.create as boolean\n const allowUpdate: boolean | undefined = toolCapabilities?.update as boolean\n const allowFind: boolean | undefined = toolCapabilities?.find as boolean\n const allowDelete: boolean | undefined = toolCapabilities?.delete as boolean\n\n if (allowCreate) {\n registerTool(\n allowCreate,\n `Create ${enabledCollectionSlug}`,\n () =>\n createResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowUpdate) {\n registerTool(\n allowUpdate,\n `Update ${enabledCollectionSlug}`,\n () =>\n updateResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowFind) {\n registerTool(\n allowFind,\n `Find ${enabledCollectionSlug}`,\n () =>\n findResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowDelete) {\n registerTool(\n allowDelete,\n `Delete ${enabledCollectionSlug}`,\n () =>\n deleteResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n } catch (error) {\n throw new APIError(\n `Error registering tools for collection ${enabledCollectionSlug}: ${String(error)}`,\n 500,\n )\n }\n })\n\n // Global Operation Tools\n const enabledGlobalSlugs = getEnabledSlugs(globalsPluginConfig, 'global')\n\n enabledGlobalSlugs.forEach((enabledGlobalSlug) => {\n try {\n const schema = configSchema.definitions?.[enabledGlobalSlug] as JSONSchema4\n\n const toolCapabilities = mcpAccessSettings?.[\n `${toCamelCase(enabledGlobalSlug)}`\n ] as Record<string, unknown>\n const allowFind: boolean | undefined = toolCapabilities?.['find'] as boolean\n const allowUpdate: boolean | undefined = toolCapabilities?.['update'] as boolean\n\n if (allowFind) {\n registerTool(\n allowFind,\n `Find ${enabledGlobalSlug}`,\n () =>\n findGlobalTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledGlobalSlug,\n globalsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowUpdate) {\n registerTool(\n allowUpdate,\n `Update ${enabledGlobalSlug}`,\n () =>\n updateGlobalTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledGlobalSlug,\n globalsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n } catch (error) {\n throw new APIError(\n `Error registering tools for global ${enabledGlobalSlug}: ${String(error)}`,\n 500,\n )\n }\n })\n\n // Custom tools\n customMCPTools.forEach((tool) => {\n const camelCasedToolName = toCamelCase(tool.name)\n const isToolEnabled = mcpAccessSettings['payload-mcp-tool']?.[camelCasedToolName] ?? false\n\n registerTool(\n isToolEnabled,\n tool.name,\n () =>\n server.tool(\n tool.name,\n tool.description,\n tool.parameters,\n payloadToolHandler(tool.handler),\n ),\n payload,\n useVerboseLogs,\n )\n })\n\n // Custom prompts\n customMCPPrompts.forEach((prompt) => {\n const camelCasedPromptName = toCamelCase(prompt.name)\n const isPromptEnabled =\n mcpAccessSettings['payload-mcp-prompt']?.[camelCasedPromptName] ?? false\n\n if (isPromptEnabled) {\n server.registerPrompt(\n prompt.name,\n {\n argsSchema: prompt.argsSchema,\n description: prompt.description,\n title: prompt.title,\n },\n payloadPromptHandler(prompt.handler),\n )\n if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ✅ Prompt: ${prompt.title} Registered.`)\n }\n } else if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ⏭️ Prompt: ${prompt.title} Skipped.`)\n }\n })\n\n // Custom resources\n customMCPResources.forEach((resource) => {\n const camelCasedResourceName = toCamelCase(resource.name)\n const isResourceEnabled =\n mcpAccessSettings['payload-mcp-resource']?.[camelCasedResourceName] ?? false\n\n if (isResourceEnabled) {\n server.registerResource(\n resource.name,\n // @ts-expect-error - Overload type is not working however -- ResourceTemplate OR String is a valid type\n resource.uri,\n {\n description: resource.description,\n mimeType: resource.mimeType,\n title: resource.title,\n },\n payloadResourceHandler(resource.handler),\n )\n\n if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ✅ Resource: ${resource.title} Registered.`)\n }\n } else if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ⏭️ Resource: ${resource.title} Skipped.`)\n }\n })\n\n // Experimental - Collection Schema Modfication Tools\n if (\n mcpAccessSettings.collections?.create &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.create,\n 'Create Collection',\n () =>\n createCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n if (\n mcpAccessSettings.collections?.delete &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.delete,\n 'Delete Collection',\n () =>\n deleteCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.collections?.find &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.find,\n 'Find Collection',\n () => findCollectionTool(server, req, useVerboseLogs, collectionsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.collections?.update &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.update,\n 'Update Collection',\n () =>\n updateCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Payload Config Modification Tools\n if (mcpAccessSettings.config?.find && experimentalTools.config?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.config.find,\n 'Find Config',\n () => findConfigTool(server, req, useVerboseLogs, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.config?.update &&\n experimentalTools.config?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.config.update,\n 'Update Config',\n () => updateConfigTool(server, req, useVerboseLogs, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Job Modification Tools\n if (mcpAccessSettings.jobs?.create && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.create,\n 'Create Job',\n () => createJobTool(server, req, useVerboseLogs, jobsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.jobs?.update && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.update,\n 'Update Job',\n () => updateJobTool(server, req, useVerboseLogs, jobsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.jobs?.run && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.run,\n 'Run Job',\n () => runJobTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Auth Modification Tools\n if (mcpAccessSettings.auth?.auth && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.auth,\n 'Auth',\n () => authTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.login && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.login,\n 'Login',\n () => loginTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.verify && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.verify,\n 'Verify',\n () => verifyTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.resetPassword && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.resetPassword,\n 'Reset Password',\n () => resetPasswordTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.forgotPassword && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.forgotPassword,\n 'Forgot Password',\n () => forgotPasswordTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.unlock && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.unlock,\n 'Unlock',\n () => unlockTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (useVerboseLogs) {\n payload.logger.info('[payload-mcp] 🚀 MCP Server Ready.')\n }\n },\n {\n serverInfo: serverOptions.serverInfo,\n },\n {\n basePath: MCPHandlerOptions.basePath || '/api',\n maxDuration: MCPHandlerOptions.maxDuration || 60,\n // INFO: Disabled until developer clarity is reached for server side streaming and we have an auth pattern for all SSE patterns\n // redisUrl: MCPHandlerOptions.redisUrl || process.env.REDIS_URL,\n verboseLogs: useVerboseLogs,\n },\n )\n } catch (error) {\n throw new APIError(`Error initializing MCP handler: ${String(error)}`, 500)\n }\n}\n"],"names":["createMcpHandler","join","APIError","configToJSONSchema","toCamelCase","getEnabledSlugs","registerTool","findGlobalTool","updateGlobalTool","createResourceTool","deleteResourceTool","findResourceTool","updateResourceTool","authTool","forgotPasswordTool","loginTool","resetPasswordTool","unlockTool","verifyTool","createCollectionTool","deleteCollectionTool","findCollectionTool","updateCollectionTool","findConfigTool","updateConfigTool","createJobTool","runJobTool","updateJobTool","getMCPHandler","pluginOptions","mcpAccessSettings","req","payload","configSchema","config","db","defaultIDType","i18n","wrapHandler","handler","args","_extra","length","handlerArgs","slice","payloadToolHandler","payloadPromptHandler","payloadResourceHandler","user","MCPOptions","mcp","customMCPTools","tools","customMCPPrompts","prompts","customMCPResources","resources","MCPHandlerOptions","handlerOptions","serverOptions","useVerboseLogs","verboseLogs","isDevelopment","process","env","NODE_ENV","experimentalTools","experimental","collectionsPluginConfig","collections","globalsPluginConfig","globals","collectionsDirPath","cwd","configFilePath","jobsDirPath","jobs","server","enabledCollectionSlugs","forEach","enabledCollectionSlug","schema","definitions","toolCapabilities","allowCreate","create","allowUpdate","update","allowFind","find","allowDelete","delete","error","String","enabledGlobalSlugs","enabledGlobalSlug","tool","camelCasedToolName","name","isToolEnabled","description","parameters","prompt","camelCasedPromptName","isPromptEnabled","registerPrompt","argsSchema","title","logger","info","resource","camelCasedResourceName","isResourceEnabled","registerResource","uri","mimeType","enabled","run","auth","login","verify","resetPassword","forgotPassword","unlock","serverInfo","basePath","maxDuration"],"mappings":"AAEA,SAASA,gBAAgB,QAAQ,sBAAqB;AACtD,SAASC,IAAI,QAAQ,OAAM;AAC3B,SAASC,QAAQ,EAAEC,kBAAkB,QAA6C,UAAS;AAI3F,SAASC,WAAW,QAAQ,wBAAuB;AACnD,SAASC,eAAe,QAAQ,8BAA6B;AAC7D,SAASC,YAAY,QAAQ,oBAAmB;AAEhD,QAAQ;AACR,SAASC,cAAc,QAAQ,yBAAwB;AACvD,SAASC,gBAAgB,QAAQ,2BAA0B;AAC3D,SAASC,kBAAkB,QAAQ,6BAA4B;AAC/D,SAASC,kBAAkB,QAAQ,6BAA4B;AAC/D,SAASC,gBAAgB,QAAQ,2BAA0B;AAC3D,SAASC,kBAAkB,QAAQ,6BAA4B;AAE/D,qBAAqB;AACrB;;CAEC,GACD,SAASC,QAAQ,QAAQ,uBAAsB;AAC/C,SAASC,kBAAkB,QAAQ,iCAAgC;AACnE,SAASC,SAAS,QAAQ,wBAAuB;AACjD,SAASC,iBAAiB,QAAQ,gCAA+B;AACjE,SAASC,UAAU,QAAQ,yBAAwB;AACnD,SAASC,UAAU,QAAQ,yBAAwB;AACnD,SAASC,oBAAoB,QAAQ,+BAA8B;AACnE,SAASC,oBAAoB,QAAQ,+BAA8B;AACnE,SAASC,kBAAkB,QAAQ,6BAA4B;AAC/D,SAASC,oBAAoB,QAAQ,+BAA8B;AACnE,SAASC,cAAc,QAAQ,yBAAwB;AACvD,SAASC,gBAAgB,QAAQ,2BAA0B;AAC3D,SAASC,aAAa,QAAQ,wBAAuB;AACrD,SAASC,UAAU,QAAQ,qBAAoB;AAC/C,SAASC,aAAa,QAAQ,wBAAuB;AAErD,OAAO,MAAMC,gBAAgB,CAC3BC,eACAC,mBACAC;IAEA,MAAM,EAAEC,OAAO,EAAE,GAAGD;IACpB,MAAME,eAAe9B,mBAAmB6B,QAAQE,MAAM,EAAEF,QAAQG,EAAE,CAACC,aAAa,EAAEL,IAAIM,IAAI;IAE1F,8DAA8D;IAC9D,MAAMC,cAAc,CAACC;QACnB,OAAO,OAAO,GAAGC;YACf,MAAMC,SAASD,IAAI,CAACA,KAAKE,MAAM,GAAG,EAAE;YACpC,MAAMC,cAAcH,KAAKI,KAAK,CAAC,GAAG,CAAC;YACnC,OAAO,MAAML,WAAWI,aAAaZ,KAAKU;QAC5C;IACF;IAEA,MAAMI,qBAAqB,CACzBN,UACGD,YAAYC;IAEjB,MAAMO,uBAAuB,CAC3BP,UACGD,YAAYC;IAEjB,MAAMQ,yBAAyB,CAC7BR,UACGD,YAAYC;IAEjB,OAAO;IACP,MAAMS,OAAOlB,kBAAkBkB,IAAI;IAEnC,iCAAiC;IACjC,MAAMC,aAAapB,cAAcqB,GAAG,IAAI,CAAC;IACzC,MAAMC,iBAAiBF,WAAWG,KAAK,IAAI,EAAE;IAC7C,MAAMC,mBAAmBJ,WAAWK,OAAO,IAAI,EAAE;IACjD,MAAMC,qBAAqBN,WAAWO,SAAS,IAAI,EAAE;IACrD,MAAMC,oBAAoBR,WAAWS,cAAc,IAAI,CAAC;IACxD,MAAMC,gBAAgBV,WAAWU,aAAa,IAAI,CAAC;IACnD,MAAMC,iBAAiBH,kBAAkBI,WAAW,IAAI;IAExD,qCAAqC;IACrC,MAAMC,gBAAgBC,QAAQC,GAAG,CAACC,QAAQ,KAAK;IAC/C,MAAMC,oBACJrC,eAAesC,cAAcf,SAAS,CAAC;IACzC,MAAMgB,0BAA0BvC,cAAcwC,WAAW,IAAI,CAAC;IAC9D,MAAMC,sBAAsBzC,cAAc0C,OAAO,IAAI,CAAC;IACtD,MAAMC,qBACJN,qBAAqBA,kBAAkBG,WAAW,EAAEG,qBAChDN,kBAAkBG,WAAW,CAACG,kBAAkB,GAChDvE,KAAK8D,QAAQU,GAAG,IAAI;IAC1B,MAAMC,iBACJR,qBAAqBA,kBAAkBhC,MAAM,EAAEwC,iBAC3CR,kBAAkBhC,MAAM,CAACwC,cAAc,GACvCzE,KAAK8D,QAAQU,GAAG,IAAI;IAC1B,MAAME,cACJT,qBAAqBA,kBAAkBU,IAAI,EAAED,cACzCT,kBAAkBU,IAAI,CAACD,WAAW,GAClC1E,KAAK8D,QAAQU,GAAG,IAAI;IAE1B,IAAI;QACF,OAAOzE,iBACL,CAAC6E;YACC,0BAA0B;YAC1B,MAAMC,yBAAyBzE,gBAAgB+D,yBAAyB;YAExE,6BAA6B;YAC7BU,uBAAuBC,OAAO,CAAC,CAACC;gBAC9B,IAAI;oBACF,MAAMC,SAAShD,aAAaiD,WAAW,EAAE,CAACF,sBAAsB;oBAEhE,MAAMG,mBAAmBrD,mBAAmB,CAC1C,GAAG1B,YAAY4E,wBAAwB,CACxC;oBACD,MAAMI,cAAmCD,kBAAkBE;oBAC3D,MAAMC,cAAmCH,kBAAkBI;oBAC3D,MAAMC,YAAiCL,kBAAkBM;oBACzD,MAAMC,cAAmCP,kBAAkBQ;oBAE3D,IAAIP,aAAa;wBACf9E,aACE8E,aACA,CAAC,OAAO,EAAEJ,uBAAuB,EACjC,IACEvE,mBACEoE,QACA9C,KACAiB,MACAY,gBACAoB,uBACAZ,yBACAa,SAEJjD,SACA4B;oBAEJ;oBACA,IAAI0B,aAAa;wBACfhF,aACEgF,aACA,CAAC,OAAO,EAAEN,uBAAuB,EACjC,IACEpE,mBACEiE,QACA9C,KACAiB,MACAY,gBACAoB,uBACAZ,yBACAa,SAEJjD,SACA4B;oBAEJ;oBACA,IAAI4B,WAAW;wBACblF,aACEkF,WACA,CAAC,KAAK,EAAER,uBAAuB,EAC/B,IACErE,iBACEkE,QACA9C,KACAiB,MACAY,gBACAoB,uBACAZ,0BAEJpC,SACA4B;oBAEJ;oBACA,IAAI8B,aAAa;wBACfpF,aACEoF,aACA,CAAC,OAAO,EAAEV,uBAAuB,EACjC,IACEtE,mBACEmE,QACA9C,KACAiB,MACAY,gBACAoB,uBACAZ,0BAEJpC,SACA4B;oBAEJ;gBACF,EAAE,OAAOgC,OAAO;oBACd,MAAM,IAAI1F,SACR,CAAC,uCAAuC,EAAE8E,sBAAsB,EAAE,EAAEa,OAAOD,QAAQ,EACnF;gBAEJ;YACF;YAEA,yBAAyB;YACzB,MAAME,qBAAqBzF,gBAAgBiE,qBAAqB;YAEhEwB,mBAAmBf,OAAO,CAAC,CAACgB;gBAC1B,IAAI;oBACF,MAAMd,SAAShD,aAAaiD,WAAW,EAAE,CAACa,kBAAkB;oBAE5D,MAAMZ,mBAAmBrD,mBAAmB,CAC1C,GAAG1B,YAAY2F,oBAAoB,CACpC;oBACD,MAAMP,YAAiCL,kBAAkB,CAAC,OAAO;oBACjE,MAAMG,cAAmCH,kBAAkB,CAAC,SAAS;oBAErE,IAAIK,WAAW;wBACblF,aACEkF,WACA,CAAC,KAAK,EAAEO,mBAAmB,EAC3B,IACExF,eACEsE,QACA9C,KACAiB,MACAY,gBACAmC,mBACAzB,sBAEJtC,SACA4B;oBAEJ;oBACA,IAAI0B,aAAa;wBACfhF,aACEgF,aACA,CAAC,OAAO,EAAES,mBAAmB,EAC7B,IACEvF,iBACEqE,QACA9C,KACAiB,MACAY,gBACAmC,mBACAzB,qBACAW,SAEJjD,SACA4B;oBAEJ;gBACF,EAAE,OAAOgC,OAAO;oBACd,MAAM,IAAI1F,SACR,CAAC,mCAAmC,EAAE6F,kBAAkB,EAAE,EAAEF,OAAOD,QAAQ,EAC3E;gBAEJ;YACF;YAEA,eAAe;YACfzC,eAAe4B,OAAO,CAAC,CAACiB;gBACtB,MAAMC,qBAAqB7F,YAAY4F,KAAKE,IAAI;gBAChD,MAAMC,gBAAgBrE,iBAAiB,CAAC,mBAAmB,EAAE,CAACmE,mBAAmB,IAAI;gBAErF3F,aACE6F,eACAH,KAAKE,IAAI,EACT,IACErB,OAAOmB,IAAI,CACTA,KAAKE,IAAI,EACTF,KAAKI,WAAW,EAChBJ,KAAKK,UAAU,EACfxD,mBAAmBmD,KAAKzD,OAAO,IAEnCP,SACA4B;YAEJ;YAEA,iBAAiB;YACjBP,iBAAiB0B,OAAO,CAAC,CAACuB;gBACxB,MAAMC,uBAAuBnG,YAAYkG,OAAOJ,IAAI;gBACpD,MAAMM,kBACJ1E,iBAAiB,CAAC,qBAAqB,EAAE,CAACyE,qBAAqB,IAAI;gBAErE,IAAIC,iBAAiB;oBACnB3B,OAAO4B,cAAc,CACnBH,OAAOJ,IAAI,EACX;wBACEQ,YAAYJ,OAAOI,UAAU;wBAC7BN,aAAaE,OAAOF,WAAW;wBAC/BO,OAAOL,OAAOK,KAAK;oBACrB,GACA7D,qBAAqBwD,OAAO/D,OAAO;oBAErC,IAAIqB,gBAAgB;wBAClB5B,QAAQ4E,MAAM,CAACC,IAAI,CAAC,CAAC,wBAAwB,EAAEP,OAAOK,KAAK,CAAC,YAAY,CAAC;oBAC3E;gBACF,OAAO,IAAI/C,gBAAgB;oBACzB5B,QAAQ4E,MAAM,CAACC,IAAI,CAAC,CAAC,yBAAyB,EAAEP,OAAOK,KAAK,CAAC,SAAS,CAAC;gBACzE;YACF;YAEA,mBAAmB;YACnBpD,mBAAmBwB,OAAO,CAAC,CAAC+B;gBAC1B,MAAMC,yBAAyB3G,YAAY0G,SAASZ,IAAI;gBACxD,MAAMc,oBACJlF,iBAAiB,CAAC,uBAAuB,EAAE,CAACiF,uBAAuB,IAAI;gBAEzE,IAAIC,mBAAmB;oBACrBnC,OAAOoC,gBAAgB,CACrBH,SAASZ,IAAI,EACb,wGAAwG;oBACxGY,SAASI,GAAG,EACZ;wBACEd,aAAaU,SAASV,WAAW;wBACjCe,UAAUL,SAASK,QAAQ;wBAC3BR,OAAOG,SAASH,KAAK;oBACvB,GACA5D,uBAAuB+D,SAASvE,OAAO;oBAGzC,IAAIqB,gBAAgB;wBAClB5B,QAAQ4E,MAAM,CAACC,IAAI,CAAC,CAAC,0BAA0B,EAAEC,SAASH,KAAK,CAAC,YAAY,CAAC;oBAC/E;gBACF,OAAO,IAAI/C,gBAAgB;oBACzB5B,QAAQ4E,MAAM,CAACC,IAAI,CAAC,CAAC,2BAA2B,EAAEC,SAASH,KAAK,CAAC,SAAS,CAAC;gBAC7E;YACF;YAEA,qDAAqD;YACrD,IACE7E,kBAAkBuC,WAAW,EAAEgB,UAC/BnB,kBAAkBG,WAAW,EAAE+C,WAC/BtD,eACA;gBACAxD,aACEwB,kBAAkBuC,WAAW,CAACgB,MAAM,EACpC,qBACA,IACElE,qBAAqB0D,QAAQ9C,KAAK6B,gBAAgBY,oBAAoBE,iBACxE1C,SACA4B;YAEJ;YACA,IACE9B,kBAAkBuC,WAAW,EAAEsB,UAC/BzB,kBAAkBG,WAAW,EAAE+C,WAC/BtD,eACA;gBACAxD,aACEwB,kBAAkBuC,WAAW,CAACsB,MAAM,EACpC,qBACA,IACEvE,qBAAqByD,QAAQ9C,KAAK6B,gBAAgBY,oBAAoBE,iBACxE1C,SACA4B;YAEJ;YAEA,IACE9B,kBAAkBuC,WAAW,EAAEoB,QAC/BvB,kBAAkBG,WAAW,EAAE+C,WAC/BtD,eACA;gBACAxD,aACEwB,kBAAkBuC,WAAW,CAACoB,IAAI,EAClC,mBACA,IAAMpE,mBAAmBwD,QAAQ9C,KAAK6B,gBAAgBY,qBACtDxC,SACA4B;YAEJ;YAEA,IACE9B,kBAAkBuC,WAAW,EAAEkB,UAC/BrB,kBAAkBG,WAAW,EAAE+C,WAC/BtD,eACA;gBACAxD,aACEwB,kBAAkBuC,WAAW,CAACkB,MAAM,EACpC,qBACA,IACEjE,qBAAqBuD,QAAQ9C,KAAK6B,gBAAgBY,oBAAoBE,iBACxE1C,SACA4B;YAEJ;YAEA,mDAAmD;YACnD,IAAI9B,kBAAkBI,MAAM,EAAEuD,QAAQvB,kBAAkBhC,MAAM,EAAEkF,WAAWtD,eAAe;gBACxFxD,aACEwB,kBAAkBI,MAAM,CAACuD,IAAI,EAC7B,eACA,IAAMlE,eAAesD,QAAQ9C,KAAK6B,gBAAgBc,iBAClD1C,SACA4B;YAEJ;YAEA,IACE9B,kBAAkBI,MAAM,EAAEqD,UAC1BrB,kBAAkBhC,MAAM,EAAEkF,WAC1BtD,eACA;gBACAxD,aACEwB,kBAAkBI,MAAM,CAACqD,MAAM,EAC/B,iBACA,IAAM/D,iBAAiBqD,QAAQ9C,KAAK6B,gBAAgBc,iBACpD1C,SACA4B;YAEJ;YAEA,wCAAwC;YACxC,IAAI9B,kBAAkB8C,IAAI,EAAES,UAAUnB,kBAAkBU,IAAI,EAAEwC,WAAWtD,eAAe;gBACtFxD,aACEwB,kBAAkB8C,IAAI,CAACS,MAAM,EAC7B,cACA,IAAM5D,cAAcoD,QAAQ9C,KAAK6B,gBAAgBe,cACjD3C,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkB8C,IAAI,EAAEW,UAAUrB,kBAAkBU,IAAI,EAAEwC,WAAWtD,eAAe;gBACtFxD,aACEwB,kBAAkB8C,IAAI,CAACW,MAAM,EAC7B,cACA,IAAM5D,cAAckD,QAAQ9C,KAAK6B,gBAAgBe,cACjD3C,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkB8C,IAAI,EAAEyC,OAAOnD,kBAAkBU,IAAI,EAAEwC,WAAWtD,eAAe;gBACnFxD,aACEwB,kBAAkB8C,IAAI,CAACyC,GAAG,EAC1B,WACA,IAAM3F,WAAWmD,QAAQ9C,KAAK6B,iBAC9B5B,SACA4B;YAEJ;YAEA,yCAAyC;YACzC,IAAI9B,kBAAkBwF,IAAI,EAAEA,QAAQpD,kBAAkBoD,IAAI,EAAEF,WAAWtD,eAAe;gBACpFxD,aACEwB,kBAAkBwF,IAAI,CAACA,IAAI,EAC3B,QACA,IAAMzG,SAASgE,QAAQ9C,KAAK6B,iBAC5B5B,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkBwF,IAAI,EAAEC,SAASrD,kBAAkBoD,IAAI,EAAEF,WAAWtD,eAAe;gBACrFxD,aACEwB,kBAAkBwF,IAAI,CAACC,KAAK,EAC5B,SACA,IAAMxG,UAAU8D,QAAQ9C,KAAK6B,iBAC7B5B,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkBwF,IAAI,EAAEE,UAAUtD,kBAAkBoD,IAAI,EAAEF,WAAWtD,eAAe;gBACtFxD,aACEwB,kBAAkBwF,IAAI,CAACE,MAAM,EAC7B,UACA,IAAMtG,WAAW2D,QAAQ9C,KAAK6B,iBAC9B5B,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkBwF,IAAI,EAAEG,iBAAiBvD,kBAAkBoD,IAAI,EAAEF,SAAS;gBAC5E9G,aACEwB,kBAAkBwF,IAAI,CAACG,aAAa,EACpC,kBACA,IAAMzG,kBAAkB6D,QAAQ9C,KAAK6B,iBACrC5B,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkBwF,IAAI,EAAEI,kBAAkBxD,kBAAkBoD,IAAI,EAAEF,SAAS;gBAC7E9G,aACEwB,kBAAkBwF,IAAI,CAACI,cAAc,EACrC,mBACA,IAAM5G,mBAAmB+D,QAAQ9C,KAAK6B,iBACtC5B,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkBwF,IAAI,EAAEK,UAAUzD,kBAAkBoD,IAAI,EAAEF,SAAS;gBACrE9G,aACEwB,kBAAkBwF,IAAI,CAACK,MAAM,EAC7B,UACA,IAAM1G,WAAW4D,QAAQ9C,KAAK6B,iBAC9B5B,SACA4B;YAEJ;YAEA,IAAIA,gBAAgB;gBAClB5B,QAAQ4E,MAAM,CAACC,IAAI,CAAC;YACtB;QACF,GACA;YACEe,YAAYjE,cAAciE,UAAU;QACtC,GACA;YACEC,UAAUpE,kBAAkBoE,QAAQ,IAAI;YACxCC,aAAarE,kBAAkBqE,WAAW,IAAI;YAC9C,+HAA+H;YAC/H,iEAAiE;YACjEjE,aAAaD;QACf;IAEJ,EAAE,OAAOgC,OAAO;QACd,MAAM,IAAI1F,SAAS,CAAC,gCAAgC,EAAE2F,OAAOD,QAAQ,EAAE;IACzE;AACF,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/getMcpHandler.ts"],"sourcesContent":["import type { JSONSchema4 } from 'json-schema'\n\nimport { createMcpHandler } from '@vercel/mcp-adapter'\nimport { join } from 'path'\nimport { APIError, configToJSONSchema, type PayloadRequest, type TypedUser } from 'payload'\n\nimport type { MCPAccessSettings, PluginMCPServerConfig } from '../types.js'\n\nimport { toCamelCase } from '../utils/camelCase.js'\nimport { getEnabledSlugs } from '../utils/getEnabledSlugs.js'\nimport { registerTool } from './registerTool.js'\n\n// Tools\nimport { findGlobalTool } from './tools/global/find.js'\nimport { updateGlobalTool } from './tools/global/update.js'\nimport { createResourceTool } from './tools/resource/create.js'\nimport { deleteResourceTool } from './tools/resource/delete.js'\nimport { findResourceTool } from './tools/resource/find.js'\nimport { updateResourceTool } from './tools/resource/update.js'\n\n// Experimental Tools\n/**\n * @experimental This tools are experimental and may change or be removed in the future.\n */\nimport { authTool } from './tools/auth/auth.js'\nimport { forgotPasswordTool } from './tools/auth/forgotPassword.js'\nimport { loginTool } from './tools/auth/login.js'\nimport { resetPasswordTool } from './tools/auth/resetPassword.js'\nimport { unlockTool } from './tools/auth/unlock.js'\nimport { verifyTool } from './tools/auth/verify.js'\nimport { createCollectionTool } from './tools/collection/create.js'\nimport { deleteCollectionTool } from './tools/collection/delete.js'\nimport { findCollectionTool } from './tools/collection/find.js'\nimport { updateCollectionTool } from './tools/collection/update.js'\nimport { findConfigTool } from './tools/config/find.js'\nimport { updateConfigTool } from './tools/config/update.js'\nimport { createJobTool } from './tools/job/create.js'\nimport { runJobTool } from './tools/job/run.js'\nimport { updateJobTool } from './tools/job/update.js'\n\nexport const getMCPHandler = (\n pluginOptions: PluginMCPServerConfig,\n mcpAccessSettings: MCPAccessSettings,\n req: PayloadRequest,\n) => {\n const { payload } = req\n const configSchema = configToJSONSchema(payload.config, payload.db.defaultIDType, req.i18n)\n\n // Handler wrapper that injects req before the _extra argument\n const wrapHandler = (handler: (...args: any[]) => any) => {\n return async (...args: any[]) => {\n const _extra = args[args.length - 1]\n const handlerArgs = args.slice(0, -1)\n return await handler(...handlerArgs, req, _extra)\n }\n }\n\n const payloadToolHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['tools']>[number]['handler'],\n ) => wrapHandler(handler)\n\n const payloadPromptHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['prompts']>[number]['handler'],\n ) => wrapHandler(handler)\n\n const payloadResourceHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['resources']>[number]['handler'],\n ) => wrapHandler(handler)\n\n // User\n const user = mcpAccessSettings.user\n\n // MCP Server and Handler Options\n const MCPOptions = pluginOptions.mcp || {}\n const customMCPTools = MCPOptions.tools || []\n const customMCPPrompts = MCPOptions.prompts || []\n const customMCPResources = MCPOptions.resources || []\n const MCPHandlerOptions = MCPOptions.handlerOptions || {}\n const serverOptions = MCPOptions.serverOptions || {}\n const useVerboseLogs = MCPHandlerOptions.verboseLogs ?? false\n\n // Experimental MCP Tool Requirements\n const isDevelopment = process.env.NODE_ENV === 'development'\n const experimentalTools: NonNullable<PluginMCPServerConfig['experimental']>['tools'] =\n pluginOptions?.experimental?.tools || {}\n const collectionsPluginConfig = pluginOptions.collections || {}\n const globalsPluginConfig = pluginOptions.globals || {}\n const collectionsDirPath =\n experimentalTools && experimentalTools.collections?.collectionsDirPath\n ? experimentalTools.collections.collectionsDirPath\n : join(process.cwd(), 'src/collections')\n const configFilePath =\n experimentalTools && experimentalTools.config?.configFilePath\n ? experimentalTools.config.configFilePath\n : join(process.cwd(), 'src/payload.config.ts')\n const jobsDirPath =\n experimentalTools && experimentalTools.jobs?.jobsDirPath\n ? experimentalTools.jobs.jobsDirPath\n : join(process.cwd(), 'src/jobs')\n\n try {\n return createMcpHandler(\n (server) => {\n // Get enabled collections\n const enabledCollectionSlugs = getEnabledSlugs(collectionsPluginConfig, 'collection')\n\n // Collection Operation Tools\n enabledCollectionSlugs.forEach((enabledCollectionSlug) => {\n try {\n const schema = configSchema.definitions?.[enabledCollectionSlug] as JSONSchema4\n\n const toolCapabilities = mcpAccessSettings?.[\n `${toCamelCase(enabledCollectionSlug)}`\n ] as Record<string, unknown>\n const allowCreate: boolean | undefined = toolCapabilities?.create as boolean\n const allowUpdate: boolean | undefined = toolCapabilities?.update as boolean\n const allowFind: boolean | undefined = toolCapabilities?.find as boolean\n const allowDelete: boolean | undefined = toolCapabilities?.delete as boolean\n\n if (allowCreate) {\n registerTool(\n allowCreate,\n `Create ${enabledCollectionSlug}`,\n () =>\n createResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowUpdate) {\n registerTool(\n allowUpdate,\n `Update ${enabledCollectionSlug}`,\n () =>\n updateResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowFind) {\n registerTool(\n allowFind,\n `Find ${enabledCollectionSlug}`,\n () =>\n findResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowDelete) {\n registerTool(\n allowDelete,\n `Delete ${enabledCollectionSlug}`,\n () =>\n deleteResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n } catch (error) {\n throw new APIError(\n `Error registering tools for collection ${enabledCollectionSlug}: ${String(error)}`,\n 500,\n )\n }\n })\n\n // Global Operation Tools\n const enabledGlobalSlugs = getEnabledSlugs(globalsPluginConfig, 'global')\n\n enabledGlobalSlugs.forEach((enabledGlobalSlug) => {\n try {\n const schema = configSchema.definitions?.[enabledGlobalSlug] as JSONSchema4\n\n const toolCapabilities = mcpAccessSettings?.[\n `${toCamelCase(enabledGlobalSlug)}`\n ] as Record<string, unknown>\n const allowFind: boolean | undefined = toolCapabilities?.['find'] as boolean\n const allowUpdate: boolean | undefined = toolCapabilities?.['update'] as boolean\n\n if (allowFind) {\n registerTool(\n allowFind,\n `Find ${enabledGlobalSlug}`,\n () =>\n findGlobalTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledGlobalSlug,\n globalsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowUpdate) {\n registerTool(\n allowUpdate,\n `Update ${enabledGlobalSlug}`,\n () =>\n updateGlobalTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledGlobalSlug,\n globalsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n } catch (error) {\n throw new APIError(\n `Error registering tools for global ${enabledGlobalSlug}: ${String(error)}`,\n 500,\n )\n }\n })\n\n // Custom tools\n customMCPTools.forEach((tool) => {\n const camelCasedToolName = toCamelCase(tool.name)\n const isToolEnabled = mcpAccessSettings['payload-mcp-tool']?.[camelCasedToolName] ?? false\n\n registerTool(\n isToolEnabled,\n tool.name,\n () =>\n server.tool(\n tool.name,\n tool.description,\n tool.parameters,\n payloadToolHandler(tool.handler),\n ),\n payload,\n useVerboseLogs,\n )\n })\n\n // Custom prompts\n customMCPPrompts.forEach((prompt) => {\n const camelCasedPromptName = toCamelCase(prompt.name)\n const isPromptEnabled =\n mcpAccessSettings['payload-mcp-prompt']?.[camelCasedPromptName] ?? false\n\n if (isPromptEnabled) {\n server.registerPrompt(\n prompt.name,\n {\n argsSchema: prompt.argsSchema,\n description: prompt.description,\n title: prompt.title,\n },\n payloadPromptHandler(prompt.handler),\n )\n if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ✅ Prompt: ${prompt.title} Registered.`)\n }\n } else if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ⏭️ Prompt: ${prompt.title} Skipped.`)\n }\n })\n\n // Custom resources\n customMCPResources.forEach((resource) => {\n const camelCasedResourceName = toCamelCase(resource.name)\n const isResourceEnabled =\n mcpAccessSettings['payload-mcp-resource']?.[camelCasedResourceName] ?? false\n\n if (isResourceEnabled) {\n server.registerResource(\n resource.name,\n // @ts-expect-error - Overload type is not working however -- ResourceTemplate OR String is a valid type\n resource.uri,\n {\n description: resource.description,\n mimeType: resource.mimeType,\n title: resource.title,\n },\n payloadResourceHandler(resource.handler),\n )\n\n if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ✅ Resource: ${resource.title} Registered.`)\n }\n } else if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ⏭️ Resource: ${resource.title} Skipped.`)\n }\n })\n\n // Experimental - Collection Schema Modfication Tools\n if (\n mcpAccessSettings.collections?.create &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.create,\n 'Create Collection',\n () =>\n createCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n if (\n mcpAccessSettings.collections?.delete &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.delete,\n 'Delete Collection',\n () =>\n deleteCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.collections?.find &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.find,\n 'Find Collection',\n () => findCollectionTool(server, req, useVerboseLogs, collectionsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.collections?.update &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.update,\n 'Update Collection',\n () =>\n updateCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Payload Config Modification Tools\n if (mcpAccessSettings.config?.find && experimentalTools.config?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.config.find,\n 'Find Config',\n () => findConfigTool(server, req, useVerboseLogs, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.config?.update &&\n experimentalTools.config?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.config.update,\n 'Update Config',\n () => updateConfigTool(server, req, useVerboseLogs, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Job Modification Tools\n if (mcpAccessSettings.jobs?.create && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.create,\n 'Create Job',\n () => createJobTool(server, req, useVerboseLogs, jobsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.jobs?.update && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.update,\n 'Update Job',\n () => updateJobTool(server, req, useVerboseLogs, jobsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.jobs?.run && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.run,\n 'Run Job',\n () => runJobTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Auth Modification Tools\n if (mcpAccessSettings.auth?.auth && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.auth,\n 'Auth',\n () => authTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.login && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.login,\n 'Login',\n () => loginTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.verify && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.verify,\n 'Verify',\n () => verifyTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.resetPassword && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.resetPassword,\n 'Reset Password',\n () => resetPasswordTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.forgotPassword && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.forgotPassword,\n 'Forgot Password',\n () => forgotPasswordTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.unlock && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.unlock,\n 'Unlock',\n () => unlockTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (useVerboseLogs) {\n payload.logger.info('[payload-mcp] 🚀 MCP Server Ready.')\n }\n },\n {\n serverInfo: serverOptions.serverInfo,\n },\n {\n basePath: MCPHandlerOptions.basePath || payload.config.routes?.api || '/api',\n maxDuration: MCPHandlerOptions.maxDuration || 60,\n // INFO: Disabled until developer clarity is reached for server side streaming and we have an auth pattern for all SSE patterns\n // redisUrl: MCPHandlerOptions.redisUrl || process.env.REDIS_URL,\n verboseLogs: useVerboseLogs,\n },\n )\n } catch (error) {\n throw new APIError(`Error initializing MCP handler: ${String(error)}`, 500)\n }\n}\n"],"names":["createMcpHandler","join","APIError","configToJSONSchema","toCamelCase","getEnabledSlugs","registerTool","findGlobalTool","updateGlobalTool","createResourceTool","deleteResourceTool","findResourceTool","updateResourceTool","authTool","forgotPasswordTool","loginTool","resetPasswordTool","unlockTool","verifyTool","createCollectionTool","deleteCollectionTool","findCollectionTool","updateCollectionTool","findConfigTool","updateConfigTool","createJobTool","runJobTool","updateJobTool","getMCPHandler","pluginOptions","mcpAccessSettings","req","payload","configSchema","config","db","defaultIDType","i18n","wrapHandler","handler","args","_extra","length","handlerArgs","slice","payloadToolHandler","payloadPromptHandler","payloadResourceHandler","user","MCPOptions","mcp","customMCPTools","tools","customMCPPrompts","prompts","customMCPResources","resources","MCPHandlerOptions","handlerOptions","serverOptions","useVerboseLogs","verboseLogs","isDevelopment","process","env","NODE_ENV","experimentalTools","experimental","collectionsPluginConfig","collections","globalsPluginConfig","globals","collectionsDirPath","cwd","configFilePath","jobsDirPath","jobs","server","enabledCollectionSlugs","forEach","enabledCollectionSlug","schema","definitions","toolCapabilities","allowCreate","create","allowUpdate","update","allowFind","find","allowDelete","delete","error","String","enabledGlobalSlugs","enabledGlobalSlug","tool","camelCasedToolName","name","isToolEnabled","description","parameters","prompt","camelCasedPromptName","isPromptEnabled","registerPrompt","argsSchema","title","logger","info","resource","camelCasedResourceName","isResourceEnabled","registerResource","uri","mimeType","enabled","run","auth","login","verify","resetPassword","forgotPassword","unlock","serverInfo","basePath","routes","api","maxDuration"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/global/find.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/global/find.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAc,SAAS,EAAE,MAAM,SAAS,CAAA;AAEpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAK9D,eAAO,MAAM,cAAc,WACjB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,cACR,MAAM,WACT,qBAAqB,CAAC,SAAS,CAAC,SA+G1C,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { toCamelCase } from '../../../utils/camelCase.js';
|
|
2
2
|
import { toolSchemas } from '../schemas.js';
|
|
3
3
|
export const findGlobalTool = (server, req, user, verboseLogs, globalSlug, globals)=>{
|
|
4
|
-
const tool = async (depth = 0, locale, fallbackLocale)=>{
|
|
4
|
+
const tool = async (depth = 0, locale, fallbackLocale, select)=>{
|
|
5
5
|
const payload = req.payload;
|
|
6
6
|
if (verboseLogs) {
|
|
7
7
|
payload.logger.info(`[payload-mcp] Reading global: ${globalSlug}, depth: ${depth}${locale ? `, locale: ${locale}` : ''}`);
|
|
@@ -12,6 +12,23 @@ export const findGlobalTool = (server, req, user, verboseLogs, globalSlug, globa
|
|
|
12
12
|
depth,
|
|
13
13
|
user
|
|
14
14
|
};
|
|
15
|
+
let selectClause;
|
|
16
|
+
if (select) {
|
|
17
|
+
try {
|
|
18
|
+
selectClause = JSON.parse(select);
|
|
19
|
+
} catch (_parseError) {
|
|
20
|
+
payload.logger.warn(`[payload-mcp] Invalid select clause JSON for global: ${select}`);
|
|
21
|
+
const response = {
|
|
22
|
+
content: [
|
|
23
|
+
{
|
|
24
|
+
type: 'text',
|
|
25
|
+
text: 'Error: Invalid JSON in select clause'
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
};
|
|
29
|
+
return globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
15
32
|
// Add locale parameters if provided
|
|
16
33
|
if (locale) {
|
|
17
34
|
findOptions.locale = locale;
|
|
@@ -19,6 +36,9 @@ export const findGlobalTool = (server, req, user, verboseLogs, globalSlug, globa
|
|
|
19
36
|
if (fallbackLocale) {
|
|
20
37
|
findOptions.fallbackLocale = fallbackLocale;
|
|
21
38
|
}
|
|
39
|
+
if (selectClause) {
|
|
40
|
+
findOptions.select = selectClause;
|
|
41
|
+
}
|
|
22
42
|
const result = await payload.findGlobal(findOptions);
|
|
23
43
|
if (verboseLogs) {
|
|
24
44
|
payload.logger.info(`[payload-mcp] Found global: ${globalSlug}`);
|
|
@@ -50,8 +70,8 @@ ${JSON.stringify(result, null, 2)}
|
|
|
50
70
|
}
|
|
51
71
|
};
|
|
52
72
|
if (globals?.[globalSlug]?.enabled) {
|
|
53
|
-
server.tool(`find${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`, `${toolSchemas.findGlobal.description.trim()}\n\n${globals?.[globalSlug]?.description || ''}`, toolSchemas.findGlobal.parameters.shape, async ({ depth, fallbackLocale, locale })=>{
|
|
54
|
-
return await tool(depth, locale, fallbackLocale);
|
|
73
|
+
server.tool(`find${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`, `${toolSchemas.findGlobal.description.trim()}\n\n${globals?.[globalSlug]?.description || ''}`, toolSchemas.findGlobal.parameters.shape, async ({ depth, fallbackLocale, locale, select })=>{
|
|
74
|
+
return await tool(depth, locale, fallbackLocale, select);
|
|
55
75
|
});
|
|
56
76
|
}
|
|
57
77
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/mcp/tools/global/find.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest, TypedUser } from 'payload'\n\nimport type { PluginMCPServerConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const findGlobalTool = (\n server: McpServer,\n req: PayloadRequest,\n user: TypedUser,\n verboseLogs: boolean,\n globalSlug: string,\n globals: PluginMCPServerConfig['globals'],\n) => {\n const tool = async (\n depth: number = 0,\n locale?: string,\n fallbackLocale?: string,\n ): Promise<{\n content: Array<{\n text: string\n type: 'text'\n }>\n }> => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Reading global: ${globalSlug}, depth: ${depth}${locale ? `, locale: ${locale}` : ''}`,\n )\n }\n\n try {\n const findOptions: Parameters<typeof payload.findGlobal>[0] = {\n slug: globalSlug,\n depth,\n user,\n }\n\n // Add locale parameters if provided\n if (locale) {\n findOptions.locale = locale\n }\n if (fallbackLocale) {\n findOptions.fallbackLocale = fallbackLocale\n }\n\n const result = await payload.findGlobal(findOptions)\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Found global: ${globalSlug}`)\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Global \"${globalSlug}\":\n\\`\\`\\`json\n${JSON.stringify(result, null, 2)}\n\\`\\`\\``,\n },\n ],\n }\n\n return (globals?.[globalSlug]?.overrideResponse?.(response, result, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(`[payload-mcp] Error reading global ${globalSlug}: ${errorMessage}`)\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error reading global \"${globalSlug}\":** ${errorMessage}`,\n },\n ],\n }\n return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n if (globals?.[globalSlug]?.enabled) {\n server.tool(\n `find${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`,\n `${toolSchemas.findGlobal.description.trim()}\\n\\n${globals?.[globalSlug]?.description || ''}`,\n toolSchemas.findGlobal.parameters.shape,\n async ({ depth, fallbackLocale, locale }) => {\n return await tool(depth, locale, fallbackLocale)\n },\n )\n }\n}\n"],"names":["toCamelCase","toolSchemas","findGlobalTool","server","req","user","verboseLogs","globalSlug","globals","tool","depth","locale","fallbackLocale","payload","logger","info","findOptions","slug","
|
|
1
|
+
{"version":3,"sources":["../../../../src/mcp/tools/global/find.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest, SelectType, TypedUser } from 'payload'\n\nimport type { PluginMCPServerConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const findGlobalTool = (\n server: McpServer,\n req: PayloadRequest,\n user: TypedUser,\n verboseLogs: boolean,\n globalSlug: string,\n globals: PluginMCPServerConfig['globals'],\n) => {\n const tool = async (\n depth: number = 0,\n locale?: string,\n fallbackLocale?: string,\n select?: string,\n ): Promise<{\n content: Array<{\n text: string\n type: 'text'\n }>\n }> => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Reading global: ${globalSlug}, depth: ${depth}${locale ? `, locale: ${locale}` : ''}`,\n )\n }\n\n try {\n const findOptions: Parameters<typeof payload.findGlobal>[0] = {\n slug: globalSlug,\n depth,\n user,\n }\n\n let selectClause: SelectType | undefined\n if (select) {\n try {\n selectClause = JSON.parse(select) as SelectType\n } catch (_parseError) {\n payload.logger.warn(`[payload-mcp] Invalid select clause JSON for global: ${select}`)\n const response = {\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON in select clause' }],\n }\n return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n // Add locale parameters if provided\n if (locale) {\n findOptions.locale = locale\n }\n if (fallbackLocale) {\n findOptions.fallbackLocale = fallbackLocale\n }\n if (selectClause) {\n findOptions.select = selectClause\n }\n\n const result = await payload.findGlobal(findOptions)\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Found global: ${globalSlug}`)\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Global \"${globalSlug}\":\n\\`\\`\\`json\n${JSON.stringify(result, null, 2)}\n\\`\\`\\``,\n },\n ],\n }\n\n return (globals?.[globalSlug]?.overrideResponse?.(response, result, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(`[payload-mcp] Error reading global ${globalSlug}: ${errorMessage}`)\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error reading global \"${globalSlug}\":** ${errorMessage}`,\n },\n ],\n }\n return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n if (globals?.[globalSlug]?.enabled) {\n server.tool(\n `find${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`,\n `${toolSchemas.findGlobal.description.trim()}\\n\\n${globals?.[globalSlug]?.description || ''}`,\n toolSchemas.findGlobal.parameters.shape,\n async ({ depth, fallbackLocale, locale, select }) => {\n return await tool(depth, locale, fallbackLocale, select)\n },\n )\n }\n}\n"],"names":["toCamelCase","toolSchemas","findGlobalTool","server","req","user","verboseLogs","globalSlug","globals","tool","depth","locale","fallbackLocale","select","payload","logger","info","findOptions","slug","selectClause","JSON","parse","_parseError","warn","response","content","type","text","overrideResponse","result","findGlobal","stringify","error","errorMessage","Error","message","enabled","charAt","toUpperCase","slice","description","trim","parameters","shape"],"mappings":"AAKA,SAASA,WAAW,QAAQ,8BAA6B;AACzD,SAASC,WAAW,QAAQ,gBAAe;AAE3C,OAAO,MAAMC,iBAAiB,CAC5BC,QACAC,KACAC,MACAC,aACAC,YACAC;IAEA,MAAMC,OAAO,OACXC,QAAgB,CAAC,EACjBC,QACAC,gBACAC;QAOA,MAAMC,UAAUV,IAAIU,OAAO;QAE3B,IAAIR,aAAa;YACfQ,QAAQC,MAAM,CAACC,IAAI,CACjB,CAAC,8BAA8B,EAAET,WAAW,SAAS,EAAEG,QAAQC,SAAS,CAAC,UAAU,EAAEA,QAAQ,GAAG,IAAI;QAExG;QAEA,IAAI;YACF,MAAMM,cAAwD;gBAC5DC,MAAMX;gBACNG;gBACAL;YACF;YAEA,IAAIc;YACJ,IAAIN,QAAQ;gBACV,IAAI;oBACFM,eAAeC,KAAKC,KAAK,CAACR;gBAC5B,EAAE,OAAOS,aAAa;oBACpBR,QAAQC,MAAM,CAACQ,IAAI,CAAC,CAAC,qDAAqD,EAAEV,QAAQ;oBACpF,MAAMW,WAAW;wBACfC,SAAS;4BAAC;gCAAEC,MAAM;gCAAiBC,MAAM;4BAAuC;yBAAE;oBACpF;oBACA,OAAQnB,SAAS,CAACD,WAAW,EAAEqB,mBAAmBJ,UAAU,CAAC,GAAGpB,QAAQoB;gBAM1E;YACF;YAEA,oCAAoC;YACpC,IAAIb,QAAQ;gBACVM,YAAYN,MAAM,GAAGA;YACvB;YACA,IAAIC,gBAAgB;gBAClBK,YAAYL,cAAc,GAAGA;YAC/B;YACA,IAAIO,cAAc;gBAChBF,YAAYJ,MAAM,GAAGM;YACvB;YAEA,MAAMU,SAAS,MAAMf,QAAQgB,UAAU,CAACb;YAExC,IAAIX,aAAa;gBACfQ,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,4BAA4B,EAAET,YAAY;YACjE;YAEA,MAAMiB,WAAW;gBACfC,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,QAAQ,EAAEpB,WAAW;;AAExC,EAAEa,KAAKW,SAAS,CAACF,QAAQ,MAAM,GAAG;MAC5B,CAAC;oBACG;iBACD;YACH;YAEA,OAAQrB,SAAS,CAACD,WAAW,EAAEqB,mBAAmBJ,UAAUK,QAAQzB,QAAQoB;QAM9E,EAAE,OAAOQ,OAAO;YACd,MAAMC,eAAeD,iBAAiBE,QAAQF,MAAMG,OAAO,GAAG;YAC9DrB,QAAQC,MAAM,CAACiB,KAAK,CAAC,CAAC,mCAAmC,EAAEzB,WAAW,EAAE,EAAE0B,cAAc;YACxF,MAAMT,WAAW;gBACfC,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,0BAA0B,EAAEpB,WAAW,KAAK,EAAE0B,cAAc;oBACrE;iBACD;YACH;YACA,OAAQzB,SAAS,CAACD,WAAW,EAAEqB,mBAAmBJ,UAAU,CAAC,GAAGpB,QAAQoB;QAM1E;IACF;IAEA,IAAIhB,SAAS,CAACD,WAAW,EAAE6B,SAAS;QAClCjC,OAAOM,IAAI,CACT,CAAC,IAAI,EAAEF,WAAW8B,MAAM,CAAC,GAAGC,WAAW,KAAKtC,YAAYO,YAAYgC,KAAK,CAAC,IAAI,EAC9E,GAAGtC,YAAY6B,UAAU,CAACU,WAAW,CAACC,IAAI,GAAG,IAAI,EAAEjC,SAAS,CAACD,WAAW,EAAEiC,eAAe,IAAI,EAC7FvC,YAAY6B,UAAU,CAACY,UAAU,CAACC,KAAK,EACvC,OAAO,EAAEjC,KAAK,EAAEE,cAAc,EAAED,MAAM,EAAEE,MAAM,EAAE;YAC9C,OAAO,MAAMJ,KAAKC,OAAOC,QAAQC,gBAAgBC;QACnD;IAEJ;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/global/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/global/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAc,SAAS,EAAE,MAAM,SAAS,CAAA;AAIpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAM9D,eAAO,MAAM,gBAAgB,WACnB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,cACR,MAAM,WACT,qBAAqB,CAAC,SAAS,CAAC,UACjC,WAAW,SAiLpB,CAAA"}
|
|
@@ -3,7 +3,7 @@ import { toCamelCase } from '../../../utils/camelCase.js';
|
|
|
3
3
|
import { convertCollectionSchemaToZod } from '../../../utils/convertCollectionSchemaToZod.js';
|
|
4
4
|
import { toolSchemas } from '../schemas.js';
|
|
5
5
|
export const updateGlobalTool = (server, req, user, verboseLogs, globalSlug, globals, schema)=>{
|
|
6
|
-
const tool = async (data, draft = false, depth = 0, locale, fallbackLocale)=>{
|
|
6
|
+
const tool = async (data, draft = false, depth = 0, locale, fallbackLocale, select)=>{
|
|
7
7
|
const payload = req.payload;
|
|
8
8
|
if (verboseLogs) {
|
|
9
9
|
payload.logger.info(`[payload-mcp] Updating global: ${globalSlug}, draft: ${draft}${locale ? `, locale: ${locale}` : ''}`);
|
|
@@ -28,6 +28,23 @@ export const updateGlobalTool = (server, req, user, verboseLogs, globalSlug, glo
|
|
|
28
28
|
};
|
|
29
29
|
return globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response;
|
|
30
30
|
}
|
|
31
|
+
let selectClause;
|
|
32
|
+
if (select) {
|
|
33
|
+
try {
|
|
34
|
+
selectClause = JSON.parse(select);
|
|
35
|
+
} catch (_parseError) {
|
|
36
|
+
payload.logger.warn(`[payload-mcp] Invalid select clause JSON for global: ${select}`);
|
|
37
|
+
const response = {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: 'Error: Invalid JSON in select clause'
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
};
|
|
45
|
+
return globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
31
48
|
const updateOptions = {
|
|
32
49
|
slug: globalSlug,
|
|
33
50
|
data: parsedData,
|
|
@@ -42,6 +59,9 @@ export const updateGlobalTool = (server, req, user, verboseLogs, globalSlug, glo
|
|
|
42
59
|
if (fallbackLocale) {
|
|
43
60
|
updateOptions.fallbackLocale = fallbackLocale;
|
|
44
61
|
}
|
|
62
|
+
if (selectClause) {
|
|
63
|
+
updateOptions.select = selectClause;
|
|
64
|
+
}
|
|
45
65
|
const result = await payload.updateGlobal(updateOptions);
|
|
46
66
|
if (verboseLogs) {
|
|
47
67
|
payload.logger.info(`[payload-mcp] Successfully updated global: ${globalSlug}`);
|
|
@@ -84,12 +104,13 @@ ${JSON.stringify(result, null, 2)}
|
|
|
84
104
|
depth: z.number().optional().describe('Optional: Depth of relationships to populate'),
|
|
85
105
|
draft: z.boolean().optional().describe('Optional: Whether to save as draft (default: false)'),
|
|
86
106
|
fallbackLocale: z.string().optional().describe('Optional: fallback locale code to use when requested locale is not available'),
|
|
87
|
-
locale: z.string().optional().describe('Optional: locale code to update data in (e.g., "en", "es"). Use "all" to update all locales for localized fields')
|
|
107
|
+
locale: z.string().optional().describe('Optional: locale code to update data in (e.g., "en", "es"). Use "all" to update all locales for localized fields'),
|
|
108
|
+
select: z.string().optional().describe('Optional: define exactly which fields you\'d like to return in the response (JSON), e.g., \'{"siteName": "My Site"}\'')
|
|
88
109
|
});
|
|
89
110
|
server.tool(`update${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`, `${toolSchemas.updateGlobal.description.trim()}\n\n${globals?.[globalSlug]?.description || ''}`, updateGlobalSchema.shape, async (params)=>{
|
|
90
|
-
const { depth, draft, fallbackLocale, locale, ...rest } = params;
|
|
111
|
+
const { depth, draft, fallbackLocale, locale, select, ...rest } = params;
|
|
91
112
|
const data = JSON.stringify(rest);
|
|
92
|
-
return await tool(data, draft, depth, locale, fallbackLocale);
|
|
113
|
+
return await tool(data, draft, depth, locale, fallbackLocale, select);
|
|
93
114
|
});
|
|
94
115
|
}
|
|
95
116
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/mcp/tools/global/update.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { JSONSchema4 } from 'json-schema'\nimport type { PayloadRequest, TypedUser } from 'payload'\n\nimport { z } from 'zod'\n\nimport type { PluginMCPServerConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport { convertCollectionSchemaToZod } from '../../../utils/convertCollectionSchemaToZod.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const updateGlobalTool = (\n server: McpServer,\n req: PayloadRequest,\n user: TypedUser,\n verboseLogs: boolean,\n globalSlug: string,\n globals: PluginMCPServerConfig['globals'],\n schema: JSONSchema4,\n) => {\n const tool = async (\n data: string,\n draft: boolean = false,\n depth: number = 0,\n locale?: string,\n fallbackLocale?: string,\n ): Promise<{\n content: Array<{\n text: string\n type: 'text'\n }>\n }> => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Updating global: ${globalSlug}, draft: ${draft}${locale ? `, locale: ${locale}` : ''}`,\n )\n }\n\n try {\n // Parse the data JSON\n let parsedData: Record<string, unknown>\n try {\n parsedData = JSON.parse(data)\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Parsed data for ${globalSlug}: ${JSON.stringify(parsedData)}`,\n )\n }\n } catch (_parseError) {\n payload.logger.error(`[payload-mcp] Invalid JSON data provided: ${data}`)\n const response = {\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON data provided' }],\n }\n return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n\n const updateOptions: Parameters<typeof payload.updateGlobal>[0] = {\n slug: globalSlug,\n data: parsedData,\n depth,\n draft,\n user,\n }\n\n // Add locale parameters if provided\n if (locale) {\n updateOptions.locale = locale\n }\n if (fallbackLocale) {\n updateOptions.fallbackLocale = fallbackLocale\n }\n\n const result = await payload.updateGlobal(updateOptions)\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully updated global: ${globalSlug}`)\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Global \"${globalSlug}\" updated successfully!\n\\`\\`\\`json\n${JSON.stringify(result, null, 2)}\n\\`\\`\\``,\n },\n ],\n }\n\n return (globals?.[globalSlug]?.overrideResponse?.(response, result, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(`[payload-mcp] Error updating global ${globalSlug}: ${errorMessage}`)\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Error updating global \"${globalSlug}\": ${errorMessage}`,\n },\n ],\n }\n\n return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n if (globals?.[globalSlug]?.enabled) {\n const convertedFields = convertCollectionSchemaToZod(schema)\n\n // Make all fields optional for partial updates (PATCH-style)\n const optionalFields = Object.fromEntries(\n Object.entries(convertedFields.shape).map(([key, value]) => [key, (value as any).optional()]),\n )\n\n const updateGlobalSchema = z.object({\n ...optionalFields,\n depth: z.number().optional().describe('Optional: Depth of relationships to populate'),\n draft: z.boolean().optional().describe('Optional: Whether to save as draft (default: false)'),\n fallbackLocale: z\n .string()\n .optional()\n .describe('Optional: fallback locale code to use when requested locale is not available'),\n locale: z\n .string()\n .optional()\n .describe(\n 'Optional: locale code to update data in (e.g., \"en\", \"es\"). Use \"all\" to update all locales for localized fields',\n ),\n })\n\n server.tool(\n `update${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`,\n `${toolSchemas.updateGlobal.description.trim()}\\n\\n${globals?.[globalSlug]?.description || ''}`,\n updateGlobalSchema.shape,\n async (params: Record<string, unknown>) => {\n const { depth, draft, fallbackLocale, locale, ...rest } = params\n const data = JSON.stringify(rest)\n return await tool(\n data,\n draft as boolean,\n depth as number,\n locale as string,\n fallbackLocale as string,\n )\n },\n )\n }\n}\n"],"names":["z","toCamelCase","convertCollectionSchemaToZod","toolSchemas","updateGlobalTool","server","req","user","verboseLogs","globalSlug","globals","schema","tool","data","draft","depth","locale","fallbackLocale","payload","logger","info","parsedData","JSON","parse","stringify","_parseError","error","response","content","type","text","overrideResponse","updateOptions","slug","result","updateGlobal","errorMessage","Error","message","enabled","convertedFields","optionalFields","Object","fromEntries","entries","shape","map","key","value","optional","updateGlobalSchema","object","number","describe","boolean","string","charAt","toUpperCase","slice","description","trim","params","rest"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/mcp/tools/global/update.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { JSONSchema4 } from 'json-schema'\nimport type { PayloadRequest, SelectType, TypedUser } from 'payload'\n\nimport { z } from 'zod'\n\nimport type { PluginMCPServerConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport { convertCollectionSchemaToZod } from '../../../utils/convertCollectionSchemaToZod.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const updateGlobalTool = (\n server: McpServer,\n req: PayloadRequest,\n user: TypedUser,\n verboseLogs: boolean,\n globalSlug: string,\n globals: PluginMCPServerConfig['globals'],\n schema: JSONSchema4,\n) => {\n const tool = async (\n data: string,\n draft: boolean = false,\n depth: number = 0,\n locale?: string,\n fallbackLocale?: string,\n select?: string,\n ): Promise<{\n content: Array<{\n text: string\n type: 'text'\n }>\n }> => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Updating global: ${globalSlug}, draft: ${draft}${locale ? `, locale: ${locale}` : ''}`,\n )\n }\n\n try {\n // Parse the data JSON\n let parsedData: Record<string, unknown>\n try {\n parsedData = JSON.parse(data)\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Parsed data for ${globalSlug}: ${JSON.stringify(parsedData)}`,\n )\n }\n } catch (_parseError) {\n payload.logger.error(`[payload-mcp] Invalid JSON data provided: ${data}`)\n const response = {\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON data provided' }],\n }\n return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n\n let selectClause: SelectType | undefined\n if (select) {\n try {\n selectClause = JSON.parse(select) as SelectType\n } catch (_parseError) {\n payload.logger.warn(`[payload-mcp] Invalid select clause JSON for global: ${select}`)\n const response = {\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON in select clause' }],\n }\n return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n const updateOptions: Parameters<typeof payload.updateGlobal>[0] = {\n slug: globalSlug,\n data: parsedData,\n depth,\n draft,\n user,\n }\n\n // Add locale parameters if provided\n if (locale) {\n updateOptions.locale = locale\n }\n if (fallbackLocale) {\n updateOptions.fallbackLocale = fallbackLocale\n }\n if (selectClause) {\n updateOptions.select = selectClause\n }\n\n const result = await payload.updateGlobal(updateOptions)\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully updated global: ${globalSlug}`)\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Global \"${globalSlug}\" updated successfully!\n\\`\\`\\`json\n${JSON.stringify(result, null, 2)}\n\\`\\`\\``,\n },\n ],\n }\n\n return (globals?.[globalSlug]?.overrideResponse?.(response, result, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(`[payload-mcp] Error updating global ${globalSlug}: ${errorMessage}`)\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Error updating global \"${globalSlug}\": ${errorMessage}`,\n },\n ],\n }\n\n return (globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n if (globals?.[globalSlug]?.enabled) {\n const convertedFields = convertCollectionSchemaToZod(schema)\n\n // Make all fields optional for partial updates (PATCH-style)\n const optionalFields = Object.fromEntries(\n Object.entries(convertedFields.shape).map(([key, value]) => [key, (value as any).optional()]),\n )\n\n const updateGlobalSchema = z.object({\n ...optionalFields,\n depth: z.number().optional().describe('Optional: Depth of relationships to populate'),\n draft: z.boolean().optional().describe('Optional: Whether to save as draft (default: false)'),\n fallbackLocale: z\n .string()\n .optional()\n .describe('Optional: fallback locale code to use when requested locale is not available'),\n locale: z\n .string()\n .optional()\n .describe(\n 'Optional: locale code to update data in (e.g., \"en\", \"es\"). Use \"all\" to update all locales for localized fields',\n ),\n select: z\n .string()\n .optional()\n .describe(\n 'Optional: define exactly which fields you\\'d like to return in the response (JSON), e.g., \\'{\"siteName\": \"My Site\"}\\'',\n ),\n })\n\n server.tool(\n `update${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`,\n `${toolSchemas.updateGlobal.description.trim()}\\n\\n${globals?.[globalSlug]?.description || ''}`,\n updateGlobalSchema.shape,\n async (params: Record<string, unknown>) => {\n const { depth, draft, fallbackLocale, locale, select, ...rest } = params\n const data = JSON.stringify(rest)\n return await tool(\n data,\n draft as boolean,\n depth as number,\n locale as string,\n fallbackLocale as string,\n select as string | undefined,\n )\n },\n )\n }\n}\n"],"names":["z","toCamelCase","convertCollectionSchemaToZod","toolSchemas","updateGlobalTool","server","req","user","verboseLogs","globalSlug","globals","schema","tool","data","draft","depth","locale","fallbackLocale","select","payload","logger","info","parsedData","JSON","parse","stringify","_parseError","error","response","content","type","text","overrideResponse","selectClause","warn","updateOptions","slug","result","updateGlobal","errorMessage","Error","message","enabled","convertedFields","optionalFields","Object","fromEntries","entries","shape","map","key","value","optional","updateGlobalSchema","object","number","describe","boolean","string","charAt","toUpperCase","slice","description","trim","params","rest"],"mappings":"AAIA,SAASA,CAAC,QAAQ,MAAK;AAIvB,SAASC,WAAW,QAAQ,8BAA6B;AACzD,SAASC,4BAA4B,QAAQ,iDAAgD;AAC7F,SAASC,WAAW,QAAQ,gBAAe;AAE3C,OAAO,MAAMC,mBAAmB,CAC9BC,QACAC,KACAC,MACAC,aACAC,YACAC,SACAC;IAEA,MAAMC,OAAO,OACXC,MACAC,QAAiB,KAAK,EACtBC,QAAgB,CAAC,EACjBC,QACAC,gBACAC;QAOA,MAAMC,UAAUb,IAAIa,OAAO;QAE3B,IAAIX,aAAa;YACfW,QAAQC,MAAM,CAACC,IAAI,CACjB,CAAC,+BAA+B,EAAEZ,WAAW,SAAS,EAAEK,QAAQE,SAAS,CAAC,UAAU,EAAEA,QAAQ,GAAG,IAAI;QAEzG;QAEA,IAAI;YACF,sBAAsB;YACtB,IAAIM;YACJ,IAAI;gBACFA,aAAaC,KAAKC,KAAK,CAACX;gBACxB,IAAIL,aAAa;oBACfW,QAAQC,MAAM,CAACC,IAAI,CACjB,CAAC,8BAA8B,EAAEZ,WAAW,EAAE,EAAEc,KAAKE,SAAS,CAACH,aAAa;gBAEhF;YACF,EAAE,OAAOI,aAAa;gBACpBP,QAAQC,MAAM,CAACO,KAAK,CAAC,CAAC,0CAA0C,EAAEd,MAAM;gBACxE,MAAMe,WAAW;oBACfC,SAAS;wBAAC;4BAAEC,MAAM;4BAAiBC,MAAM;wBAAoC;qBAAE;gBACjF;gBACA,OAAQrB,SAAS,CAACD,WAAW,EAAEuB,mBAAmBJ,UAAU,CAAC,GAAGtB,QAAQsB;YAM1E;YAEA,IAAIK;YACJ,IAAIf,QAAQ;gBACV,IAAI;oBACFe,eAAeV,KAAKC,KAAK,CAACN;gBAC5B,EAAE,OAAOQ,aAAa;oBACpBP,QAAQC,MAAM,CAACc,IAAI,CAAC,CAAC,qDAAqD,EAAEhB,QAAQ;oBACpF,MAAMU,WAAW;wBACfC,SAAS;4BAAC;gCAAEC,MAAM;gCAAiBC,MAAM;4BAAuC;yBAAE;oBACpF;oBACA,OAAQrB,SAAS,CAACD,WAAW,EAAEuB,mBAAmBJ,UAAU,CAAC,GAAGtB,QAAQsB;gBAM1E;YACF;YAEA,MAAMO,gBAA4D;gBAChEC,MAAM3B;gBACNI,MAAMS;gBACNP;gBACAD;gBACAP;YACF;YAEA,oCAAoC;YACpC,IAAIS,QAAQ;gBACVmB,cAAcnB,MAAM,GAAGA;YACzB;YACA,IAAIC,gBAAgB;gBAClBkB,cAAclB,cAAc,GAAGA;YACjC;YACA,IAAIgB,cAAc;gBAChBE,cAAcjB,MAAM,GAAGe;YACzB;YAEA,MAAMI,SAAS,MAAMlB,QAAQmB,YAAY,CAACH;YAE1C,IAAI3B,aAAa;gBACfW,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,2CAA2C,EAAEZ,YAAY;YAChF;YAEA,MAAMmB,WAAW;gBACfC,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,QAAQ,EAAEtB,WAAW;;AAExC,EAAEc,KAAKE,SAAS,CAACY,QAAQ,MAAM,GAAG;MAC5B,CAAC;oBACG;iBACD;YACH;YAEA,OAAQ3B,SAAS,CAACD,WAAW,EAAEuB,mBAAmBJ,UAAUS,QAAQ/B,QAAQsB;QAM9E,EAAE,OAAOD,OAAO;YACd,MAAMY,eAAeZ,iBAAiBa,QAAQb,MAAMc,OAAO,GAAG;YAC9DtB,QAAQC,MAAM,CAACO,KAAK,CAAC,CAAC,oCAAoC,EAAElB,WAAW,EAAE,EAAE8B,cAAc;YAEzF,MAAMX,WAAW;gBACfC,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,uBAAuB,EAAEtB,WAAW,GAAG,EAAE8B,cAAc;oBAChE;iBACD;YACH;YAEA,OAAQ7B,SAAS,CAACD,WAAW,EAAEuB,mBAAmBJ,UAAU,CAAC,GAAGtB,QAAQsB;QAM1E;IACF;IAEA,IAAIlB,SAAS,CAACD,WAAW,EAAEiC,SAAS;QAClC,MAAMC,kBAAkBzC,6BAA6BS;QAErD,6DAA6D;QAC7D,MAAMiC,iBAAiBC,OAAOC,WAAW,CACvCD,OAAOE,OAAO,CAACJ,gBAAgBK,KAAK,EAAEC,GAAG,CAAC,CAAC,CAACC,KAAKC,MAAM,GAAK;gBAACD;gBAAMC,MAAcC,QAAQ;aAAG;QAG9F,MAAMC,qBAAqBrD,EAAEsD,MAAM,CAAC;YAClC,GAAGV,cAAc;YACjB7B,OAAOf,EAAEuD,MAAM,GAAGH,QAAQ,GAAGI,QAAQ,CAAC;YACtC1C,OAAOd,EAAEyD,OAAO,GAAGL,QAAQ,GAAGI,QAAQ,CAAC;YACvCvC,gBAAgBjB,EACb0D,MAAM,GACNN,QAAQ,GACRI,QAAQ,CAAC;YACZxC,QAAQhB,EACL0D,MAAM,GACNN,QAAQ,GACRI,QAAQ,CACP;YAEJtC,QAAQlB,EACL0D,MAAM,GACNN,QAAQ,GACRI,QAAQ,CACP;QAEN;QAEAnD,OAAOO,IAAI,CACT,CAAC,MAAM,EAAEH,WAAWkD,MAAM,CAAC,GAAGC,WAAW,KAAK3D,YAAYQ,YAAYoD,KAAK,CAAC,IAAI,EAChF,GAAG1D,YAAYmC,YAAY,CAACwB,WAAW,CAACC,IAAI,GAAG,IAAI,EAAErD,SAAS,CAACD,WAAW,EAAEqD,eAAe,IAAI,EAC/FT,mBAAmBL,KAAK,EACxB,OAAOgB;YACL,MAAM,EAAEjD,KAAK,EAAED,KAAK,EAAEG,cAAc,EAAED,MAAM,EAAEE,MAAM,EAAE,GAAG+C,MAAM,GAAGD;YAClE,MAAMnD,OAAOU,KAAKE,SAAS,CAACwC;YAC5B,OAAO,MAAMrD,KACXC,MACAC,OACAC,OACAC,QACAC,gBACAC;QAEJ;IAEJ;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/resource/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/resource/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAc,SAAS,EAAE,MAAM,SAAS,CAAA;AAIpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAK9D,eAAO,MAAM,kBAAkB,WACrB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,kBACJ,MAAM,eACT,qBAAqB,CAAC,aAAa,CAAC,UACzC,WAAW,SAkLpB,CAAA"}
|
|
@@ -3,7 +3,7 @@ import { toCamelCase } from '../../../utils/camelCase.js';
|
|
|
3
3
|
import { convertCollectionSchemaToZod } from '../../../utils/convertCollectionSchemaToZod.js';
|
|
4
4
|
import { toolSchemas } from '../schemas.js';
|
|
5
5
|
export const createResourceTool = (server, req, user, verboseLogs, collectionSlug, collections, schema)=>{
|
|
6
|
-
const tool = async (data, depth = 0, draft, locale, fallbackLocale)=>{
|
|
6
|
+
const tool = async (data, depth = 0, draft, locale, fallbackLocale, select)=>{
|
|
7
7
|
const payload = req.payload;
|
|
8
8
|
if (verboseLogs) {
|
|
9
9
|
payload.logger.info(`[payload-mcp] Creating resource in collection: ${collectionSlug}${locale ? ` with locale: ${locale}` : ''}`);
|
|
@@ -27,6 +27,23 @@ export const createResourceTool = (server, req, user, verboseLogs, collectionSlu
|
|
|
27
27
|
]
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
|
+
let selectClause;
|
|
31
|
+
if (select) {
|
|
32
|
+
try {
|
|
33
|
+
selectClause = JSON.parse(select);
|
|
34
|
+
} catch (_parseError) {
|
|
35
|
+
payload.logger.warn(`[payload-mcp] Invalid select clause JSON: ${select}`);
|
|
36
|
+
const response = {
|
|
37
|
+
content: [
|
|
38
|
+
{
|
|
39
|
+
type: 'text',
|
|
40
|
+
text: 'Error: Invalid JSON in select clause'
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
};
|
|
44
|
+
return collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
30
47
|
// Create the resource
|
|
31
48
|
const result = await payload.create({
|
|
32
49
|
collection: collectionSlug,
|
|
@@ -41,6 +58,9 @@ export const createResourceTool = (server, req, user, verboseLogs, collectionSlu
|
|
|
41
58
|
},
|
|
42
59
|
...fallbackLocale && {
|
|
43
60
|
fallbackLocale
|
|
61
|
+
},
|
|
62
|
+
...selectClause && {
|
|
63
|
+
select: selectClause
|
|
44
64
|
}
|
|
45
65
|
});
|
|
46
66
|
if (verboseLogs) {
|
|
@@ -81,12 +101,13 @@ ${JSON.stringify(result, null, 2)}
|
|
|
81
101
|
depth: z.number().int().min(0).max(10).optional().default(0).describe('How many levels deep to populate relationships in response'),
|
|
82
102
|
draft: z.boolean().optional().default(false).describe('Whether to create the document as a draft'),
|
|
83
103
|
fallbackLocale: z.string().optional().describe('Optional: fallback locale code to use when requested locale is not available'),
|
|
84
|
-
locale: z.string().optional().describe('Optional: locale code to create the document in (e.g., "en", "es"). Defaults to the default locale')
|
|
104
|
+
locale: z.string().optional().describe('Optional: locale code to create the document in (e.g., "en", "es"). Defaults to the default locale'),
|
|
105
|
+
select: z.string().optional().describe('Optional: define exactly which fields you\'d like to create (JSON), e.g., \'{"title": "My Post"}\'')
|
|
85
106
|
});
|
|
86
107
|
server.tool(`create${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`, `${collections?.[collectionSlug]?.description || toolSchemas.createResource.description.trim()}`, createResourceSchema.shape, async (params)=>{
|
|
87
|
-
const { depth, draft, fallbackLocale, locale, ...fieldData } = params;
|
|
108
|
+
const { depth, draft, fallbackLocale, locale, select, ...fieldData } = params;
|
|
88
109
|
const data = JSON.stringify(fieldData);
|
|
89
|
-
return await tool(data, depth, draft, locale, fallbackLocale);
|
|
110
|
+
return await tool(data, depth, draft, locale, fallbackLocale, select);
|
|
90
111
|
});
|
|
91
112
|
}
|
|
92
113
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/mcp/tools/resource/create.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { JSONSchema4 } from 'json-schema'\nimport type { PayloadRequest, TypedUser } from 'payload'\n\nimport { z } from 'zod'\n\nimport type { PluginMCPServerConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport { convertCollectionSchemaToZod } from '../../../utils/convertCollectionSchemaToZod.js'\nimport { toolSchemas } from '../schemas.js'\nexport const createResourceTool = (\n server: McpServer,\n req: PayloadRequest,\n user: TypedUser,\n verboseLogs: boolean,\n collectionSlug: string,\n collections: PluginMCPServerConfig['collections'],\n schema: JSONSchema4,\n) => {\n const tool = async (\n data: string,\n depth: number = 0,\n draft: boolean,\n locale?: string,\n fallbackLocale?: string,\n ): Promise<{\n content: Array<{\n text: string\n type: 'text'\n }>\n }> => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Creating resource in collection: ${collectionSlug}${locale ? ` with locale: ${locale}` : ''}`,\n )\n }\n\n try {\n // Parse the data JSON\n let parsedData: Record<string, unknown>\n try {\n parsedData = JSON.parse(data)\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Parsed data for ${collectionSlug}: ${JSON.stringify(parsedData)}`,\n )\n }\n } catch (_parseError) {\n payload.logger.error(`[payload-mcp] Invalid JSON data provided: ${data}`)\n return {\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON data provided' }],\n }\n }\n\n // Create the resource\n const result = await payload.create({\n collection: collectionSlug,\n data: parsedData,\n depth,\n draft,\n overrideAccess: false,\n req,\n user,\n ...(locale && { locale }),\n ...(fallbackLocale && { fallbackLocale }),\n })\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Successfully created resource in ${collectionSlug} with ID: ${result.id}`,\n )\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Resource created successfully in collection \"${collectionSlug}\"!\nCreated resource:\n\\`\\`\\`json\n${JSON.stringify(result, null, 2)}\n\\`\\`\\``,\n },\n ],\n }\n\n return (collections?.[collectionSlug]?.overrideResponse?.(response, result, req) ||\n response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(\n `[payload-mcp] Error creating resource in ${collectionSlug}: ${errorMessage}`,\n )\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Error creating resource in collection \"${collectionSlug}\": ${errorMessage}`,\n },\n ],\n }\n\n return (collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n if (collections?.[collectionSlug]?.enabled) {\n const convertedFields = convertCollectionSchemaToZod(schema)\n\n // Create a new schema that combines the converted fields with create-specific parameters\n const createResourceSchema = z.object({\n ...convertedFields.shape,\n depth: z\n .number()\n .int()\n .min(0)\n .max(10)\n .optional()\n .default(0)\n .describe('How many levels deep to populate relationships in response'),\n draft: z\n .boolean()\n .optional()\n .default(false)\n .describe('Whether to create the document as a draft'),\n fallbackLocale: z\n .string()\n .optional()\n .describe('Optional: fallback locale code to use when requested locale is not available'),\n locale: z\n .string()\n .optional()\n .describe(\n 'Optional: locale code to create the document in (e.g., \"en\", \"es\"). Defaults to the default locale',\n ),\n })\n\n server.tool(\n `create${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`,\n `${collections?.[collectionSlug]?.description || toolSchemas.createResource.description.trim()}`,\n createResourceSchema.shape,\n async (params: Record<string, unknown>) => {\n const { depth, draft, fallbackLocale, locale, ...fieldData } = params\n const data = JSON.stringify(fieldData)\n return await tool(\n data,\n depth as number,\n draft as boolean,\n locale as string | undefined,\n fallbackLocale as string | undefined,\n )\n },\n )\n }\n}\n"],"names":["z","toCamelCase","convertCollectionSchemaToZod","toolSchemas","createResourceTool","server","req","user","verboseLogs","collectionSlug","collections","schema","tool","data","depth","draft","locale","fallbackLocale","payload","logger","info","parsedData","JSON","parse","stringify","_parseError","error","content","type","text","
|
|
1
|
+
{"version":3,"sources":["../../../../src/mcp/tools/resource/create.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { JSONSchema4 } from 'json-schema'\nimport type { PayloadRequest, SelectType, TypedUser } from 'payload'\n\nimport { z } from 'zod'\n\nimport type { PluginMCPServerConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport { convertCollectionSchemaToZod } from '../../../utils/convertCollectionSchemaToZod.js'\nimport { toolSchemas } from '../schemas.js'\nexport const createResourceTool = (\n server: McpServer,\n req: PayloadRequest,\n user: TypedUser,\n verboseLogs: boolean,\n collectionSlug: string,\n collections: PluginMCPServerConfig['collections'],\n schema: JSONSchema4,\n) => {\n const tool = async (\n data: string,\n depth: number = 0,\n draft: boolean,\n locale?: string,\n fallbackLocale?: string,\n select?: string,\n ): Promise<{\n content: Array<{\n text: string\n type: 'text'\n }>\n }> => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Creating resource in collection: ${collectionSlug}${locale ? ` with locale: ${locale}` : ''}`,\n )\n }\n\n try {\n // Parse the data JSON\n let parsedData: Record<string, unknown>\n try {\n parsedData = JSON.parse(data)\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Parsed data for ${collectionSlug}: ${JSON.stringify(parsedData)}`,\n )\n }\n } catch (_parseError) {\n payload.logger.error(`[payload-mcp] Invalid JSON data provided: ${data}`)\n return {\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON data provided' }],\n }\n }\n\n let selectClause: SelectType | undefined\n if (select) {\n try {\n selectClause = JSON.parse(select) as SelectType\n } catch (_parseError) {\n payload.logger.warn(`[payload-mcp] Invalid select clause JSON: ${select}`)\n const response = {\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON in select clause' }],\n }\n return (collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) ||\n response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n // Create the resource\n const result = await payload.create({\n collection: collectionSlug,\n data: parsedData,\n depth,\n draft,\n overrideAccess: false,\n req,\n user,\n ...(locale && { locale }),\n ...(fallbackLocale && { fallbackLocale }),\n ...(selectClause && { select: selectClause }),\n })\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Successfully created resource in ${collectionSlug} with ID: ${result.id}`,\n )\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Resource created successfully in collection \"${collectionSlug}\"!\nCreated resource:\n\\`\\`\\`json\n${JSON.stringify(result, null, 2)}\n\\`\\`\\``,\n },\n ],\n }\n\n return (collections?.[collectionSlug]?.overrideResponse?.(response, result, req) ||\n response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(\n `[payload-mcp] Error creating resource in ${collectionSlug}: ${errorMessage}`,\n )\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Error creating resource in collection \"${collectionSlug}\": ${errorMessage}`,\n },\n ],\n }\n\n return (collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n if (collections?.[collectionSlug]?.enabled) {\n const convertedFields = convertCollectionSchemaToZod(schema)\n\n // Create a new schema that combines the converted fields with create-specific parameters\n const createResourceSchema = z.object({\n ...convertedFields.shape,\n depth: z\n .number()\n .int()\n .min(0)\n .max(10)\n .optional()\n .default(0)\n .describe('How many levels deep to populate relationships in response'),\n draft: z\n .boolean()\n .optional()\n .default(false)\n .describe('Whether to create the document as a draft'),\n fallbackLocale: z\n .string()\n .optional()\n .describe('Optional: fallback locale code to use when requested locale is not available'),\n locale: z\n .string()\n .optional()\n .describe(\n 'Optional: locale code to create the document in (e.g., \"en\", \"es\"). Defaults to the default locale',\n ),\n select: z\n .string()\n .optional()\n .describe(\n 'Optional: define exactly which fields you\\'d like to create (JSON), e.g., \\'{\"title\": \"My Post\"}\\'',\n ),\n })\n\n server.tool(\n `create${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`,\n `${collections?.[collectionSlug]?.description || toolSchemas.createResource.description.trim()}`,\n createResourceSchema.shape,\n async (params: Record<string, unknown>) => {\n const { depth, draft, fallbackLocale, locale, select, ...fieldData } = params\n const data = JSON.stringify(fieldData)\n return await tool(\n data,\n depth as number,\n draft as boolean,\n locale as string | undefined,\n fallbackLocale as string | undefined,\n select as string | undefined,\n )\n },\n )\n }\n}\n"],"names":["z","toCamelCase","convertCollectionSchemaToZod","toolSchemas","createResourceTool","server","req","user","verboseLogs","collectionSlug","collections","schema","tool","data","depth","draft","locale","fallbackLocale","select","payload","logger","info","parsedData","JSON","parse","stringify","_parseError","error","content","type","text","selectClause","warn","response","overrideResponse","result","create","collection","overrideAccess","id","errorMessage","Error","message","enabled","convertedFields","createResourceSchema","object","shape","number","int","min","max","optional","default","describe","boolean","string","charAt","toUpperCase","slice","description","createResource","trim","params","fieldData"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/resource/find.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/resource/find.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAc,SAAS,EAAE,MAAM,SAAS,CAAA;AAEpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAK9D,eAAO,MAAM,gBAAgB,WACnB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,kBACJ,MAAM,eACT,qBAAqB,CAAC,aAAa,CAAC,SAqOlD,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { toCamelCase } from '../../../utils/camelCase.js';
|
|
2
2
|
import { toolSchemas } from '../schemas.js';
|
|
3
3
|
export const findResourceTool = (server, req, user, verboseLogs, collectionSlug, collections)=>{
|
|
4
|
-
const tool = async (id, limit = 10, page = 1, sort, where, depth = 0, locale, fallbackLocale, draft)=>{
|
|
4
|
+
const tool = async (id, limit = 10, page = 1, sort, where, select, depth = 0, locale, fallbackLocale, draft)=>{
|
|
5
5
|
const payload = req.payload;
|
|
6
6
|
if (verboseLogs) {
|
|
7
7
|
payload.logger.info(`[payload-mcp] Reading resource from collection: ${collectionSlug}${id ? ` with ID: ${id}` : ''}, limit: ${limit}, page: ${page}${locale ? `, locale: ${locale}` : ''}`);
|
|
@@ -28,6 +28,24 @@ export const findResourceTool = (server, req, user, verboseLogs, collectionSlug,
|
|
|
28
28
|
return collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response;
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
+
// Parse select clause if provided
|
|
32
|
+
let selectClause;
|
|
33
|
+
if (select) {
|
|
34
|
+
try {
|
|
35
|
+
selectClause = JSON.parse(select);
|
|
36
|
+
} catch (_parseError) {
|
|
37
|
+
payload.logger.warn(`[payload-mcp] Invalid select clause JSON: ${select}`);
|
|
38
|
+
const response = {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: 'text',
|
|
42
|
+
text: 'Error: Invalid JSON in select clause'
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
};
|
|
46
|
+
return collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
31
49
|
// If ID is provided, use findByID
|
|
32
50
|
if (id) {
|
|
33
51
|
try {
|
|
@@ -35,6 +53,9 @@ export const findResourceTool = (server, req, user, verboseLogs, collectionSlug,
|
|
|
35
53
|
id,
|
|
36
54
|
collection: collectionSlug,
|
|
37
55
|
depth,
|
|
56
|
+
...selectClause && {
|
|
57
|
+
select: selectClause
|
|
58
|
+
},
|
|
38
59
|
overrideAccess: false,
|
|
39
60
|
req,
|
|
40
61
|
user,
|
|
@@ -83,6 +104,9 @@ ${JSON.stringify(doc, null, 2)}`
|
|
|
83
104
|
page,
|
|
84
105
|
req,
|
|
85
106
|
user,
|
|
107
|
+
...selectClause && {
|
|
108
|
+
select: selectClause
|
|
109
|
+
},
|
|
86
110
|
...locale && {
|
|
87
111
|
locale
|
|
88
112
|
},
|
|
@@ -134,8 +158,8 @@ Page: ${result.page} of ${result.totalPages}
|
|
|
134
158
|
}
|
|
135
159
|
};
|
|
136
160
|
if (collections?.[collectionSlug]?.enabled) {
|
|
137
|
-
server.tool(`find${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`, `${collections?.[collectionSlug]?.description || toolSchemas.findResources.description.trim()}`, toolSchemas.findResources.parameters.shape, async ({ id, depth, draft, fallbackLocale, limit, locale, page, sort, where })=>{
|
|
138
|
-
return await tool(id, limit, page, sort, where, depth, locale, fallbackLocale, draft);
|
|
161
|
+
server.tool(`find${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`, `${collections?.[collectionSlug]?.description || toolSchemas.findResources.description.trim()}`, toolSchemas.findResources.parameters.shape, async ({ id, depth, draft, fallbackLocale, limit, locale, page, select, sort, where })=>{
|
|
162
|
+
return await tool(id, limit, page, sort, where, select, depth, locale, fallbackLocale, draft);
|
|
139
163
|
});
|
|
140
164
|
}
|
|
141
165
|
};
|