@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.
Files changed (121) hide show
  1. package/README.md +164 -0
  2. package/dist/config/index.d.ts +27 -0
  3. package/dist/config/index.js +31 -0
  4. package/dist/config/index.js.map +1 -0
  5. package/dist/controllers/mcp.controller.d.ts +7 -0
  6. package/dist/controllers/mcp.controller.js +328 -0
  7. package/dist/controllers/mcp.controller.js.map +1 -0
  8. package/dist/controllers/payload-mcp.controller.d.ts +4 -0
  9. package/dist/controllers/payload-mcp.controller.js +185 -0
  10. package/dist/controllers/payload-mcp.controller.js.map +1 -0
  11. package/dist/generate-tools.d.ts +1 -0
  12. package/dist/generate-tools.js +1417 -0
  13. package/dist/generate-tools.js.map +1 -0
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.js +16 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/mcp/anthropic-mcp.d.ts +3 -0
  18. package/dist/mcp/anthropic-mcp.js +332 -0
  19. package/dist/mcp/anthropic-mcp.js.map +1 -0
  20. package/dist/mcp/generated/index.d.ts +44 -0
  21. package/dist/mcp/generated/index.js +45 -0
  22. package/dist/mcp/generated/index.js.map +1 -0
  23. package/dist/mcp/generated/payload-tools.d.ts +7 -0
  24. package/dist/mcp/generated/payload-tools.js +69 -0
  25. package/dist/mcp/generated/payload-tools.js.map +1 -0
  26. package/dist/mcp/generated/payload-tools.json +13024 -0
  27. package/dist/mcp/generated/tools/create.json +9138 -0
  28. package/dist/mcp/generated/tools/createAccess.json +10 -0
  29. package/dist/mcp/generated/tools/createAfterChangeHook.json +9 -0
  30. package/dist/mcp/generated/tools/createAfterDeleteHook.json +9 -0
  31. package/dist/mcp/generated/tools/createAfterErrorHook.json +9 -0
  32. package/dist/mcp/generated/tools/createAfterForgotPasswordHook.json +9 -0
  33. package/dist/mcp/generated/tools/createAfterLoginHook.json +9 -0
  34. package/dist/mcp/generated/tools/createAfterLogoutHook.json +9 -0
  35. package/dist/mcp/generated/tools/createAfterMeHook.json +9 -0
  36. package/dist/mcp/generated/tools/createAfterOperationHook.json +9 -0
  37. package/dist/mcp/generated/tools/createAfterReadHook.json +9 -0
  38. package/dist/mcp/generated/tools/createAfterRefreshHook.json +9 -0
  39. package/dist/mcp/generated/tools/createArrayField.json +90 -0
  40. package/dist/mcp/generated/tools/createBeforeChangeHook.json +9 -0
  41. package/dist/mcp/generated/tools/createBeforeDeleteHook.json +9 -0
  42. package/dist/mcp/generated/tools/createBeforeLoginHook.json +9 -0
  43. package/dist/mcp/generated/tools/createBeforeOperationHook.json +9 -0
  44. package/dist/mcp/generated/tools/createBeforeReadHook.json +9 -0
  45. package/dist/mcp/generated/tools/createBeforeValidateHook.json +9 -0
  46. package/dist/mcp/generated/tools/createBlocksField.json +79 -0
  47. package/dist/mcp/generated/tools/createCodeField.json +79 -0
  48. package/dist/mcp/generated/tools/createCollection.json +422 -0
  49. package/dist/mcp/generated/tools/createCollectionAdminOptions.json +2789 -0
  50. package/dist/mcp/generated/tools/createDateField.json +84 -0
  51. package/dist/mcp/generated/tools/createEmailField.json +87 -0
  52. package/dist/mcp/generated/tools/createField.json +31 -0
  53. package/dist/mcp/generated/tools/createGlobal.json +220 -0
  54. package/dist/mcp/generated/tools/createGroupField.json +79 -0
  55. package/dist/mcp/generated/tools/createJSONField.json +79 -0
  56. package/dist/mcp/generated/tools/createJoinField.json +79 -0
  57. package/dist/mcp/generated/tools/createMeHook.json +9 -0
  58. package/dist/mcp/generated/tools/createNumberField.json +31 -0
  59. package/dist/mcp/generated/tools/createPointField.json +79 -0
  60. package/dist/mcp/generated/tools/createPolymorphicRelationshipField.json +31 -0
  61. package/dist/mcp/generated/tools/createRadioField.json +94 -0
  62. package/dist/mcp/generated/tools/createRefreshHook.json +9 -0
  63. package/dist/mcp/generated/tools/createRelationshipField.json +31 -0
  64. package/dist/mcp/generated/tools/createRichTextField.json +79 -0
  65. package/dist/mcp/generated/tools/createSelectField.json +31 -0
  66. package/dist/mcp/generated/tools/createSingleRelationshipField.json +31 -0
  67. package/dist/mcp/generated/tools/createTextField.json +31 -0
  68. package/dist/mcp/generated/tools/createTextareaField.json +87 -0
  69. package/dist/mcp/generated/tools/createUploadField.json +31 -0
  70. package/dist/mcp/handler.d.ts +6 -0
  71. package/dist/mcp/handler.js +147 -0
  72. package/dist/mcp/handler.js.map +1 -0
  73. package/dist/mcp/index.d.ts +1 -0
  74. package/dist/mcp/index.js +28 -0
  75. package/dist/mcp/index.js.map +1 -0
  76. package/dist/mcp/io/index.d.ts +2 -0
  77. package/dist/mcp/io/index.js +31 -0
  78. package/dist/mcp/io/index.js.map +1 -0
  79. package/dist/mcp/io/stdin.d.ts +2 -0
  80. package/dist/mcp/io/stdin.js +118 -0
  81. package/dist/mcp/io/stdin.js.map +1 -0
  82. package/dist/mcp/session.d.ts +16 -0
  83. package/dist/mcp/session.js +85 -0
  84. package/dist/mcp/session.js.map +1 -0
  85. package/dist/mcp/sse.d.ts +10 -0
  86. package/dist/mcp/sse.js +86 -0
  87. package/dist/mcp/sse.js.map +1 -0
  88. package/dist/mcp/tools/calculator.d.ts +2 -0
  89. package/dist/mcp/tools/calculator.js +68 -0
  90. package/dist/mcp/tools/calculator.js.map +1 -0
  91. package/dist/mcp/tools/index.d.ts +3 -0
  92. package/dist/mcp/tools/index.js +6 -0
  93. package/dist/mcp/tools/index.js.map +1 -0
  94. package/dist/mcp/tools/list-tools.d.ts +2 -0
  95. package/dist/mcp/tools/list-tools.js +47 -0
  96. package/dist/mcp/tools/list-tools.js.map +1 -0
  97. package/dist/mcp/tools/payload-tools-loader.d.ts +2 -0
  98. package/dist/mcp/tools/payload-tools-loader.js +21 -0
  99. package/dist/mcp/tools/payload-tools-loader.js.map +1 -0
  100. package/dist/mcp/types.d.ts +69 -0
  101. package/dist/mcp/types.js +2 -0
  102. package/dist/mcp/types.js.map +1 -0
  103. package/dist/middleware/errorHandler.d.ts +14 -0
  104. package/dist/middleware/errorHandler.js +25 -0
  105. package/dist/middleware/errorHandler.js.map +1 -0
  106. package/dist/middleware/notFoundHandler.d.ts +2 -0
  107. package/dist/middleware/notFoundHandler.js +8 -0
  108. package/dist/middleware/notFoundHandler.js.map +1 -0
  109. package/dist/routes/health.d.ts +2 -0
  110. package/dist/routes/health.js +18 -0
  111. package/dist/routes/health.js.map +1 -0
  112. package/dist/routes/mcp.d.ts +2 -0
  113. package/dist/routes/mcp.js +11 -0
  114. package/dist/routes/mcp.js.map +1 -0
  115. package/dist/routes/payload-mcp.routes.d.ts +3 -0
  116. package/dist/routes/payload-mcp.routes.js +8 -0
  117. package/dist/routes/payload-mcp.routes.js.map +1 -0
  118. package/dist/utils/logger.d.ts +2 -0
  119. package/dist/utils/logger.js +35 -0
  120. package/dist/utils/logger.js.map +1 -0
  121. package/package.json +64 -0
