@govcraft/payload-cms-mcp 1.0.1
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/README.md +164 -0
- package/dist/config/index.d.ts +27 -0
- package/dist/config/index.js +31 -0
- package/dist/config/index.js.map +1 -0
- package/dist/controllers/mcp.controller.d.ts +7 -0
- package/dist/controllers/mcp.controller.js +328 -0
- package/dist/controllers/mcp.controller.js.map +1 -0
- package/dist/controllers/payload-mcp.controller.d.ts +4 -0
- package/dist/controllers/payload-mcp.controller.js +185 -0
- package/dist/controllers/payload-mcp.controller.js.map +1 -0
- package/dist/generate-tools.d.ts +1 -0
- package/dist/generate-tools.js +1417 -0
- package/dist/generate-tools.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/anthropic-mcp.d.ts +3 -0
- package/dist/mcp/anthropic-mcp.js +332 -0
- package/dist/mcp/anthropic-mcp.js.map +1 -0
- package/dist/mcp/generated/index.d.ts +44 -0
- package/dist/mcp/generated/index.js +45 -0
- package/dist/mcp/generated/index.js.map +1 -0
- package/dist/mcp/generated/payload-tools.d.ts +7 -0
- package/dist/mcp/generated/payload-tools.js +69 -0
- package/dist/mcp/generated/payload-tools.js.map +1 -0
- package/dist/mcp/generated/payload-tools.json +13024 -0
- package/dist/mcp/generated/tools/create.json +9138 -0
- package/dist/mcp/generated/tools/createAccess.json +10 -0
- package/dist/mcp/generated/tools/createAfterChangeHook.json +9 -0
- package/dist/mcp/generated/tools/createAfterDeleteHook.json +9 -0
- package/dist/mcp/generated/tools/createAfterErrorHook.json +9 -0
- package/dist/mcp/generated/tools/createAfterForgotPasswordHook.json +9 -0
- package/dist/mcp/generated/tools/createAfterLoginHook.json +9 -0
- package/dist/mcp/generated/tools/createAfterLogoutHook.json +9 -0
- package/dist/mcp/generated/tools/createAfterMeHook.json +9 -0
- package/dist/mcp/generated/tools/createAfterOperationHook.json +9 -0
- package/dist/mcp/generated/tools/createAfterReadHook.json +9 -0
- package/dist/mcp/generated/tools/createAfterRefreshHook.json +9 -0
- package/dist/mcp/generated/tools/createArrayField.json +90 -0
- package/dist/mcp/generated/tools/createBeforeChangeHook.json +9 -0
- package/dist/mcp/generated/tools/createBeforeDeleteHook.json +9 -0
- package/dist/mcp/generated/tools/createBeforeLoginHook.json +9 -0
- package/dist/mcp/generated/tools/createBeforeOperationHook.json +9 -0
- package/dist/mcp/generated/tools/createBeforeReadHook.json +9 -0
- package/dist/mcp/generated/tools/createBeforeValidateHook.json +9 -0
- package/dist/mcp/generated/tools/createBlocksField.json +79 -0
- package/dist/mcp/generated/tools/createCodeField.json +79 -0
- package/dist/mcp/generated/tools/createCollection.json +422 -0
- package/dist/mcp/generated/tools/createCollectionAdminOptions.json +2789 -0
- package/dist/mcp/generated/tools/createDateField.json +84 -0
- package/dist/mcp/generated/tools/createEmailField.json +87 -0
- package/dist/mcp/generated/tools/createField.json +31 -0
- package/dist/mcp/generated/tools/createGlobal.json +220 -0
- package/dist/mcp/generated/tools/createGroupField.json +79 -0
- package/dist/mcp/generated/tools/createJSONField.json +79 -0
- package/dist/mcp/generated/tools/createJoinField.json +79 -0
- package/dist/mcp/generated/tools/createMeHook.json +9 -0
- package/dist/mcp/generated/tools/createNumberField.json +31 -0
- package/dist/mcp/generated/tools/createPointField.json +79 -0
- package/dist/mcp/generated/tools/createPolymorphicRelationshipField.json +31 -0
- package/dist/mcp/generated/tools/createRadioField.json +94 -0
- package/dist/mcp/generated/tools/createRefreshHook.json +9 -0
- package/dist/mcp/generated/tools/createRelationshipField.json +31 -0
- package/dist/mcp/generated/tools/createRichTextField.json +79 -0
- package/dist/mcp/generated/tools/createSelectField.json +31 -0
- package/dist/mcp/generated/tools/createSingleRelationshipField.json +31 -0
- package/dist/mcp/generated/tools/createTextField.json +31 -0
- package/dist/mcp/generated/tools/createTextareaField.json +87 -0
- package/dist/mcp/generated/tools/createUploadField.json +31 -0
- package/dist/mcp/handler.d.ts +6 -0
- package/dist/mcp/handler.js +147 -0
- package/dist/mcp/handler.js.map +1 -0
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.js +28 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/io/index.d.ts +2 -0
- package/dist/mcp/io/index.js +31 -0
- package/dist/mcp/io/index.js.map +1 -0
- package/dist/mcp/io/stdin.d.ts +2 -0
- package/dist/mcp/io/stdin.js +118 -0
- package/dist/mcp/io/stdin.js.map +1 -0
- package/dist/mcp/session.d.ts +16 -0
- package/dist/mcp/session.js +85 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/sse.d.ts +10 -0
- package/dist/mcp/sse.js +86 -0
- package/dist/mcp/sse.js.map +1 -0
- package/dist/mcp/tools/calculator.d.ts +2 -0
- package/dist/mcp/tools/calculator.js +68 -0
- package/dist/mcp/tools/calculator.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +3 -0
- package/dist/mcp/tools/index.js +6 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/list-tools.d.ts +2 -0
- package/dist/mcp/tools/list-tools.js +47 -0
- package/dist/mcp/tools/list-tools.js.map +1 -0
- package/dist/mcp/tools/payload-tools-loader.d.ts +2 -0
- package/dist/mcp/tools/payload-tools-loader.js +21 -0
- package/dist/mcp/tools/payload-tools-loader.js.map +1 -0
- package/dist/mcp/types.d.ts +69 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/middleware/errorHandler.d.ts +14 -0
- package/dist/middleware/errorHandler.js +25 -0
- package/dist/middleware/errorHandler.js.map +1 -0
- package/dist/middleware/notFoundHandler.d.ts +2 -0
- package/dist/middleware/notFoundHandler.js +8 -0
- package/dist/middleware/notFoundHandler.js.map +1 -0
- package/dist/routes/health.d.ts +2 -0
- package/dist/routes/health.js +18 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/mcp.d.ts +2 -0
- package/dist/routes/mcp.js +11 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/payload-mcp.routes.d.ts +3 -0
- package/dist/routes/payload-mcp.routes.js +8 -0
- package/dist/routes/payload-mcp.routes.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.js +35 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKhD,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,aAAa;CACd,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { getAvailableTools } from '../handler.js';
|
|
2
|
+
import { logger } from '../../utils/logger.js';
|
|
3
|
+
export const listToolsTool = {
|
|
4
|
+
name: 'listTools',
|
|
5
|
+
description: 'Lists all available tools with their descriptions and parameters',
|
|
6
|
+
parameters: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
filter: {
|
|
10
|
+
type: 'string',
|
|
11
|
+
description: 'Optional filter to search for specific tools by name or description'
|
|
12
|
+
},
|
|
13
|
+
includeParameters: {
|
|
14
|
+
type: 'boolean',
|
|
15
|
+
description: 'Whether to include parameter details in the response'
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
handler: async (params) => {
|
|
20
|
+
try {
|
|
21
|
+
const filter = params.filter;
|
|
22
|
+
const includeParameters = params.includeParameters;
|
|
23
|
+
const tools = getAvailableTools();
|
|
24
|
+
const filteredTools = filter
|
|
25
|
+
? tools.filter(tool => tool.name.toLowerCase().includes(filter.toLowerCase()) ||
|
|
26
|
+
tool.description.toLowerCase().includes(filter.toLowerCase()))
|
|
27
|
+
: tools;
|
|
28
|
+
const result = filteredTools.map(tool => {
|
|
29
|
+
const toolInfo = {
|
|
30
|
+
name: tool.name,
|
|
31
|
+
description: tool.description
|
|
32
|
+
};
|
|
33
|
+
if (includeParameters) {
|
|
34
|
+
toolInfo.inputSchema = tool.parameters;
|
|
35
|
+
}
|
|
36
|
+
return toolInfo;
|
|
37
|
+
});
|
|
38
|
+
logger.info(`Listed ${result.length} tools${filter ? ` matching filter: ${filter}` : ''}`);
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
logger.error('Error listing tools', { error });
|
|
43
|
+
throw new Error(`Failed to list tools: ${error instanceof Error ? error.message : String(error)}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=list-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/list-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAM/C,MAAM,CAAC,MAAM,aAAa,GAAY;IACpC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,kEAAkE;IAC/E,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qEAAqE;aACnF;YACD,iBAAiB,EAAE;gBACjB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,sDAAsD;aACpE;SACF;KACF;IACD,OAAO,EAAE,KAAK,EAAE,MAA+B,EAAoB,EAAE;QACnE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAA4B,CAAC;YACnD,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAwC,CAAC;YAG1E,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;YAGlC,MAAM,aAAa,GAAG,MAAM;gBAC1B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAClB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBACtD,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAC9D;gBACH,CAAC,CAAC,KAAK,CAAC;YAGV,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACtC,MAAM,QAAQ,GAA4B;oBACxC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,WAAW,EAAE,IAAI,CAAC,WAAW;iBAC9B,CAAC;gBAGF,IAAI,iBAAiB,EAAE,CAAC;oBACtB,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;gBACzC,CAAC;gBAED,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,CAAC,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3F,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { existsSync } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { logger } from '../../utils/logger.js';
|
|
4
|
+
export function loadPayloadTools() {
|
|
5
|
+
const tools = [];
|
|
6
|
+
const generatedDir = path.join(process.cwd(), 'src', 'mcp', 'generated');
|
|
7
|
+
const toolsFile = path.join(generatedDir, 'payload-tools.ts');
|
|
8
|
+
if (!existsSync(toolsFile)) {
|
|
9
|
+
logger.warn('Payload CMS tools not found. Run "pnpm generate-tools" to generate them.');
|
|
10
|
+
return tools;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
logger.info('Payload CMS tools found and will be loaded during initialization');
|
|
14
|
+
return tools;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
logger.error('Error loading Payload CMS tools', { error });
|
|
18
|
+
return tools;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=payload-tools-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload-tools-loader.js","sourceRoot":"","sources":["../../../src/mcp/tools/payload-tools-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAM/C,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAE9D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACxF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QAGH,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAGhF,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export interface MCPMessage {
|
|
2
|
+
id: string;
|
|
3
|
+
type: string;
|
|
4
|
+
timestamp: string;
|
|
5
|
+
}
|
|
6
|
+
export interface MCPRequest extends MCPMessage {
|
|
7
|
+
type: 'request';
|
|
8
|
+
payload: {
|
|
9
|
+
query: string;
|
|
10
|
+
context?: Record<string, unknown>;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface MCPResponse extends MCPMessage {
|
|
14
|
+
type: 'response';
|
|
15
|
+
payload: {
|
|
16
|
+
content: string;
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface MCPError extends MCPMessage {
|
|
21
|
+
type: 'error';
|
|
22
|
+
payload: {
|
|
23
|
+
code: string;
|
|
24
|
+
message: string;
|
|
25
|
+
details?: Record<string, unknown>;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface MCPStatus extends MCPMessage {
|
|
29
|
+
type: 'status';
|
|
30
|
+
payload: {
|
|
31
|
+
status: 'processing' | 'completed' | 'failed';
|
|
32
|
+
progress?: number;
|
|
33
|
+
message?: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface MCPToolCall extends MCPMessage {
|
|
37
|
+
type: 'tool_call';
|
|
38
|
+
payload: {
|
|
39
|
+
tool: string;
|
|
40
|
+
parameters: Record<string, unknown>;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export interface MCPToolResult extends MCPMessage {
|
|
44
|
+
type: 'tool_result';
|
|
45
|
+
payload: {
|
|
46
|
+
result: unknown;
|
|
47
|
+
error?: string;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export type MCPMessageType = MCPRequest | MCPResponse | MCPError | MCPStatus | MCPToolCall | MCPToolResult;
|
|
51
|
+
export interface MCPTool {
|
|
52
|
+
name: string;
|
|
53
|
+
description: string;
|
|
54
|
+
parameters: Record<string, unknown>;
|
|
55
|
+
handler: (params: Record<string, unknown>) => Promise<unknown>;
|
|
56
|
+
}
|
|
57
|
+
export interface MCPSession {
|
|
58
|
+
id: string;
|
|
59
|
+
startTime: Date;
|
|
60
|
+
lastActivity: Date;
|
|
61
|
+
context: Record<string, unknown>;
|
|
62
|
+
history: MCPMessageType[];
|
|
63
|
+
}
|
|
64
|
+
export interface MCPConfig {
|
|
65
|
+
maxSessionDuration: number;
|
|
66
|
+
maxSessionInactivity: number;
|
|
67
|
+
maxMessageSize: number;
|
|
68
|
+
supportedTools: MCPTool[];
|
|
69
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
export interface AppError extends Error {
|
|
3
|
+
statusCode?: number;
|
|
4
|
+
status?: string;
|
|
5
|
+
isOperational?: boolean;
|
|
6
|
+
}
|
|
7
|
+
declare global {
|
|
8
|
+
namespace Express {
|
|
9
|
+
interface Request {
|
|
10
|
+
user?: Record<string, any>;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export declare const errorHandler: (err: AppError, req: Request, res: Response, _next: NextFunction) => void;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { logger } from '../utils/logger.js';
|
|
2
|
+
export const errorHandler = (err, req, res, _next) => {
|
|
3
|
+
err.statusCode = err.statusCode || 500;
|
|
4
|
+
err.status = err.status || 'error';
|
|
5
|
+
logger.error(`${err.statusCode} - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip}`, {
|
|
6
|
+
stack: err.stack,
|
|
7
|
+
user: req.user || 'unauthenticated',
|
|
8
|
+
body: req.body,
|
|
9
|
+
params: req.params,
|
|
10
|
+
});
|
|
11
|
+
if (err.isOperational) {
|
|
12
|
+
res.status(err.statusCode).json({
|
|
13
|
+
status: err.status,
|
|
14
|
+
message: err.message,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
logger.error('An unexpected error occurred', { error: err });
|
|
19
|
+
res.status(500).json({
|
|
20
|
+
status: 'error',
|
|
21
|
+
message: 'Something went wrong',
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=errorHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/middleware/errorHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAiB5C,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,GAAa,EACb,GAAY,EACZ,GAAa,EAEb,KAAmB,EACb,EAAE;IACR,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC;IACvC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC;IAGnC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,UAAU,MAAM,GAAG,CAAC,OAAO,MAAM,GAAG,CAAC,WAAW,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE;QAClG,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,iBAAiB;QACnC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC,CAAC;IAGH,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC9B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;IACL,CAAC;SAEI,CAAC;QAEJ,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAG7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,sBAAsB;SAChC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notFoundHandler.js","sourceRoot":"","sources":["../../src/middleware/notFoundHandler.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,GAAY,EACZ,IAAc,EACd,IAAkB,EACZ,EAAE;IACR,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,WAAW,EAAE,CAAa,CAAC;IACtE,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC;IACvB,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,CAAC;AACd,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
const router = express.Router();
|
|
4
|
+
router.get('/', (_req, res) => {
|
|
5
|
+
const healthcheck = {
|
|
6
|
+
status: 'ok',
|
|
7
|
+
uptime: process.uptime(),
|
|
8
|
+
timestamp: Date.now(),
|
|
9
|
+
hostname: os.hostname(),
|
|
10
|
+
memory: process.memoryUsage(),
|
|
11
|
+
cpu: os.cpus(),
|
|
12
|
+
platform: process.platform,
|
|
13
|
+
nodeVersion: process.version,
|
|
14
|
+
};
|
|
15
|
+
res.status(200).json(healthcheck);
|
|
16
|
+
});
|
|
17
|
+
export const healthRoutes = router;
|
|
18
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,OAAsC,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,MAAM,GAAW,OAAO,CAAC,MAAM,EAAE,CAAC;AAOxC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAQ,EAAE;IACrD,MAAM,WAAW,GAAG;QAClB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;QACvB,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE;QAC7B,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,OAAO,CAAC,OAAO;KAC7B,CAAC;IAEF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAW,MAAM,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { handleMCPRequest, handleToolCall, getTools, handleSSEConnection, handleSSERequest, handleSSEToolCall } from '../controllers/mcp.controller.js';
|
|
3
|
+
const router = express.Router();
|
|
4
|
+
router.get('/sse', handleSSEConnection);
|
|
5
|
+
router.post('/sse/request', handleSSERequest);
|
|
6
|
+
router.post('/sse/tool', handleSSEToolCall);
|
|
7
|
+
router.post('/request', handleMCPRequest);
|
|
8
|
+
router.post('/tool', handleToolCall);
|
|
9
|
+
router.get('/tools', getTools);
|
|
10
|
+
export const mcpRoutes = router;
|
|
11
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/routes/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,OAAmB,MAAM,SAAS,CAAC;AAC1C,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,MAAM,GAAW,OAAO,CAAC,MAAM,EAAE,CAAC;AAOxC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAOxC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;AAO9C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;AAO5C,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;AAO1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAOrC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAE/B,MAAM,CAAC,MAAM,SAAS,GAAW,MAAM,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { handlePayloadMCPRequest, handlePayloadMCPSSEConnection, handlePayloadMCPSSERequest } from '../controllers/payload-mcp.controller.js';
|
|
3
|
+
const router = Router();
|
|
4
|
+
router.get('/sse', handlePayloadMCPSSEConnection);
|
|
5
|
+
router.post('/sse/request', handlePayloadMCPSSERequest);
|
|
6
|
+
router.post('/', handlePayloadMCPRequest);
|
|
7
|
+
export default router;
|
|
8
|
+
//# sourceMappingURL=payload-mcp.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload-mcp.routes.js","sourceRoot":"","sources":["../../src/routes/payload-mcp.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,0BAA0B,EAC3B,MAAM,0CAA0C,CAAC;AAElD,MAAM,MAAM,GAAW,MAAM,EAAE,CAAC;AAOhC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;AAOlD,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;AAOxD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;AAE1C,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import { config } from '../config/index.js';
|
|
5
|
+
const logDir = config.log.dir;
|
|
6
|
+
if (!fs.existsSync(logDir)) {
|
|
7
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
8
|
+
}
|
|
9
|
+
const logFormat = winston.format.combine(winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.errors({ stack: true }), winston.format.splat(), winston.format.json());
|
|
10
|
+
export const logger = winston.createLogger({
|
|
11
|
+
level: config.log.level,
|
|
12
|
+
format: logFormat,
|
|
13
|
+
defaultMeta: { service: 'mcp-server' },
|
|
14
|
+
transports: [
|
|
15
|
+
new winston.transports.File({
|
|
16
|
+
filename: path.join(logDir, 'error.log'),
|
|
17
|
+
level: 'error'
|
|
18
|
+
}),
|
|
19
|
+
new winston.transports.File({
|
|
20
|
+
filename: path.join(logDir, 'combined.log')
|
|
21
|
+
})
|
|
22
|
+
],
|
|
23
|
+
exceptionHandlers: [
|
|
24
|
+
new winston.transports.File({
|
|
25
|
+
filename: path.join(logDir, 'exceptions.log')
|
|
26
|
+
}),
|
|
27
|
+
],
|
|
28
|
+
rejectionHandlers: [
|
|
29
|
+
new winston.transports.File({
|
|
30
|
+
filename: path.join(logDir, 'rejections.log')
|
|
31
|
+
}),
|
|
32
|
+
],
|
|
33
|
+
exitOnError: false,
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AAGD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CACtC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC3D,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EACtB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CACtB,CAAC;AAGF,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK;IACvB,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;IACtC,UAAU,EAAE;QAEV,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;YACxC,KAAK,EAAE,OAAO;SACf,CAAC;QAEF,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;SAC5C,CAAC;KACH;IACD,iBAAiB,EAAE;QACjB,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC;SAC9C,CAAC;KACH;IACD,iBAAiB,EAAE;QACjB,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC;SAC9C,CAAC;KACH;IACD,WAAW,EAAE,KAAK;CACnB,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@govcraft/payload-cms-mcp",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Payload MCP Server - A Model Context Protocol server for Payload CMS 3.0",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"payload-cms-mcp": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"start": "node dist/index.js --stdio-only",
|
|
15
|
+
"dev": "tsx watch src/index.ts",
|
|
16
|
+
"build": "tsc && pnpm generate-tools && pnpm run copy-tools",
|
|
17
|
+
"copy-tools": "mkdir -p dist/mcp/generated && cp -r src/mcp/generated/tools dist/mcp/generated/ && cp src/mcp/generated/payload-tools.js dist/mcp/generated/",
|
|
18
|
+
"lint": "eslint . --ext .ts",
|
|
19
|
+
"lint:fix": "eslint . --ext .ts --fix",
|
|
20
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
21
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
22
|
+
"stdio": "tsx src/index.ts --stdio-only",
|
|
23
|
+
"generate-tools": "tsx src/generate-tools.ts",
|
|
24
|
+
"prepare": "pnpm add payload@latest && pnpm build",
|
|
25
|
+
"prepublishOnly": "pnpm build",
|
|
26
|
+
"postinstall": "pnpm generate-tools && pnpm run copy-tools"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"payload",
|
|
30
|
+
"cms",
|
|
31
|
+
"mcp",
|
|
32
|
+
"model-context-protocol",
|
|
33
|
+
"llm"
|
|
34
|
+
],
|
|
35
|
+
"author": "roland@govcraft.ai",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/express": "^5.0.0",
|
|
39
|
+
"@types/node": "^22.13.10",
|
|
40
|
+
"@types/uuid": "^10.0.0",
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
|
42
|
+
"@typescript-eslint/parser": "^8.26.1",
|
|
43
|
+
"depcheck": "^1.4.7",
|
|
44
|
+
"eslint": "^9.22.0",
|
|
45
|
+
"eslint-config-prettier": "^10.1.1",
|
|
46
|
+
"nodemon": "^3.1.9",
|
|
47
|
+
"prettier": "^3.5.3",
|
|
48
|
+
"ts-morph": "^25.0.1",
|
|
49
|
+
"ts-node": "^10.9.2",
|
|
50
|
+
"tsconfig-paths": "^4.2.0",
|
|
51
|
+
"tsx": "^4.19.3",
|
|
52
|
+
"typescript": "^5.8.2"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@modelcontextprotocol/sdk": "^1.7.0",
|
|
56
|
+
"dotenv": "^16.4.7",
|
|
57
|
+
"express": "^4.21.2",
|
|
58
|
+
"payload": "^3.28.1",
|
|
59
|
+
"uuid": "^11.1.0",
|
|
60
|
+
"winston": "^3.17.0",
|
|
61
|
+
"zod": "^3.24.2",
|
|
62
|
+
"ts-morph": "^25.0.1"
|
|
63
|
+
}
|
|
64
|
+
}
|