@samanhappy/mcphub 0.5.4 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -1
- package/dist/controllers/serverController.js +59 -7
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/services/mcpService.js +95 -71
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/sseService.js +52 -4
- package/dist/services/sseService.js.map +1 -1
- package/frontend/dist/assets/index-2ChivQin.js +148 -0
- package/frontend/dist/assets/index-2ChivQin.js.map +1 -0
- package/frontend/dist/assets/index-DlUYoMya.css +1 -0
- package/frontend/dist/assets/reward.png +0 -0
- package/frontend/dist/assets/wexin.png +0 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +5 -3
- package/frontend/dist/assets/index-CoJHnafW.js +0 -141
- package/frontend/dist/assets/index-MHN1hB7-.css +0 -1
|
@@ -2,17 +2,43 @@ import { randomUUID } from 'node:crypto';
|
|
|
2
2
|
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
3
3
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
4
4
|
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
-
import { getMcpServer } from './mcpService.js';
|
|
5
|
+
import { deleteMcpServer, getMcpServer } from './mcpService.js';
|
|
6
6
|
import { loadSettings } from '../config/index.js';
|
|
7
7
|
const transports = {};
|
|
8
8
|
export const getGroup = (sessionId) => {
|
|
9
9
|
return transports[sessionId]?.group || '';
|
|
10
10
|
};
|
|
11
|
+
// Helper function to validate bearer auth
|
|
12
|
+
const validateBearerAuth = (req) => {
|
|
13
|
+
const settings = loadSettings();
|
|
14
|
+
const routingConfig = settings.systemConfig?.routing || {
|
|
15
|
+
enableGlobalRoute: true,
|
|
16
|
+
enableGroupNameRoute: true,
|
|
17
|
+
enableBearerAuth: false,
|
|
18
|
+
bearerAuthKey: '',
|
|
19
|
+
};
|
|
20
|
+
if (routingConfig.enableBearerAuth) {
|
|
21
|
+
const authHeader = req.headers.authorization;
|
|
22
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
const token = authHeader.substring(7); // Remove "Bearer " prefix
|
|
26
|
+
return token === routingConfig.bearerAuthKey;
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
};
|
|
11
30
|
export const handleSseConnection = async (req, res) => {
|
|
31
|
+
// Check bearer auth
|
|
32
|
+
if (!validateBearerAuth(req)) {
|
|
33
|
+
res.status(401).send('Bearer authentication required or invalid token');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
12
36
|
const settings = loadSettings();
|
|
13
37
|
const routingConfig = settings.systemConfig?.routing || {
|
|
14
38
|
enableGlobalRoute: true,
|
|
15
39
|
enableGroupNameRoute: true,
|
|
40
|
+
enableBearerAuth: false,
|
|
41
|
+
bearerAuthKey: '',
|
|
16
42
|
};
|
|
17
43
|
const group = req.params.group;
|
|
18
44
|
// Check if this is a global route (no group) and if it's allowed
|
|
@@ -24,12 +50,18 @@ export const handleSseConnection = async (req, res) => {
|
|
|
24
50
|
transports[transport.sessionId] = { transport, group: group };
|
|
25
51
|
res.on('close', () => {
|
|
26
52
|
delete transports[transport.sessionId];
|
|
53
|
+
deleteMcpServer(transport.sessionId);
|
|
27
54
|
console.log(`SSE connection closed: ${transport.sessionId}`);
|
|
28
55
|
});
|
|
29
56
|
console.log(`New SSE connection established: ${transport.sessionId} with group: ${group || 'global'}`);
|
|
30
|
-
await getMcpServer().connect(transport);
|
|
57
|
+
await getMcpServer(transport.sessionId).connect(transport);
|
|
31
58
|
};
|
|
32
59
|
export const handleSseMessage = async (req, res) => {
|
|
60
|
+
// Check bearer auth
|
|
61
|
+
if (!validateBearerAuth(req)) {
|
|
62
|
+
res.status(401).send('Bearer authentication required or invalid token');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
33
65
|
const sessionId = req.query.sessionId;
|
|
34
66
|
const { transport, group } = transports[sessionId];
|
|
35
67
|
req.params.group = group;
|
|
@@ -44,9 +76,14 @@ export const handleSseMessage = async (req, res) => {
|
|
|
44
76
|
}
|
|
45
77
|
};
|
|
46
78
|
export const handleMcpPostRequest = async (req, res) => {
|
|
47
|
-
console.log('Handling MCP post request');
|
|
48
79
|
const sessionId = req.headers['mcp-session-id'];
|
|
49
80
|
const group = req.params.group;
|
|
81
|
+
console.log(`Handling MCP post request for sessionId: ${sessionId} and group: ${group}`);
|
|
82
|
+
// Check bearer auth
|
|
83
|
+
if (!validateBearerAuth(req)) {
|
|
84
|
+
res.status(401).send('Bearer authentication required or invalid token');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
50
87
|
const settings = loadSettings();
|
|
51
88
|
const routingConfig = settings.systemConfig?.routing || {
|
|
52
89
|
enableGlobalRoute: true,
|
|
@@ -58,6 +95,7 @@ export const handleMcpPostRequest = async (req, res) => {
|
|
|
58
95
|
}
|
|
59
96
|
let transport;
|
|
60
97
|
if (sessionId && transports[sessionId]) {
|
|
98
|
+
console.log(`Reusing existing transport for sessionId: ${sessionId}`);
|
|
61
99
|
transport = transports[sessionId].transport;
|
|
62
100
|
}
|
|
63
101
|
else if (!sessionId && isInitializeRequest(req.body)) {
|
|
@@ -68,11 +106,15 @@ export const handleMcpPostRequest = async (req, res) => {
|
|
|
68
106
|
},
|
|
69
107
|
});
|
|
70
108
|
transport.onclose = () => {
|
|
109
|
+
console.log(`Transport closed: ${transport.sessionId}`);
|
|
71
110
|
if (transport.sessionId) {
|
|
72
111
|
delete transports[transport.sessionId];
|
|
112
|
+
deleteMcpServer(transport.sessionId);
|
|
113
|
+
console.log(`MCP connection closed: ${transport.sessionId}`);
|
|
73
114
|
}
|
|
74
115
|
};
|
|
75
|
-
|
|
116
|
+
console.log(`MCP connection established: ${transport.sessionId}`);
|
|
117
|
+
await getMcpServer(transport.sessionId).connect(transport);
|
|
76
118
|
}
|
|
77
119
|
else {
|
|
78
120
|
res.status(400).json({
|
|
@@ -85,10 +127,16 @@ export const handleMcpPostRequest = async (req, res) => {
|
|
|
85
127
|
});
|
|
86
128
|
return;
|
|
87
129
|
}
|
|
130
|
+
console.log(`Handling request using transport with type ${transport.constructor.name}`);
|
|
88
131
|
await transport.handleRequest(req, res, req.body);
|
|
89
132
|
};
|
|
90
133
|
export const handleMcpOtherRequest = async (req, res) => {
|
|
91
134
|
console.log('Handling MCP other request');
|
|
135
|
+
// Check bearer auth
|
|
136
|
+
if (!validateBearerAuth(req)) {
|
|
137
|
+
res.status(401).send('Bearer authentication required or invalid token');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
92
140
|
const sessionId = req.headers['mcp-session-id'];
|
|
93
141
|
if (!sessionId || !transports[sessionId]) {
|
|
94
142
|
res.status(400).send('Invalid or missing session ID');
|
|
@@ -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,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"sseService.js","sourceRoot":"","sources":["../../src/services/sseService.ts"],"names":[],"mappings":"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"}
|