@samanhappy/mcphub 0.10.2 → 0.10.4

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 (42) hide show
  1. package/README.md +39 -1
  2. package/dist/config/index.js +24 -0
  3. package/dist/config/index.js.map +1 -1
  4. package/dist/constants/oauthServerDefaults.js +36 -0
  5. package/dist/constants/oauthServerDefaults.js.map +1 -0
  6. package/dist/controllers/oauthClientController.js +252 -0
  7. package/dist/controllers/oauthClientController.js.map +1 -0
  8. package/dist/controllers/oauthDynamicRegistrationController.js +479 -0
  9. package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -0
  10. package/dist/controllers/oauthServerController.js +449 -0
  11. package/dist/controllers/oauthServerController.js.map +1 -0
  12. package/dist/controllers/openApiController.js +6 -3
  13. package/dist/controllers/openApiController.js.map +1 -1
  14. package/dist/controllers/serverController.js +116 -23
  15. package/dist/controllers/serverController.js.map +1 -1
  16. package/dist/middlewares/auth.js +23 -2
  17. package/dist/middlewares/auth.js.map +1 -1
  18. package/dist/middlewares/userContext.js +27 -11
  19. package/dist/middlewares/userContext.js.map +1 -1
  20. package/dist/models/OAuth.js +291 -0
  21. package/dist/models/OAuth.js.map +1 -0
  22. package/dist/routes/index.js +25 -0
  23. package/dist/routes/index.js.map +1 -1
  24. package/dist/server.js +4 -1
  25. package/dist/server.js.map +1 -1
  26. package/dist/services/dataServicex.js +3 -0
  27. package/dist/services/dataServicex.js.map +1 -1
  28. package/dist/services/mcpService.js +2 -94
  29. package/dist/services/mcpService.js.map +1 -1
  30. package/dist/services/oauthServerService.js +339 -0
  31. package/dist/services/oauthServerService.js.map +1 -0
  32. package/dist/services/sseService.js +368 -45
  33. package/dist/services/sseService.js.map +1 -1
  34. package/dist/utils/oauthBearer.js +35 -0
  35. package/dist/utils/oauthBearer.js.map +1 -0
  36. package/frontend/dist/assets/index-D-WhIyV-.js +251 -0
  37. package/frontend/dist/assets/index-D-WhIyV-.js.map +1 -0
  38. package/frontend/dist/index.html +1 -1
  39. package/mcp_settings.json +111 -0
  40. package/package.json +2 -1
  41. package/frontend/dist/assets/index-CZR9_tjG.js +0 -251
  42. package/frontend/dist/assets/index-CZR9_tjG.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
