@samanhappy/mcphub 0.10.3 → 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.
- 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 +368 -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-D-WhIyV-.js +251 -0
- package/frontend/dist/assets/index-D-WhIyV-.js.map +1 -0
- package/frontend/dist/index.html +1 -1
- package/mcp_settings.json +111 -0
- 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`;
|
|
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
|
-
|
|
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,
|
|
@@ -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
|
-
|
|
85
|
-
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
162
|
-
|
|
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
|
-
|
|
194
|
-
if (!
|
|
195
|
-
res.status(
|
|
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
|
-
|
|
199
|
-
|
|
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 } =
|
|
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":"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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"}
|