@payloadcms/plugin-mcp 3.91.0-internal.6e3dc85 → 3.91.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.
Files changed (38) hide show
  1. package/dist/mcp/tools/auth/auth.d.ts.map +1 -1
  2. package/dist/mcp/tools/auth/auth.js +3 -9
  3. package/dist/mcp/tools/auth/auth.js.map +1 -1
  4. package/dist/mcp/tools/auth/auth.spec.js +2 -2
  5. package/dist/mcp/tools/auth/auth.spec.js.map +1 -1
  6. package/dist/mcp/tools/global/find.d.ts.map +1 -1
  7. package/dist/mcp/tools/global/find.js +8 -22
  8. package/dist/mcp/tools/global/find.js.map +1 -1
  9. package/dist/mcp/tools/global/update.d.ts.map +1 -1
  10. package/dist/mcp/tools/global/update.js +3 -20
  11. package/dist/mcp/tools/global/update.js.map +1 -1
  12. package/dist/mcp/tools/resource/create.d.ts.map +1 -1
  13. package/dist/mcp/tools/resource/create.js +3 -20
  14. package/dist/mcp/tools/resource/create.js.map +1 -1
  15. package/dist/mcp/tools/resource/find.d.ts.map +1 -1
  16. package/dist/mcp/tools/resource/find.js +28 -25
  17. package/dist/mcp/tools/resource/find.js.map +1 -1
  18. package/dist/mcp/tools/resource/update.d.ts.map +1 -1
  19. package/dist/mcp/tools/resource/update.js +5 -22
  20. package/dist/mcp/tools/resource/update.js.map +1 -1
  21. package/dist/mcp/tools/schemas.d.ts +33 -18
  22. package/dist/mcp/tools/schemas.d.ts.map +1 -1
  23. package/dist/mcp/tools/schemas.js +14 -6
  24. package/dist/mcp/tools/schemas.js.map +1 -1
  25. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts +2 -1
  26. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts.map +1 -1
  27. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js +21 -3
  28. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js.map +1 -1
  29. package/package.json +4 -4
  30. package/src/mcp/tools/auth/auth.spec.ts +2 -2
  31. package/src/mcp/tools/auth/auth.ts +4 -10
  32. package/src/mcp/tools/global/find.ts +10 -24
  33. package/src/mcp/tools/global/update.ts +6 -24
  34. package/src/mcp/tools/resource/create.ts +5 -24
  35. package/src/mcp/tools/resource/find.ts +35 -25
  36. package/src/mcp/tools/resource/update.ts +6 -25
  37. package/src/mcp/tools/schemas.ts +38 -14
  38. package/src/utils/schemaConversion/convertCollectionSchemaToZod.ts +23 -3
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/auth/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAM7C,eAAO,MAAM,QAAQ,WAAY,SAAS,OAAO,cAAc,eAAe,OAAO,SAiFpF,CAAA"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/auth/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAM7C,eAAO,MAAM,QAAQ,WAAY,SAAS,OAAO,cAAc,eAAe,OAAO,SA2EpF,CAAA"}
@@ -7,17 +7,11 @@ export const authTool = (server, req, verboseLogs)=>{
7
7
  payload.logger.info('[payload-mcp] Checking authentication status');
8
8
  }