@@ -0,0 +1,147 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { sessionManager } from './session.js';
3
+ import { logger } from '../utils/logger.js';
4
+ const availableTools = {};
5
+ export async function processRequest(request, sessionId) {
6
+ try {
7
+ let session = sessionId ? sessionManager.getSession(sessionId) : undefined;
8
+ let currentSessionId;
9
+ if (!session) {
10
+ session = sessionManager.createSession(request.payload.context || {});
11
+ currentSessionId = session.id;
12
+ }
13
+ else if (sessionId) {
14
+ currentSessionId = sessionId;
15
+ if (request.payload.context) {
16
+ sessionManager.updateSessionContext(currentSessionId, request.payload.context);
17
+ }
18
+ }
19
+ else {
20
+ throw new Error('Session ID is undefined');
21
+ }
22
+ sessionManager.addMessageToSession(currentSessionId, request);
23
+ const statusMessage = {
24
+ id: uuidv4(),
25
+ type: 'status',
26
+ timestamp: new Date().toISOString(),
27
+ payload: {
28
+ status: 'processing',
29
+ message: 'Processing your request'
30
+ }
31
+ };
32
+ logger.debug('Processing request', { statusMessage });
33
+ const responseMessage = {
34
+ id: uuidv4(),
35
+ type: 'response',
36
+ timestamp: new Date().toISOString(),
37
+ payload: {
38
+ content: `Processed query: ${request.payload.query}`,
39
+ metadata: {
40
+ sessionId: currentSessionId,
41
+ processingTime: '100ms'
42
+ }
43
+ }
44
+ };
45
+ sessionManager.addMessageToSession(currentSessionId, responseMessage);
46
+ return responseMessage;
47
+ }
48
+ catch (error) {
49
+ logger.error('Error processing MCP request', { error });
50
+ const errorMessage = {
51
+ id: uuidv4(),
52
+ type: 'error',
53
+ timestamp: new Date().toISOString(),
54
+ payload: {
55
+ code: 'processing_error',
56
+ message: 'Failed to process the request',
57
+ details: {
58
+ originalError: error instanceof Error ? error.message : String(error)
59
+ }
60
+ }
61
+ };
62
+ if (sessionId) {
63
+ sessionManager.addMessageToSession(sessionId, errorMessage);
64
+ }
65
+ return errorMessage;
66
+ }
67
+ }
68
+ export function registerTool(tool) {
69
+ availableTools[tool.name] = tool;
70
+ logger.info(`Registered tool: ${tool.name}`);
71
+ }
72
+ export async function executeTool(toolCall, sessionId) {
73
+ try {
74
+ const session = sessionManager.getSession(sessionId);
75
+ if (!session) {
76
+ throw new Error(`Session not found: ${sessionId}`);
77
+ }
78
+ sessionManager.addMessageToSession(sessionId, toolCall);
79
+ const statusMessage = {
80
+ id: uuidv4(),
81
+ type: 'status',
82
+ timestamp: new Date().toISOString(),
83
+ payload: {
84
+ status: 'processing',
85
+ message: `Executing tool: ${toolCall.payload.tool}`
86
+ }
87
+ };
88
+ logger.debug('Executing tool', { statusMessage });
89
+ const tool = availableTools[toolCall.payload.tool];
90
+ if (!tool) {
91
+ throw new Error(`Tool not found: ${toolCall.payload.tool}`);
92
+ }
93
+ const result = await tool.handler(toolCall.payload.parameters);
94
+ const toolResult = {
95
+ id: uuidv4(),
96
+ type: 'tool_result',
97
+ timestamp: new Date().toISOString(),
98
+ payload: {
99
+ result
100
+ }
101
+ };
102
+ sessionManager.addMessageToSession(sessionId, toolResult);
103
+ return toolResult;
104
+ }
105
+ catch (error) {
106
+ logger.error('Error executing tool', { error });
107
+ const errorMessage = {
108
+ id: uuidv4(),
109
+ type: 'error',
110
+ timestamp: new Date().toISOString(),
111
+ payload: {
112
+ code: 'tool_execution_error',
113
+ message: 'Failed to execute the tool',
114
+ details: {
115
+ originalError: error instanceof Error ? error.message : String(error)
116
+ }
117
+ }
118
+ };
119
+ if (sessionId) {
120
+ sessionManager.addMessageToSession(sessionId, errorMessage);
121
+ }
122
+ return errorMessage;
123
+ }
124
+ }
125
+ export function getAvailableTools() {
126
+ return Object.values(availableTools);
127
+ }
128
+ export function validateMessage(message) {
129
+ if (!message || typeof message !== 'object') {
130
+ return false;
131
+ }
132
+ const msg = message;
133
+ if (!msg.id || typeof msg.id !== 'string') {
134
+ return false;
135
+ }
136
+ if (!msg.type || typeof msg.type !== 'string') {
137
+ return false;
138
+ }
139
+ if (!msg.timestamp || typeof msg.timestamp !== 'string') {
140
+ return false;
141
+ }
142
+ if (!msg.payload || typeof msg.payload !== 'object') {
143
+ return false;
144
+ }
145
+ return true;
146
+ }
147
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/mcp/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function initializeMCP(): void;
@@ -0,0 +1,28 @@
1
+ import { registerTool } from './handler.js';
2
+ import { initializeIO } from './io/index.js';
3
+ import { logger } from '../utils/logger.js';
4
+ import { config } from '../config/index.js';
5
+ import { payloadTools } from './generated/payload-tools.js';
6
+ import { tools as customTools } from './tools/index.js';
7
+ export function initializeMCP() {
8
+ logger.info('Initializing MCP module...');
9
+ logger.info('Registering auto-generated Payload CMS tools...');
10
+ payloadTools.forEach((tool) => {
11
+ registerTool(tool);
12
+ logger.info(`Registered Payload CMS tool: ${tool.name}`);
13
+ });
14
+ logger.info('Registering custom tools...');
15
+ customTools.forEach(tool => {
16
+ registerTool(tool);
17
+ logger.info(`Registered custom tool: ${tool.name}`);
18
+ });
19
+ if (config.mcp.enableStdio || config.mcp.stdioOnly) {
20
+ initializeIO();
21
+ logger.info(`MCP I/O handlers initialized (stdio-only mode: ${config.mcp.stdioOnly ? 'enabled' : 'disabled'})`);
22
+ }
23
+ else {
24
+ logger.info('MCP I/O handlers disabled');
25
+ }
26
+ logger.info('MCP module initialized');
27
+ }
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMxD,MAAM,UAAU,aAAa;IAC3B,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAG1C,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC/D,YAAY,CAAC,OAAO,CAAC,CAAC,IAAa,EAAE,EAAE;QACrC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,gCAAgC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAGH,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC3C,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACzB,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAGH,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnD,YAAY,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,kDAAkD,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;IAClH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function initializeIO(): void;
2
+ export declare function closeIO(): void;
@@ -0,0 +1,31 @@
1
+ import { logger } from '../../utils/logger.js';
2
+ import { initializeStdinHandler, closeStdinHandler } from './stdin.js';
3
+ import { config } from '../../config/index.js';
4
+ export function initializeIO() {
5
+ logger.debug('Initializing MCP I/O handlers');
6
+ if (config.mcp.enableStdio || config.mcp.stdioOnly) {
7
+ initializeStdinHandler();
8
+ logger.debug('Stdin handler initialized');
9
+ process.on('SIGINT', () => {
10
+ logger.debug('Received SIGINT, cleaning up I/O handlers');
11
+ closeIO();
12
+ process.exit(0);
13
+ });
14
+ process.on('SIGTERM', () => {
15
+ logger.debug('Received SIGTERM, cleaning up I/O handlers');
16
+ closeIO();
17
+ process.exit(0);
18
+ });
19
+ }
20
+ else {
21
+ logger.debug('Stdin handler not initialized (disabled in config)');
22
+ }
23
+ }
24
+ export function closeIO() {
25
+ logger.debug('Closing MCP I/O handlers');
26
+ if (config.mcp.enableStdio || config.mcp.stdioOnly) {
27
+ closeStdinHandler();
28
+ logger.debug('Stdin handler closed');
29
+ }
30
+ }
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/io/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAK/C,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAG9C,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnD,sBAAsB,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAG1C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC1D,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC3D,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,OAAO;IACrB,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAGzC,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnD,iBAAiB,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACvC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function initializeStdinHandler(): void;
2
+ export declare function closeStdinHandler(): void;
@@ -0,0 +1,118 @@
1
+ import readline from 'readline';
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ import { processRequest, executeTool, validateMessage } from '../handler.js';
4
+ import { logger } from '../../utils/logger.js';
5
+ const isPipeMode = !process.stdin.isTTY;
6
+ const rl = readline.createInterface({
7
+ input: process.stdin,
8
+ output: process.stdout,
9
+ terminal: false
10
+ });
11
+ let sessionId;
12
+ let hasProcessedInput = false;
13
+ export function initializeStdinHandler() {
14
+ logger.info('Initializing standard I/O handler for MCP');
15
+ rl.on('line', async (line) => {
16
+ try {
17
+ if (!line.trim()) {
18
+ return;
19
+ }
20
+ hasProcessedInput = true;
21
+ let input;
22
+ try {
23
+ input = JSON.parse(line);
24
+ }
25
+ catch (error) {
26
+ input = {
27
+ id: uuidv4(),
28
+ type: 'request',
29
+ timestamp: new Date().toISOString(),
30
+ payload: {
31
+ query: line
32
+ }
33
+ };
34
+ }
35
+ if (!validateMessage(input)) {
36
+ const errorResponse = {
37
+ id: uuidv4(),
38
+ type: 'error',
39
+ timestamp: new Date().toISOString(),
40
+ payload: {
41
+ code: 'invalid_request',
42
+ message: 'Invalid MCP message format'
43
+ }
44
+ };
45
+ console.log(JSON.stringify(errorResponse));
46
+ return;
47
+ }
48
+ if (input.type === 'request') {
49
+ const request = input;
50
+ const response = await processRequest(request, sessionId);
51
+ if (!sessionId && response.type === 'response' && response.payload.metadata?.sessionId) {
52
+ sessionId = response.payload.metadata.sessionId;
53
+ logger.info(`CLI session established with ID: ${sessionId}`);
54
+ }
55
+ console.log(JSON.stringify(response));
56
+ }
57
+ else if (input.type === 'tool_call') {
58
+ if (!sessionId) {
59
+ const errorResponse = {
60
+ id: uuidv4(),
61
+ type: 'error',
62
+ timestamp: new Date().toISOString(),
63
+ payload: {
64
+ code: 'missing_session',
65
+ message: 'No active session for tool call'
66
+ }
67
+ };
68
+ console.log(JSON.stringify(errorResponse));
69
+ return;
70
+ }
71
+ const toolCall = input;
72
+ const toolResult = await executeTool(toolCall, sessionId);
73
+ console.log(JSON.stringify(toolResult));
74
+ }
75
+ else {
76
+ const errorResponse = {
77
+ id: uuidv4(),
78
+ type: 'error',
79
+ timestamp: new Date().toISOString(),
80
+ payload: {
81
+ code: 'unsupported_message_type',
82
+ message: `Unsupported message type: ${input.type}`
83
+ }
84
+ };
85
+ console.log(JSON.stringify(errorResponse));
86
+ }
87
+ }
88
+ catch (error) {
89
+ logger.error('Error processing stdin input', { error });
90
+ const errorResponse = {
91
+ id: uuidv4(),
92
+ type: 'error',
93
+ timestamp: new Date().toISOString(),
94
+ payload: {
95
+ code: 'processing_error',
96
+ message: 'Error processing input',
97
+ details: {
98
+ error: error instanceof Error ? error.message : String(error)
99
+ }
100
+ }
101
+ };
102
+ console.log(JSON.stringify(errorResponse));
103
+ }
104
+ });
105
+ rl.on('close', () => {
106
+ logger.info('Standard input stream closed');
107
+ if (isPipeMode && hasProcessedInput) {
108
+ logger.info('Exiting after processing piped input');
109
+ process.exit(0);
110
+ }
111
+ });
112
+ logger.info('Standard I/O handler initialized');
113
+ }
114
+ export function closeStdinHandler() {
115
+ rl.close();
116
+ logger.info('Standard I/O handler closed');
117
+ }
118
+ //# sourceMappingURL=stdin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../../src/mcp/io/stdin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { MCPSession, MCPMessageType } from './types.js';
2
+ declare class SessionManager {
3
+ private sessions;
4
+ private readonly maxSessionDuration;
5
+ private readonly maxSessionInactivity;
6
+ constructor(maxSessionDuration?: number, maxSessionInactivity?: number);
7
+ createSession(initialContext?: Record<string, unknown>): MCPSession;
8
+ getSession(sessionId: string): MCPSession | undefined;
9
+ addMessageToSession(sessionId: string, message: MCPMessageType): boolean;
10
+ updateSessionContext(sessionId: string, context: Record<string, unknown>): boolean;
11
+ endSession(sessionId: string): boolean;
12
+ private cleanupSessions;
13
+ getSessionCount(): number;
14
+ }
15
+ export declare const sessionManager: SessionManager;
16
+ export {};
@@ -0,0 +1,85 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { logger } from '../utils/logger.js';
3
+ class SessionManager {
4
+ sessions = new Map();
5
+ maxSessionDuration;
6
+ maxSessionInactivity;
7
+ constructor(maxSessionDuration = 3600000, maxSessionInactivity = 1800000) {
8
+ this.maxSessionDuration = maxSessionDuration;
9
+ this.maxSessionInactivity = maxSessionInactivity;
10
+ setInterval(() => this.cleanupSessions(), 300000);
11
+ }
12
+ createSession(initialContext = {}) {
13
+ const sessionId = uuidv4();
14
+ const now = new Date();
15
+ const session = {
16
+ id: sessionId,
17
+ startTime: now,
18
+ lastActivity: now,
19
+ context: initialContext,
20
+ history: []
21
+ };
22
+ this.sessions.set(sessionId, session);
23
+ logger.info(`Created new MCP session: ${sessionId}`);
24
+ return session;
25
+ }
26
+ getSession(sessionId) {
27
+ const session = this.sessions.get(sessionId);
28
+ if (session) {
29
+ session.lastActivity = new Date();
30
+ this.sessions.set(sessionId, session);
31
+ }
32
+ return session;
33
+ }
34
+ addMessageToSession(sessionId, message) {
35
+ const session = this.getSession(sessionId);
36
+ if (!session) {
37
+ logger.warn(`Attempted to add message to non-existent session: ${sessionId}`);
38
+ return false;
39
+ }
40
+ session.history.push(message);
41
+ session.lastActivity = new Date();
42
+ this.sessions.set(sessionId, session);
43
+ return true;
44
+ }
45
+ updateSessionContext(sessionId, context) {
46
+ const session = this.getSession(sessionId);
47
+ if (!session) {
48
+ logger.warn(`Attempted to update context for non-existent session: ${sessionId}`);
49
+ return false;
50
+ }
51
+ session.context = { ...session.context, ...context };
52
+ session.lastActivity = new Date();
53
+ this.sessions.set(sessionId, session);
54
+ return true;
55
+ }
56
+ endSession(sessionId) {
57
+ if (!this.sessions.has(sessionId)) {
58
+ logger.warn(`Attempted to end non-existent session: ${sessionId}`);
59
+ return false;
60
+ }
61
+ this.sessions.delete(sessionId);
62
+ logger.info(`Ended MCP session: ${sessionId}`);
63
+ return true;
64
+ }
65
+ cleanupSessions() {
66
+ const now = new Date();
67
+ let expiredCount = 0;
68
+ for (const [sessionId, session] of this.sessions.entries()) {
69
+ const sessionAge = now.getTime() - session.startTime.getTime();
70
+ const inactivityTime = now.getTime() - session.lastActivity.getTime();
71
+ if (sessionAge > this.maxSessionDuration || inactivityTime > this.maxSessionInactivity) {
72
+ this.sessions.delete(sessionId);
73
+ expiredCount++;
74
+ }
75
+ }
76
+ if (expiredCount > 0) {
77
+ logger.info(`Cleaned up ${expiredCount} expired MCP sessions`);
78
+ }
79
+ }
80
+ getSessionCount() {
81
+ return this.sessions.size;
82
+ }
83
+ }
84
+ export const sessionManager = new SessionManager();
85
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/mcp/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Response } from 'express';
2
+ import { EventEmitter } from 'events';
3
+ import { MCPMessage } from './types.js';
4
+ export declare const sseEmitter: EventEmitter<[never]>;
5
+ export declare function initializeSSE(res: Response, sessionId: string): void;
6
+ export declare function sendMessageToClient(sessionId: string, message: MCPMessage): boolean;
7
+ export declare function broadcastMessage(message: MCPMessage): void;
8
+ export declare function closeSSEConnection(sessionId: string): boolean;
9
+ export declare function getActiveConnectionsCount(): number;
10
+ export declare function hasActiveConnection(sessionId: string): boolean;
@@ -0,0 +1,86 @@
1
+ import { EventEmitter } from 'events';
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ import { logger } from '../utils/logger.js';
4
+ export const sseEmitter = new EventEmitter();
5
+ const activeConnections = new Map();
6
+ export function initializeSSE(res, sessionId) {
7
+ res.setHeader('Content-Type', 'text/event-stream');
8
+ res.setHeader('Cache-Control', 'no-cache');
9
+ res.setHeader('Connection', 'keep-alive');
10
+ res.setHeader('X-Accel-Buffering', 'no');
11
+ const connectionMessage = {
12
+ id: uuidv4(),
13
+ type: 'status',
14
+ timestamp: new Date().toISOString(),
15
+ payload: {
16
+ status: 'processing',
17
+ message: 'SSE connection established'
18
+ }
19
+ };
20
+ sendSSEMessage(res, connectionMessage);
21
+ activeConnections.set(sessionId, res);
22
+ logger.info(`SSE connection established for session: ${sessionId}`);
23
+ res.on('close', () => {
24
+ activeConnections.delete(sessionId);
25
+ logger.info(`SSE connection closed for session: ${sessionId}`);
26
+ });
27
+ }
28
+ export function sendMessageToClient(sessionId, message) {
29
+ const connection = activeConnections.get(sessionId);
30
+ if (!connection) {
31
+ logger.warn(`Attempted to send message to non-existent SSE connection: ${sessionId}`);
32
+ return false;
33
+ }
34
+ return sendSSEMessage(connection, message);
35
+ }
36
+ export function broadcastMessage(message) {
37
+ for (const [sessionId, connection] of activeConnections.entries()) {
38
+ sendSSEMessage(connection, message);
39
+ logger.debug(`Broadcast message to session: ${sessionId}`);
40
+ }
41
+ }
42
+ function sendSSEMessage(res, message) {
43
+ try {
44
+ const data = `data: ${JSON.stringify(message)}\n\n`;
45
+ res.write(data);
46
+ return true;
47
+ }
48
+ catch (error) {
49
+ logger.error('Error sending SSE message', { error });
50
+ return false;
51
+ }
52
+ }
53
+ export function closeSSEConnection(sessionId) {
54
+ const connection = activeConnections.get(sessionId);
55
+ if (!connection) {
56
+ logger.warn(`Attempted to close non-existent SSE connection: ${sessionId}`);
57
+ return false;
58
+ }
59
+ try {
60
+ const endMessage = {
61
+ id: uuidv4(),
62
+ type: 'status',
63
+ timestamp: new Date().toISOString(),
64
+ payload: {
65
+ status: 'completed',
66
+ message: 'Connection closed by server'
67
+ }
68
+ };
69
+ sendSSEMessage(connection, endMessage);
70
+ connection.end();
71
+ activeConnections.delete(sessionId);
72
+ logger.info(`Closed SSE connection for session: ${sessionId}`);
73
+ return true;
74
+ }
75
+ catch (error) {
76
+ logger.error('Error closing SSE connection', { error });
77
+ return false;
78
+ }
79
+ }
80
+ export function getActiveConnectionsCount() {
81
+ return activeConnections.size;
82
+ }
83
+ export function hasActiveConnection(sessionId) {
84
+ return activeConnections.has(sessionId);
85
+ }
86
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/mcp/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { MCPTool } from '../types.js';
2
+ export declare const calculatorTool: MCPTool;
@@ -0,0 +1,68 @@
1
+ import { logger } from '../../utils/logger.js';
2
+ export const calculatorTool = {
3
+ name: 'calculator',
4
+ description: 'Performs basic arithmetic operations',
5
+ parameters: {
6
+ type: 'object',
7
+ properties: {
8
+ operation: {
9
+ type: 'string',
10
+ enum: ['add', 'subtract', 'multiply', 'divide'],
11
+ description: 'The arithmetic operation to perform'
12
+ },
13
+ a: {
14
+ type: 'number',
15
+ description: 'The first operand'
16
+ },
17
+ b: {
18
+ type: 'number',
19
+ description: 'The second operand'
20
+ }
21
+ },
22
+ required: ['operation', 'a', 'b']
23
+ },
24
+ handler: async (params) => {
25
+ try {
26
+ const operation = params.operation;
27
+ const a = params.a;
28
+ const b = params.b;
29
+ if (!['add', 'subtract', 'multiply', 'divide'].includes(operation) ||
30
+ typeof a !== 'number' ||
31
+ typeof b !== 'number') {
32
+ throw new Error('Invalid parameters for calculator tool');
33
+ }
34
+ logger.debug('Calculator tool called', { operation, a, b });
35
+ let result;
36
+ switch (operation) {
37
+ case 'add':
38
+ result = a + b;
39
+ break;
40
+ case 'subtract':
41
+ result = a - b;
42
+ break;
43
+ case 'multiply':
44
+ result = a * b;
45
+ break;
46
+ case 'divide':
47
+ if (b === 0) {
48
+ throw new Error('Division by zero');
49
+ }
50
+ result = a / b;
51
+ break;
52
+ default:
53
+ throw new Error(`Unknown operation: ${operation}`);
54
+ }
55
+ return {
56
+ result,
57
+ operation,
58
+ a,
59
+ b
60
+ };
61
+ }
62
+ catch (error) {
63
+ logger.error('Error in calculator tool', { error, params });
64
+ throw error;
65
+ }
66
+ }
67
+ };
68
+ //# sourceMappingURL=calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculator.js","sourceRoot":"","sources":["../../../src/mcp/tools/calculator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAK/C,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,sCAAsC;IACnD,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC;gBAC/C,WAAW,EAAE,qCAAqC;aACnD;YACD,CAAC,EAAE;gBACD,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mBAAmB;aACjC;YACD,CAAC,EAAE;gBACD,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oBAAoB;aAClC;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC;KAClC;IACD,OAAO,EAAE,KAAK,EAAE,MAA+B,EAAoB,EAAE;QACnE,IAAI,CAAC;YAEH,MAAM,SAAS,GAAG,MAAM,CAAC,SAAmB,CAAC;YAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAW,CAAC;YAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAW,CAAC;YAG7B,IACE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC9D,OAAO,CAAC,KAAK,QAAQ;gBACrB,OAAO,CAAC,KAAK,QAAQ,EACrB,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAE5D,IAAI,MAAc,CAAC;YAEnB,QAAQ,SAAS,EAAE,CAAC;gBAClB,KAAK,KAAK;oBACR,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;oBACf,MAAM;gBACR,KAAK,UAAU;oBACb,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;oBACf,MAAM;gBACR,KAAK,UAAU;oBACb,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;oBACf,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;wBACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;oBACtC,CAAC;oBACD,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;oBACf,MAAM;gBACR;oBACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;YACvD,CAAC;YAED,OAAO;gBACL,MAAM;gBACN,SAAS;gBACT,CAAC;gBACD,CAAC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF,CAAC"}