@mcp-web/bridge 0.1.0 → 0.1.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/package.json +7 -2
- package/dist/bridge.d.ts +0 -38
- package/dist/bridge.d.ts.map +0 -1
- package/dist/bridge.js +0 -1004
- package/dist/bridge.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-web/bridge",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -11,13 +11,18 @@
|
|
|
11
11
|
"@modelcontextprotocol/sdk": "^1.24.0",
|
|
12
12
|
"ws": "^8.18.0",
|
|
13
13
|
"zod": "~4.1.12",
|
|
14
|
-
"@mcp-web/types": "0.1.
|
|
14
|
+
"@mcp-web/types": "0.1.1"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"@types/node": "^25.0.9",
|
|
18
18
|
"@types/ws": "^8.5.13",
|
|
19
19
|
"typescript": "~5.9.3"
|
|
20
20
|
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/flekschas/mcp-web",
|
|
24
|
+
"directory": "packages/bridge"
|
|
25
|
+
},
|
|
21
26
|
"scripts": {
|
|
22
27
|
"build": "tsc",
|
|
23
28
|
"dev": "tsc --watch",
|
package/dist/bridge.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { type MCPWebConfig } from '@mcp-web/types';
|
|
3
|
-
export declare class MCPWebBridge {
|
|
4
|
-
#private;
|
|
5
|
-
constructor(config?: MCPWebConfig);
|
|
6
|
-
private setupWebSocketServer;
|
|
7
|
-
private setupMCPServer;
|
|
8
|
-
private handleFrontendMessage;
|
|
9
|
-
private handleAuthentication;
|
|
10
|
-
private handleToolRegistration;
|
|
11
|
-
private handleActivity;
|
|
12
|
-
private handleQueryCancel;
|
|
13
|
-
private handleQuery;
|
|
14
|
-
private handleQueryProgressEndpoint;
|
|
15
|
-
private handleQueryCompleteEndpoint;
|
|
16
|
-
private handleQueryFailEndpoint;
|
|
17
|
-
private handleQueryCancelEndpoint;
|
|
18
|
-
private handleMCPRequest;
|
|
19
|
-
private getVersion;
|
|
20
|
-
private handleInitialize;
|
|
21
|
-
private getSessionAndSessionId;
|
|
22
|
-
private getSessionFromMetaParams;
|
|
23
|
-
private createSessionNotFoundError;
|
|
24
|
-
private handleToolsList;
|
|
25
|
-
private handleToolCall;
|
|
26
|
-
private handleResourcesList;
|
|
27
|
-
private handleResourceRead;
|
|
28
|
-
private listSessions;
|
|
29
|
-
private handlePromptsList;
|
|
30
|
-
private forwardToolCallToSession;
|
|
31
|
-
private sendMCPResponse;
|
|
32
|
-
private sendMCPError;
|
|
33
|
-
/**
|
|
34
|
-
* Close the bridge servers and cleanup all connections
|
|
35
|
-
*/
|
|
36
|
-
close(): Promise<void>;
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=bridge.d.ts.map
|
package/dist/bridge.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":";AAMA,OAAO,EAOL,KAAK,YAAY,EAyBlB,MAAM,gBAAgB,CAAC;AAiDxB,qBAAa,YAAY;;gBAarB,MAAM,GAAE,YAKP;IAmBH,OAAO,CAAC,oBAAoB;IA6C5B,OAAO,CAAC,cAAc;IA6EtB,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,oBAAoB;IAkD5B,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,cAAc;YAOR,iBAAiB;YA8BjB,WAAW;IAiFzB,OAAO,CAAC,2BAA2B;IA0BnC,OAAO,CAAC,2BAA2B;IAuDnC,OAAO,CAAC,uBAAuB;IA+B/B,OAAO,CAAC,yBAAyB;YAsCnB,gBAAgB;IAwF9B,OAAO,CAAC,UAAU;YAaJ,gBAAgB;IAiB9B,OAAO,CAAC,sBAAsB;IAwB9B,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,0BAA0B;YAWpB,eAAe;YA6Df,cAAc;YA8Dd,mBAAmB;YA6CnB,kBAAkB;IA0BhC,OAAO,CAAC,YAAY;YAaN,iBAAiB;YA+BjB,wBAAwB;IAkFtC,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,YAAY;IA2FpB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAiD7B"}
|
package/dist/bridge.js
DELETED
|
@@ -1,1004 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var _MCPWebBridge_instances, _MCPWebBridge_sessions, _MCPWebBridge_queries, _MCPWebBridge_config, _MCPWebBridge_wsServer, _MCPWebBridge_mcpServer, _MCPWebBridge_tokenSessionIds, _MCPWebBridge_tokenQueryCounts, _MCPWebBridge_sessionTimeoutInterval, _MCPWebBridge_decrementQueryCount, _MCPWebBridge_decrementQueryCountForQuery, _MCPWebBridge_closeOldestSessionForToken, _MCPWebBridge_cleanupSession, _MCPWebBridge_startSessionTimeoutChecker;
|
|
14
|
-
import crypto from 'node:crypto';
|
|
15
|
-
import { readFileSync } from 'node:fs';
|
|
16
|
-
import { createServer } from 'node:http';
|
|
17
|
-
import { dirname, join } from 'node:path';
|
|
18
|
-
import { fileURLToPath, URL } from 'node:url';
|
|
19
|
-
import { InternalErrorCode, InvalidSessionErrorCode, McpWebConfigSchema, MissingAuthenticationErrorCode, NoSessionsFoundErrorCode, QueryAcceptedMessageSchema, QueryCancelMessageSchema, QueryCompleteBridgeMessageSchema, QueryCompleteClientMessageSchema, QueryFailureMessageSchema, QueryLimitExceededErrorCode, QueryMessageSchema, QueryNotActiveErrorCode, QueryNotFoundErrorCode, QueryProgressMessageSchema, SessionExpiredErrorCode, SessionLimitExceededErrorCode, SessionNotFoundErrorCode, SessionNotSpecifiedErrorCode, ToolNameRequiredErrorCode, ToolNotAllowedErrorCode, ToolNotFoundErrorCode, UnknownMethodErrorCode, } from '@mcp-web/types';
|
|
20
|
-
import { WebSocket, WebSocketServer } from 'ws';
|
|
21
|
-
const SessionNotSpecifiedErrorDetails = 'Multiple sessions available. See `available_sessions` or call the `list_sessions` tool to discover available sessions and specify the session using `_meta.sessionId`.';
|
|
22
|
-
/**
|
|
23
|
-
* Builds the query URL by appending the UUID to the agent URL.
|
|
24
|
-
* If the agent URL has no path (e.g., 'http://localhost:3000'), defaults to '/query'.
|
|
25
|
-
* Otherwise uses the existing path (e.g., 'http://localhost:3000/api/v1/query').
|
|
26
|
-
*/
|
|
27
|
-
const buildQueryUrl = (agentUrl, uuid) => {
|
|
28
|
-
const url = new URL(agentUrl);
|
|
29
|
-
// If URL has no path or just '/', default to '/query'
|
|
30
|
-
if (url.pathname === '/' || url.pathname === '') {
|
|
31
|
-
url.pathname = '/query';
|
|
32
|
-
}
|
|
33
|
-
// Ensure path doesn't end with /
|
|
34
|
-
if (url.pathname.endsWith('/')) {
|
|
35
|
-
url.pathname = url.pathname.slice(0, -1);
|
|
36
|
-
}
|
|
37
|
-
// Append UUID
|
|
38
|
-
url.pathname = `${url.pathname}/${uuid}`;
|
|
39
|
-
return url.toString();
|
|
40
|
-
};
|
|
41
|
-
export class MCPWebBridge {
|
|
42
|
-
constructor(config = {
|
|
43
|
-
wsPort: 3001,
|
|
44
|
-
mcpPort: 3002,
|
|
45
|
-
name: "Web App Controller",
|
|
46
|
-
description: "Control web applications and dashboards through your browser"
|
|
47
|
-
}) {
|
|
48
|
-
_MCPWebBridge_instances.add(this);
|
|
49
|
-
_MCPWebBridge_sessions.set(this, new Map());
|
|
50
|
-
_MCPWebBridge_queries.set(this, new Map());
|
|
51
|
-
_MCPWebBridge_config.set(this, void 0);
|
|
52
|
-
_MCPWebBridge_wsServer.set(this, void 0);
|
|
53
|
-
_MCPWebBridge_mcpServer.set(this, void 0);
|
|
54
|
-
// Session & Query limit tracking
|
|
55
|
-
_MCPWebBridge_tokenSessionIds.set(this, new Map()); // token -> sessionIds
|
|
56
|
-
_MCPWebBridge_tokenQueryCounts.set(this, new Map()); // token -> active query count
|
|
57
|
-
_MCPWebBridge_sessionTimeoutInterval.set(this, void 0);
|
|
58
|
-
// Validate the configuration
|
|
59
|
-
const parsedConfig = McpWebConfigSchema.safeParse(config);
|
|
60
|
-
if (!parsedConfig.success) {
|
|
61
|
-
throw new Error(`Invalid bridge server configuration: ${parsedConfig.error.message}`);
|
|
62
|
-
}
|
|
63
|
-
__classPrivateFieldSet(this, _MCPWebBridge_config, parsedConfig.data, "f");
|
|
64
|
-
__classPrivateFieldSet(this, _MCPWebBridge_wsServer, this.setupWebSocketServer(__classPrivateFieldGet(this, _MCPWebBridge_config, "f").wsPort), "f");
|
|
65
|
-
__classPrivateFieldSet(this, _MCPWebBridge_mcpServer, this.setupMCPServer(__classPrivateFieldGet(this, _MCPWebBridge_config, "f").mcpPort), "f");
|
|
66
|
-
// Start session timeout checker if configured
|
|
67
|
-
if (__classPrivateFieldGet(this, _MCPWebBridge_config, "f").sessionMaxDurationMs) {
|
|
68
|
-
__classPrivateFieldGet(this, _MCPWebBridge_instances, "m", _MCPWebBridge_startSessionTimeoutChecker).call(this);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
setupWebSocketServer(wsPort) {
|
|
72
|
-
const wsServer = new WebSocketServer({
|
|
73
|
-
port: wsPort,
|
|
74
|
-
verifyClient: () => {
|
|
75
|
-
// Add origin verification if needed
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
wsServer.on('connection', (ws, req) => {
|
|
80
|
-
if (!req.url) {
|
|
81
|
-
ws.close(1008, 'Missing URL');
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
const url = new URL(req.url, 'ws://localhost');
|
|
85
|
-
const sessionId = url.searchParams.get('session');
|
|
86
|
-
if (!sessionId) {
|
|
87
|
-
ws.close(1008, 'Missing session key');
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
ws.on('message', (data) => {
|
|
91
|
-
try {
|
|
92
|
-
const message = JSON.parse(data.toString());
|
|
93
|
-
this.handleFrontendMessage(sessionId, message, ws);
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
console.error('Invalid JSON message:', error);
|
|
97
|
-
ws.close(1003, 'Invalid JSON');
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
ws.on('close', () => {
|
|
101
|
-
__classPrivateFieldGet(this, _MCPWebBridge_instances, "m", _MCPWebBridge_cleanupSession).call(this, sessionId);
|
|
102
|
-
});
|
|
103
|
-
ws.on('error', (error) => {
|
|
104
|
-
console.error(`WebSocket error for session ${sessionId}:`, error);
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
return wsServer;
|
|
108
|
-
}
|
|
109
|
-
setupMCPServer(mcpPort) {
|
|
110
|
-
const mcpServer = createServer((req, res) => {
|
|
111
|
-
// Enable CORS
|
|
112
|
-
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
113
|
-
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, OPTIONS');
|
|
114
|
-
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
115
|
-
if (req.method === 'OPTIONS') {
|
|
116
|
-
res.writeHead(200);
|
|
117
|
-
res.end();
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
// Route query progress/complete/fail/cancel endpoints
|
|
121
|
-
const url = req.url || '';
|
|
122
|
-
const queryProgressMatch = url.match(/^\/query\/([^/]+)\/progress$/);
|
|
123
|
-
const queryCompleteMatch = url.match(/^\/query\/([^/]+)\/complete$/);
|
|
124
|
-
const queryFailMatch = url.match(/^\/query\/([^/]+)\/fail$/);
|
|
125
|
-
const queryCancelMatch = url.match(/^\/query\/([^/]+)\/cancel$/);
|
|
126
|
-
if (req.method === 'POST' && queryProgressMatch) {
|
|
127
|
-
const uuid = queryProgressMatch[1];
|
|
128
|
-
let body = '';
|
|
129
|
-
req.on('data', (chunk) => { body += chunk; });
|
|
130
|
-
req.on('end', () => {
|
|
131
|
-
this.handleQueryProgressEndpoint(req, res, uuid, body);
|
|
132
|
-
});
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
if (req.method === 'PUT' && queryCompleteMatch) {
|
|
136
|
-
const uuid = queryCompleteMatch[1];
|
|
137
|
-
let body = '';
|
|
138
|
-
req.on('data', (chunk) => { body += chunk; });
|
|
139
|
-
req.on('end', () => {
|
|
140
|
-
this.handleQueryCompleteEndpoint(req, res, uuid, body);
|
|
141
|
-
});
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
if (req.method === 'PUT' && queryFailMatch) {
|
|
145
|
-
const uuid = queryFailMatch[1];
|
|
146
|
-
let body = '';
|
|
147
|
-
req.on('data', (chunk) => { body += chunk; });
|
|
148
|
-
req.on('end', () => {
|
|
149
|
-
this.handleQueryFailEndpoint(req, res, uuid, body);
|
|
150
|
-
});
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
if (req.method === 'PUT' && queryCancelMatch) {
|
|
154
|
-
const uuid = queryCancelMatch[1];
|
|
155
|
-
let body = '';
|
|
156
|
-
req.on('data', (chunk) => { body += chunk; });
|
|
157
|
-
req.on('end', () => {
|
|
158
|
-
this.handleQueryCancelEndpoint(req, res, uuid, body);
|
|
159
|
-
});
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
if (req.method === 'POST') {
|
|
163
|
-
let body = '';
|
|
164
|
-
req.on('data', (chunk) => { body += chunk; });
|
|
165
|
-
req.on('end', () => {
|
|
166
|
-
this.handleMCPRequest(req, res, body);
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
res.writeHead(404);
|
|
171
|
-
res.end('Not Found');
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
mcpServer.listen(mcpPort);
|
|
175
|
-
return mcpServer;
|
|
176
|
-
}
|
|
177
|
-
handleFrontendMessage(sessionId, message, ws) {
|
|
178
|
-
switch (message.type) {
|
|
179
|
-
case 'authenticate':
|
|
180
|
-
this.handleAuthentication(sessionId, message, ws);
|
|
181
|
-
break;
|
|
182
|
-
case 'register-tool':
|
|
183
|
-
this.handleToolRegistration(sessionId, message);
|
|
184
|
-
break;
|
|
185
|
-
case 'activity':
|
|
186
|
-
this.handleActivity(sessionId, message);
|
|
187
|
-
break;
|
|
188
|
-
case 'tool-response':
|
|
189
|
-
// tool-response messages are handled by per-request listeners
|
|
190
|
-
// in handleToolCall() at line ~770, not here in the main router
|
|
191
|
-
break;
|
|
192
|
-
case 'query':
|
|
193
|
-
this.handleQuery(sessionId, message, ws);
|
|
194
|
-
break;
|
|
195
|
-
case 'query_cancel':
|
|
196
|
-
this.handleQueryCancel(message);
|
|
197
|
-
break;
|
|
198
|
-
default:
|
|
199
|
-
// biome-ignore lint/suspicious/noExplicitAny: Edge case handling
|
|
200
|
-
console.warn(`Unknown message type: ${message.type}`);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
handleAuthentication(sessionId, message, ws) {
|
|
204
|
-
const { authToken } = message;
|
|
205
|
-
// Check session limit
|
|
206
|
-
if (__classPrivateFieldGet(this, _MCPWebBridge_config, "f").maxSessionsPerToken) {
|
|
207
|
-
const existingSessions = __classPrivateFieldGet(this, _MCPWebBridge_tokenSessionIds, "f").get(authToken);
|
|
208
|
-
const currentCount = existingSessions?.size ?? 0;
|
|
209
|
-
if (currentCount >= __classPrivateFieldGet(this, _MCPWebBridge_config, "f").maxSessionsPerToken) {
|
|
210
|
-
if (__classPrivateFieldGet(this, _MCPWebBridge_config, "f").onSessionLimitExceeded === 'close_oldest') {
|
|
211
|
-
__classPrivateFieldGet(this, _MCPWebBridge_instances, "m", _MCPWebBridge_closeOldestSessionForToken).call(this, authToken);
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
ws.send(JSON.stringify({
|
|
215
|
-
type: 'authentication-failed',
|
|
216
|
-
error: 'Session limit exceeded',
|
|
217
|
-
code: SessionLimitExceededErrorCode
|
|
218
|
-
}));
|
|
219
|
-
ws.close(1008, 'Session limit exceeded');
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
const sessionData = {
|
|
225
|
-
ws,
|
|
226
|
-
authToken: message.authToken,
|
|
227
|
-
origin: message.origin,
|
|
228
|
-
pageTitle: message.pageTitle,
|
|
229
|
-
userAgent: message.userAgent,
|
|
230
|
-
connectedAt: Date.now(),
|
|
231
|
-
lastActivity: Date.now(),
|
|
232
|
-
tools: new Map()
|
|
233
|
-
};
|
|
234
|
-
__classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").set(sessionId, sessionData);
|
|
235
|
-
// Track session for this token
|
|
236
|
-
const sessionIds = __classPrivateFieldGet(this, _MCPWebBridge_tokenSessionIds, "f").get(authToken) ?? new Set();
|
|
237
|
-
sessionIds.add(sessionId);
|
|
238
|
-
__classPrivateFieldGet(this, _MCPWebBridge_tokenSessionIds, "f").set(authToken, sessionIds);
|
|
239
|
-
ws.send(JSON.stringify({
|
|
240
|
-
type: 'authenticated',
|
|
241
|
-
// @ts-expect-error We know the port exists.
|
|
242
|
-
mcpPort: __classPrivateFieldGet(this, _MCPWebBridge_mcpServer, "f").address()?.port,
|
|
243
|
-
sessionId,
|
|
244
|
-
success: true
|
|
245
|
-
}));
|
|
246
|
-
}
|
|
247
|
-
handleToolRegistration(sessionId, message) {
|
|
248
|
-
const session = __classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").get(sessionId);
|
|
249
|
-
if (!session) {
|
|
250
|
-
console.warn(`Tool registration for unknown session: ${sessionId}`);
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
console.log('registering tool for session', sessionId, message);
|
|
254
|
-
session.tools.set(message.tool.name, message.tool);
|
|
255
|
-
}
|
|
256
|
-
handleActivity(sessionId, message) {
|
|
257
|
-
const session = __classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").get(sessionId);
|
|
258
|
-
if (session) {
|
|
259
|
-
session.lastActivity = message.timestamp;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
async handleQueryCancel(message) {
|
|
263
|
-
const cancelMessage = QueryCancelMessageSchema.parse(message);
|
|
264
|
-
const { uuid } = cancelMessage;
|
|
265
|
-
const query = __classPrivateFieldGet(this, _MCPWebBridge_queries, "f").get(uuid);
|
|
266
|
-
if (!query) {
|
|
267
|
-
console.warn(`Cancel requested for unknown query: ${uuid}`);
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
// Mark query as cancelled
|
|
271
|
-
query.state = 'cancelled';
|
|
272
|
-
// Notify agent that query no longer exists (optional - agent may not implement DELETE)
|
|
273
|
-
if (__classPrivateFieldGet(this, _MCPWebBridge_config, "f").agentUrl) {
|
|
274
|
-
try {
|
|
275
|
-
await fetch(buildQueryUrl(__classPrivateFieldGet(this, _MCPWebBridge_config, "f").agentUrl, uuid), {
|
|
276
|
-
method: 'DELETE',
|
|
277
|
-
headers: { 'Content-Type': 'application/json' }
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
catch (error) {
|
|
281
|
-
// Agent may not implement DELETE endpoint, which is fine
|
|
282
|
-
console.debug(`Failed to notify agent of query deletion (optional): ${error instanceof Error ? error.message : String(error)}`);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
__classPrivateFieldGet(this, _MCPWebBridge_instances, "m", _MCPWebBridge_decrementQueryCountForQuery).call(this, query);
|
|
286
|
-
__classPrivateFieldGet(this, _MCPWebBridge_queries, "f").delete(uuid);
|
|
287
|
-
}
|
|
288
|
-
async handleQuery(sessionId, message, ws) {
|
|
289
|
-
const { uuid, responseTool, tools, restrictTools } = message;
|
|
290
|
-
if (!__classPrivateFieldGet(this, _MCPWebBridge_config, "f").agentUrl) {
|
|
291
|
-
ws.send(JSON.stringify(QueryFailureMessageSchema.parse({
|
|
292
|
-
uuid,
|
|
293
|
-
error: 'Missing Agent URL'
|
|
294
|
-
})));
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
// Get session for query limit checking
|
|
298
|
-
const session = __classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").get(sessionId);
|
|
299
|
-
if (!session) {
|
|
300
|
-
ws.send(JSON.stringify(QueryFailureMessageSchema.parse({
|
|
301
|
-
uuid,
|
|
302
|
-
error: 'Session not found'
|
|
303
|
-
})));
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
// Check query limit
|
|
307
|
-
if (__classPrivateFieldGet(this, _MCPWebBridge_config, "f").maxInFlightQueriesPerToken) {
|
|
308
|
-
const currentQueries = __classPrivateFieldGet(this, _MCPWebBridge_tokenQueryCounts, "f").get(session.authToken) ?? 0;
|
|
309
|
-
if (currentQueries >= __classPrivateFieldGet(this, _MCPWebBridge_config, "f").maxInFlightQueriesPerToken) {
|
|
310
|
-
ws.send(JSON.stringify(QueryFailureMessageSchema.parse({
|
|
311
|
-
uuid,
|
|
312
|
-
error: 'Query limit exceeded. Wait for existing queries to complete.',
|
|
313
|
-
code: QueryLimitExceededErrorCode
|
|
314
|
-
})));
|
|
315
|
-
return;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
// Increment query count for this token
|
|
319
|
-
__classPrivateFieldGet(this, _MCPWebBridge_tokenQueryCounts, "f").set(session.authToken, (__classPrivateFieldGet(this, _MCPWebBridge_tokenQueryCounts, "f").get(session.authToken) ?? 0) + 1);
|
|
320
|
-
try {
|
|
321
|
-
// Track this query
|
|
322
|
-
__classPrivateFieldGet(this, _MCPWebBridge_queries, "f").set(uuid, {
|
|
323
|
-
sessionId,
|
|
324
|
-
responseTool: responseTool?.name,
|
|
325
|
-
toolCalls: [],
|
|
326
|
-
ws,
|
|
327
|
-
state: 'active',
|
|
328
|
-
tools,
|
|
329
|
-
restrictTools
|
|
330
|
-
});
|
|
331
|
-
// Forward query to agent
|
|
332
|
-
const response = await fetch(buildQueryUrl(__classPrivateFieldGet(this, _MCPWebBridge_config, "f").agentUrl, uuid), {
|
|
333
|
-
method: 'PUT',
|
|
334
|
-
headers: {
|
|
335
|
-
'Content-Type': 'application/json',
|
|
336
|
-
...(__classPrivateFieldGet(this, _MCPWebBridge_config, "f").authToken && { 'Authorization': `Bearer ${__classPrivateFieldGet(this, _MCPWebBridge_config, "f").authToken}` })
|
|
337
|
-
},
|
|
338
|
-
body: JSON.stringify(QueryMessageSchema.parse(message))
|
|
339
|
-
});
|
|
340
|
-
if (!response.ok) {
|
|
341
|
-
throw new Error(`Agent responded with ${response.status}: ${response.statusText}`);
|
|
342
|
-
}
|
|
343
|
-
// Send immediate acceptance back to frontend
|
|
344
|
-
ws.send(JSON.stringify(QueryAcceptedMessageSchema.parse({ uuid })));
|
|
345
|
-
}
|
|
346
|
-
catch (error) {
|
|
347
|
-
console.error(`Error forwarding query ${uuid}:`, error);
|
|
348
|
-
__classPrivateFieldGet(this, _MCPWebBridge_queries, "f").delete(uuid);
|
|
349
|
-
__classPrivateFieldGet(this, _MCPWebBridge_instances, "m", _MCPWebBridge_decrementQueryCount).call(this, session.authToken);
|
|
350
|
-
ws.send(JSON.stringify(QueryFailureMessageSchema.parse({
|
|
351
|
-
uuid,
|
|
352
|
-
error: `${error instanceof Error ? error.message : String(error)}`
|
|
353
|
-
})));
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
handleQueryProgressEndpoint(_req, res, uuid, body) {
|
|
357
|
-
try {
|
|
358
|
-
const message = JSON.parse(body);
|
|
359
|
-
const progressMessage = QueryProgressMessageSchema.parse({ uuid, ...message });
|
|
360
|
-
const query = __classPrivateFieldGet(this, _MCPWebBridge_queries, "f").get(uuid);
|
|
361
|
-
if (!query) {
|
|
362
|
-
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
363
|
-
res.end(JSON.stringify({ error: QueryNotFoundErrorCode }));
|
|
364
|
-
return;
|
|
365
|
-
}
|
|
366
|
-
// Forward progress to frontend
|
|
367
|
-
if (query.ws.readyState === WebSocket.OPEN) {
|
|
368
|
-
query.ws.send(JSON.stringify(progressMessage));
|
|
369
|
-
}
|
|
370
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
371
|
-
res.end(JSON.stringify({ success: true }));
|
|
372
|
-
}
|
|
373
|
-
catch (error) {
|
|
374
|
-
console.error('Error handling query progress:', error);
|
|
375
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
376
|
-
res.end(JSON.stringify({ error: 'Invalid request body' }));
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
handleQueryCompleteEndpoint(_req, res, uuid, body) {
|
|
380
|
-
try {
|
|
381
|
-
const message = JSON.parse(body);
|
|
382
|
-
const completeMessage = QueryCompleteClientMessageSchema.parse({ uuid, ...message });
|
|
383
|
-
const query = __classPrivateFieldGet(this, _MCPWebBridge_queries, "f").get(uuid);
|
|
384
|
-
if (!query) {
|
|
385
|
-
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
386
|
-
res.end(JSON.stringify({ error: QueryNotFoundErrorCode }));
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
389
|
-
// Edge case: responseTool specified but agent called queryComplete()
|
|
390
|
-
if (query.responseTool) {
|
|
391
|
-
const errorMessage = QueryFailureMessageSchema.parse({
|
|
392
|
-
uuid,
|
|
393
|
-
error: `Query specified responseTool '${query.responseTool}' but agent called queryComplete() instead`
|
|
394
|
-
});
|
|
395
|
-
if (query.ws.readyState === WebSocket.OPEN) {
|
|
396
|
-
query.ws.send(JSON.stringify(errorMessage));
|
|
397
|
-
}
|
|
398
|
-
__classPrivateFieldGet(this, _MCPWebBridge_instances, "m", _MCPWebBridge_decrementQueryCountForQuery).call(this, query);
|
|
399
|
-
__classPrivateFieldGet(this, _MCPWebBridge_queries, "f").delete(uuid);
|
|
400
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
401
|
-
res.end(JSON.stringify({ error: errorMessage.error }));
|
|
402
|
-
return;
|
|
403
|
-
}
|
|
404
|
-
// Mark query as completed
|
|
405
|
-
query.state = 'completed';
|
|
406
|
-
// Send completion with tracked tool calls
|
|
407
|
-
const bridgeMessage = QueryCompleteBridgeMessageSchema.parse({
|
|
408
|
-
uuid,
|
|
409
|
-
message: completeMessage.message,
|
|
410
|
-
toolCalls: query.toolCalls
|
|
411
|
-
});
|
|
412
|
-
if (query.ws.readyState === WebSocket.OPEN) {
|
|
413
|
-
query.ws.send(JSON.stringify(bridgeMessage));
|
|
414
|
-
}
|
|
415
|
-
__classPrivateFieldGet(this, _MCPWebBridge_instances, "m", _MCPWebBridge_decrementQueryCountForQuery).call(this, query);
|
|
416
|
-
__classPrivateFieldGet(this, _MCPWebBridge_queries, "f").delete(uuid);
|
|
417
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
418
|
-
res.end(JSON.stringify({ success: true }));
|
|
419
|
-
}
|
|
420
|
-
catch (error) {
|
|
421
|
-
console.error('Error handling query complete:', error);
|
|
422
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
423
|
-
res.end(JSON.stringify({ error: 'Invalid request body' }));
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
handleQueryFailEndpoint(_req, res, uuid, body) {
|
|
427
|
-
try {
|
|
428
|
-
const message = JSON.parse(body);
|
|
429
|
-
const failureMessage = QueryFailureMessageSchema.parse({ uuid, ...message });
|
|
430
|
-
const query = __classPrivateFieldGet(this, _MCPWebBridge_queries, "f").get(uuid);
|
|
431
|
-
if (!query) {
|
|
432
|
-
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
433
|
-
res.end(JSON.stringify({ error: QueryNotFoundErrorCode }));
|
|
434
|
-
return;
|
|
435
|
-
}
|
|
436
|
-
// Mark query as failed
|
|
437
|
-
query.state = 'failed';
|
|
438
|
-
// Send failure message to frontend
|
|
439
|
-
if (query.ws.readyState === WebSocket.OPEN) {
|
|
440
|
-
query.ws.send(JSON.stringify(failureMessage));
|
|
441
|
-
}
|
|
442
|
-
__classPrivateFieldGet(this, _MCPWebBridge_instances, "m", _MCPWebBridge_decrementQueryCountForQuery).call(this, query);
|
|
443
|
-
__classPrivateFieldGet(this, _MCPWebBridge_queries, "f").delete(uuid);
|
|
444
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
445
|
-
res.end(JSON.stringify({ success: true }));
|
|
446
|
-
}
|
|
447
|
-
catch (error) {
|
|
448
|
-
console.error('Error handling query fail:', error);
|
|
449
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
450
|
-
res.end(JSON.stringify({ error: 'Invalid request body' }));
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
handleQueryCancelEndpoint(_req, res, uuid, body) {
|
|
454
|
-
try {
|
|
455
|
-
const query = __classPrivateFieldGet(this, _MCPWebBridge_queries, "f").get(uuid);
|
|
456
|
-
if (!query) {
|
|
457
|
-
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
458
|
-
res.end(JSON.stringify({ error: QueryNotFoundErrorCode }));
|
|
459
|
-
return;
|
|
460
|
-
}
|
|
461
|
-
// Mark query as cancelled
|
|
462
|
-
query.state = 'cancelled';
|
|
463
|
-
// Send cancellation message to frontend (as a failure with specific message)
|
|
464
|
-
const cancellationMessage = QueryCancelMessageSchema.parse({
|
|
465
|
-
uuid,
|
|
466
|
-
reason: body ? JSON.parse(body).reason : undefined
|
|
467
|
-
});
|
|
468
|
-
if (query.ws.readyState === WebSocket.OPEN) {
|
|
469
|
-
query.ws.send(JSON.stringify(cancellationMessage));
|
|
470
|
-
}
|
|
471
|
-
__classPrivateFieldGet(this, _MCPWebBridge_instances, "m", _MCPWebBridge_decrementQueryCountForQuery).call(this, query);
|
|
472
|
-
__classPrivateFieldGet(this, _MCPWebBridge_queries, "f").delete(uuid);
|
|
473
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
474
|
-
res.end(JSON.stringify({ success: true }));
|
|
475
|
-
}
|
|
476
|
-
catch (error) {
|
|
477
|
-
console.error('Error handling query cancel:', error);
|
|
478
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
479
|
-
res.end(JSON.stringify({ error: 'Invalid request body' }));
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
async handleMCPRequest(req, res, body) {
|
|
483
|
-
try {
|
|
484
|
-
const mcpRequest = JSON.parse(body);
|
|
485
|
-
// Extract auth from header OR query context
|
|
486
|
-
const authHeader = req.headers.authorization;
|
|
487
|
-
const authToken = authHeader?.replace('Bearer ', '');
|
|
488
|
-
const queryId = mcpRequest.params?._meta?.queryId;
|
|
489
|
-
const sessions = new Map();
|
|
490
|
-
if (queryId) {
|
|
491
|
-
// Authenticate via query context
|
|
492
|
-
const query = __classPrivateFieldGet(this, _MCPWebBridge_queries, "f").get(queryId);
|
|
493
|
-
if (!query) {
|
|
494
|
-
this.sendMCPError(res, mcpRequest.id, -32600, QueryNotFoundErrorCode);
|
|
495
|
-
return;
|
|
496
|
-
}
|
|
497
|
-
if (query.state !== 'active') {
|
|
498
|
-
this.sendMCPError(res, mcpRequest.id, -32600, QueryNotActiveErrorCode);
|
|
499
|
-
return;
|
|
500
|
-
}
|
|
501
|
-
const session = __classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").get(query.sessionId);
|
|
502
|
-
if (!session) {
|
|
503
|
-
this.sendMCPError(res, mcpRequest.id, -32600, InvalidSessionErrorCode);
|
|
504
|
-
return;
|
|
505
|
-
}
|
|
506
|
-
sessions.set(query.sessionId, session);
|
|
507
|
-
}
|
|
508
|
-
else if (authToken) {
|
|
509
|
-
// Traditional authentication
|
|
510
|
-
Array.from(__classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").entries())
|
|
511
|
-
.filter(([_, session]) => session.authToken === authToken)
|
|
512
|
-
.forEach(([sessionId, session]) => {
|
|
513
|
-
sessions.set(sessionId, session);
|
|
514
|
-
});
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
this.sendMCPError(res, mcpRequest.id, -32600, MissingAuthenticationErrorCode);
|
|
518
|
-
return;
|
|
519
|
-
}
|
|
520
|
-
if (sessions.size === 0) {
|
|
521
|
-
this.sendMCPError(res, mcpRequest.id, -32600, NoSessionsFoundErrorCode);
|
|
522
|
-
return;
|
|
523
|
-
}
|
|
524
|
-
let result;
|
|
525
|
-
switch (mcpRequest.method) {
|
|
526
|
-
case 'initialize':
|
|
527
|
-
result = await this.handleInitialize();
|
|
528
|
-
break;
|
|
529
|
-
case 'tools/list':
|
|
530
|
-
result = await this.handleToolsList(sessions, mcpRequest.params);
|
|
531
|
-
break;
|
|
532
|
-
case 'tools/call':
|
|
533
|
-
result = await this.handleToolCall(sessions, mcpRequest.params);
|
|
534
|
-
break;
|
|
535
|
-
case 'resources/list':
|
|
536
|
-
result = await this.handleResourcesList(sessions, mcpRequest.params);
|
|
537
|
-
break;
|
|
538
|
-
case 'resources/read':
|
|
539
|
-
result = await this.handleResourceRead(sessions, mcpRequest.params);
|
|
540
|
-
break;
|
|
541
|
-
case 'prompts/list':
|
|
542
|
-
result = await this.handlePromptsList(sessions, mcpRequest.params);
|
|
543
|
-
break;
|
|
544
|
-
default: {
|
|
545
|
-
this.sendMCPError(res, mcpRequest.id, -32601, UnknownMethodErrorCode);
|
|
546
|
-
return;
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
// Check if result contains a fatal error (has error_is_fatal: true)
|
|
550
|
-
// Recoverable errors have isError: true with partial data and go in result
|
|
551
|
-
if (result && typeof result === 'object' && 'error_is_fatal' in result && result.error_is_fatal === true) {
|
|
552
|
-
const fatalError = result;
|
|
553
|
-
// Use -32602 (Invalid params) for client errors like missing sessionId
|
|
554
|
-
this.sendMCPError(res, mcpRequest.id, -32602, fatalError.error_message, fatalError);
|
|
555
|
-
return;
|
|
556
|
-
}
|
|
557
|
-
// Everything else (including soft errors with isError: true) goes in result
|
|
558
|
-
this.sendMCPResponse(res, mcpRequest.id, result);
|
|
559
|
-
}
|
|
560
|
-
catch (error) {
|
|
561
|
-
console.error('MCP request error:', error);
|
|
562
|
-
this.sendMCPError(res, 0, -32603, InternalErrorCode);
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
getVersion() {
|
|
566
|
-
try {
|
|
567
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
568
|
-
const __dirname = dirname(__filename);
|
|
569
|
-
const packageJsonPath = join(__dirname, '..', 'package.json');
|
|
570
|
-
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
571
|
-
return packageJson.version || "1.0.0";
|
|
572
|
-
}
|
|
573
|
-
catch (error) {
|
|
574
|
-
console.warn('Failed to read version from package.json:', error);
|
|
575
|
-
return "1.0.0";
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
async handleInitialize() {
|
|
579
|
-
return {
|
|
580
|
-
protocolVersion: "2024-11-05",
|
|
581
|
-
capabilities: {
|
|
582
|
-
tools: {},
|
|
583
|
-
resources: {},
|
|
584
|
-
prompts: {}
|
|
585
|
-
},
|
|
586
|
-
serverInfo: {
|
|
587
|
-
name: __classPrivateFieldGet(this, _MCPWebBridge_config, "f").name,
|
|
588
|
-
description: __classPrivateFieldGet(this, _MCPWebBridge_config, "f").description,
|
|
589
|
-
version: this.getVersion(),
|
|
590
|
-
...(__classPrivateFieldGet(this, _MCPWebBridge_config, "f").icon && { icon: __classPrivateFieldGet(this, _MCPWebBridge_config, "f").icon })
|
|
591
|
-
}
|
|
592
|
-
};
|
|
593
|
-
}
|
|
594
|
-
getSessionAndSessionId(sessions, sessionId) {
|
|
595
|
-
if (!sessionId) {
|
|
596
|
-
if (sessions.size === 1) {
|
|
597
|
-
sessionId = sessions.keys().next().value;
|
|
598
|
-
if (!sessionId) {
|
|
599
|
-
return undefined;
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
else {
|
|
603
|
-
return undefined;
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
const session = sessions.get(sessionId);
|
|
607
|
-
if (!session) {
|
|
608
|
-
return undefined;
|
|
609
|
-
}
|
|
610
|
-
return [sessionId, session];
|
|
611
|
-
}
|
|
612
|
-
getSessionFromMetaParams(sessions, params) {
|
|
613
|
-
const sessionId = params?._meta?.sessionId;
|
|
614
|
-
return this.getSessionAndSessionId(sessions, sessionId)?.[1];
|
|
615
|
-
}
|
|
616
|
-
createSessionNotFoundError(sessions) {
|
|
617
|
-
if (sessions.size > 1) {
|
|
618
|
-
return {
|
|
619
|
-
error: SessionNotSpecifiedErrorCode,
|
|
620
|
-
error_message: SessionNotSpecifiedErrorDetails,
|
|
621
|
-
available_sessions: this.listSessions(sessions)
|
|
622
|
-
};
|
|
623
|
-
}
|
|
624
|
-
return { error: SessionNotFoundErrorCode };
|
|
625
|
-
}
|
|
626
|
-
async handleToolsList(sessions, params) {
|
|
627
|
-
const session = this.getSessionFromMetaParams(sessions, params);
|
|
628
|
-
const listSessionsTool = {
|
|
629
|
-
name: "list_sessions",
|
|
630
|
-
description: "List all browser sessions with their available tools",
|
|
631
|
-
inputSchema: {
|
|
632
|
-
type: "object",
|
|
633
|
-
properties: {},
|
|
634
|
-
required: []
|
|
635
|
-
}
|
|
636
|
-
};
|
|
637
|
-
// If no session found and multiple sessions exist, return list_sessions tool only with isError
|
|
638
|
-
if (!session && sessions.size > 1) {
|
|
639
|
-
return {
|
|
640
|
-
tools: [listSessionsTool],
|
|
641
|
-
isError: true,
|
|
642
|
-
error: SessionNotSpecifiedErrorCode,
|
|
643
|
-
error_message: SessionNotSpecifiedErrorDetails,
|
|
644
|
-
error_is_fatal: false,
|
|
645
|
-
available_sessions: this.listSessions(sessions)
|
|
646
|
-
};
|
|
647
|
-
}
|
|
648
|
-
// If no session at all (shouldn't happen with proper auth), return fatal error
|
|
649
|
-
if (!session) {
|
|
650
|
-
return {
|
|
651
|
-
error: SessionNotFoundErrorCode,
|
|
652
|
-
error_message: 'No session found for the provided authentication',
|
|
653
|
-
error_is_fatal: true
|
|
654
|
-
};
|
|
655
|
-
}
|
|
656
|
-
const tools = [listSessionsTool];
|
|
657
|
-
for (const tool of session.tools.values()) {
|
|
658
|
-
const sessionAwareTool = {
|
|
659
|
-
name: tool.name,
|
|
660
|
-
description: tool.description,
|
|
661
|
-
inputSchema: {
|
|
662
|
-
type: "object",
|
|
663
|
-
properties: {
|
|
664
|
-
session_id: {
|
|
665
|
-
type: "string",
|
|
666
|
-
description: "Session ID (optional - will auto-select if only one session active)",
|
|
667
|
-
},
|
|
668
|
-
...(tool.inputSchema?.properties || {})
|
|
669
|
-
},
|
|
670
|
-
required: tool.inputSchema?.required || []
|
|
671
|
-
}
|
|
672
|
-
};
|
|
673
|
-
tools.push(sessionAwareTool);
|
|
674
|
-
}
|
|
675
|
-
return { tools };
|
|
676
|
-
}
|
|
677
|
-
async handleToolCall(sessions, params) {
|
|
678
|
-
const { name: toolName, arguments: toolInput, _meta } = params || {};
|
|
679
|
-
if (!toolName) {
|
|
680
|
-
return { error: ToolNameRequiredErrorCode };
|
|
681
|
-
}
|
|
682
|
-
// Extract query ID from context if available
|
|
683
|
-
const queryId = _meta?.queryId;
|
|
684
|
-
// If this is part of a query, validate the query state and restrictions
|
|
685
|
-
if (queryId) {
|
|
686
|
-
const query = __classPrivateFieldGet(this, _MCPWebBridge_queries, "f").get(queryId);
|
|
687
|
-
if (!query) {
|
|
688
|
-
return { error: QueryNotFoundErrorCode };
|
|
689
|
-
}
|
|
690
|
-
if (query.state !== 'active') {
|
|
691
|
-
return { error: QueryNotActiveErrorCode };
|
|
692
|
-
}
|
|
693
|
-
// Check tool restrictions if query has them
|
|
694
|
-
if (query.restrictTools && query.tools) {
|
|
695
|
-
const allowed = query.tools.some(t => t.name === toolName);
|
|
696
|
-
if (!allowed) {
|
|
697
|
-
return {
|
|
698
|
-
error: ToolNotAllowedErrorCode,
|
|
699
|
-
details: 'The query restricts the allowed tool calls. Use one of `allowed_tools`.',
|
|
700
|
-
allowed_tools: query.tools.map(t => t.name)
|
|
701
|
-
};
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
if (toolName === 'list_sessions') {
|
|
706
|
-
return { sessions: this.listSessions(sessions) };
|
|
707
|
-
}
|
|
708
|
-
// Handle session-specific tool
|
|
709
|
-
const [sessionId, session] = this.getSessionAndSessionId(sessions, toolInput?.session_id || _meta?.sessionId) || [];
|
|
710
|
-
if (!sessionId || !session) {
|
|
711
|
-
return this.createSessionNotFoundError(sessions);
|
|
712
|
-
}
|
|
713
|
-
// Check if tool exists in this session
|
|
714
|
-
if (!session.tools.has(toolName)) {
|
|
715
|
-
return {
|
|
716
|
-
error: ToolNotFoundErrorCode,
|
|
717
|
-
available_tools: Array.from(session.tools.keys())
|
|
718
|
-
};
|
|
719
|
-
}
|
|
720
|
-
// Forward tool call to frontend
|
|
721
|
-
return this.forwardToolCallToSession(sessionId, toolName, toolInput, queryId);
|
|
722
|
-
}
|
|
723
|
-
async handleResourcesList(sessions, params) {
|
|
724
|
-
const session = this.getSessionFromMetaParams(sessions, params);
|
|
725
|
-
// Built-in resource that provides session discovery (like list_sessions tool)
|
|
726
|
-
const sessionListResource = {
|
|
727
|
-
uri: "sessions://list",
|
|
728
|
-
name: "sessions",
|
|
729
|
-
title: "Active Browser Sessions",
|
|
730
|
-
description: "List of all active browser sessions for this authentication context",
|
|
731
|
-
mimeType: "application/json"
|
|
732
|
-
};
|
|
733
|
-
// If no session found and multiple sessions exist, return discovery resource only with isError
|
|
734
|
-
if (!session && sessions.size > 1) {
|
|
735
|
-
return {
|
|
736
|
-
resources: [sessionListResource],
|
|
737
|
-
isError: true,
|
|
738
|
-
error: SessionNotSpecifiedErrorCode,
|
|
739
|
-
error_message: SessionNotSpecifiedErrorDetails,
|
|
740
|
-
error_is_fatal: false,
|
|
741
|
-
available_sessions: this.listSessions(sessions)
|
|
742
|
-
};
|
|
743
|
-
}
|
|
744
|
-
// If no session at all (shouldn't happen with proper auth), return fatal error
|
|
745
|
-
if (!session) {
|
|
746
|
-
return {
|
|
747
|
-
error: SessionNotFoundErrorCode,
|
|
748
|
-
error_message: 'No session found for the provided authentication',
|
|
749
|
-
error_is_fatal: true
|
|
750
|
-
};
|
|
751
|
-
}
|
|
752
|
-
// TODO: Add session-specific resources
|
|
753
|
-
const resources = [
|
|
754
|
-
sessionListResource,
|
|
755
|
-
// ...session.resources (future)
|
|
756
|
-
];
|
|
757
|
-
return { resources };
|
|
758
|
-
}
|
|
759
|
-
async handleResourceRead(sessions, params) {
|
|
760
|
-
const { uri } = params || {};
|
|
761
|
-
if (!uri) {
|
|
762
|
-
return { error: "Resource URI is required" };
|
|
763
|
-
}
|
|
764
|
-
// Handle built-in sessions resource
|
|
765
|
-
if (uri === "sessions://list") {
|
|
766
|
-
const sessionData = this.listSessions(sessions);
|
|
767
|
-
return {
|
|
768
|
-
contents: [{
|
|
769
|
-
uri: "sessions://list",
|
|
770
|
-
mimeType: "application/json",
|
|
771
|
-
text: JSON.stringify(sessionData, null, 2)
|
|
772
|
-
}]
|
|
773
|
-
};
|
|
774
|
-
}
|
|
775
|
-
// TODO: Handle session-specific resources
|
|
776
|
-
return { error: "Resource not found" };
|
|
777
|
-
}
|
|
778
|
-
listSessions(sessions) {
|
|
779
|
-
const sessionList = Array.from(sessions.entries()).map(([key, session]) => ({
|
|
780
|
-
session_id: key,
|
|
781
|
-
origin: session.origin,
|
|
782
|
-
page_title: session.pageTitle,
|
|
783
|
-
connected_at: new Date(session.connectedAt).toISOString(),
|
|
784
|
-
last_activity: new Date(session.lastActivity).toISOString(),
|
|
785
|
-
available_tools: Array.from(session.tools.keys())
|
|
786
|
-
}));
|
|
787
|
-
return sessionList;
|
|
788
|
-
}
|
|
789
|
-
async handlePromptsList(sessions, params) {
|
|
790
|
-
const session = this.getSessionFromMetaParams(sessions, params);
|
|
791
|
-
// If no session found and multiple sessions exist, return empty prompts with isError
|
|
792
|
-
if (!session && sessions.size > 1) {
|
|
793
|
-
return {
|
|
794
|
-
prompts: [],
|
|
795
|
-
isError: true,
|
|
796
|
-
error: SessionNotSpecifiedErrorCode,
|
|
797
|
-
error_message: SessionNotSpecifiedErrorDetails,
|
|
798
|
-
error_is_fatal: false,
|
|
799
|
-
available_sessions: this.listSessions(sessions),
|
|
800
|
-
};
|
|
801
|
-
}
|
|
802
|
-
// If no session at all (shouldn't happen with proper auth), return fatal error
|
|
803
|
-
if (!session) {
|
|
804
|
-
return {
|
|
805
|
-
error: SessionNotFoundErrorCode,
|
|
806
|
-
error_message: 'No session found for the provided authentication',
|
|
807
|
-
error_is_fatal: true
|
|
808
|
-
};
|
|
809
|
-
}
|
|
810
|
-
// TO DO: implement prompt exposure
|
|
811
|
-
return { prompts: [] };
|
|
812
|
-
}
|
|
813
|
-
async forwardToolCallToSession(sessionId, toolName, toolInput, queryId) {
|
|
814
|
-
const session = __classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").get(sessionId);
|
|
815
|
-
if (!session || session.ws.readyState !== WebSocket.OPEN) {
|
|
816
|
-
return { error: "Session not available" };
|
|
817
|
-
}
|
|
818
|
-
// Generate request ID for tracking
|
|
819
|
-
const requestId = crypto.randomUUID();
|
|
820
|
-
// Send tool call to frontend
|
|
821
|
-
const toolCall = {
|
|
822
|
-
type: 'tool-call',
|
|
823
|
-
requestId,
|
|
824
|
-
toolName,
|
|
825
|
-
toolInput,
|
|
826
|
-
...(queryId && { queryId })
|
|
827
|
-
};
|
|
828
|
-
return new Promise((resolve) => {
|
|
829
|
-
// Set up response handler
|
|
830
|
-
const timeout = setTimeout(() => {
|
|
831
|
-
resolve({ error: "Tool call timeout" });
|
|
832
|
-
}, 30000); // 30 second timeout
|
|
833
|
-
const handleResponse = (data) => {
|
|
834
|
-
try {
|
|
835
|
-
const message = JSON.parse(data.toString());
|
|
836
|
-
if (message.type === 'tool-response' && message.requestId === requestId) {
|
|
837
|
-
clearTimeout(timeout);
|
|
838
|
-
session.ws.removeListener('message', handleResponse);
|
|
839
|
-
const toolResult = message.result;
|
|
840
|
-
// Track tool call if part of a query
|
|
841
|
-
if (queryId) {
|
|
842
|
-
const query = __classPrivateFieldGet(this, _MCPWebBridge_queries, "f").get(queryId);
|
|
843
|
-
if (query) {
|
|
844
|
-
query.toolCalls.push({
|
|
845
|
-
tool: toolName,
|
|
846
|
-
arguments: toolInput,
|
|
847
|
-
result: toolResult
|
|
848
|
-
});
|
|
849
|
-
// Check if this was the responseTool - auto-complete query
|
|
850
|
-
if (query.responseTool === toolName) {
|
|
851
|
-
// Check if tool call succeeded
|
|
852
|
-
if (!(toolResult && typeof toolResult === 'object' && 'error' in toolResult)) {
|
|
853
|
-
// Tool succeeded - auto-complete query
|
|
854
|
-
const bridgeMessage = QueryCompleteBridgeMessageSchema.parse({
|
|
855
|
-
uuid: queryId,
|
|
856
|
-
message: undefined,
|
|
857
|
-
toolCalls: query.toolCalls
|
|
858
|
-
});
|
|
859
|
-
if (query.ws.readyState === WebSocket.OPEN) {
|
|
860
|
-
query.ws.send(JSON.stringify(bridgeMessage));
|
|
861
|
-
}
|
|
862
|
-
// Only delete query on success
|
|
863
|
-
__classPrivateFieldGet(this, _MCPWebBridge_queries, "f").delete(queryId);
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
}
|
|
868
|
-
resolve(toolResult);
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
catch (_error) {
|
|
872
|
-
// Ignore invalid JSON
|
|
873
|
-
}
|
|
874
|
-
};
|
|
875
|
-
session.ws.addListener('message', handleResponse);
|
|
876
|
-
session.ws.send(JSON.stringify(toolCall));
|
|
877
|
-
});
|
|
878
|
-
}
|
|
879
|
-
sendMCPResponse(res, id, result) {
|
|
880
|
-
const response = {
|
|
881
|
-
jsonrpc: "2.0",
|
|
882
|
-
id,
|
|
883
|
-
result
|
|
884
|
-
};
|
|
885
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
886
|
-
res.end(JSON.stringify(response));
|
|
887
|
-
}
|
|
888
|
-
sendMCPError(res, id, code, message, data) {
|
|
889
|
-
const response = {
|
|
890
|
-
jsonrpc: "2.0",
|
|
891
|
-
id,
|
|
892
|
-
error: { code, message, data }
|
|
893
|
-
};
|
|
894
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
895
|
-
res.end(JSON.stringify(response));
|
|
896
|
-
}
|
|
897
|
-
/**
|
|
898
|
-
* Close the bridge servers and cleanup all connections
|
|
899
|
-
*/
|
|
900
|
-
async close() {
|
|
901
|
-
// Stop session timeout checker
|
|
902
|
-
if (__classPrivateFieldGet(this, _MCPWebBridge_sessionTimeoutInterval, "f")) {
|
|
903
|
-
clearInterval(__classPrivateFieldGet(this, _MCPWebBridge_sessionTimeoutInterval, "f"));
|
|
904
|
-
__classPrivateFieldSet(this, _MCPWebBridge_sessionTimeoutInterval, undefined, "f");
|
|
905
|
-
}
|
|
906
|
-
// Close all WebSocket connections first
|
|
907
|
-
for (const session of __classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").values()) {
|
|
908
|
-
if (session.ws.readyState === WebSocket.OPEN) {
|
|
909
|
-
session.ws.close(1000, 'Server shutting down');
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
__classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").clear();
|
|
913
|
-
// Clear queries and tracking maps
|
|
914
|
-
__classPrivateFieldGet(this, _MCPWebBridge_queries, "f").clear();
|
|
915
|
-
__classPrivateFieldGet(this, _MCPWebBridge_tokenSessionIds, "f").clear();
|
|
916
|
-
__classPrivateFieldGet(this, _MCPWebBridge_tokenQueryCounts, "f").clear();
|
|
917
|
-
// Close servers with timeout to prevent hanging
|
|
918
|
-
const closeWithTimeout = (closePromise, timeoutMs = 1000) => {
|
|
919
|
-
return Promise.race([
|
|
920
|
-
closePromise,
|
|
921
|
-
new Promise((resolve) => setTimeout(resolve, timeoutMs))
|
|
922
|
-
]);
|
|
923
|
-
};
|
|
924
|
-
// Close WebSocket server
|
|
925
|
-
if (__classPrivateFieldGet(this, _MCPWebBridge_wsServer, "f")) {
|
|
926
|
-
await closeWithTimeout(new Promise((resolve) => {
|
|
927
|
-
__classPrivateFieldGet(this, _MCPWebBridge_wsServer, "f")?.close(() => resolve());
|
|
928
|
-
}));
|
|
929
|
-
}
|
|
930
|
-
// Close MCP server
|
|
931
|
-
if (__classPrivateFieldGet(this, _MCPWebBridge_mcpServer, "f")) {
|
|
932
|
-
await closeWithTimeout(new Promise((resolve) => {
|
|
933
|
-
__classPrivateFieldGet(this, _MCPWebBridge_mcpServer, "f")?.close(() => resolve());
|
|
934
|
-
}));
|
|
935
|
-
}
|
|
936
|
-
}
|
|
937
|
-
}
|
|
938
|
-
_MCPWebBridge_sessions = new WeakMap(), _MCPWebBridge_queries = new WeakMap(), _MCPWebBridge_config = new WeakMap(), _MCPWebBridge_wsServer = new WeakMap(), _MCPWebBridge_mcpServer = new WeakMap(), _MCPWebBridge_tokenSessionIds = new WeakMap(), _MCPWebBridge_tokenQueryCounts = new WeakMap(), _MCPWebBridge_sessionTimeoutInterval = new WeakMap(), _MCPWebBridge_instances = new WeakSet(), _MCPWebBridge_decrementQueryCount = function _MCPWebBridge_decrementQueryCount(authToken) {
|
|
939
|
-
const count = __classPrivateFieldGet(this, _MCPWebBridge_tokenQueryCounts, "f").get(authToken) ?? 0;
|
|
940
|
-
if (count <= 1) {
|
|
941
|
-
__classPrivateFieldGet(this, _MCPWebBridge_tokenQueryCounts, "f").delete(authToken);
|
|
942
|
-
}
|
|
943
|
-
else {
|
|
944
|
-
__classPrivateFieldGet(this, _MCPWebBridge_tokenQueryCounts, "f").set(authToken, count - 1);
|
|
945
|
-
}
|
|
946
|
-
}, _MCPWebBridge_decrementQueryCountForQuery = function _MCPWebBridge_decrementQueryCountForQuery(query) {
|
|
947
|
-
const session = __classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").get(query.sessionId);
|
|
948
|
-
if (session) {
|
|
949
|
-
__classPrivateFieldGet(this, _MCPWebBridge_instances, "m", _MCPWebBridge_decrementQueryCount).call(this, session.authToken);
|
|
950
|
-
}
|
|
951
|
-
}, _MCPWebBridge_closeOldestSessionForToken = function _MCPWebBridge_closeOldestSessionForToken(authToken) {
|
|
952
|
-
const sessionIds = __classPrivateFieldGet(this, _MCPWebBridge_tokenSessionIds, "f").get(authToken);
|
|
953
|
-
if (!sessionIds || sessionIds.size === 0)
|
|
954
|
-
return;
|
|
955
|
-
let oldest = null;
|
|
956
|
-
for (const sessionId of sessionIds) {
|
|
957
|
-
const session = __classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").get(sessionId);
|
|
958
|
-
if (session && (!oldest || session.connectedAt < oldest.connectedAt)) {
|
|
959
|
-
oldest = { sessionId, connectedAt: session.connectedAt };
|
|
960
|
-
}
|
|
961
|
-
}
|
|
962
|
-
if (oldest) {
|
|
963
|
-
const session = __classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").get(oldest.sessionId);
|
|
964
|
-
if (session) {
|
|
965
|
-
session.ws.send(JSON.stringify({
|
|
966
|
-
type: 'session-closed',
|
|
967
|
-
reason: 'Session limit exceeded, closing oldest session',
|
|
968
|
-
code: SessionLimitExceededErrorCode
|
|
969
|
-
}));
|
|
970
|
-
session.ws.close(1008, 'Session limit exceeded');
|
|
971
|
-
}
|
|
972
|
-
}
|
|
973
|
-
}, _MCPWebBridge_cleanupSession = function _MCPWebBridge_cleanupSession(sessionId) {
|
|
974
|
-
const session = __classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").get(sessionId);
|
|
975
|
-
if (session) {
|
|
976
|
-
// Remove from token tracking
|
|
977
|
-
const sessionIds = __classPrivateFieldGet(this, _MCPWebBridge_tokenSessionIds, "f").get(session.authToken);
|
|
978
|
-
if (sessionIds) {
|
|
979
|
-
sessionIds.delete(sessionId);
|
|
980
|
-
if (sessionIds.size === 0) {
|
|
981
|
-
__classPrivateFieldGet(this, _MCPWebBridge_tokenSessionIds, "f").delete(session.authToken);
|
|
982
|
-
}
|
|
983
|
-
}
|
|
984
|
-
}
|
|
985
|
-
__classPrivateFieldGet(this, _MCPWebBridge_sessions, "f").delete(sessionId);
|
|
986
|
-
}, _MCPWebBridge_startSessionTimeoutChecker = function _MCPWebBridge_startSessionTimeoutChecker() {
|
|
987
|
-
const maxDuration = __classPrivateFieldGet(this, _MCPWebBridge_config, "f").sessionMaxDurationMs;
|
|
988
|
-
if (!maxDuration)
|
|
989
|
-
return;
|
|
990
|
-
__classPrivateFieldSet(this, _MCPWebBridge_sessionTimeoutInterval, setInterval(() => {
|
|
991
|
-
const now = Date.now();
|
|
992
|
-
for (const [_sessionId, session] of __classPrivateFieldGet(this, _MCPWebBridge_sessions, "f")) {
|
|
993
|
-
if (now - session.connectedAt > maxDuration) {
|
|
994
|
-
session.ws.send(JSON.stringify({
|
|
995
|
-
type: 'session-expired',
|
|
996
|
-
code: SessionExpiredErrorCode
|
|
997
|
-
}));
|
|
998
|
-
session.ws.close(1008, 'Session expired');
|
|
999
|
-
// Note: cleanup happens in the 'close' event handler
|
|
1000
|
-
}
|
|
1001
|
-
}
|
|
1002
|
-
}, 60000), "f"); // Check every minute
|
|
1003
|
-
};
|
|
1004
|
-
//# sourceMappingURL=bridge.js.map
|
package/dist/bridge.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
|