@payloadcms/plugin-mcp 3.80.0-internal.cee0ccf → 3.80.0
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/endpoints/mcp.d.ts.map +1 -1
- package/dist/endpoints/mcp.js +23 -1
- package/dist/endpoints/mcp.js.map +1 -1
- package/dist/mcp/getMcpHandler.d.ts.map +1 -1
- package/dist/mcp/getMcpHandler.js +3 -1
- package/dist/mcp/getMcpHandler.js.map +1 -1
- package/package.json +4 -4
- package/src/endpoints/mcp.ts +21 -1
- package/src/mcp/getMcpHandler.ts +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/endpoints/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,cAAc,EAAiD,MAAM,SAAS,CAAA;AAE5F,OAAO,KAAK,EAAqB,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAK3E,eAAO,MAAM,oBAAoB,kBAAmB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/endpoints/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,cAAc,EAAiD,MAAM,SAAS,CAAA;AAE5F,OAAO,KAAK,EAAqB,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAK3E,eAAO,MAAM,oBAAoB,kBAAmB,qBAAqB,mBAkFxE,CAAA"}
|
package/dist/endpoints/mcp.js
CHANGED
|
@@ -39,9 +39,31 @@ export const initializeMCPHandler = (pluginOptions)=>{
|
|
|
39
39
|
return docs[0];
|
|
40
40
|
};
|
|
41
41
|
const mcpAccessSettings = pluginOptions.overrideAuth ? await pluginOptions.overrideAuth(req, getDefaultMcpAccessSettings) : await getDefaultMcpAccessSettings();
|
|
42
|
+
// @modelcontextprotocol/sdk's StreamableHTTPServerTransport uses @hono/node-server's
|
|
43
|
+
// getRequestListener, which replaces global.Request and global.Response with Hono
|
|
44
|
+
// custom classes. Unfortunately, we cannot pass overrideGlobalObjects: false because the option is
|
|
45
|
+
// consumed inside the SDK transport and is not exposed to callers.
|
|
46
|
+
// Save originals here and restore after the handler resolves so that Next.js
|
|
47
|
+
// instanceof Response checks on subsequent route handlers keep working.
|
|
48
|
+
const globals = globalThis;
|
|
49
|
+
const originalResponse = globals['Response'];
|
|
50
|
+
const originalRequest = globals['Request'];
|
|
42
51
|
const handler = getMCPHandler(pluginOptions, mcpAccessSettings, req);
|
|
43
52
|
const request = createRequestFromPayloadRequest(req);
|
|
44
|
-
|
|
53
|
+
try {
|
|
54
|
+
return await handler(request);
|
|
55
|
+
} finally{
|
|
56
|
+
if (globals['Response'] !== originalResponse) {
|
|
57
|
+
Object.defineProperty(globalThis, 'Response', {
|
|
58
|
+
value: originalResponse
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (globals['Request'] !== originalRequest) {
|
|
62
|
+
Object.defineProperty(globalThis, 'Request', {
|
|
63
|
+
value: originalRequest
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
45
67
|
};
|
|
46
68
|
return mcpHandler;
|
|
47
69
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/endpoints/mcp.ts"],"sourcesContent":["import crypto from 'crypto'\nimport { type PayloadHandler, type TypedUser, UnauthorizedError, type Where } from 'payload'\n\nimport type { MCPAccessSettings, PluginMCPServerConfig } from '../types.js'\n\nimport { createRequestFromPayloadRequest } from '../mcp/createRequest.js'\nimport { getMCPHandler } from '../mcp/getMcpHandler.js'\n\nexport const initializeMCPHandler = (pluginOptions: PluginMCPServerConfig) => {\n const mcpHandler: PayloadHandler = async (req) => {\n const { payload } = req\n const MCPOptions = pluginOptions.mcp || {}\n const MCPHandlerOptions = MCPOptions.handlerOptions || {}\n const useVerboseLogs = MCPHandlerOptions.verboseLogs ?? false\n\n req.payloadAPI = 'MCP' as const\n\n const getDefaultMcpAccessSettings = async (overrideApiKey?: null | string) => {\n const apiKey =\n (overrideApiKey ?? req.headers.get('Authorization')?.startsWith('Bearer '))\n ? req.headers.get('Authorization')?.replace('Bearer ', '').trim()\n : null\n\n if (apiKey === null) {\n throw new UnauthorizedError()\n }\n\n const sha256APIKeyIndex = crypto\n .createHmac('sha256', payload.secret)\n .update(apiKey || '')\n .digest('hex')\n\n const where: Where = {\n apiKeyIndex: {\n equals: sha256APIKeyIndex,\n },\n }\n\n const { docs } = await payload.find({\n collection: 'payload-mcp-api-keys',\n depth: 1,\n limit: 1,\n pagination: false,\n where,\n })\n\n if (docs.length === 0) {\n throw new UnauthorizedError()\n }\n\n if (useVerboseLogs) {\n payload.logger.info('[payload-mcp] API Key is valid')\n }\n\n const user = docs[0]?.user as TypedUser\n user.collection = pluginOptions.userCollection as string\n user._strategy = 'mcp-api-key' as const\n\n return docs[0] as unknown as MCPAccessSettings\n }\n\n const mcpAccessSettings = pluginOptions.overrideAuth\n ? await pluginOptions.overrideAuth(req, getDefaultMcpAccessSettings)\n : await getDefaultMcpAccessSettings()\n\n const handler = getMCPHandler(pluginOptions, mcpAccessSettings, req)\n const request = createRequestFromPayloadRequest(req)\n return await handler(request)\n }\n return mcpHandler\n}\n"],"names":["crypto","UnauthorizedError","createRequestFromPayloadRequest","getMCPHandler","initializeMCPHandler","pluginOptions","mcpHandler","req","payload","MCPOptions","mcp","MCPHandlerOptions","handlerOptions","useVerboseLogs","verboseLogs","payloadAPI","getDefaultMcpAccessSettings","overrideApiKey","apiKey","headers","get","startsWith","replace","trim","sha256APIKeyIndex","createHmac","secret","update","digest","where","apiKeyIndex","equals","docs","find","collection","depth","limit","pagination","length","logger","info","user","userCollection","_strategy","mcpAccessSettings","overrideAuth","handler","request"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAC3B,SAA8CC,iBAAiB,QAAoB,UAAS;AAI5F,SAASC,+BAA+B,QAAQ,0BAAyB;AACzE,SAASC,aAAa,QAAQ,0BAAyB;AAEvD,OAAO,MAAMC,uBAAuB,CAACC;IACnC,MAAMC,aAA6B,OAAOC;QACxC,MAAM,EAAEC,OAAO,EAAE,GAAGD;QACpB,MAAME,aAAaJ,cAAcK,GAAG,IAAI,CAAC;QACzC,MAAMC,oBAAoBF,WAAWG,cAAc,IAAI,CAAC;QACxD,MAAMC,iBAAiBF,kBAAkBG,WAAW,IAAI;QAExDP,IAAIQ,UAAU,GAAG;QAEjB,MAAMC,8BAA8B,OAAOC;YACzC,MAAMC,SACJ,AAACD,kBAAkBV,IAAIY,OAAO,CAACC,GAAG,CAAC,kBAAkBC,WAAW,aAC5Dd,IAAIY,OAAO,CAACC,GAAG,CAAC,kBAAkBE,QAAQ,WAAW,IAAIC,SACzD;YAEN,IAAIL,WAAW,MAAM;gBACnB,MAAM,IAAIjB;YACZ;YAEA,MAAMuB,oBAAoBxB,OACvByB,UAAU,CAAC,UAAUjB,QAAQkB,MAAM,EACnCC,MAAM,CAACT,UAAU,IACjBU,MAAM,CAAC;YAEV,MAAMC,QAAe;gBACnBC,aAAa;oBACXC,QAAQP;gBACV;YACF;YAEA,MAAM,EAAEQ,IAAI,EAAE,GAAG,MAAMxB,QAAQyB,IAAI,CAAC;gBAClCC,YAAY;gBACZC,OAAO;gBACPC,OAAO;gBACPC,YAAY;gBACZR;YACF;YAEA,IAAIG,KAAKM,MAAM,KAAK,GAAG;gBACrB,MAAM,IAAIrC;YACZ;YAEA,IAAIY,gBAAgB;gBAClBL,QAAQ+B,MAAM,CAACC,IAAI,CAAC;YACtB;YAEA,MAAMC,OAAOT,IAAI,CAAC,EAAE,EAAES;YACtBA,KAAKP,UAAU,GAAG7B,cAAcqC,cAAc;YAC9CD,KAAKE,SAAS,GAAG;YAEjB,OAAOX,IAAI,CAAC,EAAE;QAChB;QAEA,MAAMY,oBAAoBvC,cAAcwC,YAAY,GAChD,MAAMxC,cAAcwC,YAAY,CAACtC,KAAKS,+BACtC,MAAMA;QAEV,MAAM8B,
|
|
1
|
+
{"version":3,"sources":["../../src/endpoints/mcp.ts"],"sourcesContent":["import crypto from 'crypto'\nimport { type PayloadHandler, type TypedUser, UnauthorizedError, type Where } from 'payload'\n\nimport type { MCPAccessSettings, PluginMCPServerConfig } from '../types.js'\n\nimport { createRequestFromPayloadRequest } from '../mcp/createRequest.js'\nimport { getMCPHandler } from '../mcp/getMcpHandler.js'\n\nexport const initializeMCPHandler = (pluginOptions: PluginMCPServerConfig) => {\n const mcpHandler: PayloadHandler = async (req) => {\n const { payload } = req\n const MCPOptions = pluginOptions.mcp || {}\n const MCPHandlerOptions = MCPOptions.handlerOptions || {}\n const useVerboseLogs = MCPHandlerOptions.verboseLogs ?? false\n\n req.payloadAPI = 'MCP' as const\n\n const getDefaultMcpAccessSettings = async (overrideApiKey?: null | string) => {\n const apiKey =\n (overrideApiKey ?? req.headers.get('Authorization')?.startsWith('Bearer '))\n ? req.headers.get('Authorization')?.replace('Bearer ', '').trim()\n : null\n\n if (apiKey === null) {\n throw new UnauthorizedError()\n }\n\n const sha256APIKeyIndex = crypto\n .createHmac('sha256', payload.secret)\n .update(apiKey || '')\n .digest('hex')\n\n const where: Where = {\n apiKeyIndex: {\n equals: sha256APIKeyIndex,\n },\n }\n\n const { docs } = await payload.find({\n collection: 'payload-mcp-api-keys',\n depth: 1,\n limit: 1,\n pagination: false,\n where,\n })\n\n if (docs.length === 0) {\n throw new UnauthorizedError()\n }\n\n if (useVerboseLogs) {\n payload.logger.info('[payload-mcp] API Key is valid')\n }\n\n const user = docs[0]?.user as TypedUser\n user.collection = pluginOptions.userCollection as string\n user._strategy = 'mcp-api-key' as const\n\n return docs[0] as unknown as MCPAccessSettings\n }\n\n const mcpAccessSettings = pluginOptions.overrideAuth\n ? await pluginOptions.overrideAuth(req, getDefaultMcpAccessSettings)\n : await getDefaultMcpAccessSettings()\n\n // @modelcontextprotocol/sdk's StreamableHTTPServerTransport uses @hono/node-server's\n // getRequestListener, which replaces global.Request and global.Response with Hono\n // custom classes. Unfortunately, we cannot pass overrideGlobalObjects: false because the option is\n // consumed inside the SDK transport and is not exposed to callers.\n // Save originals here and restore after the handler resolves so that Next.js\n // instanceof Response checks on subsequent route handlers keep working.\n const globals = globalThis as Record<string, unknown>\n const originalResponse = globals['Response']\n const originalRequest = globals['Request']\n\n const handler = getMCPHandler(pluginOptions, mcpAccessSettings, req)\n const request = createRequestFromPayloadRequest(req)\n\n try {\n return await handler(request)\n } finally {\n if (globals['Response'] !== originalResponse) {\n Object.defineProperty(globalThis, 'Response', { value: originalResponse })\n }\n if (globals['Request'] !== originalRequest) {\n Object.defineProperty(globalThis, 'Request', { value: originalRequest })\n }\n }\n }\n return mcpHandler\n}\n"],"names":["crypto","UnauthorizedError","createRequestFromPayloadRequest","getMCPHandler","initializeMCPHandler","pluginOptions","mcpHandler","req","payload","MCPOptions","mcp","MCPHandlerOptions","handlerOptions","useVerboseLogs","verboseLogs","payloadAPI","getDefaultMcpAccessSettings","overrideApiKey","apiKey","headers","get","startsWith","replace","trim","sha256APIKeyIndex","createHmac","secret","update","digest","where","apiKeyIndex","equals","docs","find","collection","depth","limit","pagination","length","logger","info","user","userCollection","_strategy","mcpAccessSettings","overrideAuth","globals","globalThis","originalResponse","originalRequest","handler","request","Object","defineProperty","value"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAC3B,SAA8CC,iBAAiB,QAAoB,UAAS;AAI5F,SAASC,+BAA+B,QAAQ,0BAAyB;AACzE,SAASC,aAAa,QAAQ,0BAAyB;AAEvD,OAAO,MAAMC,uBAAuB,CAACC;IACnC,MAAMC,aAA6B,OAAOC;QACxC,MAAM,EAAEC,OAAO,EAAE,GAAGD;QACpB,MAAME,aAAaJ,cAAcK,GAAG,IAAI,CAAC;QACzC,MAAMC,oBAAoBF,WAAWG,cAAc,IAAI,CAAC;QACxD,MAAMC,iBAAiBF,kBAAkBG,WAAW,IAAI;QAExDP,IAAIQ,UAAU,GAAG;QAEjB,MAAMC,8BAA8B,OAAOC;YACzC,MAAMC,SACJ,AAACD,kBAAkBV,IAAIY,OAAO,CAACC,GAAG,CAAC,kBAAkBC,WAAW,aAC5Dd,IAAIY,OAAO,CAACC,GAAG,CAAC,kBAAkBE,QAAQ,WAAW,IAAIC,SACzD;YAEN,IAAIL,WAAW,MAAM;gBACnB,MAAM,IAAIjB;YACZ;YAEA,MAAMuB,oBAAoBxB,OACvByB,UAAU,CAAC,UAAUjB,QAAQkB,MAAM,EACnCC,MAAM,CAACT,UAAU,IACjBU,MAAM,CAAC;YAEV,MAAMC,QAAe;gBACnBC,aAAa;oBACXC,QAAQP;gBACV;YACF;YAEA,MAAM,EAAEQ,IAAI,EAAE,GAAG,MAAMxB,QAAQyB,IAAI,CAAC;gBAClCC,YAAY;gBACZC,OAAO;gBACPC,OAAO;gBACPC,YAAY;gBACZR;YACF;YAEA,IAAIG,KAAKM,MAAM,KAAK,GAAG;gBACrB,MAAM,IAAIrC;YACZ;YAEA,IAAIY,gBAAgB;gBAClBL,QAAQ+B,MAAM,CAACC,IAAI,CAAC;YACtB;YAEA,MAAMC,OAAOT,IAAI,CAAC,EAAE,EAAES;YACtBA,KAAKP,UAAU,GAAG7B,cAAcqC,cAAc;YAC9CD,KAAKE,SAAS,GAAG;YAEjB,OAAOX,IAAI,CAAC,EAAE;QAChB;QAEA,MAAMY,oBAAoBvC,cAAcwC,YAAY,GAChD,MAAMxC,cAAcwC,YAAY,CAACtC,KAAKS,+BACtC,MAAMA;QAEV,qFAAqF;QACrF,kFAAkF;QAClF,mGAAmG;QACnG,mEAAmE;QACnE,6EAA6E;QAC7E,wEAAwE;QACxE,MAAM8B,UAAUC;QAChB,MAAMC,mBAAmBF,OAAO,CAAC,WAAW;QAC5C,MAAMG,kBAAkBH,OAAO,CAAC,UAAU;QAE1C,MAAMI,UAAU/C,cAAcE,eAAeuC,mBAAmBrC;QAChE,MAAM4C,UAAUjD,gCAAgCK;QAEhD,IAAI;YACF,OAAO,MAAM2C,QAAQC;QACvB,SAAU;YACR,IAAIL,OAAO,CAAC,WAAW,KAAKE,kBAAkB;gBAC5CI,OAAOC,cAAc,CAACN,YAAY,YAAY;oBAAEO,OAAON;gBAAiB;YAC1E;YACA,IAAIF,OAAO,CAAC,UAAU,KAAKG,iBAAiB;gBAC1CG,OAAOC,cAAc,CAACN,YAAY,WAAW;oBAAEO,OAAOL;gBAAgB;YACxE;QACF;IACF;IACA,OAAO3C;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMcpHandler.d.ts","sourceRoot":"","sources":["../../src/mcp/getMcpHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,KAAK,cAAc,EAAkB,MAAM,SAAS,CAAA;AAE3F,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAuC3E,eAAO,MAAM,aAAa,kBACT,qBAAqB,qBACjB,iBAAiB,OAC/B,cAAc,
|
|
1
|
+
{"version":3,"file":"getMcpHandler.d.ts","sourceRoot":"","sources":["../../src/mcp/getMcpHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,KAAK,cAAc,EAAkB,MAAM,SAAS,CAAA;AAE3F,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAuC3E,eAAO,MAAM,aAAa,kBACT,qBAAqB,qBACjB,iBAAiB,OAC/B,cAAc,4CA+epB,CAAA"}
|
|
@@ -33,7 +33,9 @@ import { runJobTool } from './tools/job/run.js';
|
|
|
33
33
|
import { updateJobTool } from './tools/job/update.js';
|
|
34
34
|
export const getMCPHandler = (pluginOptions, mcpAccessSettings, req)=>{
|
|
35
35
|
const { payload } = req;
|
|
36
|
-
const configSchema = configToJSONSchema(payload.config, payload.db.defaultIDType, req.i18n
|
|
36
|
+
const configSchema = configToJSONSchema(payload.config, payload.db.defaultIDType, req.i18n, {
|
|
37
|
+
forceInlineBlocks: true
|
|
38
|
+
});
|
|
37
39
|
// Handler wrapper that injects req before the _extra argument
|
|
38
40
|
const wrapHandler = (handler)=>{
|
|
39
41
|
return async (...args)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/getMcpHandler.ts"],"sourcesContent":["import type { JSONSchema4 } from 'json-schema'\n\nimport { createMcpHandler } from 'mcp-handler'\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 {\n getCollectionVirtualFieldNames,\n getGlobalVirtualFieldNames,\n} from '../utils/getVirtualFieldNames.js'\nimport { removeVirtualFieldsFromSchema } from '../utils/schemaConversion/removeVirtualFieldsFromSchema.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 rawSchema = configSchema.definitions?.[enabledCollectionSlug] as JSONSchema4\n\n const virtualFieldNames = getCollectionVirtualFieldNames(\n payload.config,\n enabledCollectionSlug,\n )\n const schema = removeVirtualFieldsFromSchema(\n JSON.parse(JSON.stringify(rawSchema)) as JSONSchema4,\n virtualFieldNames,\n )\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 rawSchema = configSchema.definitions?.[enabledGlobalSlug] as JSONSchema4\n\n const virtualFieldNames = getGlobalVirtualFieldNames(payload.config, enabledGlobalSlug)\n const schema = removeVirtualFieldsFromSchema(\n JSON.parse(JSON.stringify(rawSchema)) as JSONSchema4,\n virtualFieldNames,\n )\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.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: tool.parameters,\n },\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 disableSse: MCPHandlerOptions.disableSse ?? true,\n maxDuration: MCPHandlerOptions.maxDuration || 60,\n onEvent: MCPHandlerOptions.onEvent,\n redisUrl: MCPHandlerOptions.redisUrl,\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","getCollectionVirtualFieldNames","getGlobalVirtualFieldNames","removeVirtualFieldsFromSchema","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","rawSchema","definitions","virtualFieldNames","schema","JSON","parse","stringify","toolCapabilities","allowCreate","create","allowUpdate","update","allowFind","find","allowDelete","delete","error","String","enabledGlobalSlugs","enabledGlobalSlug","tool","camelCasedToolName","name","isToolEnabled","description","inputSchema","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","disableSse","maxDuration","onEvent","redisUrl"],"mappings":"AAEA,SAASA,gBAAgB,QAAQ,cAAa;AAC9C,SAASC,IAAI,QAAQ,OAAM;AAC3B,SAASC,QAAQ,EAAEC,kBAAkB,QAA6C,UAAS;AAI3F,SAASC,WAAW,QAAQ,wBAAuB;AACnD,SAASC,eAAe,QAAQ,8BAA6B;AAC7D,SACEC,8BAA8B,EAC9BC,0BAA0B,QACrB,mCAAkC;AACzC,SAASC,6BAA6B,QAAQ,6DAA4D;AAC1G,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,eAAejC,mBAAmBgC,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,GAChD1E,KAAKiE,QAAQU,GAAG,IAAI;IAC1B,MAAMC,iBACJR,qBAAqBA,kBAAkBhC,MAAM,EAAEwC,iBAC3CR,kBAAkBhC,MAAM,CAACwC,cAAc,GACvC5E,KAAKiE,QAAQU,GAAG,IAAI;IAC1B,MAAME,cACJT,qBAAqBA,kBAAkBU,IAAI,EAAED,cACzCT,kBAAkBU,IAAI,CAACD,WAAW,GAClC7E,KAAKiE,QAAQU,GAAG,IAAI;IAE1B,IAAI;QACF,OAAO5E,iBACL,CAACgF;YACC,0BAA0B;YAC1B,MAAMC,yBAAyB5E,gBAAgBkE,yBAAyB;YAExE,6BAA6B;YAC7BU,uBAAuBC,OAAO,CAAC,CAACC;gBAC9B,IAAI;oBACF,MAAMC,YAAYhD,aAAaiD,WAAW,EAAE,CAACF,sBAAsB;oBAEnE,MAAMG,oBAAoBhF,+BACxB6B,QAAQE,MAAM,EACd8C;oBAEF,MAAMI,SAAS/E,8BACbgF,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACN,aAC1BE;oBAGF,MAAMK,mBAAmB1D,mBAAmB,CAC1C,GAAG7B,YAAY+E,wBAAwB,CACxC;oBACD,MAAMS,cAAmCD,kBAAkBE;oBAC3D,MAAMC,cAAmCH,kBAAkBI;oBAC3D,MAAMC,YAAiCL,kBAAkBM;oBACzD,MAAMC,cAAmCP,kBAAkBQ;oBAE3D,IAAIP,aAAa;wBACfnF,aACEmF,aACA,CAAC,OAAO,EAAET,uBAAuB,EACjC,IACEvE,mBACEoE,QACA9C,KACAiB,MACAY,gBACAoB,uBACAZ,yBACAgB,SAEJpD,SACA4B;oBAEJ;oBACA,IAAI+B,aAAa;wBACfrF,aACEqF,aACA,CAAC,OAAO,EAAEX,uBAAuB,EACjC,IACEpE,mBACEiE,QACA9C,KACAiB,MACAY,gBACAoB,uBACAZ,yBACAgB,SAEJpD,SACA4B;oBAEJ;oBACA,IAAIiC,WAAW;wBACbvF,aACEuF,WACA,CAAC,KAAK,EAAEb,uBAAuB,EAC/B,IACErE,iBACEkE,QACA9C,KACAiB,MACAY,gBACAoB,uBACAZ,0BAEJpC,SACA4B;oBAEJ;oBACA,IAAImC,aAAa;wBACfzF,aACEyF,aACA,CAAC,OAAO,EAAEf,uBAAuB,EACjC,IACEtE,mBACEmE,QACA9C,KACAiB,MACAY,gBACAoB,uBACAZ,0BAEJpC,SACA4B;oBAEJ;gBACF,EAAE,OAAOqC,OAAO;oBACd,MAAM,IAAIlG,SACR,CAAC,uCAAuC,EAAEiF,sBAAsB,EAAE,EAAEkB,OAAOD,QAAQ,EACnF;gBAEJ;YACF;YAEA,yBAAyB;YACzB,MAAME,qBAAqBjG,gBAAgBoE,qBAAqB;YAEhE6B,mBAAmBpB,OAAO,CAAC,CAACqB;gBAC1B,IAAI;oBACF,MAAMnB,YAAYhD,aAAaiD,WAAW,EAAE,CAACkB,kBAAkB;oBAE/D,MAAMjB,oBAAoB/E,2BAA2B4B,QAAQE,MAAM,EAAEkE;oBACrE,MAAMhB,SAAS/E,8BACbgF,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACN,aAC1BE;oBAGF,MAAMK,mBAAmB1D,mBAAmB,CAC1C,GAAG7B,YAAYmG,oBAAoB,CACpC;oBACD,MAAMP,YAAiCL,kBAAkB,CAAC,OAAO;oBACjE,MAAMG,cAAmCH,kBAAkB,CAAC,SAAS;oBAErE,IAAIK,WAAW;wBACbvF,aACEuF,WACA,CAAC,KAAK,EAAEO,mBAAmB,EAC3B,IACE7F,eACEsE,QACA9C,KACAiB,MACAY,gBACAwC,mBACA9B,sBAEJtC,SACA4B;oBAEJ;oBACA,IAAI+B,aAAa;wBACfrF,aACEqF,aACA,CAAC,OAAO,EAAES,mBAAmB,EAC7B,IACE5F,iBACEqE,QACA9C,KACAiB,MACAY,gBACAwC,mBACA9B,qBACAc,SAEJpD,SACA4B;oBAEJ;gBACF,EAAE,OAAOqC,OAAO;oBACd,MAAM,IAAIlG,SACR,CAAC,mCAAmC,EAAEqG,kBAAkB,EAAE,EAAEF,OAAOD,QAAQ,EAC3E;gBAEJ;YACF;YAEA,eAAe;YACf9C,eAAe4B,OAAO,CAAC,CAACsB;gBACtB,MAAMC,qBAAqBrG,YAAYoG,KAAKE,IAAI;gBAChD,MAAMC,gBAAgB1E,iBAAiB,CAAC,mBAAmB,EAAE,CAACwE,mBAAmB,IAAI;gBAErFhG,aACEkG,eACAH,KAAKE,IAAI,EACT,IACE1B,OAAOvE,YAAY,CACjB+F,KAAKE,IAAI,EACT;wBACEE,aAAaJ,KAAKI,WAAW;wBAC7BC,aAAaL,KAAKM,UAAU;oBAC9B,GACA9D,mBAAmBwD,KAAK9D,OAAO,IAEnCP,SACA4B;YAEJ;YAEA,iBAAiB;YACjBP,iBAAiB0B,OAAO,CAAC,CAAC6B;gBACxB,MAAMC,uBAAuB5G,YAAY2G,OAAOL,IAAI;gBACpD,MAAMO,kBACJhF,iBAAiB,CAAC,qBAAqB,EAAE,CAAC+E,qBAAqB,IAAI;gBAErE,IAAIC,iBAAiB;oBACnBjC,OAAOkC,cAAc,CACnBH,OAAOL,IAAI,EACX;wBACES,YAAYJ,OAAOI,UAAU;wBAC7BP,aAAaG,OAAOH,WAAW;wBAC/BQ,OAAOL,OAAOK,KAAK;oBACrB,GACAnE,qBAAqB8D,OAAOrE,OAAO;oBAErC,IAAIqB,gBAAgB;wBAClB5B,QAAQkF,MAAM,CAACC,IAAI,CAAC,CAAC,wBAAwB,EAAEP,OAAOK,KAAK,CAAC,YAAY,CAAC;oBAC3E;gBACF,OAAO,IAAIrD,gBAAgB;oBACzB5B,QAAQkF,MAAM,CAACC,IAAI,CAAC,CAAC,yBAAyB,EAAEP,OAAOK,KAAK,CAAC,SAAS,CAAC;gBACzE;YACF;YAEA,mBAAmB;YACnB1D,mBAAmBwB,OAAO,CAAC,CAACqC;gBAC1B,MAAMC,yBAAyBpH,YAAYmH,SAASb,IAAI;gBACxD,MAAMe,oBACJxF,iBAAiB,CAAC,uBAAuB,EAAE,CAACuF,uBAAuB,IAAI;gBAEzE,IAAIC,mBAAmB;oBACrBzC,OAAO0C,gBAAgB,CACrBH,SAASb,IAAI,EACb,wGAAwG;oBACxGa,SAASI,GAAG,EACZ;wBACEf,aAAaW,SAASX,WAAW;wBACjCgB,UAAUL,SAASK,QAAQ;wBAC3BR,OAAOG,SAASH,KAAK;oBACvB,GACAlE,uBAAuBqE,SAAS7E,OAAO;oBAGzC,IAAIqB,gBAAgB;wBAClB5B,QAAQkF,MAAM,CAACC,IAAI,CAAC,CAAC,0BAA0B,EAAEC,SAASH,KAAK,CAAC,YAAY,CAAC;oBAC/E;gBACF,OAAO,IAAIrD,gBAAgB;oBACzB5B,QAAQkF,MAAM,CAACC,IAAI,CAAC,CAAC,2BAA2B,EAAEC,SAASH,KAAK,CAAC,SAAS,CAAC;gBAC7E;YACF;YAEA,qDAAqD;YACrD,IACEnF,kBAAkBuC,WAAW,EAAEqB,UAC/BxB,kBAAkBG,WAAW,EAAEqD,WAC/B5D,eACA;gBACAxD,aACEwB,kBAAkBuC,WAAW,CAACqB,MAAM,EACpC,qBACA,IACEvE,qBAAqB0D,QAAQ9C,KAAK6B,gBAAgBY,oBAAoBE,iBACxE1C,SACA4B;YAEJ;YACA,IACE9B,kBAAkBuC,WAAW,EAAE2B,UAC/B9B,kBAAkBG,WAAW,EAAEqD,WAC/B5D,eACA;gBACAxD,aACEwB,kBAAkBuC,WAAW,CAAC2B,MAAM,EACpC,qBACA,IACE5E,qBAAqByD,QAAQ9C,KAAK6B,gBAAgBY,oBAAoBE,iBACxE1C,SACA4B;YAEJ;YAEA,IACE9B,kBAAkBuC,WAAW,EAAEyB,QAC/B5B,kBAAkBG,WAAW,EAAEqD,WAC/B5D,eACA;gBACAxD,aACEwB,kBAAkBuC,WAAW,CAACyB,IAAI,EAClC,mBACA,IAAMzE,mBAAmBwD,QAAQ9C,KAAK6B,gBAAgBY,qBACtDxC,SACA4B;YAEJ;YAEA,IACE9B,kBAAkBuC,WAAW,EAAEuB,UAC/B1B,kBAAkBG,WAAW,EAAEqD,WAC/B5D,eACA;gBACAxD,aACEwB,kBAAkBuC,WAAW,CAACuB,MAAM,EACpC,qBACA,IACEtE,qBAAqBuD,QAAQ9C,KAAK6B,gBAAgBY,oBAAoBE,iBACxE1C,SACA4B;YAEJ;YAEA,mDAAmD;YACnD,IAAI9B,kBAAkBI,MAAM,EAAE4D,QAAQ5B,kBAAkBhC,MAAM,EAAEwF,WAAW5D,eAAe;gBACxFxD,aACEwB,kBAAkBI,MAAM,CAAC4D,IAAI,EAC7B,eACA,IAAMvE,eAAesD,QAAQ9C,KAAK6B,gBAAgBc,iBAClD1C,SACA4B;YAEJ;YAEA,IACE9B,kBAAkBI,MAAM,EAAE0D,UAC1B1B,kBAAkBhC,MAAM,EAAEwF,WAC1B5D,eACA;gBACAxD,aACEwB,kBAAkBI,MAAM,CAAC0D,MAAM,EAC/B,iBACA,IAAMpE,iBAAiBqD,QAAQ9C,KAAK6B,gBAAgBc,iBACpD1C,SACA4B;YAEJ;YAEA,wCAAwC;YACxC,IAAI9B,kBAAkB8C,IAAI,EAAEc,UAAUxB,kBAAkBU,IAAI,EAAE8C,WAAW5D,eAAe;gBACtFxD,aACEwB,kBAAkB8C,IAAI,CAACc,MAAM,EAC7B,cACA,IAAMjE,cAAcoD,QAAQ9C,KAAK6B,gBAAgBe,cACjD3C,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkB8C,IAAI,EAAEgB,UAAU1B,kBAAkBU,IAAI,EAAE8C,WAAW5D,eAAe;gBACtFxD,aACEwB,kBAAkB8C,IAAI,CAACgB,MAAM,EAC7B,cACA,IAAMjE,cAAckD,QAAQ9C,KAAK6B,gBAAgBe,cACjD3C,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkB8C,IAAI,EAAE+C,OAAOzD,kBAAkBU,IAAI,EAAE8C,WAAW5D,eAAe;gBACnFxD,aACEwB,kBAAkB8C,IAAI,CAAC+C,GAAG,EAC1B,WACA,IAAMjG,WAAWmD,QAAQ9C,KAAK6B,iBAC9B5B,SACA4B;YAEJ;YAEA,yCAAyC;YACzC,IAAI9B,kBAAkB8F,IAAI,EAAEA,QAAQ1D,kBAAkB0D,IAAI,EAAEF,WAAW5D,eAAe;gBACpFxD,aACEwB,kBAAkB8F,IAAI,CAACA,IAAI,EAC3B,QACA,IAAM/G,SAASgE,QAAQ9C,KAAK6B,iBAC5B5B,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkB8F,IAAI,EAAEC,SAAS3D,kBAAkB0D,IAAI,EAAEF,WAAW5D,eAAe;gBACrFxD,aACEwB,kBAAkB8F,IAAI,CAACC,KAAK,EAC5B,SACA,IAAM9G,UAAU8D,QAAQ9C,KAAK6B,iBAC7B5B,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkB8F,IAAI,EAAEE,UAAU5D,kBAAkB0D,IAAI,EAAEF,WAAW5D,eAAe;gBACtFxD,aACEwB,kBAAkB8F,IAAI,CAACE,MAAM,EAC7B,UACA,IAAM5G,WAAW2D,QAAQ9C,KAAK6B,iBAC9B5B,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkB8F,IAAI,EAAEG,iBAAiB7D,kBAAkB0D,IAAI,EAAEF,SAAS;gBAC5EpH,aACEwB,kBAAkB8F,IAAI,CAACG,aAAa,EACpC,kBACA,IAAM/G,kBAAkB6D,QAAQ9C,KAAK6B,iBACrC5B,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkB8F,IAAI,EAAEI,kBAAkB9D,kBAAkB0D,IAAI,EAAEF,SAAS;gBAC7EpH,aACEwB,kBAAkB8F,IAAI,CAACI,cAAc,EACrC,mBACA,IAAMlH,mBAAmB+D,QAAQ9C,KAAK6B,iBACtC5B,SACA4B;YAEJ;YAEA,IAAI9B,kBAAkB8F,IAAI,EAAEK,UAAU/D,kBAAkB0D,IAAI,EAAEF,SAAS;gBACrEpH,aACEwB,kBAAkB8F,IAAI,CAACK,MAAM,EAC7B,UACA,IAAMhH,WAAW4D,QAAQ9C,KAAK6B,iBAC9B5B,SACA4B;YAEJ;YAEA,IAAIA,gBAAgB;gBAClB5B,QAAQkF,MAAM,CAACC,IAAI,CAAC;YACtB;QACF,GACA;YACEe,YAAYvE,cAAcuE,UAAU;QACtC,GACA;YACEC,UAAU1E,kBAAkB0E,QAAQ,IAAInG,QAAQE,MAAM,CAACkG,MAAM,EAAEC,OAAO;YACtEC,YAAY7E,kBAAkB6E,UAAU,IAAI;YAC5CC,aAAa9E,kBAAkB8E,WAAW,IAAI;YAC9CC,SAAS/E,kBAAkB+E,OAAO;YAClCC,UAAUhF,kBAAkBgF,QAAQ;YACpC5E,aAAaD;QACf;IAEJ,EAAE,OAAOqC,OAAO;QACd,MAAM,IAAIlG,SAAS,CAAC,gCAAgC,EAAEmG,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 'mcp-handler'\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 {\n getCollectionVirtualFieldNames,\n getGlobalVirtualFieldNames,\n} from '../utils/getVirtualFieldNames.js'\nimport { removeVirtualFieldsFromSchema } from '../utils/schemaConversion/removeVirtualFieldsFromSchema.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 forceInlineBlocks: true,\n })\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 rawSchema = configSchema.definitions?.[enabledCollectionSlug] as JSONSchema4\n\n const virtualFieldNames = getCollectionVirtualFieldNames(\n payload.config,\n enabledCollectionSlug,\n )\n const schema = removeVirtualFieldsFromSchema(\n JSON.parse(JSON.stringify(rawSchema)) as JSONSchema4,\n virtualFieldNames,\n )\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 rawSchema = configSchema.definitions?.[enabledGlobalSlug] as JSONSchema4\n\n const virtualFieldNames = getGlobalVirtualFieldNames(payload.config, enabledGlobalSlug)\n const schema = removeVirtualFieldsFromSchema(\n JSON.parse(JSON.stringify(rawSchema)) as JSONSchema4,\n virtualFieldNames,\n )\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.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: tool.parameters,\n },\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 disableSse: MCPHandlerOptions.disableSse ?? true,\n maxDuration: MCPHandlerOptions.maxDuration || 60,\n onEvent: MCPHandlerOptions.onEvent,\n redisUrl: MCPHandlerOptions.redisUrl,\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","getCollectionVirtualFieldNames","getGlobalVirtualFieldNames","removeVirtualFieldsFromSchema","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","forceInlineBlocks","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","rawSchema","definitions","virtualFieldNames","schema","JSON","parse","stringify","toolCapabilities","allowCreate","create","allowUpdate","update","allowFind","find","allowDelete","delete","error","String","enabledGlobalSlugs","enabledGlobalSlug","tool","camelCasedToolName","name","isToolEnabled","description","inputSchema","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","disableSse","maxDuration","onEvent","redisUrl"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/plugin-mcp",
|
|
3
|
-
"version": "3.80.0
|
|
3
|
+
"version": "3.80.0",
|
|
4
4
|
"description": "MCP (Model Context Protocol) capabilities with Payload",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"plugin",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"dist"
|
|
38
38
|
],
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@modelcontextprotocol/sdk": "1.
|
|
40
|
+
"@modelcontextprotocol/sdk": "1.27.1",
|
|
41
41
|
"@types/json-schema": "7.0.15",
|
|
42
42
|
"json-schema-to-zod": "2.6.1",
|
|
43
43
|
"mcp-handler": "^1.0.7",
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@payloadcms/eslint-config": "3.28.0",
|
|
48
|
-
"payload": "3.80.0
|
|
48
|
+
"payload": "3.80.0"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
|
-
"payload": "3.80.0
|
|
51
|
+
"payload": "3.80.0"
|
|
52
52
|
},
|
|
53
53
|
"homepage:": "https://payloadcms.com",
|
|
54
54
|
"scripts": {
|
package/src/endpoints/mcp.ts
CHANGED
|
@@ -63,9 +63,29 @@ export const initializeMCPHandler = (pluginOptions: PluginMCPServerConfig) => {
|
|
|
63
63
|
? await pluginOptions.overrideAuth(req, getDefaultMcpAccessSettings)
|
|
64
64
|
: await getDefaultMcpAccessSettings()
|
|
65
65
|
|
|
66
|
+
// @modelcontextprotocol/sdk's StreamableHTTPServerTransport uses @hono/node-server's
|
|
67
|
+
// getRequestListener, which replaces global.Request and global.Response with Hono
|
|
68
|
+
// custom classes. Unfortunately, we cannot pass overrideGlobalObjects: false because the option is
|
|
69
|
+
// consumed inside the SDK transport and is not exposed to callers.
|
|
70
|
+
// Save originals here and restore after the handler resolves so that Next.js
|
|
71
|
+
// instanceof Response checks on subsequent route handlers keep working.
|
|
72
|
+
const globals = globalThis as Record<string, unknown>
|
|
73
|
+
const originalResponse = globals['Response']
|
|
74
|
+
const originalRequest = globals['Request']
|
|
75
|
+
|
|
66
76
|
const handler = getMCPHandler(pluginOptions, mcpAccessSettings, req)
|
|
67
77
|
const request = createRequestFromPayloadRequest(req)
|
|
68
|
-
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
return await handler(request)
|
|
81
|
+
} finally {
|
|
82
|
+
if (globals['Response'] !== originalResponse) {
|
|
83
|
+
Object.defineProperty(globalThis, 'Response', { value: originalResponse })
|
|
84
|
+
}
|
|
85
|
+
if (globals['Request'] !== originalRequest) {
|
|
86
|
+
Object.defineProperty(globalThis, 'Request', { value: originalRequest })
|
|
87
|
+
}
|
|
88
|
+
}
|
|
69
89
|
}
|
|
70
90
|
return mcpHandler
|
|
71
91
|
}
|
package/src/mcp/getMcpHandler.ts
CHANGED
|
@@ -49,7 +49,9 @@ export const getMCPHandler = (
|
|
|
49
49
|
req: PayloadRequest,
|
|
50
50
|
) => {
|
|
51
51
|
const { payload } = req
|
|
52
|
-
const configSchema = configToJSONSchema(payload.config, payload.db.defaultIDType, req.i18n
|
|
52
|
+
const configSchema = configToJSONSchema(payload.config, payload.db.defaultIDType, req.i18n, {
|
|
53
|
+
forceInlineBlocks: true,
|
|
54
|
+
})
|
|
53
55
|
|
|
54
56
|
// Handler wrapper that injects req before the _extra argument
|
|
55
57
|
const wrapHandler = (handler: (...args: any[]) => any) => {
|