mcp-http-webhook 1.0.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/.eslintrc.json +16 -0
- package/.prettierrc.json +8 -0
- package/ARCHITECTURE.md +269 -0
- package/CONTRIBUTING.md +136 -0
- package/GETTING_STARTED.md +310 -0
- package/IMPLEMENTATION.md +294 -0
- package/LICENSE +21 -0
- package/MIGRATION_TO_SDK.md +263 -0
- package/README.md +496 -0
- package/SDK_INTEGRATION_COMPLETE.md +300 -0
- package/STANDARD_SUBSCRIPTIONS.md +268 -0
- package/STANDARD_SUBSCRIPTIONS_COMPLETE.md +309 -0
- package/SUMMARY.md +272 -0
- package/Spec.md +2778 -0
- package/dist/errors/index.d.ts +52 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +81 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/ProtocolHandler.d.ts +37 -0
- package/dist/protocol/ProtocolHandler.d.ts.map +1 -0
- package/dist/protocol/ProtocolHandler.js +172 -0
- package/dist/protocol/ProtocolHandler.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +502 -0
- package/dist/server.js.map +1 -0
- package/dist/stores/InMemoryStore.d.ts +27 -0
- package/dist/stores/InMemoryStore.d.ts.map +1 -0
- package/dist/stores/InMemoryStore.js +73 -0
- package/dist/stores/InMemoryStore.js.map +1 -0
- package/dist/stores/RedisStore.d.ts +18 -0
- package/dist/stores/RedisStore.d.ts.map +1 -0
- package/dist/stores/RedisStore.js +45 -0
- package/dist/stores/RedisStore.js.map +1 -0
- package/dist/stores/index.d.ts +3 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +9 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/subscriptions/SubscriptionManager.d.ts +49 -0
- package/dist/subscriptions/SubscriptionManager.d.ts.map +1 -0
- package/dist/subscriptions/SubscriptionManager.js +181 -0
- package/dist/subscriptions/SubscriptionManager.js.map +1 -0
- package/dist/types/index.d.ts +271 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +51 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +154 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/webhooks/WebhookManager.d.ts +27 -0
- package/dist/webhooks/WebhookManager.d.ts.map +1 -0
- package/dist/webhooks/WebhookManager.js +174 -0
- package/dist/webhooks/WebhookManager.js.map +1 -0
- package/examples/GITHUB_LIVE_EXAMPLE.md +308 -0
- package/examples/GITHUB_LIVE_SETUP.md +253 -0
- package/examples/QUICKSTART.md +130 -0
- package/examples/basic-setup.ts +142 -0
- package/examples/github-server-live.ts +690 -0
- package/examples/github-server.ts +223 -0
- package/examples/google-drive-server-live.ts +773 -0
- package/examples/start-github-live.sh +53 -0
- package/jest.config.js +20 -0
- package/package.json +58 -0
- package/src/errors/index.ts +81 -0
- package/src/index.ts +19 -0
- package/src/server.ts +595 -0
- package/src/stores/InMemoryStore.ts +87 -0
- package/src/stores/RedisStore.ts +51 -0
- package/src/stores/index.ts +2 -0
- package/src/subscriptions/SubscriptionManager.ts +240 -0
- package/src/types/index.ts +341 -0
- package/src/utils/index.ts +156 -0
- package/src/webhooks/WebhookManager.ts +230 -0
- package/test-sdk-integration.sh +157 -0
- package/tsconfig.json +21 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createMCPServer = createMCPServer;
|
|
7
|
+
const express_1 = __importDefault(require("express"));
|
|
8
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
9
|
+
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const SubscriptionManager_1 = require("./subscriptions/SubscriptionManager");
|
|
12
|
+
const WebhookManager_1 = require("./webhooks/WebhookManager");
|
|
13
|
+
const errors_1 = require("./errors");
|
|
14
|
+
const utils_1 = require("./utils");
|
|
15
|
+
const cors_1 = __importDefault(require("cors"));
|
|
16
|
+
/**
|
|
17
|
+
* Default console logger
|
|
18
|
+
*/
|
|
19
|
+
const defaultLogger = {
|
|
20
|
+
debug: (msg, meta) => console.debug(msg, meta),
|
|
21
|
+
info: (msg, meta) => console.info(msg, meta),
|
|
22
|
+
warn: (msg, meta) => console.warn(msg, meta),
|
|
23
|
+
error: (msg, meta) => console.error(msg, meta),
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Convert JSON Schema to Zod schema (simplified version)
|
|
27
|
+
* Handles basic types and nested objects
|
|
28
|
+
*/
|
|
29
|
+
function convertToZodSchema(jsonSchema) {
|
|
30
|
+
const schema = {};
|
|
31
|
+
if (!jsonSchema || !jsonSchema.properties) {
|
|
32
|
+
return schema;
|
|
33
|
+
}
|
|
34
|
+
const required = jsonSchema.required || [];
|
|
35
|
+
for (const [key, value] of Object.entries(jsonSchema.properties)) {
|
|
36
|
+
let zodType;
|
|
37
|
+
if (value.type === 'string') {
|
|
38
|
+
zodType = zod_1.z.string();
|
|
39
|
+
}
|
|
40
|
+
else if (value.type === 'number' || value.type === 'integer') {
|
|
41
|
+
zodType = zod_1.z.number();
|
|
42
|
+
}
|
|
43
|
+
else if (value.type === 'boolean') {
|
|
44
|
+
zodType = zod_1.z.boolean();
|
|
45
|
+
}
|
|
46
|
+
else if (value.type === 'array') {
|
|
47
|
+
// Handle array items
|
|
48
|
+
if (value.items?.type === 'string') {
|
|
49
|
+
zodType = zod_1.z.array(zod_1.z.string());
|
|
50
|
+
}
|
|
51
|
+
else if (value.items?.type === 'number') {
|
|
52
|
+
zodType = zod_1.z.array(zod_1.z.number());
|
|
53
|
+
}
|
|
54
|
+
else if (value.items?.type === 'object') {
|
|
55
|
+
zodType = zod_1.z.array(zod_1.z.object(convertToZodSchema(value.items)));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
zodType = zod_1.z.array(zod_1.z.any());
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (value.type === 'object') {
|
|
62
|
+
zodType = zod_1.z.object(convertToZodSchema(value));
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
zodType = zod_1.z.any();
|
|
66
|
+
}
|
|
67
|
+
// Mark as optional if not in required array
|
|
68
|
+
if (!required.includes(key)) {
|
|
69
|
+
zodType = zodType.optional();
|
|
70
|
+
}
|
|
71
|
+
schema[key] = zodType;
|
|
72
|
+
}
|
|
73
|
+
return schema;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create MCP HTTP Webhook Server using standard MCP SDK
|
|
77
|
+
*/
|
|
78
|
+
function createMCPServer(config) {
|
|
79
|
+
const logger = config.logger || defaultLogger;
|
|
80
|
+
const basePath = config.basePath || '/mcp';
|
|
81
|
+
const port = config.port || 3000;
|
|
82
|
+
const host = config.host || '0.0.0.0';
|
|
83
|
+
// Validate configuration
|
|
84
|
+
validateConfig(config);
|
|
85
|
+
// Create Express app
|
|
86
|
+
const app = (0, express_1.default)();
|
|
87
|
+
// Middleware
|
|
88
|
+
app.use(express_1.default.json());
|
|
89
|
+
// allow cors
|
|
90
|
+
app.use((0, cors_1.default)());
|
|
91
|
+
// Custom middleware
|
|
92
|
+
if (config.middleware) {
|
|
93
|
+
config.middleware.forEach((mw) => app.use(mw));
|
|
94
|
+
}
|
|
95
|
+
// Create MCP SDK server
|
|
96
|
+
const sdkServer = new mcp_js_1.McpServer({
|
|
97
|
+
name: config.name,
|
|
98
|
+
version: config.version,
|
|
99
|
+
}, {
|
|
100
|
+
capabilities: {
|
|
101
|
+
resources: {
|
|
102
|
+
subscribe: true,
|
|
103
|
+
listChanged: true,
|
|
104
|
+
},
|
|
105
|
+
experimental: {
|
|
106
|
+
isConnector: true,
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
// Initialize managers for webhook subscriptions
|
|
111
|
+
const subscriptionManager = new SubscriptionManager_1.SubscriptionManager(config.store, config.resources, config.publicUrl, logger);
|
|
112
|
+
const webhookManager = new WebhookManager_1.WebhookManager(config.webhooks, config.resources, logger);
|
|
113
|
+
// Register tools with MCP SDK
|
|
114
|
+
config.tools.forEach((toolDef) => {
|
|
115
|
+
sdkServer.registerTool(toolDef.name, {
|
|
116
|
+
title: toolDef.description,
|
|
117
|
+
description: toolDef.description,
|
|
118
|
+
inputSchema: convertToZodSchema(toolDef.inputSchema),
|
|
119
|
+
}, async (input) => {
|
|
120
|
+
// Get auth context from request metadata if available
|
|
121
|
+
const context = sdkServer._currentContext || { userId: 'anonymous' };
|
|
122
|
+
const result = await toolDef.handler(input, context);
|
|
123
|
+
return {
|
|
124
|
+
content: [
|
|
125
|
+
{
|
|
126
|
+
type: 'text',
|
|
127
|
+
text: JSON.stringify(result, null, 2),
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
structuredContent: result,
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
// Register resources with MCP SDK
|
|
135
|
+
config.resources.forEach((resourceDef) => {
|
|
136
|
+
// Check if URI is a template (contains {})
|
|
137
|
+
const isTemplate = resourceDef.uri.includes('{') && resourceDef.uri.includes('}');
|
|
138
|
+
if (isTemplate && resourceDef.list) {
|
|
139
|
+
// Use ResourceTemplate for templated URIs
|
|
140
|
+
const template = new mcp_js_1.ResourceTemplate(resourceDef.uri, {
|
|
141
|
+
list: async () => {
|
|
142
|
+
const context = sdkServer._currentContext || { userId: 'anonymous' };
|
|
143
|
+
const resources = await resourceDef.list(context);
|
|
144
|
+
// Map to MCP SDK Resource format with index signature
|
|
145
|
+
return {
|
|
146
|
+
resources: resources.map((r) => ({
|
|
147
|
+
uri: r.uri,
|
|
148
|
+
name: r.name,
|
|
149
|
+
description: r.description,
|
|
150
|
+
mimeType: resourceDef.mimeType,
|
|
151
|
+
...r, // Spread to add index signature
|
|
152
|
+
})),
|
|
153
|
+
};
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
sdkServer.registerResource(resourceDef.name, template, {
|
|
157
|
+
description: resourceDef.description,
|
|
158
|
+
mimeType: resourceDef.mimeType || 'application/json',
|
|
159
|
+
}, async (uri, _variables, _extra) => {
|
|
160
|
+
const context = sdkServer._currentContext || { userId: 'anonymous' };
|
|
161
|
+
const result = await resourceDef.read(uri.href, context);
|
|
162
|
+
return {
|
|
163
|
+
contents: Array.isArray(result.contents)
|
|
164
|
+
? result.contents.map((content) => ({
|
|
165
|
+
uri: uri.href,
|
|
166
|
+
text: typeof content === 'string' ? content : JSON.stringify(content),
|
|
167
|
+
mimeType: resourceDef.mimeType || 'text/plain',
|
|
168
|
+
}))
|
|
169
|
+
: [{
|
|
170
|
+
uri: uri.href,
|
|
171
|
+
text: typeof result.contents === 'string' ? result.contents : JSON.stringify(result.contents),
|
|
172
|
+
mimeType: resourceDef.mimeType || 'text/plain',
|
|
173
|
+
}],
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// Static resource - simple URI
|
|
179
|
+
sdkServer.registerResource(resourceDef.name, resourceDef.uri, {
|
|
180
|
+
description: resourceDef.description,
|
|
181
|
+
mimeType: resourceDef.mimeType || 'application/json',
|
|
182
|
+
}, async (uri, _extra) => {
|
|
183
|
+
const context = sdkServer._currentContext || { userId: 'anonymous' };
|
|
184
|
+
const result = await resourceDef.read(uri.href, context);
|
|
185
|
+
return {
|
|
186
|
+
contents: Array.isArray(result.contents)
|
|
187
|
+
? result.contents.map((content) => ({
|
|
188
|
+
uri: uri.href,
|
|
189
|
+
text: typeof content === 'string' ? content : JSON.stringify(content),
|
|
190
|
+
mimeType: resourceDef.mimeType || 'application/json',
|
|
191
|
+
}))
|
|
192
|
+
: [{
|
|
193
|
+
uri: uri.href,
|
|
194
|
+
text: typeof result.contents === 'string' ? result.contents : JSON.stringify(result.contents),
|
|
195
|
+
mimeType: resourceDef.mimeType || 'application/json',
|
|
196
|
+
}],
|
|
197
|
+
};
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
// Register prompts with MCP SDK
|
|
202
|
+
if (config.prompts) {
|
|
203
|
+
config.prompts.forEach((promptDef) => {
|
|
204
|
+
sdkServer.registerPrompt(promptDef.name, {
|
|
205
|
+
title: promptDef.name,
|
|
206
|
+
description: promptDef.description,
|
|
207
|
+
argsSchema: promptDef.arguments?.reduce((schema, arg) => {
|
|
208
|
+
schema[arg.name] = zod_1.z.string();
|
|
209
|
+
return schema;
|
|
210
|
+
}, {}) || {},
|
|
211
|
+
}, async (args) => {
|
|
212
|
+
const context = sdkServer._currentContext || { userId: 'anonymous' };
|
|
213
|
+
const result = await promptDef.handler(args, context);
|
|
214
|
+
// Convert to MCP SDK message format
|
|
215
|
+
return {
|
|
216
|
+
messages: result.messages.map((msg) => ({
|
|
217
|
+
role: msg.role,
|
|
218
|
+
content: {
|
|
219
|
+
type: 'text',
|
|
220
|
+
text: msg.content,
|
|
221
|
+
},
|
|
222
|
+
})),
|
|
223
|
+
};
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
// Health check endpoints
|
|
228
|
+
app.get('/health', (_req, res) => {
|
|
229
|
+
res.json({ status: 'ok' });
|
|
230
|
+
});
|
|
231
|
+
app.get('/ready', async (_req, res) => {
|
|
232
|
+
try {
|
|
233
|
+
// Test store connectivity
|
|
234
|
+
await config.store.set('health-check', 'ok', 10);
|
|
235
|
+
await config.store.delete('health-check');
|
|
236
|
+
res.json({ status: 'ready' });
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
res.status(503).json({ status: 'not ready', error: String(error) });
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
// Standard MCP endpoint with StreamableHTTPServerTransport
|
|
243
|
+
app.post(basePath, asyncHandler(async (req, res) => {
|
|
244
|
+
// Authenticate and store context
|
|
245
|
+
const context = await authenticate(req, config);
|
|
246
|
+
sdkServer._currentContext = context;
|
|
247
|
+
// Intercept resources/subscribe to support webhook callbacks
|
|
248
|
+
if (req.body.method === 'resources/subscribe') {
|
|
249
|
+
const { uri } = req.body.params || {};
|
|
250
|
+
const webhookUrl = req.body.params?._meta?.webhookUrl || req.body.params?.webhookUrl;
|
|
251
|
+
const webhookSecret = req.body.params?._meta?.webhookSecret || req.body.params?.webhookSecret;
|
|
252
|
+
if (webhookUrl) {
|
|
253
|
+
// Handle webhook-based subscription
|
|
254
|
+
logger.info('Standard MCP subscribe with webhook support', { uri, webhookUrl });
|
|
255
|
+
if (!(0, utils_1.isValidUrl)(webhookUrl)) {
|
|
256
|
+
return res.json({
|
|
257
|
+
jsonrpc: '2.0',
|
|
258
|
+
id: req.body.id,
|
|
259
|
+
error: {
|
|
260
|
+
code: -32602,
|
|
261
|
+
message: 'Invalid webhookUrl in _meta'
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
try {
|
|
266
|
+
await subscriptionManager.createSubscription({
|
|
267
|
+
uri,
|
|
268
|
+
clientCallbackUrl: webhookUrl,
|
|
269
|
+
clientCallbackSecret: webhookSecret,
|
|
270
|
+
context,
|
|
271
|
+
});
|
|
272
|
+
// Return standard MCP response
|
|
273
|
+
return res.json({
|
|
274
|
+
jsonrpc: '2.0',
|
|
275
|
+
id: req.body.id,
|
|
276
|
+
method: 'notifications/resources/updated',
|
|
277
|
+
params: {
|
|
278
|
+
uri: uri,
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
return res.json({
|
|
284
|
+
jsonrpc: '2.0',
|
|
285
|
+
id: req.body.id,
|
|
286
|
+
error: {
|
|
287
|
+
code: -32603,
|
|
288
|
+
message: error.message || 'Failed to create subscription'
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
// No webhookUrl - throw error
|
|
295
|
+
return res.json({
|
|
296
|
+
jsonrpc: '2.0',
|
|
297
|
+
id: req.body.id,
|
|
298
|
+
error: {
|
|
299
|
+
code: -32602,
|
|
300
|
+
message: 'Invalid webhookUrl in _meta'
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// Intercept resources/unsubscribe to support webhook cleanup
|
|
306
|
+
if (req.body.method === 'resources/unsubscribe') {
|
|
307
|
+
const subscriptionId = req.body.params?._meta?.subscriptionId || req.body.params?.subscriptionId;
|
|
308
|
+
if (subscriptionId) {
|
|
309
|
+
logger.info('Standard MCP unsubscribe with webhook cleanup', { subscriptionId });
|
|
310
|
+
try {
|
|
311
|
+
await subscriptionManager.deleteSubscription(subscriptionId, context);
|
|
312
|
+
return res.json({
|
|
313
|
+
jsonrpc: '2.0',
|
|
314
|
+
id: req.body.id,
|
|
315
|
+
result: {
|
|
316
|
+
success: true,
|
|
317
|
+
_meta: {
|
|
318
|
+
webhookEnabled: true
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
return res.json({
|
|
325
|
+
jsonrpc: '2.0',
|
|
326
|
+
id: req.body.id,
|
|
327
|
+
error: {
|
|
328
|
+
code: -32603,
|
|
329
|
+
message: error.message || 'Failed to unsubscribe'
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
// Standard MCP request handling
|
|
336
|
+
const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
|
|
337
|
+
sessionIdGenerator: undefined,
|
|
338
|
+
enableJsonResponse: true,
|
|
339
|
+
});
|
|
340
|
+
res.on('close', () => {
|
|
341
|
+
transport.close();
|
|
342
|
+
delete sdkServer._currentContext;
|
|
343
|
+
});
|
|
344
|
+
await sdkServer.connect(transport);
|
|
345
|
+
await transport.handleRequest(req, res, req.body);
|
|
346
|
+
}));
|
|
347
|
+
// Additional webhook subscription endpoints (extensions to MCP)
|
|
348
|
+
app.post(`${basePath}/resources/subscribe`, asyncHandler(async (req, res) => {
|
|
349
|
+
const context = await authenticate(req, config);
|
|
350
|
+
const { uri, callbackUrl, callbackSecret } = req.body.params || req.body;
|
|
351
|
+
if (!uri || !callbackUrl) {
|
|
352
|
+
throw new errors_1.ValidationError('uri and callbackUrl are required');
|
|
353
|
+
}
|
|
354
|
+
if (!(0, utils_1.isValidUrl)(callbackUrl)) {
|
|
355
|
+
throw new errors_1.ValidationError('Invalid callbackUrl');
|
|
356
|
+
}
|
|
357
|
+
const result = await subscriptionManager.createSubscription({
|
|
358
|
+
uri,
|
|
359
|
+
clientCallbackUrl: callbackUrl,
|
|
360
|
+
clientCallbackSecret: callbackSecret,
|
|
361
|
+
context,
|
|
362
|
+
});
|
|
363
|
+
res.json(result);
|
|
364
|
+
}));
|
|
365
|
+
app.post(`${basePath}/resources/unsubscribe`, asyncHandler(async (req, res) => {
|
|
366
|
+
const context = await authenticate(req, config);
|
|
367
|
+
const { subscriptionId } = req.body.params || req.body;
|
|
368
|
+
if (!subscriptionId) {
|
|
369
|
+
throw new errors_1.ValidationError('subscriptionId is required');
|
|
370
|
+
}
|
|
371
|
+
await subscriptionManager.deleteSubscription(subscriptionId, context);
|
|
372
|
+
res.json({ status: 'unsubscribed' });
|
|
373
|
+
}));
|
|
374
|
+
// Webhook endpoints
|
|
375
|
+
const webhookPath = config.webhooks?.incomingPath || '/webhooks/incoming';
|
|
376
|
+
app.post(`${webhookPath}/:subscriptionId`, asyncHandler(async (req, res) => {
|
|
377
|
+
const { subscriptionId } = req.params;
|
|
378
|
+
const payload = req.body;
|
|
379
|
+
const headers = req.headers;
|
|
380
|
+
logger.debug('Received webhook', { subscriptionId });
|
|
381
|
+
// Load subscription
|
|
382
|
+
const subscription = await subscriptionManager.getSubscription(subscriptionId);
|
|
383
|
+
if (!subscription) {
|
|
384
|
+
logger.warn('Subscription not found', { subscriptionId });
|
|
385
|
+
return res.status(404).json({ error: 'Subscription not found' });
|
|
386
|
+
}
|
|
387
|
+
// Process webhook
|
|
388
|
+
const changeInfo = await webhookManager.processIncomingWebhook(subscriptionId, payload, headers, subscription);
|
|
389
|
+
if (changeInfo) {
|
|
390
|
+
// Notify client (async, don't wait)
|
|
391
|
+
webhookManager.notifyClient(subscription, changeInfo).catch((error) => {
|
|
392
|
+
logger.error('Failed to notify client', {
|
|
393
|
+
subscriptionId,
|
|
394
|
+
error: error instanceof Error ? error.message : String(error),
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
res.json({ received: true });
|
|
399
|
+
}));
|
|
400
|
+
// Error handler
|
|
401
|
+
app.use((err, _req, res, _next) => {
|
|
402
|
+
if (err instanceof errors_1.MCPError) {
|
|
403
|
+
logger.warn('MCP Error', { code: err.code, message: err.message });
|
|
404
|
+
return res.status(400).json(err.toJSON());
|
|
405
|
+
}
|
|
406
|
+
logger.error('Unexpected error', {
|
|
407
|
+
error: err.message,
|
|
408
|
+
stack: err.stack,
|
|
409
|
+
});
|
|
410
|
+
res.status(500).json({
|
|
411
|
+
error: {
|
|
412
|
+
code: -1,
|
|
413
|
+
message: 'Internal server error',
|
|
414
|
+
},
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
// Server instance
|
|
418
|
+
let server;
|
|
419
|
+
const mcpServer = {
|
|
420
|
+
async start() {
|
|
421
|
+
return new Promise((resolve) => {
|
|
422
|
+
server = app.listen(port, host, () => {
|
|
423
|
+
logger.info(`MCP Server started`, {
|
|
424
|
+
name: config.name,
|
|
425
|
+
version: config.version,
|
|
426
|
+
host,
|
|
427
|
+
port,
|
|
428
|
+
publicUrl: config.publicUrl,
|
|
429
|
+
});
|
|
430
|
+
resolve();
|
|
431
|
+
});
|
|
432
|
+
});
|
|
433
|
+
},
|
|
434
|
+
async stop() {
|
|
435
|
+
if (server) {
|
|
436
|
+
return new Promise((resolve) => {
|
|
437
|
+
server.close(() => {
|
|
438
|
+
logger.info('MCP Server stopped');
|
|
439
|
+
resolve();
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
},
|
|
444
|
+
getApp() {
|
|
445
|
+
return app;
|
|
446
|
+
},
|
|
447
|
+
};
|
|
448
|
+
return mcpServer;
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Validate server configuration
|
|
452
|
+
*/
|
|
453
|
+
function validateConfig(config) {
|
|
454
|
+
if (!config.name) {
|
|
455
|
+
throw new Error('Server name is required');
|
|
456
|
+
}
|
|
457
|
+
if (!config.version) {
|
|
458
|
+
throw new Error('Server version is required');
|
|
459
|
+
}
|
|
460
|
+
if (!config.publicUrl) {
|
|
461
|
+
throw new Error('publicUrl is required');
|
|
462
|
+
}
|
|
463
|
+
if (!(0, utils_1.isValidUrl)(config.publicUrl)) {
|
|
464
|
+
throw new Error('Invalid publicUrl');
|
|
465
|
+
}
|
|
466
|
+
if (process.env.NODE_ENV === 'production' && !(0, utils_1.isHttpsUrl)(config.publicUrl)) {
|
|
467
|
+
throw new Error('publicUrl must use HTTPS in production');
|
|
468
|
+
}
|
|
469
|
+
if (!config.store) {
|
|
470
|
+
throw new Error('Store is required');
|
|
471
|
+
}
|
|
472
|
+
if (!Array.isArray(config.tools)) {
|
|
473
|
+
throw new Error('tools must be an array');
|
|
474
|
+
}
|
|
475
|
+
if (!Array.isArray(config.resources)) {
|
|
476
|
+
throw new Error('resources must be an array');
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Authenticate request
|
|
481
|
+
*/
|
|
482
|
+
async function authenticate(req, config) {
|
|
483
|
+
if (!config.authenticate) {
|
|
484
|
+
// No authentication configured - return default context
|
|
485
|
+
return { userId: 'anonymous' };
|
|
486
|
+
}
|
|
487
|
+
try {
|
|
488
|
+
return await config.authenticate(req);
|
|
489
|
+
}
|
|
490
|
+
catch (error) {
|
|
491
|
+
throw new errors_1.AuthenticationError(error instanceof Error ? error.message : 'Authentication failed');
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Async handler wrapper
|
|
496
|
+
*/
|
|
497
|
+
function asyncHandler(fn) {
|
|
498
|
+
return (req, res, next) => {
|
|
499
|
+
Promise.resolve(fn(req, res)).catch(next);
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { KeyValueStore } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory store implementation (for development/testing only)
|
|
4
|
+
* DO NOT USE IN PRODUCTION
|
|
5
|
+
*/
|
|
6
|
+
export declare class InMemoryStore implements KeyValueStore {
|
|
7
|
+
private data;
|
|
8
|
+
private cleanupInterval;
|
|
9
|
+
constructor();
|
|
10
|
+
get(key: string): Promise<string | null>;
|
|
11
|
+
set(key: string, value: string, ttl?: number): Promise<void>;
|
|
12
|
+
delete(key: string): Promise<void>;
|
|
13
|
+
scan(pattern: string): Promise<string[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Cleanup expired keys
|
|
16
|
+
*/
|
|
17
|
+
private cleanup;
|
|
18
|
+
/**
|
|
19
|
+
* Clear all data
|
|
20
|
+
*/
|
|
21
|
+
clear(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Destroy store and cleanup interval
|
|
24
|
+
*/
|
|
25
|
+
destroy(): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=InMemoryStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryStore.d.ts","sourceRoot":"","sources":["../../src/stores/InMemoryStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;GAGG;AACH,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,IAAI,CAAiE;IAC7E,OAAO,CAAC,eAAe,CAAiB;;IAOlC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAc9C;;OAEG;IACH,OAAO,CAAC,OAAO;IAUf;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryStore = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* In-memory store implementation (for development/testing only)
|
|
6
|
+
* DO NOT USE IN PRODUCTION
|
|
7
|
+
*/
|
|
8
|
+
class InMemoryStore {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.data = new Map();
|
|
11
|
+
// Cleanup expired keys every minute
|
|
12
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), 60000);
|
|
13
|
+
}
|
|
14
|
+
async get(key) {
|
|
15
|
+
const item = this.data.get(key);
|
|
16
|
+
if (!item) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
// Check expiration
|
|
20
|
+
if (item.expiresAt && item.expiresAt < Date.now()) {
|
|
21
|
+
this.data.delete(key);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return item.value;
|
|
25
|
+
}
|
|
26
|
+
async set(key, value, ttl) {
|
|
27
|
+
const item = { value };
|
|
28
|
+
if (ttl) {
|
|
29
|
+
item.expiresAt = Date.now() + ttl * 1000;
|
|
30
|
+
}
|
|
31
|
+
this.data.set(key, item);
|
|
32
|
+
}
|
|
33
|
+
async delete(key) {
|
|
34
|
+
this.data.delete(key);
|
|
35
|
+
}
|
|
36
|
+
async scan(pattern) {
|
|
37
|
+
// Simple glob pattern matching
|
|
38
|
+
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
39
|
+
const keys = [];
|
|
40
|
+
for (const key of this.data.keys()) {
|
|
41
|
+
if (regex.test(key)) {
|
|
42
|
+
keys.push(key);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return keys;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Cleanup expired keys
|
|
49
|
+
*/
|
|
50
|
+
cleanup() {
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
for (const [key, item] of this.data.entries()) {
|
|
53
|
+
if (item.expiresAt && item.expiresAt < now) {
|
|
54
|
+
this.data.delete(key);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Clear all data
|
|
60
|
+
*/
|
|
61
|
+
clear() {
|
|
62
|
+
this.data.clear();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Destroy store and cleanup interval
|
|
66
|
+
*/
|
|
67
|
+
destroy() {
|
|
68
|
+
clearInterval(this.cleanupInterval);
|
|
69
|
+
this.clear();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.InMemoryStore = InMemoryStore;
|
|
73
|
+
//# sourceMappingURL=InMemoryStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryStore.js","sourceRoot":"","sources":["../../src/stores/InMemoryStore.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,aAAa;IAIxB;QAHQ,SAAI,GAAuD,IAAI,GAAG,EAAE,CAAC;QAI3E,oCAAoC;QACpC,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,GAAY;QAChD,MAAM,IAAI,GAA0C,EAAE,KAAK,EAAE,CAAC;QAE9D,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,+BAA+B;QAC/B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACnE,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF;AAhFD,sCAgFC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { KeyValueStore } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Redis store implementation
|
|
4
|
+
* Requires ioredis package
|
|
5
|
+
*/
|
|
6
|
+
export declare class RedisStore implements KeyValueStore {
|
|
7
|
+
private redis;
|
|
8
|
+
constructor(redis: any);
|
|
9
|
+
get(key: string): Promise<string | null>;
|
|
10
|
+
set(key: string, value: string, ttl?: number): Promise<void>;
|
|
11
|
+
delete(key: string): Promise<void>;
|
|
12
|
+
scan(pattern: string): Promise<string[]>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create Redis store from connection URL
|
|
16
|
+
*/
|
|
17
|
+
export declare function createRedisStore(redis: any): KeyValueStore;
|
|
18
|
+
//# sourceMappingURL=RedisStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisStore.d.ts","sourceRoot":"","sources":["../../src/stores/RedisStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;GAGG;AACH,qBAAa,UAAW,YAAW,aAAa;IAClC,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,GAAG;IAExB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAkB/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,GAAG,aAAa,CAE1D"}
|