@samanhappy/mcphub 0.10.3 → 0.10.5
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 +39 -1
- package/dist/config/index.js +24 -0
- package/dist/config/index.js.map +1 -1
- package/dist/constants/oauthServerDefaults.js +36 -0
- package/dist/constants/oauthServerDefaults.js.map +1 -0
- package/dist/controllers/oauthClientController.js +252 -0
- package/dist/controllers/oauthClientController.js.map +1 -0
- package/dist/controllers/oauthDynamicRegistrationController.js +479 -0
- package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -0
- package/dist/controllers/oauthServerController.js +449 -0
- package/dist/controllers/oauthServerController.js.map +1 -0
- package/dist/controllers/openApiController.js +6 -3
- package/dist/controllers/openApiController.js.map +1 -1
- package/dist/controllers/serverController.js +116 -23
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/middlewares/auth.js +23 -2
- package/dist/middlewares/auth.js.map +1 -1
- package/dist/middlewares/userContext.js +27 -11
- package/dist/middlewares/userContext.js.map +1 -1
- package/dist/models/OAuth.js +291 -0
- package/dist/models/OAuth.js.map +1 -0
- package/dist/routes/index.js +25 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/server.js +4 -1
- package/dist/server.js.map +1 -1
- package/dist/services/dataServicex.js +3 -0
- package/dist/services/dataServicex.js.map +1 -1
- package/dist/services/oauthServerService.js +339 -0
- package/dist/services/oauthServerService.js.map +1 -0
- package/dist/services/sseService.js +413 -45
- package/dist/services/sseService.js.map +1 -1
- package/dist/utils/oauthBearer.js +35 -0
- package/dist/utils/oauthBearer.js.map +1 -0
- package/frontend/dist/assets/index-qg3ysGil.js +251 -0
- package/frontend/dist/assets/index-qg3ysGil.js.map +1 -0
- package/frontend/dist/index.html +1 -1
- package/mcp_settings.json +23 -1
- package/package.json +2 -1
- package/frontend/dist/assets/index-BpPaTvxv.js +0 -251
- package/frontend/dist/assets/index-BpPaTvxv.js.map +0 -1
|
@@ -7,11 +7,13 @@ import { loadSettings } from '../config/index.js';
|
|
|
7
7
|
import config from '../config/index.js';
|
|
8
8
|
import { UserContextService } from './userContextService.js';
|
|
9
9
|
import { RequestContextService } from './requestContextService.js';
|
|
10
|
-
|
|
10
|
+
import { resolveOAuthUserFromToken } from '../utils/oauthBearer.js';
|
|
11
|
+
export const transports = {};
|
|
12
|
+
// Session creation locks to prevent concurrent session creation conflicts
|
|
13
|
+
const sessionCreationLocks = {};
|
|
11
14
|
export const getGroup = (sessionId) => {
|
|
12
15
|
return transports[sessionId]?.group || '';
|
|
13
16
|
};
|
|
14
|
-
// Helper function to validate bearer auth
|
|
15
17
|
const validateBearerAuth = (req) => {
|
|
16
18
|
const settings = loadSettings();
|
|
17
19
|
const routingConfig = settings.systemConfig?.routing || {
|
|
@@ -23,24 +25,103 @@ const validateBearerAuth = (req) => {
|
|
|
23
25
|
if (routingConfig.enableBearerAuth) {
|
|
24
26
|
const authHeader = req.headers.authorization;
|
|
25
27
|
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
26
|
-
return false;
|
|
28
|
+
return { valid: false, reason: 'missing' };
|
|
27
29
|
}
|
|
28
30
|
const token = authHeader.substring(7); // Remove "Bearer " prefix
|
|
29
|
-
|
|
31
|
+
if (token.trim().length === 0) {
|
|
32
|
+
return { valid: false, reason: 'missing' };
|
|
33
|
+
}
|
|
34
|
+
if (token === routingConfig.bearerAuthKey) {
|
|
35
|
+
return { valid: true };
|
|
36
|
+
}
|
|
37
|
+
const oauthUser = resolveOAuthUserFromToken(token);
|
|
38
|
+
if (oauthUser) {
|
|
39
|
+
return { valid: true, user: oauthUser };
|
|
40
|
+
}
|
|
41
|
+
return { valid: false, reason: 'invalid' };
|
|
42
|
+
}
|
|
43
|
+
return { valid: true };
|
|
44
|
+
};
|
|
45
|
+
const attachUserContextFromBearer = (result, res) => {
|
|
46
|
+
if (!result.valid || !result.user) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const userContextService = UserContextService.getInstance();
|
|
50
|
+
if (userContextService.hasUser()) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
userContextService.setCurrentUser(result.user);
|
|
54
|
+
let cleanedUp = false;
|
|
55
|
+
const cleanup = () => {
|
|
56
|
+
if (cleanedUp) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
cleanedUp = true;
|
|
60
|
+
userContextService.clearCurrentUser();
|
|
61
|
+
};
|
|
62
|
+
res.on('finish', cleanup);
|
|
63
|
+
res.on('close', cleanup);
|
|
64
|
+
};
|
|
65
|
+
const escapeHeaderValue = (value) => {
|
|
66
|
+
return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
67
|
+
};
|
|
68
|
+
const buildResourceMetadataUrl = (req) => {
|
|
69
|
+
const forwardedProto = req.headers['x-forwarded-proto']
|
|
70
|
+
?.split(',')[0]
|
|
71
|
+
?.trim();
|
|
72
|
+
const protocol = forwardedProto || req.protocol || 'http';
|
|
73
|
+
const forwardedHost = req.headers['x-forwarded-host']
|
|
74
|
+
?.split(',')[0]
|
|
75
|
+
?.trim();
|
|
76
|
+
const host = forwardedHost ||
|
|
77
|
+
req.headers.host ||
|
|
78
|
+
req.headers[':authority'];
|
|
79
|
+
if (!host) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const origin = `${protocol}://${host}`;
|
|
83
|
+
const basePath = config.basePath || '';
|
|
84
|
+
if (!basePath || basePath === '/') {
|
|
85
|
+
return `${origin}/.well-known/oauth-protected-resource`;
|
|
30
86
|
}
|
|
31
|
-
|
|
87
|
+
const normalizedBasePath = `${basePath.startsWith('/') ? '' : '/'}${basePath}`.replace(/\/+$/, '');
|
|
88
|
+
return `${origin}/.well-known/oauth-protected-resource${normalizedBasePath}`;
|
|
89
|
+
};
|
|
90
|
+
const sendBearerAuthError = (req, res, reason) => {
|
|
91
|
+
const errorDescription = reason === 'missing' ? 'No authorization provided' : 'Invalid bearer token';
|
|
92
|
+
const resourceMetadataUrl = buildResourceMetadataUrl(req);
|
|
93
|
+
const headerParts = [
|
|
94
|
+
'error="invalid_token"',
|
|
95
|
+
`error_description="${escapeHeaderValue(errorDescription)}"`,
|
|
96
|
+
];
|
|
97
|
+
if (resourceMetadataUrl) {
|
|
98
|
+
headerParts.push(`resource_metadata="${escapeHeaderValue(resourceMetadataUrl)}"`);
|
|
99
|
+
}
|
|
100
|
+
console.warn(reason === 'missing'
|
|
101
|
+
? 'Bearer authentication required but no authorization header was provided'
|
|
102
|
+
: 'Bearer authentication failed due to invalid bearer token');
|
|
103
|
+
res.setHeader('WWW-Authenticate', `Bearer ${headerParts.join(', ')}`);
|
|
104
|
+
const responseBody = {
|
|
105
|
+
error: 'invalid_token',
|
|
106
|
+
error_description: errorDescription,
|
|
107
|
+
};
|
|
108
|
+
if (resourceMetadataUrl) {
|
|
109
|
+
responseBody.resource_metadata = resourceMetadataUrl;
|
|
110
|
+
}
|
|
111
|
+
res.status(401).json(responseBody);
|
|
32
112
|
};
|
|
33
113
|
export const handleSseConnection = async (req, res) => {
|
|
34
114
|
// User context is now set by sseUserContextMiddleware
|
|
35
115
|
const userContextService = UserContextService.getInstance();
|
|
36
|
-
const currentUser = userContextService.getCurrentUser();
|
|
37
|
-
const username = currentUser?.username;
|
|
38
116
|
// Check bearer auth using filtered settings
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
117
|
+
const bearerAuthResult = validateBearerAuth(req);
|
|
118
|
+
if (!bearerAuthResult.valid) {
|
|
119
|
+
sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
42
120
|
return;
|
|
43
121
|
}
|
|
122
|
+
attachUserContextFromBearer(bearerAuthResult, res);
|
|
123
|
+
const currentUser = userContextService.getCurrentUser();
|
|
124
|
+
const username = currentUser?.username;
|
|
44
125
|
const settings = loadSettings();
|
|
45
126
|
const routingConfig = settings.systemConfig?.routing || {
|
|
46
127
|
enableGlobalRoute: true,
|
|
@@ -67,7 +148,22 @@ export const handleSseConnection = async (req, res) => {
|
|
|
67
148
|
console.log(`Creating SSE transport with messages path: ${messagesPath}`);
|
|
68
149
|
const transport = new SSEServerTransport(messagesPath, res);
|
|
69
150
|
transports[transport.sessionId] = { transport, group: group };
|
|
151
|
+
// Send keepalive ping every 30 seconds to prevent client from closing connection
|
|
152
|
+
const keepAlive = setInterval(() => {
|
|
153
|
+
try {
|
|
154
|
+
// Send a ping notification to keep the connection alive
|
|
155
|
+
transport.send({ jsonrpc: '2.0', method: 'ping' });
|
|
156
|
+
console.log(`Sent keepalive ping for SSE session: ${transport.sessionId}`);
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
// If sending a ping fails, the connection is likely broken.
|
|
160
|
+
// Log the error and clear the interval to prevent further attempts.
|
|
161
|
+
console.warn(`Failed to send keepalive ping for SSE session ${transport.sessionId}, cleaning up interval:`, e);
|
|
162
|
+
clearInterval(keepAlive);
|
|
163
|
+
}
|
|
164
|
+
}, 30000); // Send ping every 30 seconds
|
|
70
165
|
res.on('close', () => {
|
|
166
|
+
clearInterval(keepAlive);
|
|
71
167
|
delete transports[transport.sessionId];
|
|
72
168
|
deleteMcpServer(transport.sessionId);
|
|
73
169
|
console.log(`SSE connection closed: ${transport.sessionId}`);
|
|
@@ -78,13 +174,15 @@ export const handleSseConnection = async (req, res) => {
|
|
|
78
174
|
export const handleSseMessage = async (req, res) => {
|
|
79
175
|
// User context is now set by sseUserContextMiddleware
|
|
80
176
|
const userContextService = UserContextService.getInstance();
|
|
81
|
-
const currentUser = userContextService.getCurrentUser();
|
|
82
|
-
const username = currentUser?.username;
|
|
83
177
|
// Check bearer auth using filtered settings
|
|
84
|
-
|
|
85
|
-
|
|
178
|
+
const bearerAuthResult = validateBearerAuth(req);
|
|
179
|
+
if (!bearerAuthResult.valid) {
|
|
180
|
+
sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
86
181
|
return;
|
|
87
182
|
}
|
|
183
|
+
attachUserContextFromBearer(bearerAuthResult, res);
|
|
184
|
+
const currentUser = userContextService.getCurrentUser();
|
|
185
|
+
const username = currentUser?.username;
|
|
88
186
|
const sessionId = req.query.sessionId;
|
|
89
187
|
// Validate sessionId
|
|
90
188
|
if (!sessionId) {
|
|
@@ -114,20 +212,112 @@ export const handleSseMessage = async (req, res) => {
|
|
|
114
212
|
requestContextService.clearRequestContext();
|
|
115
213
|
}
|
|
116
214
|
};
|
|
215
|
+
// Helper function to create a session with a specific sessionId
|
|
216
|
+
async function createSessionWithId(sessionId, group, username) {
|
|
217
|
+
console.log(`[SESSION REBUILD] Starting session rebuild for ID: ${sessionId}${username ? ` for user: ${username}` : ''}`);
|
|
218
|
+
// Create a new server instance to ensure clean state
|
|
219
|
+
const server = getMcpServer(sessionId, group);
|
|
220
|
+
const transport = new StreamableHTTPServerTransport({
|
|
221
|
+
sessionIdGenerator: () => sessionId, // Use the specified sessionId
|
|
222
|
+
onsessioninitialized: (initializedSessionId) => {
|
|
223
|
+
console.log(`[SESSION REBUILD] onsessioninitialized triggered for ID: ${initializedSessionId}`); // New log
|
|
224
|
+
if (initializedSessionId === sessionId) {
|
|
225
|
+
transports[sessionId] = { transport, group };
|
|
226
|
+
console.log(`[SESSION REBUILD] Session ${sessionId} initialized successfully${username ? ` for user: ${username}` : ''}`);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
console.warn(`[SESSION REBUILD] Session ID mismatch: expected ${sessionId}, got ${initializedSessionId}`);
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
});
|
|
233
|
+
// Send keepalive ping every 30 seconds to prevent client from closing connection
|
|
234
|
+
const keepAlive = setInterval(() => {
|
|
235
|
+
try {
|
|
236
|
+
// Send a ping notification to keep the connection alive
|
|
237
|
+
transport.send({ jsonrpc: '2.0', method: 'ping' });
|
|
238
|
+
console.log(`Sent keepalive ping for StreamableHTTP session: ${sessionId}`);
|
|
239
|
+
}
|
|
240
|
+
catch (e) {
|
|
241
|
+
// If sending a ping fails, the connection is likely broken.
|
|
242
|
+
// Log the error and clear the interval to prevent further attempts.
|
|
243
|
+
console.warn(`Failed to send keepalive ping for StreamableHTTP session ${sessionId}, cleaning up interval:`, e);
|
|
244
|
+
clearInterval(keepAlive);
|
|
245
|
+
}
|
|
246
|
+
}, 30000); // Send ping every 30 seconds
|
|
247
|
+
transport.onclose = () => {
|
|
248
|
+
console.log(`[SESSION REBUILD] Transport closed: ${sessionId}`);
|
|
249
|
+
clearInterval(keepAlive);
|
|
250
|
+
delete transports[sessionId];
|
|
251
|
+
deleteMcpServer(sessionId);
|
|
252
|
+
};
|
|
253
|
+
// Connect to MCP server
|
|
254
|
+
await server.connect(transport);
|
|
255
|
+
// Wait for the server to fully initialize
|
|
256
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
257
|
+
// Ensure the transport is properly initialized
|
|
258
|
+
if (!transports[sessionId]) {
|
|
259
|
+
console.warn(`[SESSION REBUILD] Transport not found in transports after initialization, forcing registration`);
|
|
260
|
+
transports[sessionId] = { transport, group, needsInitialization: true };
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// Mark the session as needing initialization
|
|
264
|
+
transports[sessionId].needsInitialization = true;
|
|
265
|
+
}
|
|
266
|
+
console.log(`[SESSION REBUILD] Session ${sessionId} created but not yet initialized. It will be initialized on first use.`);
|
|
267
|
+
console.log(`[SESSION REBUILD] Successfully rebuilt session ${sessionId} in group: ${group}`);
|
|
268
|
+
return transport;
|
|
269
|
+
}
|
|
270
|
+
// Helper function to create a completely new session
|
|
271
|
+
async function createNewSession(group, username) {
|
|
272
|
+
const newSessionId = randomUUID();
|
|
273
|
+
console.log(`[SESSION NEW] Creating new session with ID: ${newSessionId}${username ? ` for user: ${username}` : ''}`);
|
|
274
|
+
const transport = new StreamableHTTPServerTransport({
|
|
275
|
+
sessionIdGenerator: () => newSessionId,
|
|
276
|
+
onsessioninitialized: (sessionId) => {
|
|
277
|
+
transports[sessionId] = { transport, group };
|
|
278
|
+
console.log(`[SESSION NEW] New session ${sessionId} initialized successfully${username ? ` for user: ${username}` : ''}`);
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
// Send keepalive ping every 30 seconds to prevent client from closing connection
|
|
282
|
+
const keepAlive = setInterval(() => {
|
|
283
|
+
try {
|
|
284
|
+
// Send a ping notification to keep the connection alive
|
|
285
|
+
transport.send({ jsonrpc: '2.0', method: 'ping' });
|
|
286
|
+
console.log(`Sent keepalive ping for StreamableHTTP session: ${newSessionId}`);
|
|
287
|
+
}
|
|
288
|
+
catch (e) {
|
|
289
|
+
// If sending a ping fails, the connection is likely broken.
|
|
290
|
+
// Log the error and clear the interval to prevent further attempts.
|
|
291
|
+
console.warn(`Failed to send keepalive ping for StreamableHTTP session ${newSessionId}, cleaning up interval:`, e);
|
|
292
|
+
clearInterval(keepAlive);
|
|
293
|
+
}
|
|
294
|
+
}, 30000); // Send ping every 30 seconds
|
|
295
|
+
transport.onclose = () => {
|
|
296
|
+
console.log(`[SESSION NEW] Transport closed: ${newSessionId}`);
|
|
297
|
+
clearInterval(keepAlive);
|
|
298
|
+
delete transports[newSessionId];
|
|
299
|
+
deleteMcpServer(newSessionId);
|
|
300
|
+
};
|
|
301
|
+
await getMcpServer(newSessionId, group).connect(transport);
|
|
302
|
+
console.log(`[SESSION NEW] Successfully created new session ${newSessionId} in group: ${group}`);
|
|
303
|
+
return transport;
|
|
304
|
+
}
|
|
117
305
|
export const handleMcpPostRequest = async (req, res) => {
|
|
118
306
|
// User context is now set by sseUserContextMiddleware
|
|
119
307
|
const userContextService = UserContextService.getInstance();
|
|
308
|
+
// Check bearer auth using filtered settings
|
|
309
|
+
const bearerAuthResult = validateBearerAuth(req);
|
|
310
|
+
if (!bearerAuthResult.valid) {
|
|
311
|
+
sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
attachUserContextFromBearer(bearerAuthResult, res);
|
|
120
315
|
const currentUser = userContextService.getCurrentUser();
|
|
121
316
|
const username = currentUser?.username;
|
|
122
317
|
const sessionId = req.headers['mcp-session-id'];
|
|
123
318
|
const group = req.params.group;
|
|
124
319
|
const body = req.body;
|
|
125
320
|
console.log(`Handling MCP post request for sessionId: ${sessionId} and group: ${group}${username ? ` for user: ${username}` : ''} with body: ${JSON.stringify(body)}`);
|
|
126
|
-
// Check bearer auth using filtered settings
|
|
127
|
-
if (!validateBearerAuth(req)) {
|
|
128
|
-
res.status(401).send('Bearer authentication required or invalid token');
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
321
|
// Get filtered settings based on user context (after setting user context)
|
|
132
322
|
const settings = loadSettings();
|
|
133
323
|
const routingConfig = settings.systemConfig?.routing || {
|
|
@@ -139,29 +329,67 @@ export const handleMcpPostRequest = async (req, res) => {
|
|
|
139
329
|
return;
|
|
140
330
|
}
|
|
141
331
|
let transport;
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
332
|
+
let transportInfo;
|
|
333
|
+
if (sessionId) {
|
|
334
|
+
transportInfo = transports[sessionId];
|
|
335
|
+
}
|
|
336
|
+
if (sessionId && transportInfo) {
|
|
337
|
+
// Case 1: Session exists and is valid, reuse it
|
|
338
|
+
console.log(`[SESSION REUSE] Reusing existing session: ${sessionId}${username ? ` for user: ${username}` : ''}`);
|
|
339
|
+
transport = transportInfo.transport;
|
|
340
|
+
}
|
|
341
|
+
else if (sessionId) {
|
|
342
|
+
// Case 2: SessionId exists but transport is missing (server restart), check if session rebuild is enabled
|
|
343
|
+
const settings = loadSettings();
|
|
344
|
+
const enableSessionRebuild = settings.systemConfig?.enableSessionRebuild || false;
|
|
345
|
+
if (enableSessionRebuild) {
|
|
346
|
+
console.log(`[SESSION AUTO-REBUILD] Session ${sessionId} not found, initiating transparent rebuild${username ? ` for user: ${username}` : ''}`);
|
|
347
|
+
// Prevent concurrent session creation
|
|
348
|
+
if (sessionCreationLocks[sessionId] !== undefined) {
|
|
349
|
+
console.log(`[SESSION AUTO-REBUILD] Session creation in progress for ${sessionId}, waiting...`);
|
|
350
|
+
transport = await sessionCreationLocks[sessionId];
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
sessionCreationLocks[sessionId] = createSessionWithId(sessionId, group, username);
|
|
354
|
+
try {
|
|
355
|
+
transport = await sessionCreationLocks[sessionId];
|
|
356
|
+
console.log(`[SESSION AUTO-REBUILD] Successfully transparently rebuilt session: ${sessionId}`);
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
console.error(`[SESSION AUTO-REBUILD] Failed to rebuild session ${sessionId}:`, error);
|
|
360
|
+
throw error;
|
|
361
|
+
}
|
|
362
|
+
finally {
|
|
363
|
+
delete sessionCreationLocks[sessionId];
|
|
364
|
+
}
|
|
159
365
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
366
|
+
// Get the updated transport info after rebuild
|
|
367
|
+
if (sessionId) {
|
|
368
|
+
transportInfo = transports[sessionId];
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
// Session rebuild is disabled, return error
|
|
373
|
+
console.warn(`[SESSION ERROR] Session ${sessionId} not found and session rebuild is disabled${username ? ` for user: ${username}` : ''}`);
|
|
374
|
+
res.status(400).json({
|
|
375
|
+
jsonrpc: '2.0',
|
|
376
|
+
error: {
|
|
377
|
+
code: -32000,
|
|
378
|
+
message: 'Bad Request: No valid session ID provided',
|
|
379
|
+
},
|
|
380
|
+
id: null,
|
|
381
|
+
});
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
else if (isInitializeRequest(req.body)) {
|
|
386
|
+
// Case 3: No sessionId and this is an initialize request, create new session
|
|
387
|
+
console.log(`[SESSION CREATE] No session ID provided for initialize request, creating new session${username ? ` for user: ${username}` : ''}`);
|
|
388
|
+
transport = await createNewSession(group, username);
|
|
163
389
|
}
|
|
164
390
|
else {
|
|
391
|
+
// Case 4: No sessionId and not an initialize request, return error
|
|
392
|
+
console.warn(`[SESSION ERROR] No session ID provided for non-initialize request (method: ${req.body?.method})${username ? ` for user: ${username}` : ''}`);
|
|
165
393
|
res.status(400).json({
|
|
166
394
|
jsonrpc: '2.0',
|
|
167
395
|
error: {
|
|
@@ -176,9 +404,112 @@ export const handleMcpPostRequest = async (req, res) => {
|
|
|
176
404
|
// Set request context for MCP handlers to access HTTP headers
|
|
177
405
|
const requestContextService = RequestContextService.getInstance();
|
|
178
406
|
requestContextService.setRequestContext(req);
|
|
407
|
+
// Check if the session needs initialization (for rebuilt sessions)
|
|
408
|
+
if (transportInfo && transportInfo.needsInitialization) {
|
|
409
|
+
console.log(`[MCP] Session ${sessionId} needs initialization, performing proactive initialization`);
|
|
410
|
+
try {
|
|
411
|
+
// Create a mock response object that doesn't actually send headers
|
|
412
|
+
const mockRes = {
|
|
413
|
+
writeHead: () => { },
|
|
414
|
+
end: () => { },
|
|
415
|
+
json: () => { },
|
|
416
|
+
status: () => mockRes,
|
|
417
|
+
send: () => { },
|
|
418
|
+
headersSent: false,
|
|
419
|
+
};
|
|
420
|
+
// First, send the initialize request
|
|
421
|
+
const initializeRequest = {
|
|
422
|
+
method: 'initialize',
|
|
423
|
+
params: {
|
|
424
|
+
protocolVersion: '2025-03-26',
|
|
425
|
+
capabilities: {},
|
|
426
|
+
clientInfo: {
|
|
427
|
+
name: 'MCPHub-Client',
|
|
428
|
+
version: '1.0.0',
|
|
429
|
+
},
|
|
430
|
+
},
|
|
431
|
+
jsonrpc: '2.0',
|
|
432
|
+
id: `init-${sessionId}-${Date.now()}`,
|
|
433
|
+
};
|
|
434
|
+
console.log(`[MCP] Sending initialize request for session ${sessionId}`);
|
|
435
|
+
// Use mock response to avoid sending actual HTTP response
|
|
436
|
+
await transport.handleRequest(req, mockRes, initializeRequest);
|
|
437
|
+
// Then send the initialized notification
|
|
438
|
+
const initializedNotification = {
|
|
439
|
+
method: 'notifications/initialized',
|
|
440
|
+
jsonrpc: '2.0',
|
|
441
|
+
};
|
|
442
|
+
console.log(`[MCP] Sending initialized notification for session ${sessionId}`);
|
|
443
|
+
await transport.handleRequest(req, mockRes, initializedNotification);
|
|
444
|
+
// Mark the session as initialized
|
|
445
|
+
transportInfo.needsInitialization = false;
|
|
446
|
+
console.log(`[MCP] Session ${sessionId} successfully initialized`);
|
|
447
|
+
}
|
|
448
|
+
catch (initError) {
|
|
449
|
+
console.error(`[MCP] Failed to initialize session ${sessionId}:`, initError);
|
|
450
|
+
console.error(`[MCP] Initialization error details:`, initError);
|
|
451
|
+
// Don't return here, continue with the original request
|
|
452
|
+
}
|
|
453
|
+
}
|
|
179
454
|
try {
|
|
180
455
|
await transport.handleRequest(req, res, req.body);
|
|
181
456
|
}
|
|
457
|
+
catch (error) {
|
|
458
|
+
// Check if this is a "Server not initialized" error for a newly rebuilt session
|
|
459
|
+
if (sessionId && error.message && error.message.includes('Server not initialized')) {
|
|
460
|
+
console.log(`[SESSION AUTO-REBUILD] Server not initialized for ${sessionId}. Attempting to initialize with the current request.`);
|
|
461
|
+
// Check if the current request is an 'initialize' request
|
|
462
|
+
if (isInitializeRequest(req.body)) {
|
|
463
|
+
// If it is, we can just retry it. The transport should now be in the transports map.
|
|
464
|
+
console.log(`[SESSION AUTO-REBUILD] Retrying initialize request for ${sessionId}.`);
|
|
465
|
+
await transport.handleRequest(req, res, req.body);
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
// If not, we need to send an initialize request first.
|
|
469
|
+
// We construct a mock initialize request, but use the REAL req/res objects.
|
|
470
|
+
const initializeRequest = {
|
|
471
|
+
method: 'initialize',
|
|
472
|
+
params: {
|
|
473
|
+
protocolVersion: '2025-03-26',
|
|
474
|
+
capabilities: {},
|
|
475
|
+
clientInfo: {
|
|
476
|
+
name: 'MCPHub-Client',
|
|
477
|
+
version: '1.0.0',
|
|
478
|
+
},
|
|
479
|
+
},
|
|
480
|
+
jsonrpc: '2.0',
|
|
481
|
+
id: `init-${sessionId}-${Date.now()}`,
|
|
482
|
+
};
|
|
483
|
+
console.log(`[SESSION AUTO-REBUILD] Sending initialize request for ${sessionId} before handling the actual request.`);
|
|
484
|
+
try {
|
|
485
|
+
// Temporarily replace the body to send the initialize request
|
|
486
|
+
const originalBody = req.body;
|
|
487
|
+
req.body = initializeRequest;
|
|
488
|
+
await transport.handleRequest(req, res, req.body);
|
|
489
|
+
// Now, send the notifications/initialized
|
|
490
|
+
const initializedNotification = {
|
|
491
|
+
method: 'notifications/initialized',
|
|
492
|
+
jsonrpc: '2.0',
|
|
493
|
+
};
|
|
494
|
+
req.body = initializedNotification;
|
|
495
|
+
await transport.handleRequest(req, res, req.body);
|
|
496
|
+
// Restore the original body and retry the original request
|
|
497
|
+
req.body = originalBody;
|
|
498
|
+
console.log(`[SESSION AUTO-REBUILD] Initialization complete for ${sessionId}. Retrying original request.`);
|
|
499
|
+
await transport.handleRequest(req, res, req.body);
|
|
500
|
+
}
|
|
501
|
+
catch (initError) {
|
|
502
|
+
console.error(`[SESSION AUTO-REBUILD] Failed to initialize session ${sessionId} on-the-fly:`, initError);
|
|
503
|
+
// Re-throw the original error if initialization fails
|
|
504
|
+
throw error;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
// If it's a different error, just re-throw it
|
|
510
|
+
throw error;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
182
513
|
finally {
|
|
183
514
|
// Clean up request context after handling
|
|
184
515
|
requestContextService.clearRequestContext();
|
|
@@ -187,20 +518,57 @@ export const handleMcpPostRequest = async (req, res) => {
|
|
|
187
518
|
export const handleMcpOtherRequest = async (req, res) => {
|
|
188
519
|
// User context is now set by sseUserContextMiddleware
|
|
189
520
|
const userContextService = UserContextService.getInstance();
|
|
521
|
+
// Check bearer auth using filtered settings
|
|
522
|
+
const bearerAuthResult = validateBearerAuth(req);
|
|
523
|
+
if (!bearerAuthResult.valid) {
|
|
524
|
+
sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
attachUserContextFromBearer(bearerAuthResult, res);
|
|
190
528
|
const currentUser = userContextService.getCurrentUser();
|
|
191
529
|
const username = currentUser?.username;
|
|
192
530
|
console.log(`Handling MCP other request${username ? ` for user: ${username}` : ''}`);
|
|
193
|
-
|
|
194
|
-
if (!
|
|
195
|
-
res.status(
|
|
531
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
532
|
+
if (!sessionId) {
|
|
533
|
+
res.status(400).send('Invalid or missing session ID');
|
|
196
534
|
return;
|
|
197
535
|
}
|
|
198
|
-
|
|
199
|
-
|
|
536
|
+
let transportEntry = transports[sessionId];
|
|
537
|
+
// If session doesn't exist, attempt transparent rebuild if enabled
|
|
538
|
+
if (!transportEntry) {
|
|
539
|
+
const settings = loadSettings();
|
|
540
|
+
const enableSessionRebuild = settings.systemConfig?.enableSessionRebuild || false;
|
|
541
|
+
if (enableSessionRebuild) {
|
|
542
|
+
console.log(`[SESSION AUTO-REBUILD] Session ${sessionId} not found in handleMcpOtherRequest, initiating transparent rebuild`);
|
|
543
|
+
try {
|
|
544
|
+
// Check if user context exists
|
|
545
|
+
if (!currentUser) {
|
|
546
|
+
res.status(401).send('User context not found');
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
// Create session with same ID using existing function
|
|
550
|
+
const group = req.params.group;
|
|
551
|
+
const rebuiltSession = await createSessionWithId(sessionId, group, currentUser.username);
|
|
552
|
+
if (rebuiltSession) {
|
|
553
|
+
console.log(`[SESSION AUTO-REBUILD] Successfully transparently rebuilt session: ${sessionId}`);
|
|
554
|
+
transportEntry = transports[sessionId];
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
catch (error) {
|
|
558
|
+
console.error(`[SESSION AUTO-REBUILD] Failed to rebuild session ${sessionId}:`, error);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
else {
|
|
562
|
+
console.warn(`[SESSION ERROR] Session ${sessionId} not found and session rebuild is disabled in handleMcpOtherRequest`);
|
|
563
|
+
res.status(400).send('Invalid or missing session ID');
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
if (!transportEntry) {
|
|
200
568
|
res.status(400).send('Invalid or missing session ID');
|
|
201
569
|
return;
|
|
202
570
|
}
|
|
203
|
-
const { transport } =
|
|
571
|
+
const { transport } = transportEntry;
|
|
204
572
|
await transport.handleRequest(req, res);
|
|
205
573
|
};
|
|
206
574
|
export const getConnectionCount = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sseService.js","sourceRoot":"","sources":["../../src/services/sseService.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sseService.js","sourceRoot":"","sources":["../../src/services/sseService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { isOAuthServerEnabled } from '../services/oauthServerService.js';
|
|
2
|
+
import { getToken as getOAuthStoredToken } from '../models/OAuth.js';
|
|
3
|
+
import { findUserByUsername } from '../models/User.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve an MCPHub user from a raw OAuth bearer token.
|
|
6
|
+
*/
|
|
7
|
+
export const resolveOAuthUserFromToken = (token) => {
|
|
8
|
+
if (!token || !isOAuthServerEnabled()) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
const oauthToken = getOAuthStoredToken(token);
|
|
12
|
+
if (!oauthToken || oauthToken.accessToken !== token) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const dbUser = findUserByUsername(oauthToken.username);
|
|
16
|
+
return {
|
|
17
|
+
username: oauthToken.username,
|
|
18
|
+
password: '',
|
|
19
|
+
isAdmin: dbUser?.isAdmin || false,
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Resolve an MCPHub user from an Authorization header.
|
|
24
|
+
*/
|
|
25
|
+
export const resolveOAuthUserFromAuthHeader = (authHeader) => {
|
|
26
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const token = authHeader.substring(7).trim();
|
|
30
|
+
if (!token) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return resolveOAuthUserFromToken(token);
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=oauthBearer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauthBearer.js","sourceRoot":"","sources":["../../src/utils/oauthBearer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAc,EAAgB,EAAE;IACxE,IAAI,CAAC,KAAK,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEvD,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,KAAK;KAClC,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,UAAmB,EAAgB,EAAE;IAClF,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,yBAAyB,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC,CAAC"}
|