@payloadcms/plugin-mcp 3.91.0-internal.c1569dc → 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.
- package/dist/mcp/tools/auth/auth.d.ts.map +1 -1
- package/dist/mcp/tools/auth/auth.js +3 -9
- package/dist/mcp/tools/auth/auth.js.map +1 -1
- package/dist/mcp/tools/auth/auth.spec.js +2 -2
- package/dist/mcp/tools/auth/auth.spec.js.map +1 -1
- package/dist/mcp/tools/global/find.d.ts.map +1 -1
- package/dist/mcp/tools/global/find.js +8 -22
- package/dist/mcp/tools/global/find.js.map +1 -1
- package/dist/mcp/tools/global/update.d.ts.map +1 -1
- package/dist/mcp/tools/global/update.js +3 -20
- package/dist/mcp/tools/global/update.js.map +1 -1
- package/dist/mcp/tools/resource/create.d.ts.map +1 -1
- package/dist/mcp/tools/resource/create.js +3 -20
- package/dist/mcp/tools/resource/create.js.map +1 -1
- package/dist/mcp/tools/resource/find.d.ts.map +1 -1
- package/dist/mcp/tools/resource/find.js +28 -25
- package/dist/mcp/tools/resource/find.js.map +1 -1
- package/dist/mcp/tools/resource/update.d.ts.map +1 -1
- package/dist/mcp/tools/resource/update.js +5 -22
- package/dist/mcp/tools/resource/update.js.map +1 -1
- package/dist/mcp/tools/schemas.d.ts +33 -18
- package/dist/mcp/tools/schemas.d.ts.map +1 -1
- package/dist/mcp/tools/schemas.js +14 -6
- package/dist/mcp/tools/schemas.js.map +1 -1
- package/package.json +4 -4
- package/src/mcp/tools/auth/auth.spec.ts +2 -2
- package/src/mcp/tools/auth/auth.ts +4 -10
- package/src/mcp/tools/global/find.ts +10 -24
- package/src/mcp/tools/global/update.ts +6 -24
- package/src/mcp/tools/resource/create.ts +5 -24
- package/src/mcp/tools/resource/find.ts +35 -25
- package/src/mcp/tools/resource/update.ts +6 -25
- package/src/mcp/tools/schemas.ts +38 -14
|
@@ -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,
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
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:
|
|
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:
|
|
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,
|
|
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 (
|
|
42
|
-
findOptions.select =
|
|
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
|
|
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,
|
|
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 (
|
|
68
|
-
updateOptions.select =
|
|
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(
|
|
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,
|
|
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
|
-
...
|
|
69
|
-
select:
|
|
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(
|
|
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":"AAIA,SAASA,CAAC,QAAQ,MAAK;AAIvB,SAASC,WAAW,QAAQ,8BAA6B;AACzD,SACEC,8BAA8B,EAC9BC,kBAAkB,QACb,yCAAwC;AAC/C,SAASC,4BAA4B,QAAQ,kEAAiE;AAC9G,SAASC,2BAA2B,QAAQ,gDAA+C;AAC3F,SAASC,WAAW,QAAQ,gBAAe;AAC3C,OAAO,MAAMC,qBAAqB,CAChCC,QACAC,KACAC,MACAC,aACAC,gBACAC,aACAC;IAEA,MAAMC,OAAO,OACXC,MACAC,QAAgB,CAAC,EACjBC,OACAC,QACAC,gBACAC;QAOA,MAAMC,UAAUb,IAAIa,OAAO;QAE3B,IAAIX,aAAa;YACfW,QAAQC,MAAM,CAACC,IAAI,CACjB,CAAC,+CAA+C,EAAEZ,iBAAiBO,SAAS,CAAC,cAAc,EAAEA,QAAQ,GAAG,IAAI;QAEhH;QAEA,IAAI;YACF,sBAAsB;YACtB,IAAIM;YACJ,IAAI;gBACFA,aAAaC,KAAKC,KAAK,CAACX;gBAExB,2DAA2D;gBAC3DS,aAAapB,4BAA4BoB;gBAEzC,MAAMG,oBAAoB1B,+BAA+BoB,QAAQO,MAAM,EAAEjB;gBACzEa,aAAatB,mBAAmBsB,YAAYG;gBAE5C,IAAIjB,aAAa;oBACfW,QAAQC,MAAM,CAACC,IAAI,CACjB,CAAC,8BAA8B,EAAEZ,eAAe,EAAE,EAAEc,KAAKI,SAAS,CAACL,aAAa;gBAEpF;YACF,EAAE,OAAOM,aAAa;gBACpBT,QAAQC,MAAM,CAACS,KAAK,CAAC,CAAC,0CAA0C,EAAEhB,MAAM;gBACxE,OAAO;oBACLiB,SAAS;wBAAC;4BAAEC,MAAM;4BAAiBC,MAAM;wBAAoC;qBAAE;gBACjF;YACF;YAEA,sBAAsB;YACtB,MAAMC,SAAS,MAAMd,QAAQe,MAAM,CAAC;gBAClCC,YAAY1B;gBACZI,MAAMS;gBACNR;gBACAC;gBACAqB,gBAAgB;gBAChB9B;gBACAC;gBACA,GAAIS,UAAU;oBAAEA;gBAAO,CAAC;gBACxB,GAAIC,kBAAkB;oBAAEA;gBAAe,CAAC;gBACxC,GAAIC,UAAU;oBAAEA,QAAQA;gBAAqB,CAAC;YAChD;YAEA,IAAIV,aAAa;gBACfW,QAAQC,MAAM,CAACC,IAAI,CACjB,CAAC,+CAA+C,EAAEZ,eAAe,UAAU,EAAEwB,OAAOI,EAAE,EAAE;YAE5F;YAEA,MAAMC,WAAW;gBACfR,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,6CAA6C,EAAEvB,eAAe;;;AAGjF,EAAEc,KAAKI,SAAS,CAACM,QAAQ;MACnB,CAAC;oBACG;iBACD;YACH;YAEA,OAAQvB,aAAa,CAACD,eAAe,EAAE8B,mBAAmBD,UAAUL,QAAQ3B,QAC1EgC;QAMJ,EAAE,OAAOT,OAAO;YACd,MAAMW,eAAeX,iBAAiBY,QAAQZ,MAAMa,OAAO,GAAG;YAC9DvB,QAAQC,MAAM,CAACS,KAAK,CAClB,CAAC,yCAAyC,EAAEpB,eAAe,EAAE,EAAE+B,cAAc;YAG/E,MAAMF,WAAW;gBACfR,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,uCAAuC,EAAEvB,eAAe,GAAG,EAAE+B,cAAc;oBACpF;iBACD;YACH;YAEA,OAAQ9B,aAAa,CAACD,eAAe,EAAE8B,mBAAmBD,UAAU,CAAC,GAAGhC,QAAQgC;QAMlF;IACF;IAEA,IAAI5B,aAAa,CAACD,eAAe,EAAEkC,SAAS;QAC1C,MAAMC,kBAAkB3C,6BAA6BU;QAErD,yFAAyF;QACzF,MAAMkC,uBAAuBhD,EAAEiD,MAAM,CAAC;YACpC,GAAGF,gBAAgBG,KAAK;YACxBjC,OAAOjB,EACJmD,MAAM,GACNC,GAAG,GACHC,GAAG,CAAC,GACJC,GAAG,CAAC,IACJC,QAAQ,GACRC,OAAO,CAAC,GACRC,QAAQ,CAAC;YACZvC,OAAOlB,EACJ0D,OAAO,GACPH,QAAQ,GACRC,OAAO,CAAC,OACRC,QAAQ,CAAC;YACZrC,gBAAgBpB,EACb2D,MAAM,GACNJ,QAAQ,GACRE,QAAQ,CAAC;YACZtC,QAAQnB,EACL2D,MAAM,GACNJ,QAAQ,GACRE,QAAQ,CACP;YAEJpC,QAAQrB,EACL4D,MAAM,CAAC5D,EAAE2D,MAAM,IAAI3D,EAAE6D,OAAO,IAC5BN,QAAQ,GACRE,QAAQ,CACP;QAEN;QAEAjD,OAAOsD,YAAY,CACjB,CAAC,MAAM,EAAElD,eAAemD,MAAM,CAAC,GAAGC,WAAW,KAAK/D,YAAYW,gBAAgBqD,KAAK,CAAC,IAAI,EACxF;YACEC,aAAa,GAAGrD,aAAa,CAACD,eAAe,EAAEsD,eAAe5D,YAAY6D,cAAc,CAACD,WAAW,CAACE,IAAI,IAAI;YAC7GC,aAAarB,qBAAqBE,KAAK;QACzC,GACA,OAAOoB;YACL,MAAM,EAAErD,KAAK,EAAEC,KAAK,EAAEE,cAAc,EAAED,MAAM,EAAEE,MAAM,EAAE,GAAGkD,WAAW,GAAGD;YACvE,MAAMtD,OAAOU,KAAKI,SAAS,CAACyC;YAC5B,OAAO,MAAMxD,KACXC,MACAC,OACAC,OACAC,QACAC,gBACAC;QAEJ;IAEJ;AACF,EAAC"}
|
|
@@ -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,
|
|
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
|
-
...
|
|
57
|
-
select:
|
|
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
|
-
...
|
|
108
|
-
select:
|
|
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,
|
|
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"}
|