9
9
  try {
10
- // Parse custom headers if provided, otherwise use empty headers
11
10
  let authHeaders = new Headers();
12
11
  if (headers) {
13
- try {
14
- const parsedHeaders = JSON.parse(headers);
15
- authHeaders = new Headers(parsedHeaders);
16
- if (verboseLogs) {
17
- payload.logger.info(`[payload-mcp] Using custom headers: ${headers}`);
18
- }
19
- } catch (_ignore) {
20
- payload.logger.warn(`[payload-mcp] Invalid headers JSON: ${headers}, using empty headers`);
12
+ authHeaders = new Headers(headers);
13
+ if (verboseLogs) {
14
+ payload.logger.info(`[payload-mcp] Using custom headers: ${JSON.stringify(headers)}`);
21
15
  }
22
16
  }
23
17
  const authReq = await createLocalReq({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/mcp/tools/auth/auth.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest } from 'payload'\n\nimport { createLocalReq } from 'payload'\n\nimport { toolSchemas } from '../schemas.js'\n\nexport const authTool = (server: McpServer, req: PayloadRequest, verboseLogs: boolean) => {\n const tool = async (headers?: string) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info('[payload-mcp] Checking authentication status')\n }\n\n try {\n // Parse custom headers if provided, otherwise use empty headers\n let authHeaders = new Headers()\n\n if (headers) {\n try {\n const parsedHeaders = JSON.parse(headers)\n authHeaders = new Headers(parsedHeaders)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Using custom headers: ${headers}`)\n }\n } catch (_ignore) {\n payload.logger.warn(`[payload-mcp] Invalid headers JSON: ${headers}, using empty headers`)\n }\n }\n\n const authReq = await createLocalReq({ req: { headers: authHeaders } }, payload)\n const result = await payload.auth({ headers: authHeaders, req: authReq })\n\n if (result.user) {\n const authenticatedUser = result.user\n const user = await payload.findByID({\n id: authenticatedUser.id,\n collection: authenticatedUser.collection,\n overrideAccess: false,\n req: authReq,\n })\n\n result.user = {\n ...user,\n _sid: authenticatedUser._sid,\n _strategy: authenticatedUser._strategy,\n collection: authenticatedUser.collection,\n }\n }\n\n if (verboseLogs) {\n payload.logger.info('[payload-mcp] Authentication check completed successfully')\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `# Authentication Status\\n\\n\\`\\`\\`json\\n${JSON.stringify(result)}\\n\\`\\`\\``,\n },\n ],\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(`[payload-mcp] Error checking authentication: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error checking authentication**: ${errorMessage}`,\n },\n ],\n }\n }\n }\n\n server.registerTool(\n 'auth',\n {\n description: toolSchemas.auth.description,\n inputSchema: toolSchemas.auth.parameters.shape,\n },\n async ({ headers }) => {\n return await tool(headers)\n },\n )\n}\n"],"names":["createLocalReq","toolSchemas","authTool","server","req","verboseLogs","tool","headers","payload","logger","info","authHeaders","Headers","parsedHeaders","JSON","parse","_ignore","warn","authReq","result","auth","user","authenticatedUser","findByID","id","collection","overrideAccess","_sid","_strategy","content","type","text","stringify","error","errorMessage","Error","message","registerTool","description","inputSchema","parameters","shape"],"mappings":"AAGA,SAASA,cAAc,QAAQ,UAAS;AAExC,SAASC,WAAW,QAAQ,gBAAe;AAE3C,OAAO,MAAMC,WAAW,CAACC,QAAmBC,KAAqBC;IAC/D,MAAMC,OAAO,OAAOC;QAClB,MAAMC,UAAUJ,IAAII,OAAO;QAE3B,IAAIH,aAAa;YACfG,QAAQC,MAAM,CAACC,IAAI,CAAC;QACtB;QAEA,IAAI;YACF,gEAAgE;YAChE,IAAIC,cAAc,IAAIC;YAEtB,IAAIL,SAAS;gBACX,IAAI;oBACF,MAAMM,gBAAgBC,KAAKC,KAAK,CAACR;oBACjCI,cAAc,IAAIC,QAAQC;oBAC1B,IAAIR,aAAa;wBACfG,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,oCAAoC,EAAEH,SAAS;oBACtE;gBACF,EAAE,OAAOS,SAAS;oBAChBR,QAAQC,MAAM,CAACQ,IAAI,CAAC,CAAC,oCAAoC,EAAEV,QAAQ,qBAAqB,CAAC;gBAC3F;YACF;YAEA,MAAMW,UAAU,MAAMlB,eAAe;gBAAEI,KAAK;oBAAEG,SAASI;gBAAY;YAAE,GAAGH;YACxE,MAAMW,SAAS,MAAMX,QAAQY,IAAI,CAAC;gBAAEb,SAASI;gBAAaP,KAAKc;YAAQ;YAEvE,IAAIC,OAAOE,IAAI,EAAE;gBACf,MAAMC,oBAAoBH,OAAOE,IAAI;gBACrC,MAAMA,OAAO,MAAMb,QAAQe,QAAQ,CAAC;oBAClCC,IAAIF,kBAAkBE,EAAE;oBACxBC,YAAYH,kBAAkBG,UAAU;oBACxCC,gBAAgB;oBAChBtB,KAAKc;gBACP;gBAEAC,OAAOE,IAAI,GAAG;oBACZ,GAAGA,IAAI;oBACPM,MAAML,kBAAkBK,IAAI;oBAC5BC,WAAWN,kBAAkBM,SAAS;oBACtCH,YAAYH,kBAAkBG,UAAU;gBAC1C;YACF;YAEA,IAAIpB,aAAa;gBACfG,QAAQC,MAAM,CAACC,IAAI,CAAC;YACtB;YAEA,OAAO;gBACLmB,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,uCAAuC,EAAEjB,KAAKkB,SAAS,CAACb,QAAQ,QAAQ,CAAC;oBAClF;iBACD;YACH;QACF,EAAE,OAAOc,OAAO;YACd,MAAMC,eAAeD,iBAAiBE,QAAQF,MAAMG,OAAO,GAAG;YAC9D5B,QAAQC,MAAM,CAACwB,KAAK,CAAC,CAAC,6CAA6C,EAAEC,cAAc;YAEnF,OAAO;gBACLL,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,qCAAqC,EAAEG,cAAc;oBAC9D;iBACD;YACH;QACF;IACF;IAEA/B,OAAOkC,YAAY,CACjB,QACA;QACEC,aAAarC,YAAYmB,IAAI,CAACkB,WAAW;QACzCC,aAAatC,YAAYmB,IAAI,CAACoB,UAAU,CAACC,KAAK;IAChD,GACA,OAAO,EAAElC,OAAO,EAAE;QAChB,OAAO,MAAMD,KAAKC;IACpB;AAEJ,EAAC"}
1
+ {"version":3,"sources":["../../../../src/mcp/tools/auth/auth.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest } from 'payload'\n\nimport { createLocalReq } from 'payload'\n\nimport { toolSchemas } from '../schemas.js'\n\nexport const authTool = (server: McpServer, req: PayloadRequest, verboseLogs: boolean) => {\n const tool = async (headers?: Record<string, string>) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info('[payload-mcp] Checking authentication status')\n }\n\n try {\n let authHeaders = new Headers()\n\n if (headers) {\n authHeaders = new Headers(headers)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Using custom headers: ${JSON.stringify(headers)}`)\n }\n }\n\n const authReq = await createLocalReq({ req: { headers: authHeaders } }, payload)\n const result = await payload.auth({ headers: authHeaders, req: authReq })\n\n if (result.user) {\n const authenticatedUser = result.user\n const user = await payload.findByID({\n id: authenticatedUser.id,\n collection: authenticatedUser.collection,\n overrideAccess: false,\n req: authReq,\n })\n\n result.user = {\n ...user,\n _sid: authenticatedUser._sid,\n _strategy: authenticatedUser._strategy,\n collection: authenticatedUser.collection,\n }\n }\n\n if (verboseLogs) {\n payload.logger.info('[payload-mcp] Authentication check completed successfully')\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `# Authentication Status\\n\\n\\`\\`\\`json\\n${JSON.stringify(result)}\\n\\`\\`\\``,\n },\n ],\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(`[payload-mcp] Error checking authentication: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error checking authentication**: ${errorMessage}`,\n },\n ],\n }\n }\n }\n\n server.registerTool(\n 'auth',\n {\n description: toolSchemas.auth.description,\n inputSchema: toolSchemas.auth.parameters.shape,\n },\n async ({ headers }) => {\n return await tool(headers)\n },\n )\n}\n"],"names":["createLocalReq","toolSchemas","authTool","server","req","verboseLogs","tool","headers","payload","logger","info","authHeaders","Headers","JSON","stringify","authReq","result","auth","user","authenticatedUser","findByID","id","collection","overrideAccess","_sid","_strategy","content","type","text","error","errorMessage","Error","message","registerTool","description","inputSchema","parameters","shape"],"mappings":"AAGA,SAASA,cAAc,QAAQ,UAAS;AAExC,SAASC,WAAW,QAAQ,gBAAe;AAE3C,OAAO,MAAMC,WAAW,CAACC,QAAmBC,KAAqBC;IAC/D,MAAMC,OAAO,OAAOC;QAClB,MAAMC,UAAUJ,IAAII,OAAO;QAE3B,IAAIH,aAAa;YACfG,QAAQC,MAAM,CAACC,IAAI,CAAC;QACtB;QAEA,IAAI;YACF,IAAIC,cAAc,IAAIC;YAEtB,IAAIL,SAAS;gBACXI,cAAc,IAAIC,QAAQL;gBAC1B,IAAIF,aAAa;oBACfG,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,oCAAoC,EAAEG,KAAKC,SAAS,CAACP,UAAU;gBACtF;YACF;YAEA,MAAMQ,UAAU,MAAMf,eAAe;gBAAEI,KAAK;oBAAEG,SAASI;gBAAY;YAAE,GAAGH;YACxE,MAAMQ,SAAS,MAAMR,QAAQS,IAAI,CAAC;gBAAEV,SAASI;gBAAaP,KAAKW;YAAQ;YAEvE,IAAIC,OAAOE,IAAI,EAAE;gBACf,MAAMC,oBAAoBH,OAAOE,IAAI;gBACrC,MAAMA,OAAO,MAAMV,QAAQY,QAAQ,CAAC;oBAClCC,IAAIF,kBAAkBE,EAAE;oBACxBC,YAAYH,kBAAkBG,UAAU;oBACxCC,gBAAgB;oBAChBnB,KAAKW;gBACP;gBAEAC,OAAOE,IAAI,GAAG;oBACZ,GAAGA,IAAI;oBACPM,MAAML,kBAAkBK,IAAI;oBAC5BC,WAAWN,kBAAkBM,SAAS;oBACtCH,YAAYH,kBAAkBG,UAAU;gBAC1C;YACF;YAEA,IAAIjB,aAAa;gBACfG,QAAQC,MAAM,CAACC,IAAI,CAAC;YACtB;YAEA,OAAO;gBACLgB,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,uCAAuC,EAAEf,KAAKC,SAAS,CAACE,QAAQ,QAAQ,CAAC;oBAClF;iBACD;YACH;QACF,EAAE,OAAOa,OAAO;YACd,MAAMC,eAAeD,iBAAiBE,QAAQF,MAAMG,OAAO,GAAG;YAC9DxB,QAAQC,MAAM,CAACoB,KAAK,CAAC,CAAC,6CAA6C,EAAEC,cAAc;YAEnF,OAAO;gBACLJ,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,qCAAqC,EAAEE,cAAc;oBAC9D;iBACD;YACH;QACF;IACF;IAEA3B,OAAO8B,YAAY,CACjB,QACA;QACEC,aAAajC,YAAYgB,IAAI,CAACiB,WAAW;QACzCC,aAAalC,YAAYgB,IAAI,CAACmB,UAAU,CAACC,KAAK;IAChD,GACA,OAAO,EAAE9B,OAAO,EAAE;QAChB,OAAO,MAAMD,KAAKC;IACpB;AAEJ,EAAC"}
@@ -54,9 +54,9 @@ describe('authTool', ()=>{
54
54
  throw new Error('Auth tool was not registered');
55
55
  }
56
56
  const result = await handler({
57
- headers: JSON.stringify({
57
+ headers: {
58
58
  Authorization: 'JWT token'
59
- })
59
+ }
60
60
  });
61
61
  const json = result.content[0].text.match(/```json\n([\s\S]*?)\n```/)?.[1];
62
62
  expect(json).toBeDefined();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/mcp/tools/auth/auth.spec.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { Payload, PayloadRequest } from 'payload'\n\nimport { beforeEach, describe, expect, it, vi } from 'vitest'\n\nconst mocks = vi.hoisted(() => ({\n createLocalReq: vi.fn(),\n}))\n\nvi.mock('payload', () => ({\n createLocalReq: mocks.createLocalReq,\n}))\n\nimport { authTool } from './auth.js'\n\ntype AuthToolResult = {\n content: Array<{\n text: string\n type: 'text'\n }>\n}\n\ntype AuthToolHandler = (args: { headers?: string }) => Promise<AuthToolResult>\n\ndescribe('authTool', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n })\n\n it('should omit user fields without read access from authentication status', async () => {\n const internalNotes = 'private authentication notes'\n const authenticatedUser = {\n _sid: 'session-id',\n _strategy: 'local-jwt',\n collection: 'users',\n id: 'user-id',\n internalNotes,\n }\n const payload = {\n auth: vi.fn(async ({ req }: { req: PayloadRequest }) => {\n req.user = authenticatedUser\n\n return { user: authenticatedUser }\n }),\n findByID: vi.fn(async ({ overrideAccess }: { overrideAccess: boolean }) =>\n overrideAccess\n ? authenticatedUser\n : { email: 'user@example.com', id: authenticatedUser.id },\n ),\n logger: {\n error: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n },\n } as unknown as Payload\n const authReq = { payload } as PayloadRequest\n const req = { payload } as PayloadRequest\n let handler: AuthToolHandler | undefined\n const server = {\n registerTool: (_name: string, _definition: unknown, registeredHandler: AuthToolHandler) => {\n handler = registeredHandler\n },\n } as unknown as McpServer\n\n mocks.createLocalReq.mockResolvedValue(authReq)\n authTool(server, req, false)\n\n if (!handler) {\n throw new Error('Auth tool was not registered')\n }\n\n const result = await handler({\n headers: JSON.stringify({ Authorization: 'JWT token' }),\n })\n const json = result.content[0]!.text.match(/```json\\n([\\s\\S]*?)\\n```/)?.[1]\n\n expect(json).toBeDefined()\n\n const authenticationStatus = JSON.parse(json!)\n\n expect(authReq.user).toBe(authenticatedUser)\n expect(payload.findByID).toHaveBeenCalledWith({\n id: authenticatedUser.id,\n collection: authenticatedUser.collection,\n overrideAccess: false,\n req: authReq,\n })\n expect(authenticationStatus.user).toMatchObject({\n _sid: authenticatedUser._sid,\n _strategy: authenticatedUser._strategy,\n collection: authenticatedUser.collection,\n email: 'user@example.com',\n id: authenticatedUser.id,\n })\n expect(authenticationStatus.user).not.toHaveProperty('internalNotes')\n expect(JSON.stringify(authenticationStatus)).not.toContain(internalNotes)\n })\n})\n"],"names":["beforeEach","describe","expect","it","vi","mocks","hoisted","createLocalReq","fn","mock","authTool","clearAllMocks","internalNotes","authenticatedUser","_sid","_strategy","collection","id","payload","auth","req","user","findByID","overrideAccess","email","logger","error","info","warn","authReq","handler","server","registerTool","_name","_definition","registeredHandler","mockResolvedValue","Error","result","headers","JSON","stringify","Authorization","json","content","text","match","toBeDefined","authenticationStatus","parse","toBe","toHaveBeenCalledWith","toMatchObject","not","toHaveProperty","toContain"],"mappings":"AAGA,SAASA,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,SAAQ;AAE7D,MAAMC,QAAQD,GAAGE,OAAO,CAAC,IAAO,CAAA;QAC9BC,gBAAgBH,GAAGI,EAAE;IACvB,CAAA;AAEAJ,GAAGK,IAAI,CAAC,WAAW,IAAO,CAAA;QACxBF,gBAAgBF,MAAME,cAAc;IACtC,CAAA;AAEA,SAASG,QAAQ,QAAQ,YAAW;AAWpCT,SAAS,YAAY;IACnBD,WAAW;QACTI,GAAGO,aAAa;IAClB;IAEAR,GAAG,0EAA0E;QAC3E,MAAMS,gBAAgB;QACtB,MAAMC,oBAAoB;YACxBC,MAAM;YACNC,WAAW;YACXC,YAAY;YACZC,IAAI;YACJL;QACF;QACA,MAAMM,UAAU;YACdC,MAAMf,GAAGI,EAAE,CAAC,OAAO,EAAEY,GAAG,EAA2B;gBACjDA,IAAIC,IAAI,GAAGR;gBAEX,OAAO;oBAAEQ,MAAMR;gBAAkB;YACnC;YACAS,UAAUlB,GAAGI,EAAE,CAAC,OAAO,EAAEe,cAAc,EAA+B,GACpEA,iBACIV,oBACA;oBAAEW,OAAO;oBAAoBP,IAAIJ,kBAAkBI,EAAE;gBAAC;YAE5DQ,QAAQ;gBACNC,OAAOtB,GAAGI,EAAE;gBACZmB,MAAMvB,GAAGI,EAAE;gBACXoB,MAAMxB,GAAGI,EAAE;YACb;QACF;QACA,MAAMqB,UAAU;YAAEX;QAAQ;QAC1B,MAAME,MAAM;YAAEF;QAAQ;QACtB,IAAIY;QACJ,MAAMC,SAAS;YACbC,cAAc,CAACC,OAAeC,aAAsBC;gBAClDL,UAAUK;YACZ;QACF;QAEA9B,MAAME,cAAc,CAAC6B,iBAAiB,CAACP;QACvCnB,SAASqB,QAAQX,KAAK;QAEtB,IAAI,CAACU,SAAS;YACZ,MAAM,IAAIO,MAAM;QAClB;QAEA,MAAMC,SAAS,MAAMR,QAAQ;YAC3BS,SAASC,KAAKC,SAAS,CAAC;gBAAEC,eAAe;YAAY;QACvD;QACA,MAAMC,OAAOL,OAAOM,OAAO,CAAC,EAAE,CAAEC,IAAI,CAACC,KAAK,CAAC,6BAA6B,CAAC,EAAE;QAE3E5C,OAAOyC,MAAMI,WAAW;QAExB,MAAMC,uBAAuBR,KAAKS,KAAK,CAACN;QAExCzC,OAAO2B,QAAQR,IAAI,EAAE6B,IAAI,CAACrC;QAC1BX,OAAOgB,QAAQI,QAAQ,EAAE6B,oBAAoB,CAAC;YAC5ClC,IAAIJ,kBAAkBI,EAAE;YACxBD,YAAYH,kBAAkBG,UAAU;YACxCO,gBAAgB;YAChBH,KAAKS;QACP;QACA3B,OAAO8C,qBAAqB3B,IAAI,EAAE+B,aAAa,CAAC;YAC9CtC,MAAMD,kBAAkBC,IAAI;YAC5BC,WAAWF,kBAAkBE,SAAS;YACtCC,YAAYH,kBAAkBG,UAAU;YACxCQ,OAAO;YACPP,IAAIJ,kBAAkBI,EAAE;QAC1B;QACAf,OAAO8C,qBAAqB3B,IAAI,EAAEgC,GAAG,CAACC,cAAc,CAAC;QACrDpD,OAAOsC,KAAKC,SAAS,CAACO,uBAAuBK,GAAG,CAACE,SAAS,CAAC3C;IAC7D;AACF"}
1
+ {"version":3,"sources":["../../../../src/mcp/tools/auth/auth.spec.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { Payload, PayloadRequest } from 'payload'\n\nimport { beforeEach, describe, expect, it, vi } from 'vitest'\n\nconst mocks = vi.hoisted(() => ({\n createLocalReq: vi.fn(),\n}))\n\nvi.mock('payload', () => ({\n createLocalReq: mocks.createLocalReq,\n}))\n\nimport { authTool } from './auth.js'\n\ntype AuthToolResult = {\n content: Array<{\n text: string\n type: 'text'\n }>\n}\n\ntype AuthToolHandler = (args: { headers?: Record<string, string> }) => Promise<AuthToolResult>\n\ndescribe('authTool', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n })\n\n it('should omit user fields without read access from authentication status', async () => {\n const internalNotes = 'private authentication notes'\n const authenticatedUser = {\n _sid: 'session-id',\n _strategy: 'local-jwt',\n collection: 'users',\n id: 'user-id',\n internalNotes,\n }\n const payload = {\n auth: vi.fn(async ({ req }: { req: PayloadRequest }) => {\n req.user = authenticatedUser\n\n return { user: authenticatedUser }\n }),\n findByID: vi.fn(async ({ overrideAccess }: { overrideAccess: boolean }) =>\n overrideAccess\n ? authenticatedUser\n : { email: 'user@example.com', id: authenticatedUser.id },\n ),\n logger: {\n error: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n },\n } as unknown as Payload\n const authReq = { payload } as PayloadRequest\n const req = { payload } as PayloadRequest\n let handler: AuthToolHandler | undefined\n const server = {\n registerTool: (_name: string, _definition: unknown, registeredHandler: AuthToolHandler) => {\n handler = registeredHandler\n },\n } as unknown as McpServer\n\n mocks.createLocalReq.mockResolvedValue(authReq)\n authTool(server, req, false)\n\n if (!handler) {\n throw new Error('Auth tool was not registered')\n }\n\n const result = await handler({\n headers: { Authorization: 'JWT token' },\n })\n const json = result.content[0]!.text.match(/```json\\n([\\s\\S]*?)\\n```/)?.[1]\n\n expect(json).toBeDefined()\n\n const authenticationStatus = JSON.parse(json!)\n\n expect(authReq.user).toBe(authenticatedUser)\n expect(payload.findByID).toHaveBeenCalledWith({\n id: authenticatedUser.id,\n collection: authenticatedUser.collection,\n overrideAccess: false,\n req: authReq,\n })\n expect(authenticationStatus.user).toMatchObject({\n _sid: authenticatedUser._sid,\n _strategy: authenticatedUser._strategy,\n collection: authenticatedUser.collection,\n email: 'user@example.com',\n id: authenticatedUser.id,\n })\n expect(authenticationStatus.user).not.toHaveProperty('internalNotes')\n expect(JSON.stringify(authenticationStatus)).not.toContain(internalNotes)\n })\n})\n"],"names":["beforeEach","describe","expect","it","vi","mocks","hoisted","createLocalReq","fn","mock","authTool","clearAllMocks","internalNotes","authenticatedUser","_sid","_strategy","collection","id","payload","auth","req","user","findByID","overrideAccess","email","logger","error","info","warn","authReq","handler","server","registerTool","_name","_definition","registeredHandler","mockResolvedValue","Error","result","headers","Authorization","json","content","text","match","toBeDefined","authenticationStatus","JSON","parse","toBe","toHaveBeenCalledWith","toMatchObject","not","toHaveProperty","stringify","toContain"],"mappings":"AAGA,SAASA,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,SAAQ;AAE7D,MAAMC,QAAQD,GAAGE,OAAO,CAAC,IAAO,CAAA;QAC9BC,gBAAgBH,GAAGI,EAAE;IACvB,CAAA;AAEAJ,GAAGK,IAAI,CAAC,WAAW,IAAO,CAAA;QACxBF,gBAAgBF,MAAME,cAAc;IACtC,CAAA;AAEA,SAASG,QAAQ,QAAQ,YAAW;AAWpCT,SAAS,YAAY;IACnBD,WAAW;QACTI,GAAGO,aAAa;IAClB;IAEAR,GAAG,0EAA0E;QAC3E,MAAMS,gBAAgB;QACtB,MAAMC,oBAAoB;YACxBC,MAAM;YACNC,WAAW;YACXC,YAAY;YACZC,IAAI;YACJL;QACF;QACA,MAAMM,UAAU;YACdC,MAAMf,GAAGI,EAAE,CAAC,OAAO,EAAEY,GAAG,EAA2B;gBACjDA,IAAIC,IAAI,GAAGR;gBAEX,OAAO;oBAAEQ,MAAMR;gBAAkB;YACnC;YACAS,UAAUlB,GAAGI,EAAE,CAAC,OAAO,EAAEe,cAAc,EAA+B,GACpEA,iBACIV,oBACA;oBAAEW,OAAO;oBAAoBP,IAAIJ,kBAAkBI,EAAE;gBAAC;YAE5DQ,QAAQ;gBACNC,OAAOtB,GAAGI,EAAE;gBACZmB,MAAMvB,GAAGI,EAAE;gBACXoB,MAAMxB,GAAGI,EAAE;YACb;QACF;QACA,MAAMqB,UAAU;YAAEX;QAAQ;QAC1B,MAAME,MAAM;YAAEF;QAAQ;QACtB,IAAIY;QACJ,MAAMC,SAAS;YACbC,cAAc,CAACC,OAAeC,aAAsBC;gBAClDL,UAAUK;YACZ;QACF;QAEA9B,MAAME,cAAc,CAAC6B,iBAAiB,CAACP;QACvCnB,SAASqB,QAAQX,KAAK;QAEtB,IAAI,CAACU,SAAS;YACZ,MAAM,IAAIO,MAAM;QAClB;QAEA,MAAMC,SAAS,MAAMR,QAAQ;YAC3BS,SAAS;gBAAEC,eAAe;YAAY;QACxC;QACA,MAAMC,OAAOH,OAAOI,OAAO,CAAC,EAAE,CAAEC,IAAI,CAACC,KAAK,CAAC,6BAA6B,CAAC,EAAE;QAE3E1C,OAAOuC,MAAMI,WAAW;QAExB,MAAMC,uBAAuBC,KAAKC,KAAK,CAACP;QAExCvC,OAAO2B,QAAQR,IAAI,EAAE4B,IAAI,CAACpC;QAC1BX,OAAOgB,QAAQI,QAAQ,EAAE4B,oBAAoB,CAAC;YAC5CjC,IAAIJ,kBAAkBI,EAAE;YACxBD,YAAYH,kBAAkBG,UAAU;YACxCO,gBAAgB;YAChBH,KAAKS;QACP;QACA3B,OAAO4C,qBAAqBzB,IAAI,EAAE8B,aAAa,CAAC;YAC9CrC,MAAMD,kBAAkBC,IAAI;YAC5BC,WAAWF,kBAAkBE,SAAS;YACtCC,YAAYH,kBAAkBG,UAAU;YACxCQ,OAAO;YACPP,IAAIJ,kBAAkBI,EAAE;QAC1B;QACAf,OAAO4C,qBAAqBzB,IAAI,EAAE+B,GAAG,CAACC,cAAc,CAAC;QACrDnD,OAAO6C,KAAKO,SAAS,CAACR,uBAAuBM,GAAG,CAACG,SAAS,CAAC3C;IAC7D;AACF"}
@@ -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,EAAc,SAAS,EAAE,MAAM,SAAS,CAAA;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAKxD,eAAO,MAAM,cAAc,WACjB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,cACR,MAAM,WACT,eAAe,CAAC,SAAS,CAAC,SAmHpC,CAAA"}
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,EAA4B,SAAS,EAAE,MAAM,SAAS,CAAA;AAElF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAKxD,eAAO,MAAM,cAAc,WACjB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,cACR,MAAM,WACT,eAAe,CAAC,SAAS,CAAC,SAqGpC,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, select)=>{
4
+ const tool = async (depth = 0, locale, fallbackLocale, select, populate)=>{
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}` : ''}`);
@@ -14,23 +14,6 @@ export const findGlobalTool = (server, req, user, verboseLogs, globalSlug, globa
14
14
  req,
15
15
  user
16
16
  };
17
- let selectClause;
18
- if (select) {
19
- try {
20
- selectClause = JSON.parse(select);
21
- } catch (_parseError) {
22
- payload.logger.warn(`[payload-mcp] Invalid select clause JSON for global: ${select}`);
23
- const response = {
24
- content: [
25
- {
26
- type: 'text',
27
- text: 'Error: Invalid JSON in select clause'
28
- }
29
- ]
30
- };
31
- return globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response;
32
- }
33
- }
34
17
  // Add locale parameters if provided
35
18
  if (locale) {
36
19
  findOptions.locale = locale;
@@ -38,8 +21,11 @@ export const findGlobalTool = (server, req, user, verboseLogs, globalSlug, globa
38
21
  if (fallbackLocale) {
39
22
  findOptions.fallbackLocale = fallbackLocale;
40
23
  }
41
- if (selectClause) {
42
- findOptions.select = selectClause;
24
+ if (select) {
25
+ findOptions.select = select;
26
+ }
27
+ if (populate) {
28
+ findOptions.populate = populate;
43
29
  }
44
30
  const result = await payload.findGlobal(findOptions);
45
31
  if (verboseLogs) {
@@ -75,8 +61,8 @@ ${JSON.stringify(result)}
75
61
  server.registerTool(`find${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`, {
76
62
  description: `${toolSchemas.findGlobal.description.trim()}\n\n${globals?.[globalSlug]?.description || ''}`,
77
63
  inputSchema: toolSchemas.findGlobal.parameters.shape
78
- }, async ({ depth, fallbackLocale, locale, select })=>{
79
- return await tool(depth, locale, fallbackLocale, select);
64
+ }, async ({ depth, fallbackLocale, locale, populate, select })=>{
65
+ return await tool(depth, locale, fallbackLocale, select, populate);
80
66
  });
81
67
  }
82
68
  };
@@ -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, SelectType, TypedUser } from 'payload'\n\nimport type { MCPPluginConfig } 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: MCPPluginConfig['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 overrideAccess: false,\n req,\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)}\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.registerTool(\n `find${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`,\n {\n description: `${toolSchemas.findGlobal.description.trim()}\\n\\n${globals?.[globalSlug]?.description || ''}`,\n inputSchema: toolSchemas.findGlobal.parameters.shape,\n },\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","overrideAccess","selectClause","JSON","parse","_parseError","warn","response","content","type","text","overrideResponse","result","findGlobal","stringify","error","errorMessage","Error","message","enabled","registerTool","charAt","toUpperCase","slice","description","trim","inputSchema","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;gBACAS,gBAAgB;gBAChBf;gBACAC;YACF;YAEA,IAAIe;YACJ,IAAIP,QAAQ;gBACV,IAAI;oBACFO,eAAeC,KAAKC,KAAK,CAACT;gBAC5B,EAAE,OAAOU,aAAa;oBACpBT,QAAQC,MAAM,CAACS,IAAI,CAAC,CAAC,qDAAqD,EAAEX,QAAQ;oBACpF,MAAMY,WAAW;wBACfC,SAAS;4BAAC;gCAAEC,MAAM;gCAAiBC,MAAM;4BAAuC;yBAAE;oBACpF;oBACA,OAAQpB,SAAS,CAACD,WAAW,EAAEsB,mBAAmBJ,UAAU,CAAC,GAAGrB,QAAQqB;gBAM1E;YACF;YAEA,oCAAoC;YACpC,IAAId,QAAQ;gBACVM,YAAYN,MAAM,GAAGA;YACvB;YACA,IAAIC,gBAAgB;gBAClBK,YAAYL,cAAc,GAAGA;YAC/B;YACA,IAAIQ,cAAc;gBAChBH,YAAYJ,MAAM,GAAGO;YACvB;YAEA,MAAMU,SAAS,MAAMhB,QAAQiB,UAAU,CAACd;YAExC,IAAIX,aAAa;gBACfQ,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,4BAA4B,EAAET,YAAY;YACjE;YAEA,MAAMkB,WAAW;gBACfC,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,QAAQ,EAAErB,WAAW;;AAExC,EAAEc,KAAKW,SAAS,CAACF,QAAQ;MACnB,CAAC;oBACG;iBACD;YACH;YAEA,OAAQtB,SAAS,CAACD,WAAW,EAAEsB,mBAAmBJ,UAAUK,QAAQ1B,QAAQqB;QAM9E,EAAE,OAAOQ,OAAO;YACd,MAAMC,eAAeD,iBAAiBE,QAAQF,MAAMG,OAAO,GAAG;YAC9DtB,QAAQC,MAAM,CAACkB,KAAK,CAAC,CAAC,mCAAmC,EAAE1B,WAAW,EAAE,EAAE2B,cAAc;YACxF,MAAMT,WAAW;gBACfC,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,0BAA0B,EAAErB,WAAW,KAAK,EAAE2B,cAAc;oBACrE;iBACD;YACH;YACA,OAAQ1B,SAAS,CAACD,WAAW,EAAEsB,mBAAmBJ,UAAU,CAAC,GAAGrB,QAAQqB;QAM1E;IACF;IAEA,IAAIjB,SAAS,CAACD,WAAW,EAAE8B,SAAS;QAClClC,OAAOmC,YAAY,CACjB,CAAC,IAAI,EAAE/B,WAAWgC,MAAM,CAAC,GAAGC,WAAW,KAAKxC,YAAYO,YAAYkC,KAAK,CAAC,IAAI,EAC9E;YACEC,aAAa,GAAGzC,YAAY8B,UAAU,CAACW,WAAW,CAACC,IAAI,GAAG,IAAI,EAAEnC,SAAS,CAACD,WAAW,EAAEmC,eAAe,IAAI;YAC1GE,aAAa3C,YAAY8B,UAAU,CAACc,UAAU,CAACC,KAAK;QACtD,GACA,OAAO,EAAEpC,KAAK,EAAEE,cAAc,EAAED,MAAM,EAAEE,MAAM,EAAE;YAC9C,OAAO,MAAMJ,KAAKC,OAAOC,QAAQC,gBAAgBC;QACnD;IAEJ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../../src/mcp/tools/global/find.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest, PopulateType, SelectType, TypedUser } from 'payload'\n\nimport type { MCPPluginConfig } 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: MCPPluginConfig['globals'],\n) => {\n const tool = async (\n depth: number = 0,\n locale?: string,\n fallbackLocale?: string,\n select?: Record<string, unknown>,\n populate?: Record<string, unknown>,\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 overrideAccess: false,\n req,\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 if (select) {\n findOptions.select = select as SelectType\n }\n if (populate) {\n findOptions.populate = populate as PopulateType\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)}\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.registerTool(\n `find${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`,\n {\n description: `${toolSchemas.findGlobal.description.trim()}\\n\\n${globals?.[globalSlug]?.description || ''}`,\n inputSchema: toolSchemas.findGlobal.parameters.shape,\n },\n async ({ depth, fallbackLocale, locale, populate, select }) => {\n return await tool(depth, locale, fallbackLocale, select, populate)\n },\n )\n }\n}\n"],"names":["toCamelCase","toolSchemas","findGlobalTool","server","req","user","verboseLogs","globalSlug","globals","tool","depth","locale","fallbackLocale","select","populate","payload","logger","info","findOptions","slug","overrideAccess","result","findGlobal","response","content","type","text","JSON","stringify","overrideResponse","error","errorMessage","Error","message","enabled","registerTool","charAt","toUpperCase","slice","description","trim","inputSchema","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,QACAC;QAOA,MAAMC,UAAUX,IAAIW,OAAO;QAE3B,IAAIT,aAAa;YACfS,QAAQC,MAAM,CAACC,IAAI,CACjB,CAAC,8BAA8B,EAAEV,WAAW,SAAS,EAAEG,QAAQC,SAAS,CAAC,UAAU,EAAEA,QAAQ,GAAG,IAAI;QAExG;QAEA,IAAI;YACF,MAAMO,cAAwD;gBAC5DC,MAAMZ;gBACNG;gBACAU,gBAAgB;gBAChBhB;gBACAC;YACF;YAEA,oCAAoC;YACpC,IAAIM,QAAQ;gBACVO,YAAYP,MAAM,GAAGA;YACvB;YACA,IAAIC,gBAAgB;gBAClBM,YAAYN,cAAc,GAAGA;YAC/B;YACA,IAAIC,QAAQ;gBACVK,YAAYL,MAAM,GAAGA;YACvB;YACA,IAAIC,UAAU;gBACZI,YAAYJ,QAAQ,GAAGA;YACzB;YAEA,MAAMO,SAAS,MAAMN,QAAQO,UAAU,CAACJ;YAExC,IAAIZ,aAAa;gBACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,4BAA4B,EAAEV,YAAY;YACjE;YAEA,MAAMgB,WAAW;gBACfC,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,QAAQ,EAAEnB,WAAW;;AAExC,EAAEoB,KAAKC,SAAS,CAACP,QAAQ;MACnB,CAAC;oBACG;iBACD;YACH;YAEA,OAAQb,SAAS,CAACD,WAAW,EAAEsB,mBAAmBN,UAAUF,QAAQjB,QAAQmB;QAM9E,EAAE,OAAOO,OAAO;YACd,MAAMC,eAAeD,iBAAiBE,QAAQF,MAAMG,OAAO,GAAG;YAC9DlB,QAAQC,MAAM,CAACc,KAAK,CAAC,CAAC,mCAAmC,EAAEvB,WAAW,EAAE,EAAEwB,cAAc;YACxF,MAAMR,WAAW;gBACfC,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,0BAA0B,EAAEnB,WAAW,KAAK,EAAEwB,cAAc;oBACrE;iBACD;YACH;YACA,OAAQvB,SAAS,CAACD,WAAW,EAAEsB,mBAAmBN,UAAU,CAAC,GAAGnB,QAAQmB;QAM1E;IACF;IAEA,IAAIf,SAAS,CAACD,WAAW,EAAE2B,SAAS;QAClC/B,OAAOgC,YAAY,CACjB,CAAC,IAAI,EAAE5B,WAAW6B,MAAM,CAAC,GAAGC,WAAW,KAAKrC,YAAYO,YAAY+B,KAAK,CAAC,IAAI,EAC9E;YACEC,aAAa,GAAGtC,YAAYqB,UAAU,CAACiB,WAAW,CAACC,IAAI,GAAG,IAAI,EAAEhC,SAAS,CAACD,WAAW,EAAEgC,eAAe,IAAI;YAC1GE,aAAaxC,YAAYqB,UAAU,CAACoB,UAAU,CAACC,KAAK;QACtD,GACA,OAAO,EAAEjC,KAAK,EAAEE,cAAc,EAAED,MAAM,EAAEG,QAAQ,EAAED,MAAM,EAAE;YACxD,OAAO,MAAMJ,KAAKC,OAAOC,QAAQC,gBAAgBC,QAAQC;QAC3D;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,EAAc,SAAS,EAAE,MAAM,SAAS,CAAA;AAIpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAUxD,eAAO,MAAM,gBAAgB,WACnB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,cACR,MAAM,WACT,eAAe,CAAC,SAAS,CAAC,UAC3B,WAAW,SAyLpB,CAAA"}
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,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAUxD,eAAO,MAAM,gBAAgB,WACnB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,cACR,MAAM,WACT,eAAe,CAAC,SAAS,CAAC,UAC3B,WAAW,SAuKpB,CAAA"}
@@ -31,23 +31,6 @@ export const updateGlobalTool = (server, req, user, verboseLogs, globalSlug, glo
31
31
  };
32
32
  return globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response;
33
33
  }
34
- let selectClause;
35
- if (select) {
36
- try {
37
- selectClause = JSON.parse(select);
38
- } catch (_parseError) {
39
- payload.logger.warn(`[payload-mcp] Invalid select clause JSON for global: ${select}`);
40
- const response = {
41
- content: [
42
- {
43
- type: 'text',
44
- text: 'Error: Invalid JSON in select clause'
45
- }
46
- ]
47
- };
48
- return globals?.[globalSlug]?.overrideResponse?.(response, {}, req) || response;
49
- }
50
- }
51
34
  const updateOptions = {
52
35
  slug: globalSlug,
53
36
  data: parsedData,
@@ -64,8 +47,8 @@ export const updateGlobalTool = (server, req, user, verboseLogs, globalSlug, glo
64
47
  if (fallbackLocale) {
65
48
  updateOptions.fallbackLocale = fallbackLocale;
66
49
  }
67
- if (selectClause) {
68
- updateOptions.select = selectClause;
50
+ if (select) {
51
+ updateOptions.select = select;
69
52
  }
70
53
  const result = await payload.updateGlobal(updateOptions);
71
54
  if (verboseLogs) {
@@ -110,7 +93,7 @@ ${JSON.stringify(result)}
110
93
  draft: z.boolean().optional().describe('Optional: Whether to save as draft (default: false)'),
111
94
  fallbackLocale: z.string().optional().describe('Optional: fallback locale code to use when requested locale is not available'),
112
95
  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'),
113
- select: z.string().optional().describe('Optional: define exactly which fields you\'d like to return in the response (JSON), e.g., \'{"siteName": "My Site"}\'')
96
+ select: z.record(z.string(), z.unknown()).optional().describe("Optional: define exactly which fields you'd like to return in the response, e.g., {\"siteName\": true}")
114
97
  });
115
98
  server.registerTool(`update${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`, {
116
99
  description: `${toolSchemas.updateGlobal.description.trim()}\n\n${globals?.[globalSlug]?.description || ''}`,
@@ -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, SelectType, TypedUser } from 'payload'\n\nimport { z } from 'zod'\n\nimport type { MCPPluginConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport {\n getGlobalVirtualFieldNames,\n stripVirtualFields,\n} from '../../../utils/getVirtualFieldNames.js'\nimport { convertCollectionSchemaToZod } from '../../../utils/schemaConversion/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: MCPPluginConfig['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\n const virtualFieldNames = getGlobalVirtualFieldNames(payload.config, globalSlug)\n parsedData = stripVirtualFields(parsedData, virtualFieldNames)\n\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 overrideAccess: false,\n req,\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)}\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.registerTool(\n `update${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`,\n {\n description: `${toolSchemas.updateGlobal.description.trim()}\\n\\n${globals?.[globalSlug]?.description || ''}`,\n inputSchema: updateGlobalSchema.shape,\n },\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","getGlobalVirtualFieldNames","stripVirtualFields","convertCollectionSchemaToZod","toolSchemas","updateGlobalTool","server","req","user","verboseLogs","globalSlug","globals","schema","tool","data","draft","depth","locale","fallbackLocale","select","payload","logger","info","parsedData","JSON","parse","virtualFieldNames","config","stringify","_parseError","error","response","content","type","text","overrideResponse","selectClause","warn","updateOptions","slug","overrideAccess","result","updateGlobal","errorMessage","Error","message","enabled","convertedFields","optionalFields","Object","fromEntries","entries","shape","map","key","value","optional","updateGlobalSchema","object","number","describe","boolean","string","registerTool","charAt","toUpperCase","slice","description","trim","inputSchema","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 { MCPPluginConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport {\n getGlobalVirtualFieldNames,\n stripVirtualFields,\n} from '../../../utils/getVirtualFieldNames.js'\nimport { convertCollectionSchemaToZod } from '../../../utils/schemaConversion/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: MCPPluginConfig['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?: Record<string, unknown>,\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\n const virtualFieldNames = getGlobalVirtualFieldNames(payload.config, globalSlug)\n parsedData = stripVirtualFields(parsedData, virtualFieldNames)\n\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 overrideAccess: false,\n req,\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 (select) {\n updateOptions.select = select as SelectType\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)}\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 .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Optional: define exactly which fields you'd like to return in the response, e.g., {\\\"siteName\\\": true}\",\n ),\n })\n\n server.registerTool(\n `update${globalSlug.charAt(0).toUpperCase() + toCamelCase(globalSlug).slice(1)}`,\n {\n description: `${toolSchemas.updateGlobal.description.trim()}\\n\\n${globals?.[globalSlug]?.description || ''}`,\n inputSchema: updateGlobalSchema.shape,\n },\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 Record<string, unknown> | undefined,\n )\n },\n )\n }\n}\n"],"names":["z","toCamelCase","getGlobalVirtualFieldNames","stripVirtualFields","convertCollectionSchemaToZod","toolSchemas","updateGlobalTool","server","req","user","verboseLogs","globalSlug","globals","schema","tool","data","draft","depth","locale","fallbackLocale","select","payload","logger","info","parsedData","JSON","parse","virtualFieldNames","config","stringify","_parseError","error","response","content","type","text","overrideResponse","updateOptions","slug","overrideAccess","result","updateGlobal","errorMessage","Error","message","enabled","convertedFields","optionalFields","Object","fromEntries","entries","shape","map","key","value","optional","updateGlobalSchema","object","number","describe","boolean","string","record","unknown","registerTool","charAt","toUpperCase","slice","description","trim","inputSchema","params","rest"],"mappings":"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"}
@@ -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,EAAc,SAAS,EAAE,MAAM,SAAS,CAAA;AAIpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAUxD,eAAO,MAAM,kBAAkB,WACrB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,kBACJ,MAAM,eACT,eAAe,CAAC,aAAa,CAAC,UACnC,WAAW,SA2LpB,CAAA"}
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,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAUxD,eAAO,MAAM,kBAAkB,WACrB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,kBACJ,MAAM,eACT,eAAe,CAAC,aAAa,CAAC,UACnC,WAAW,SAwKpB,CAAA"}
@@ -33,23 +33,6 @@ export const createResourceTool = (server, req, user, verboseLogs, collectionSlu
33
33
  ]
34
34
  };
35
35
  }
36
- let selectClause;
37
- if (select) {
38
- try {
39
- selectClause = JSON.parse(select);
40
- } catch (_parseError) {
41
- payload.logger.warn(`[payload-mcp] Invalid select clause JSON: ${select}`);
42
- const response = {
43
- content: [
44
- {
45
- type: 'text',
46
- text: 'Error: Invalid JSON in select clause'
47
- }
48
- ]
49
- };
50
- return collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response;
51
- }
52
- }
53
36
  // Create the resource
54
37
  const result = await payload.create({
55
38
  collection: collectionSlug,
@@ -65,8 +48,8 @@ export const createResourceTool = (server, req, user, verboseLogs, collectionSlu
65
48
  ...fallbackLocale && {
66
49
  fallbackLocale
67
50
  },
68
- ...selectClause && {
69
- select: selectClause
51
+ ...select && {
52
+ select: select
70
53
  }
71
54
  });
72
55
  if (verboseLogs) {
@@ -108,7 +91,7 @@ ${JSON.stringify(result)}
108
91
  draft: z.boolean().optional().default(false).describe('Whether to create the document as a draft'),
109
92
  fallbackLocale: z.string().optional().describe('Optional: fallback locale code to use when requested locale is not available'),
110
93
  locale: z.string().optional().describe('Optional: locale code to create the document in (e.g., "en", "es"). Defaults to the default locale'),
111
- select: z.string().optional().describe('Optional: define exactly which fields you\'d like to create (JSON), e.g., \'{"title": "My Post"}\'')
94
+ select: z.record(z.string(), z.unknown()).optional().describe("Optional: define exactly which fields you'd like to return in the response, e.g., {\"title\": true}")
112
95
  });
113
96
  server.registerTool(`create${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`, {
114
97
  description: `${collections?.[collectionSlug]?.description || toolSchemas.createResource.description.trim()}`,
@@ -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, SelectType, TypedUser } from 'payload'\n\nimport { z } from 'zod'\n\nimport type { MCPPluginConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport {\n getCollectionVirtualFieldNames,\n stripVirtualFields,\n} from '../../../utils/getVirtualFieldNames.js'\nimport { convertCollectionSchemaToZod } from '../../../utils/schemaConversion/convertCollectionSchemaToZod.js'\nimport { transformPointDataToPayload } from '../../../utils/transformPointDataToPayload.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: MCPPluginConfig['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\n // Transform point fields from object format to tuple array\n parsedData = transformPointDataToPayload(parsedData)\n\n const virtualFieldNames = getCollectionVirtualFieldNames(payload.config, collectionSlug)\n parsedData = stripVirtualFields(parsedData, virtualFieldNames)\n\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)}\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.registerTool(\n `create${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`,\n {\n description: `${collections?.[collectionSlug]?.description || toolSchemas.createResource.description.trim()}`,\n inputSchema: createResourceSchema.shape,\n },\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","getCollectionVirtualFieldNames","stripVirtualFields","convertCollectionSchemaToZod","transformPointDataToPayload","toolSchemas","createResourceTool","server","req","user","verboseLogs","collectionSlug","collections","schema","tool","data","depth","draft","locale","fallbackLocale","select","payload","logger","info","parsedData","JSON","parse","virtualFieldNames","config","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","registerTool","charAt","toUpperCase","slice","description","createResource","trim","inputSchema","params","fieldData"],"mappings":"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"}
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 { MCPPluginConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport {\n getCollectionVirtualFieldNames,\n stripVirtualFields,\n} from '../../../utils/getVirtualFieldNames.js'\nimport { convertCollectionSchemaToZod } from '../../../utils/schemaConversion/convertCollectionSchemaToZod.js'\nimport { transformPointDataToPayload } from '../../../utils/transformPointDataToPayload.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: MCPPluginConfig['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?: Record<string, unknown>,\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\n // Transform point fields from object format to tuple array\n parsedData = transformPointDataToPayload(parsedData)\n\n const virtualFieldNames = getCollectionVirtualFieldNames(payload.config, collectionSlug)\n parsedData = stripVirtualFields(parsedData, virtualFieldNames)\n\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 ...(select && { select: select as SelectType }),\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)}\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 .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Optional: define exactly which fields you'd like to return in the response, e.g., {\\\"title\\\": true}\",\n ),\n })\n\n server.registerTool(\n `create${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`,\n {\n description: `${collections?.[collectionSlug]?.description || toolSchemas.createResource.description.trim()}`,\n inputSchema: createResourceSchema.shape,\n },\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 Record<string, unknown> | undefined,\n )\n },\n )\n }\n}\n"],"names":["z","toCamelCase","getCollectionVirtualFieldNames","stripVirtualFields","convertCollectionSchemaToZod","transformPointDataToPayload","toolSchemas","createResourceTool","server","req","user","verboseLogs","collectionSlug","collections","schema","tool","data","depth","draft","locale","fallbackLocale","select","payload","logger","info","parsedData","JSON","parse","virtualFieldNames","config","stringify","_parseError","error","content","type","text","result","create","collection","overrideAccess","id","response","overrideResponse","errorMessage","Error","message","enabled","convertedFields","createResourceSchema","object","shape","number","int","min","max","optional","default","describe","boolean","string","record","unknown","registerTool","charAt","toUpperCase","slice","description","createResource","trim","inputSchema","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,EAAc,SAAS,EAAE,MAAM,SAAS,CAAA;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAKxD,eAAO,MAAM,gBAAgB,WACnB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,kBACJ,MAAM,eACT,eAAe,CAAC,aAAa,CAAC,SAuO5C,CAAA"}
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,EAAa,cAAc,EAA4B,SAAS,EAAE,MAAM,SAAS,CAAA;AAE7F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAKxD,eAAO,MAAM,gBAAgB,WACnB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,kBACJ,MAAM,eACT,eAAe,CAAC,aAAa,CAAC,SAiP5C,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, select, depth = 0, locale, fallbackLocale, draft)=>{
4
+ const tool = async (id, limit = 10, page = 1, sort, where, select, depth = 0, locale, fallbackLocale, draft, populate, joins, trash, pagination)=>{
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,24 +28,6 @@ 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
- }
49
31
  // If ID is provided, use findByID
50
32
  if (id) {
51
33
  try {
@@ -53,8 +35,14 @@ export const findResourceTool = (server, req, user, verboseLogs, collectionSlug,
53
35
  id,
54
36
  collection: collectionSlug,
55
37
  depth,
56
- ...selectClause && {
57
- select: selectClause
38
+ ...select && {
39
+ select: select
40
+ },
41
+ ...populate && {
42
+ populate: populate
43
+ },
44
+ ...joins !== undefined && {
45
+ joins: joins
58
46
  },
59
47
  overrideAccess: false,
60
48
  req,
@@ -67,6 +55,9 @@ export const findResourceTool = (server, req, user, verboseLogs, collectionSlug,
67
55
  },
68
56
  ...draft !== undefined && {
69
57
  draft
58
+ },
59
+ ...trash !== undefined && {
60
+ trash
70
61
  }
71
62
  });
72
63
  if (verboseLogs) {
@@ -104,8 +95,14 @@ ${JSON.stringify(doc)}`
104
95
  page,
105
96
  req,
106
97
  user,
107
- ...selectClause && {
108
- select: selectClause
98
+ ...select && {
99
+ select: select
100
+ },
101
+ ...populate && {
102
+ populate: populate
103
+ },
104
+ ...joins !== undefined && {
105
+ joins: joins
109
106
  },
110
107
  ...locale && {
111
108
  locale
@@ -115,6 +112,12 @@ ${JSON.stringify(doc)}`
115
112
  },
116
113
  ...draft !== undefined && {
117
114
  draft
115
+ },
116
+ ...pagination !== undefined && {
117
+ pagination
118
+ },
119
+ ...trash !== undefined && {
120
+ trash
118
121
  }
119
122
  };
120
123
  if (sort) {
@@ -161,8 +164,8 @@ Page: ${result.page} of ${result.totalPages}
161
164
  server.registerTool(`find${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`, {
162
165
  description: `${collections?.[collectionSlug]?.description || toolSchemas.findResources.description.trim()}`,
163
166
  inputSchema: toolSchemas.findResources.parameters.shape
164
- }, async ({ id, depth, draft, fallbackLocale, limit, locale, page, select, sort, where })=>{
165
- return await tool(id, limit, page, sort, where, select, depth, locale, fallbackLocale, draft);
167
+ }, async ({ id, depth, draft, fallbackLocale, joins, limit, locale, page, pagination, populate, select, sort, trash, where })=>{
168
+ return await tool(id, limit, page, sort, where, select, depth, locale, fallbackLocale, draft, populate, joins, trash, pagination);
166
169
  });
167
170
  }
168
171
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/mcp/tools/resource/find.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest, SelectType, TypedUser } from 'payload'\n\nimport type { MCPPluginConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const findResourceTool = (\n server: McpServer,\n req: PayloadRequest,\n user: TypedUser,\n verboseLogs: boolean,\n collectionSlug: string,\n collections: MCPPluginConfig['collections'],\n) => {\n const tool = async (\n id?: number | string,\n limit: number = 10,\n page: number = 1,\n sort?: string,\n where?: string,\n select?: string,\n depth: number = 0,\n locale?: string,\n fallbackLocale?: string,\n draft?: boolean,\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 resource from collection: ${collectionSlug}${id ? ` with ID: ${id}` : ''}, limit: ${limit}, page: ${page}${locale ? `, locale: ${locale}` : ''}`,\n )\n }\n\n try {\n // Parse where clause if provided\n let whereClause = {}\n if (where) {\n try {\n whereClause = JSON.parse(where)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Using where clause: ${where}`)\n }\n } catch (_parseError) {\n payload.logger.warn(`[payload-mcp] Invalid where clause JSON: ${where}`)\n const response = {\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON in where 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 // Parse select clause if provided\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 // If ID is provided, use findByID\n if (id) {\n try {\n const doc = await payload.findByID({\n id,\n collection: collectionSlug,\n depth,\n ...(selectClause && { select: selectClause }),\n overrideAccess: false,\n req,\n user,\n ...(locale && { locale }),\n ...(fallbackLocale && { fallbackLocale }),\n ...(draft !== undefined && { draft }),\n })\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Found document with ID: ${id}`)\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Resource from collection \"${collectionSlug}\":\n${JSON.stringify(doc)}`,\n },\n ],\n }\n\n return (collections?.[collectionSlug]?.overrideResponse?.(response, doc, req) ||\n response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n } catch (_findError) {\n payload.logger.warn(\n `[payload-mcp] Document not found with ID: ${id} in collection: ${collectionSlug}`,\n )\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Error: Document with ID \"${id}\" not found in collection \"${collectionSlug}\"`,\n },\n ],\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 // Otherwise, use find to get multiple documents\n const findOptions: Parameters<typeof payload.find>[0] = {\n collection: collectionSlug,\n depth,\n limit,\n overrideAccess: false,\n page,\n req,\n user,\n ...(selectClause && { select: selectClause }),\n ...(locale && { locale }),\n ...(fallbackLocale && { fallbackLocale }),\n ...(draft !== undefined && { draft }),\n }\n\n if (sort) {\n findOptions.sort = sort\n }\n\n if (Object.keys(whereClause).length > 0) {\n findOptions.where = whereClause\n }\n\n const result = await payload.find(findOptions)\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Found ${result.docs.length} documents in collection: ${collectionSlug}`,\n )\n }\n\n let responseText = `Collection: \"${collectionSlug}\"\nTotal: ${result.totalDocs} documents\nPage: ${result.page} of ${result.totalPages}\n`\n\n for (const doc of result.docs) {\n responseText += `\\n\\`\\`\\`json\\n${JSON.stringify(doc)}\\n\\`\\`\\``\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: responseText,\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 reading resources from collection ${collectionSlug}: ${errorMessage}`,\n )\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error reading resources from collection \"${collectionSlug}\":** ${errorMessage}`,\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 server.registerTool(\n `find${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`,\n {\n description: `${collections?.[collectionSlug]?.description || toolSchemas.findResources.description.trim()}`,\n inputSchema: toolSchemas.findResources.parameters.shape,\n },\n async ({ id, depth, draft, fallbackLocale, limit, locale, page, select, sort, where }) => {\n return await tool(\n id,\n limit,\n page,\n sort,\n where,\n select,\n depth,\n locale,\n fallbackLocale,\n draft,\n )\n },\n )\n }\n}\n"],"names":["toCamelCase","toolSchemas","findResourceTool","server","req","user","verboseLogs","collectionSlug","collections","tool","id","limit","page","sort","where","select","depth","locale","fallbackLocale","draft","payload","logger","info","whereClause","JSON","parse","_parseError","warn","response","content","type","text","overrideResponse","selectClause","doc","findByID","collection","overrideAccess","undefined","stringify","_findError","findOptions","Object","keys","length","result","find","docs","responseText","totalDocs","totalPages","error","errorMessage","Error","message","enabled","registerTool","charAt","toUpperCase","slice","description","findResources","trim","inputSchema","parameters","shape"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/mcp/tools/resource/find.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { JoinQuery, PayloadRequest, PopulateType, SelectType, TypedUser } from 'payload'\n\nimport type { MCPPluginConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const findResourceTool = (\n server: McpServer,\n req: PayloadRequest,\n user: TypedUser,\n verboseLogs: boolean,\n collectionSlug: string,\n collections: MCPPluginConfig['collections'],\n) => {\n const tool = async (\n id?: number | string,\n limit: number = 10,\n page: number = 1,\n sort?: string,\n where?: string,\n select?: Record<string, unknown>,\n depth: number = 0,\n locale?: string,\n fallbackLocale?: string,\n draft?: boolean,\n populate?: Record<string, unknown>,\n joins?: false | Record<string, unknown>,\n trash?: boolean,\n pagination?: boolean,\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 resource from collection: ${collectionSlug}${id ? ` with ID: ${id}` : ''}, limit: ${limit}, page: ${page}${locale ? `, locale: ${locale}` : ''}`,\n )\n }\n\n try {\n // Parse where clause if provided\n let whereClause = {}\n if (where) {\n try {\n whereClause = JSON.parse(where)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Using where clause: ${where}`)\n }\n } catch (_parseError) {\n payload.logger.warn(`[payload-mcp] Invalid where clause JSON: ${where}`)\n const response = {\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON in where 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 // If ID is provided, use findByID\n if (id) {\n try {\n const doc = await payload.findByID({\n id,\n collection: collectionSlug,\n depth,\n ...(select && { select: select as SelectType }),\n ...(populate && { populate: populate as PopulateType }),\n ...(joins !== undefined && { joins: joins as JoinQuery }),\n overrideAccess: false,\n req,\n user,\n ...(locale && { locale }),\n ...(fallbackLocale && { fallbackLocale }),\n ...(draft !== undefined && { draft }),\n ...(trash !== undefined && { trash }),\n })\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Found document with ID: ${id}`)\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Resource from collection \"${collectionSlug}\":\n${JSON.stringify(doc)}`,\n },\n ],\n }\n\n return (collections?.[collectionSlug]?.overrideResponse?.(response, doc, req) ||\n response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n } catch (_findError) {\n payload.logger.warn(\n `[payload-mcp] Document not found with ID: ${id} in collection: ${collectionSlug}`,\n )\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Error: Document with ID \"${id}\" not found in collection \"${collectionSlug}\"`,\n },\n ],\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 // Otherwise, use find to get multiple documents\n const findOptions: Parameters<typeof payload.find>[0] = {\n collection: collectionSlug,\n depth,\n limit,\n overrideAccess: false,\n page,\n req,\n user,\n ...(select && { select: select as SelectType }),\n ...(populate && { populate: populate as PopulateType }),\n ...(joins !== undefined && { joins: joins as JoinQuery }),\n ...(locale && { locale }),\n ...(fallbackLocale && { fallbackLocale }),\n ...(draft !== undefined && { draft }),\n ...(pagination !== undefined && { pagination }),\n ...(trash !== undefined && { trash }),\n }\n\n if (sort) {\n findOptions.sort = sort\n }\n\n if (Object.keys(whereClause).length > 0) {\n findOptions.where = whereClause\n }\n\n const result = await payload.find(findOptions)\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Found ${result.docs.length} documents in collection: ${collectionSlug}`,\n )\n }\n\n let responseText = `Collection: \"${collectionSlug}\"\nTotal: ${result.totalDocs} documents\nPage: ${result.page} of ${result.totalPages}\n`\n\n for (const doc of result.docs) {\n responseText += `\\n\\`\\`\\`json\\n${JSON.stringify(doc)}\\n\\`\\`\\``\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: responseText,\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 reading resources from collection ${collectionSlug}: ${errorMessage}`,\n )\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error reading resources from collection \"${collectionSlug}\":** ${errorMessage}`,\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 server.registerTool(\n `find${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`,\n {\n description: `${collections?.[collectionSlug]?.description || toolSchemas.findResources.description.trim()}`,\n inputSchema: toolSchemas.findResources.parameters.shape,\n },\n async ({\n id,\n depth,\n draft,\n fallbackLocale,\n joins,\n limit,\n locale,\n page,\n pagination,\n populate,\n select,\n sort,\n trash,\n where,\n }) => {\n return await tool(\n id,\n limit,\n page,\n sort,\n where,\n select,\n depth,\n locale,\n fallbackLocale,\n draft,\n populate,\n joins,\n trash,\n pagination,\n )\n },\n )\n }\n}\n"],"names":["toCamelCase","toolSchemas","findResourceTool","server","req","user","verboseLogs","collectionSlug","collections","tool","id","limit","page","sort","where","select","depth","locale","fallbackLocale","draft","populate","joins","trash","pagination","payload","logger","info","whereClause","JSON","parse","_parseError","warn","response","content","type","text","overrideResponse","doc","findByID","collection","undefined","overrideAccess","stringify","_findError","findOptions","Object","keys","length","result","find","docs","responseText","totalDocs","totalPages","error","errorMessage","Error","message","enabled","registerTool","charAt","toUpperCase","slice","description","findResources","trim","inputSchema","parameters","shape"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/resource/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,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAUxD,eAAO,MAAM,kBAAkB,WACrB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,kBACJ,MAAM,eACT,eAAe,CAAC,aAAa,CAAC,UACnC,WAAW,SAuVpB,CAAA"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/resource/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,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAUxD,eAAO,MAAM,kBAAkB,WACrB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,kBACJ,MAAM,eACT,eAAe,CAAC,aAAa,CAAC,UACnC,WAAW,SAoUpB,CAAA"}