- const transports = {};
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
- return token === routingConfig.bearerAuthKey;
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`;
86
+ }
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;
30
110
  }
31
- return true;
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
- if (!validateBearerAuth(req)) {
40
- console.warn('Bearer authentication failed or not provided');
41
- res.status(401).send('Bearer authentication required or invalid token');
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,
@@ -78,13 +159,15 @@ export const handleSseConnection = async (req, res) => {
78
159
  export const handleSseMessage = async (req, res) => {
79
160
  // User context is now set by sseUserContextMiddleware
80
161
  const userContextService = UserContextService.getInstance();
81
- const currentUser = userContextService.getCurrentUser();
82
- const username = currentUser?.username;
83
162
  // Check bearer auth using filtered settings
84
- if (!validateBearerAuth(req)) {
85
- res.status(401).send('Bearer authentication required or invalid token');
163
+ const bearerAuthResult = validateBearerAuth(req);
164
+ if (!bearerAuthResult.valid) {
165
+ sendBearerAuthError(req, res, bearerAuthResult.reason);
86
166
  return;
87
167
  }
168
+ attachUserContextFromBearer(bearerAuthResult, res);
169
+ const currentUser = userContextService.getCurrentUser();
170
+ const username = currentUser?.username;
88
171
  const sessionId = req.query.sessionId;
89
172
  // Validate sessionId
90
173
  if (!sessionId) {
@@ -114,20 +197,82 @@ export const handleSseMessage = async (req, res) => {
114
197
  requestContextService.clearRequestContext();
115
198
  }
116
199
  };
200
+ // Helper function to create a session with a specific sessionId
201
+ async function createSessionWithId(sessionId, group, username) {
202
+ console.log(`[SESSION REBUILD] Starting session rebuild for ID: ${sessionId}${username ? ` for user: ${username}` : ''}`);
203
+ // Create a new server instance to ensure clean state
204
+ const server = getMcpServer(sessionId, group);
205
+ const transport = new StreamableHTTPServerTransport({
206
+ sessionIdGenerator: () => sessionId, // Use the specified sessionId
207
+ onsessioninitialized: (initializedSessionId) => {
208
+ console.log(`[SESSION REBUILD] onsessioninitialized triggered for ID: ${initializedSessionId}`); // New log
209
+ if (initializedSessionId === sessionId) {
210
+ transports[sessionId] = { transport, group };
211
+ console.log(`[SESSION REBUILD] Session ${sessionId} initialized successfully${username ? ` for user: ${username}` : ''}`);
212
+ }
213
+ else {
214
+ console.warn(`[SESSION REBUILD] Session ID mismatch: expected ${sessionId}, got ${initializedSessionId}`);
215
+ }
216
+ },
217
+ });
218
+ transport.onclose = () => {
219
+ console.log(`[SESSION REBUILD] Transport closed: ${sessionId}`);
220
+ delete transports[sessionId];
221
+ deleteMcpServer(sessionId);
222
+ };
223
+ // Connect to MCP server
224
+ await server.connect(transport);
225
+ // Wait for the server to fully initialize
226
+ await new Promise(resolve => setTimeout(resolve, 500));
227
+ // Ensure the transport is properly initialized
228
+ if (!transports[sessionId]) {
229
+ console.warn(`[SESSION REBUILD] Transport not found in transports after initialization, forcing registration`);
230
+ transports[sessionId] = { transport, group, needsInitialization: true };
231
+ }
232
+ else {
233
+ // Mark the session as needing initialization
234
+ transports[sessionId].needsInitialization = true;
235
+ }
236
+ console.log(`[SESSION REBUILD] Session ${sessionId} created but not yet initialized. It will be initialized on first use.`);
237
+ console.log(`[SESSION REBUILD] Successfully rebuilt session ${sessionId} in group: ${group}`);
238
+ return transport;
239
+ }
240
+ // Helper function to create a completely new session
241
+ async function createNewSession(group, username) {
242
+ const newSessionId = randomUUID();
243
+ console.log(`[SESSION NEW] Creating new session with ID: ${newSessionId}${username ? ` for user: ${username}` : ''}`);
244
+ const transport = new StreamableHTTPServerTransport({
245
+ sessionIdGenerator: () => newSessionId,
246
+ onsessioninitialized: (sessionId) => {
247
+ transports[sessionId] = { transport, group };
248
+ console.log(`[SESSION NEW] New session ${sessionId} initialized successfully${username ? ` for user: ${username}` : ''}`);
249
+ },
250
+ });
251
+ transport.onclose = () => {
252
+ console.log(`[SESSION NEW] Transport closed: ${newSessionId}`);
253
+ delete transports[newSessionId];
254
+ deleteMcpServer(newSessionId);
255
+ };
256
+ await getMcpServer(newSessionId, group).connect(transport);
257
+ console.log(`[SESSION NEW] Successfully created new session ${newSessionId} in group: ${group}`);
258
+ return transport;
259
+ }
117
260
  export const handleMcpPostRequest = async (req, res) => {
118
261
  // User context is now set by sseUserContextMiddleware
119
262
  const userContextService = UserContextService.getInstance();
263
+ // Check bearer auth using filtered settings
264
+ const bearerAuthResult = validateBearerAuth(req);
265
+ if (!bearerAuthResult.valid) {
266
+ sendBearerAuthError(req, res, bearerAuthResult.reason);
267
+ return;
268
+ }
269
+ attachUserContextFromBearer(bearerAuthResult, res);
120
270
  const currentUser = userContextService.getCurrentUser();
121
271
  const username = currentUser?.username;
122
272
  const sessionId = req.headers['mcp-session-id'];
123
273
  const group = req.params.group;
124
274
  const body = req.body;
125
275
  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
276
  // Get filtered settings based on user context (after setting user context)
132
277
  const settings = loadSettings();
133
278
  const routingConfig = settings.systemConfig?.routing || {
@@ -139,29 +284,67 @@ export const handleMcpPostRequest = async (req, res) => {
139
284
  return;
140
285
  }
141
286
  let transport;
142
- if (sessionId && transports[sessionId]) {
143
- console.log(`Reusing existing transport for sessionId: ${sessionId}`);
144
- transport = transports[sessionId].transport;
145
- }
146
- else if (!sessionId && isInitializeRequest(req.body)) {
147
- transport = new StreamableHTTPServerTransport({
148
- sessionIdGenerator: () => randomUUID(),
149
- onsessioninitialized: (sessionId) => {
150
- transports[sessionId] = { transport, group };
151
- },
152
- });
153
- transport.onclose = () => {
154
- console.log(`Transport closed: ${transport.sessionId}`);
155
- if (transport.sessionId) {
156
- delete transports[transport.sessionId];
157
- deleteMcpServer(transport.sessionId);
158
- console.log(`MCP connection closed: ${transport.sessionId}`);
287
+ let transportInfo;
288
+ if (sessionId) {
289
+ transportInfo = transports[sessionId];
290
+ }
291
+ if (sessionId && transportInfo) {
292
+ // Case 1: Session exists and is valid, reuse it
293
+ console.log(`[SESSION REUSE] Reusing existing session: ${sessionId}${username ? ` for user: ${username}` : ''}`);
294
+ transport = transportInfo.transport;
295
+ }
296
+ else if (sessionId) {
297
+ // Case 2: SessionId exists but transport is missing (server restart), check if session rebuild is enabled
298
+ const settings = loadSettings();
299
+ const enableSessionRebuild = settings.systemConfig?.enableSessionRebuild || false;
300
+ if (enableSessionRebuild) {
301
+ console.log(`[SESSION AUTO-REBUILD] Session ${sessionId} not found, initiating transparent rebuild${username ? ` for user: ${username}` : ''}`);
302
+ // Prevent concurrent session creation
303
+ if (sessionCreationLocks[sessionId] !== undefined) {
304
+ console.log(`[SESSION AUTO-REBUILD] Session creation in progress for ${sessionId}, waiting...`);
305
+ transport = await sessionCreationLocks[sessionId];
306
+ }
307
+ else {
308
+ sessionCreationLocks[sessionId] = createSessionWithId(sessionId, group, username);
309
+ try {
310
+ transport = await sessionCreationLocks[sessionId];
311
+ console.log(`[SESSION AUTO-REBUILD] Successfully transparently rebuilt session: ${sessionId}`);
312
+ }
313
+ catch (error) {
314
+ console.error(`[SESSION AUTO-REBUILD] Failed to rebuild session ${sessionId}:`, error);
315
+ throw error;
316
+ }
317
+ finally {
318
+ delete sessionCreationLocks[sessionId];
319
+ }
320
+ }
321
+ // Get the updated transport info after rebuild
322
+ if (sessionId) {
323
+ transportInfo = transports[sessionId];
159
324
  }
160
- };
161
- console.log(`MCP connection established: ${transport.sessionId}${username ? ` for user: ${username}` : ''}`);
162
- await getMcpServer(transport.sessionId, group).connect(transport);
325
+ }
326
+ else {
327
+ // Session rebuild is disabled, return error
328
+ console.warn(`[SESSION ERROR] Session ${sessionId} not found and session rebuild is disabled${username ? ` for user: ${username}` : ''}`);
329
+ res.status(400).json({
330
+ jsonrpc: '2.0',
331
+ error: {
332
+ code: -32000,
333
+ message: 'Bad Request: No valid session ID provided',
334
+ },
335
+ id: null,
336
+ });
337
+ return;
338
+ }
339
+ }
340
+ else if (isInitializeRequest(req.body)) {
341
+ // Case 3: No sessionId and this is an initialize request, create new session
342
+ console.log(`[SESSION CREATE] No session ID provided for initialize request, creating new session${username ? ` for user: ${username}` : ''}`);
343
+ transport = await createNewSession(group, username);
163
344
  }
164
345
  else {
346
+ // Case 4: No sessionId and not an initialize request, return error
347
+ console.warn(`[SESSION ERROR] No session ID provided for non-initialize request (method: ${req.body?.method})${username ? ` for user: ${username}` : ''}`);
165
348
  res.status(400).json({
166
349
  jsonrpc: '2.0',
167
350
  error: {
@@ -176,9 +359,112 @@ export const handleMcpPostRequest = async (req, res) => {
176
359
  // Set request context for MCP handlers to access HTTP headers
177
360
  const requestContextService = RequestContextService.getInstance();
178
361
  requestContextService.setRequestContext(req);
362
+ // Check if the session needs initialization (for rebuilt sessions)
363
+ if (transportInfo && transportInfo.needsInitialization) {
364
+ console.log(`[MCP] Session ${sessionId} needs initialization, performing proactive initialization`);
365
+ try {
366
+ // Create a mock response object that doesn't actually send headers
367
+ const mockRes = {
368
+ writeHead: () => { },
369
+ end: () => { },
370
+ json: () => { },
371
+ status: () => mockRes,
372
+ send: () => { },
373
+ headersSent: false
374
+ };
375
+ // First, send the initialize request
376
+ const initializeRequest = {
377
+ method: 'initialize',
378
+ params: {
379
+ protocolVersion: '2025-03-26',
380
+ capabilities: {},
381
+ clientInfo: {
382
+ name: 'MCPHub-Client',
383
+ version: '1.0.0'
384
+ }
385
+ },
386
+ jsonrpc: '2.0',
387
+ id: `init-${sessionId}-${Date.now()}`
388
+ };
389
+ console.log(`[MCP] Sending initialize request for session ${sessionId}`);
390
+ // Use mock response to avoid sending actual HTTP response
391
+ await transport.handleRequest(req, mockRes, initializeRequest);
392
+ // Then send the initialized notification
393
+ const initializedNotification = {
394
+ method: 'notifications/initialized',
395
+ jsonrpc: '2.0'
396
+ };
397
+ console.log(`[MCP] Sending initialized notification for session ${sessionId}`);
398
+ await transport.handleRequest(req, mockRes, initializedNotification);
399
+ // Mark the session as initialized
400
+ transportInfo.needsInitialization = false;
401
+ console.log(`[MCP] Session ${sessionId} successfully initialized`);
402
+ }
403
+ catch (initError) {
404
+ console.error(`[MCP] Failed to initialize session ${sessionId}:`, initError);
405
+ console.error(`[MCP] Initialization error details:`, initError);
406
+ // Don't return here, continue with the original request
407
+ }
408
+ }
179
409
  try {
180
410
  await transport.handleRequest(req, res, req.body);
181
411
  }
412
+ catch (error) {
413
+ // Check if this is a "Server not initialized" error for a newly rebuilt session
414
+ if (sessionId && error.message && error.message.includes('Server not initialized')) {
415
+ console.log(`[SESSION AUTO-REBUILD] Server not initialized for ${sessionId}. Attempting to initialize with the current request.`);
416
+ // Check if the current request is an 'initialize' request
417
+ if (isInitializeRequest(req.body)) {
418
+ // If it is, we can just retry it. The transport should now be in the transports map.
419
+ console.log(`[SESSION AUTO-REBUILD] Retrying initialize request for ${sessionId}.`);
420
+ await transport.handleRequest(req, res, req.body);
421
+ }
422
+ else {
423
+ // If not, we need to send an initialize request first.
424
+ // We construct a mock initialize request, but use the REAL req/res objects.
425
+ const initializeRequest = {
426
+ method: 'initialize',
427
+ params: {
428
+ protocolVersion: '2025-03-26',
429
+ capabilities: {},
430
+ clientInfo: {
431
+ name: 'MCPHub-Client',
432
+ version: '1.0.0'
433
+ }
434
+ },
435
+ jsonrpc: '2.0',
436
+ id: `init-${sessionId}-${Date.now()}`
437
+ };
438
+ console.log(`[SESSION AUTO-REBUILD] Sending initialize request for ${sessionId} before handling the actual request.`);
439
+ try {
440
+ // Temporarily replace the body to send the initialize request
441
+ const originalBody = req.body;
442
+ req.body = initializeRequest;
443
+ await transport.handleRequest(req, res, req.body);
444
+ // Now, send the notifications/initialized
445
+ const initializedNotification = {
446
+ method: 'notifications/initialized',
447
+ jsonrpc: '2.0'
448
+ };
449
+ req.body = initializedNotification;
450
+ await transport.handleRequest(req, res, req.body);
451
+ // Restore the original body and retry the original request
452
+ req.body = originalBody;
453
+ console.log(`[SESSION AUTO-REBUILD] Initialization complete for ${sessionId}. Retrying original request.`);
454
+ await transport.handleRequest(req, res, req.body);
455
+ }
456
+ catch (initError) {
457
+ console.error(`[SESSION AUTO-REBUILD] Failed to initialize session ${sessionId} on-the-fly:`, initError);
458
+ // Re-throw the original error if initialization fails
459
+ throw error;
460
+ }
461
+ }
462
+ }
463
+ else {
464
+ // If it's a different error, just re-throw it
465
+ throw error;
466
+ }
467
+ }
182
468
  finally {
183
469
  // Clean up request context after handling
184
470
  requestContextService.clearRequestContext();
@@ -187,20 +473,57 @@ export const handleMcpPostRequest = async (req, res) => {
187
473
  export const handleMcpOtherRequest = async (req, res) => {
188
474
  // User context is now set by sseUserContextMiddleware
189
475
  const userContextService = UserContextService.getInstance();
476
+ // Check bearer auth using filtered settings
477
+ const bearerAuthResult = validateBearerAuth(req);
478
+ if (!bearerAuthResult.valid) {
479
+ sendBearerAuthError(req, res, bearerAuthResult.reason);
480
+ return;
481
+ }
482
+ attachUserContextFromBearer(bearerAuthResult, res);
190
483
  const currentUser = userContextService.getCurrentUser();
191
484
  const username = currentUser?.username;
192
485
  console.log(`Handling MCP other request${username ? ` for user: ${username}` : ''}`);
193
- // Check bearer auth using filtered settings
194
- if (!validateBearerAuth(req)) {
195
- res.status(401).send('Bearer authentication required or invalid token');
486
+ const sessionId = req.headers['mcp-session-id'];
487
+ if (!sessionId) {
488
+ res.status(400).send('Invalid or missing session ID');
196
489
  return;
197
490
  }
198
- const sessionId = req.headers['mcp-session-id'];
199
- if (!sessionId || !transports[sessionId]) {
491
+ let transportEntry = transports[sessionId];
492
+ // If session doesn't exist, attempt transparent rebuild if enabled
493
+ if (!transportEntry) {
494
+ const settings = loadSettings();
495
+ const enableSessionRebuild = settings.systemConfig?.enableSessionRebuild || false;
496
+ if (enableSessionRebuild) {
497
+ console.log(`[SESSION AUTO-REBUILD] Session ${sessionId} not found in handleMcpOtherRequest, initiating transparent rebuild`);
498
+ try {
499
+ // Check if user context exists
500
+ if (!currentUser) {
501
+ res.status(401).send('User context not found');
502
+ return;
503
+ }
504
+ // Create session with same ID using existing function
505
+ const group = req.params.group;
506
+ const rebuiltSession = await createSessionWithId(sessionId, group, currentUser.username);
507
+ if (rebuiltSession) {
508
+ console.log(`[SESSION AUTO-REBUILD] Successfully transparently rebuilt session: ${sessionId}`);
509
+ transportEntry = transports[sessionId];
510
+ }
511
+ }
512
+ catch (error) {
513
+ console.error(`[SESSION AUTO-REBUILD] Failed to rebuild session ${sessionId}:`, error);
514
+ }
515
+ }
516
+ else {
517
+ console.warn(`[SESSION ERROR] Session ${sessionId} not found and session rebuild is disabled in handleMcpOtherRequest`);
518
+ res.status(400).send('Invalid or missing session ID');
519
+ return;
520
+ }
521
+ }
522
+ if (!transportEntry) {
200
523
  res.status(400).send('Invalid or missing session ID');
201
524
  return;
202
525
  }
203
- const { transport } = transports[sessionId];
526
+ const { transport } = transportEntry;
204
527
  await transport.handleRequest(req, res);
205
528
  };
206
529
  export const getConnectionCount = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"sseService.js","sourceRoot":"","sources":["../../src/services/sseService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,UAAU,GAAqE,EAAE,CAAC;AAExF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAU,EAAE;IACpD,OAAO,UAAU,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF,0CAA0C;AAC1C,MAAM,kBAAkB,GAAG,CAAC,GAAY,EAAW,EAAE;IACnD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,aAAa,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,IAAI;QACtD,iBAAiB,EAAE,IAAI;QACvB,oBAAoB,EAAE,IAAI;QAC1B,gBAAgB,EAAE,KAAK;QACvB,aAAa,EAAE,EAAE;KAClB,CAAC;IAEF,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B;QACjE,OAAO,KAAK,KAAK,aAAa,CAAC,aAAa,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;IACtF,sDAAsD;IACtD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,WAAW,GAAG,kBAAkB,CAAC,cAAc,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC;IAEvC,4CAA4C;IAC5C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,aAAa,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,IAAI;QACtD,iBAAiB,EAAE,IAAI;QACvB,oBAAoB,EAAE,IAAI;QAC1B,gBAAgB,EAAE,KAAK;QACvB,aAAa,EAAE,EAAE;KAClB,CAAC;IACF,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;IAE/B,iEAAiE;IACjE,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACjE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IAED,mFAAmF;IACnF,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QACtB,mFAAmF;QACnF,OAAO,CAAC,GAAG,CAAC,QAAQ,QAAQ,qBAAqB,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,gEAAgE;IAChE,MAAM,YAAY,GAAG,QAAQ;QAC3B,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,WAAW;QAC3C,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,WAAW,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC,8CAA8C,YAAY,EAAE,CAAC,CAAC;IAE1E,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC5D,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAE9D,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACnB,OAAO,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvC,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,0BAA0B,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CACT,mCAAmC,SAAS,CAAC,SAAS,gBAAgB,KAAK,IAAI,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACrI,CAAC;IACF,MAAM,YAAY,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;IACnF,sDAAsD;IACtD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,WAAW,GAAG,kBAAkB,CAAC,cAAc,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC;IAEvC,4CAA4C;IAC5C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,SAAmB,CAAC;IAEhD,qBAAqB;IACrB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACvD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,iDAAiD;IACjD,MAAM,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;QAC/D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC;IAC3C,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACzB,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACxB,OAAO,CAAC,GAAG,CACT,mCAAmC,SAAS,cAAc,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7G,CAAC;IAEF,8DAA8D;IAC9D,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,WAAW,EAAE,CAAC;IAClE,qBAAqB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,MAAO,SAAgC,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;YAAS,CAAC;QACT,0CAA0C;QAC1C,qBAAqB,CAAC,mBAAmB,EAAE,CAAC;IAC9C,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;IACvF,sDAAsD;IACtD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,WAAW,GAAG,kBAAkB,CAAC,cAAc,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC;IAEvC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;IACtE,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;IAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,OAAO,CAAC,GAAG,CACT,4CAA4C,SAAS,eAAe,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAC1J,CAAC;IAEF,4CAA4C;IAC5C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,aAAa,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,IAAI;QACtD,iBAAiB,EAAE,IAAI;QACvB,oBAAoB,EAAE,IAAI;KAC3B,CAAC;IACF,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IAED,IAAI,SAAwC,CAAC;IAC7C,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,6CAA6C,SAAS,EAAE,CAAC,CAAC;QACtE,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,SAA0C,CAAC;IAC/E,CAAC;SAAM,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,SAAS,GAAG,IAAI,6BAA6B,CAAC;YAC5C,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;YACtC,oBAAoB,EAAE,CAAC,SAAS,EAAE,EAAE;gBAClC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC/C,CAAC;SACF,CAAC,CAAC;QAEH,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;YACvB,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;YACxD,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,OAAO,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACvC,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,0BAA0B,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,GAAG,CACT,+BAA+B,SAAS,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAChG,CAAC;QACF,MAAM,YAAY,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,KAAK;gBACZ,OAAO,EAAE,2CAA2C;aACrD;YACD,EAAE,EAAE,IAAI;SACT,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAExF,8DAA8D;IAC9D,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,WAAW,EAAE,CAAC;IAClE,qBAAqB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;YAAS,CAAC;QACT,0CAA0C;QAC1C,qBAAqB,CAAC,mBAAmB,EAAE,CAAC;IAC9C,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACzE,sDAAsD;IACtD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,WAAW,GAAG,kBAAkB,CAAC,cAAc,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,6BAA6B,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAErF,4CAA4C;IAC5C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;IACtE,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAO,SAA2C,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAW,EAAE;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;AACxC,CAAC,CAAC"}
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"}