@mcp-web/bridge 0.1.0
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/LICENSE +201 -0
- package/README.md +311 -0
- package/dist/adapters/bun.d.ts +95 -0
- package/dist/adapters/bun.d.ts.map +1 -0
- package/dist/adapters/bun.js +286 -0
- package/dist/adapters/bun.js.map +1 -0
- package/dist/adapters/deno.d.ts +89 -0
- package/dist/adapters/deno.d.ts.map +1 -0
- package/dist/adapters/deno.js +249 -0
- package/dist/adapters/deno.js.map +1 -0
- package/dist/adapters/index.d.ts +21 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +21 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/node.d.ts +112 -0
- package/dist/adapters/node.d.ts.map +1 -0
- package/dist/adapters/node.js +309 -0
- package/dist/adapters/node.js.map +1 -0
- package/dist/adapters/partykit.d.ts +153 -0
- package/dist/adapters/partykit.d.ts.map +1 -0
- package/dist/adapters/partykit.js +372 -0
- package/dist/adapters/partykit.js.map +1 -0
- package/dist/bridge.d.ts +38 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +1004 -0
- package/dist/bridge.js.map +1 -0
- package/dist/core.d.ts +75 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +1508 -0
- package/dist/core.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/index.d.ts +11 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +9 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +69 -0
- package/dist/runtime/scheduler.d.ts.map +1 -0
- package/dist/runtime/scheduler.js +88 -0
- package/dist/runtime/scheduler.js.map +1 -0
- package/dist/runtime/types.d.ts +144 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +82 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/schemas.d.ts +6 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +6 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.d.ts +130 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +28 -0
- package/src/adapters/bun.ts +354 -0
- package/src/adapters/deno.ts +282 -0
- package/src/adapters/index.ts +28 -0
- package/src/adapters/node.ts +385 -0
- package/src/adapters/partykit.ts +482 -0
- package/src/bridge.test.ts +64 -0
- package/src/core.ts +2176 -0
- package/src/index.ts +90 -0
- package/src/limits.test.ts +436 -0
- package/src/remote-mcp.test.ts +770 -0
- package/src/runtime/index.ts +24 -0
- package/src/runtime/scheduler.ts +130 -0
- package/src/runtime/types.ts +229 -0
- package/src/schemas.ts +6 -0
- package/src/session-naming.test.ts +443 -0
- package/src/types.ts +180 -0
- package/tsconfig.json +12 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCPWebBridgeBun - Bun adapter for the MCP Web Bridge.
|
|
3
|
+
*
|
|
4
|
+
* Uses Bun.serve() with built-in WebSocket support for a single-port server.
|
|
5
|
+
* Bun's server natively handles both HTTP and WebSocket on the same port.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // server.ts
|
|
10
|
+
* import { MCPWebBridgeBun } from '@mcp-web/bridge';
|
|
11
|
+
*
|
|
12
|
+
* const bridge = new MCPWebBridgeBun({
|
|
13
|
+
* name: 'My App',
|
|
14
|
+
* description: 'My awesome app',
|
|
15
|
+
* port: 3001,
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Bridge is now listening on ws://localhost:3001 and http://localhost:3001
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @example Production deployment
|
|
22
|
+
* ```typescript
|
|
23
|
+
* import { MCPWebBridgeBun } from '@mcp-web/bridge';
|
|
24
|
+
*
|
|
25
|
+
* const bridge = new MCPWebBridgeBun({
|
|
26
|
+
* name: 'Production Bridge',
|
|
27
|
+
* description: 'Production MCP Web bridge server',
|
|
28
|
+
* port: Number(process.env.PORT) || 3001,
|
|
29
|
+
* hostname: '0.0.0.0',
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* // Graceful shutdown
|
|
33
|
+
* process.on('SIGTERM', async () => {
|
|
34
|
+
* await bridge.close();
|
|
35
|
+
* process.exit(0);
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @remarks
|
|
40
|
+
* This adapter requires Bun runtime (https://bun.sh).
|
|
41
|
+
* Bun's `Bun.serve()` provides excellent performance with native WebSocket support.
|
|
42
|
+
*
|
|
43
|
+
* Key features:
|
|
44
|
+
* - Single port for HTTP and WebSocket
|
|
45
|
+
* - Native TypeScript support
|
|
46
|
+
* - High performance HTTP and WebSocket handling
|
|
47
|
+
*
|
|
48
|
+
* @see https://bun.sh/docs/api/http
|
|
49
|
+
* @see https://bun.sh/docs/api/websockets
|
|
50
|
+
*/
|
|
51
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
52
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
53
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
54
|
+
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");
|
|
55
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
56
|
+
};
|
|
57
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
58
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
59
|
+
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");
|
|
60
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
61
|
+
};
|
|
62
|
+
var _MCPWebBridgeBun_core, _MCPWebBridgeBun_server, _MCPWebBridgeBun_port, _MCPWebBridgeBun_hostname;
|
|
63
|
+
import { MCPWebBridge } from '../core.js';
|
|
64
|
+
import { TimerScheduler } from '../runtime/scheduler.js';
|
|
65
|
+
import { isSSEResponse } from '../runtime/types.js';
|
|
66
|
+
/**
|
|
67
|
+
* Wraps a Bun ServerWebSocket in our runtime-agnostic interface.
|
|
68
|
+
*/
|
|
69
|
+
function createBunWebSocketWrapper() {
|
|
70
|
+
const messageHandlers = new Set();
|
|
71
|
+
// biome-ignore lint/suspicious/noExplicitAny: Bun's ServerWebSocket type varies
|
|
72
|
+
let wsSocket = null;
|
|
73
|
+
const wrapped = {
|
|
74
|
+
send(data) {
|
|
75
|
+
if (wsSocket?.readyState === 1) {
|
|
76
|
+
// OPEN
|
|
77
|
+
wsSocket.send(data);
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
close(code, reason) {
|
|
81
|
+
wsSocket?.close(code, reason);
|
|
82
|
+
},
|
|
83
|
+
get readyState() {
|
|
84
|
+
if (!wsSocket)
|
|
85
|
+
return 'CLOSED';
|
|
86
|
+
switch (wsSocket.readyState) {
|
|
87
|
+
case 0:
|
|
88
|
+
return 'CONNECTING';
|
|
89
|
+
case 1:
|
|
90
|
+
return 'OPEN';
|
|
91
|
+
case 2:
|
|
92
|
+
return 'CLOSING';
|
|
93
|
+
case 3:
|
|
94
|
+
default:
|
|
95
|
+
return 'CLOSED';
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
onMessage(handler) {
|
|
99
|
+
messageHandlers.add(handler);
|
|
100
|
+
},
|
|
101
|
+
offMessage(handler) {
|
|
102
|
+
messageHandlers.delete(handler);
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
wrapped,
|
|
107
|
+
messageHandlers,
|
|
108
|
+
// biome-ignore lint/suspicious/noExplicitAny: Bun's ServerWebSocket type varies
|
|
109
|
+
setSocket: (socket) => {
|
|
110
|
+
wsSocket = socket;
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Wraps a Bun Request in our runtime-agnostic HttpRequest interface.
|
|
116
|
+
*/
|
|
117
|
+
function wrapBunRequest(req) {
|
|
118
|
+
return {
|
|
119
|
+
method: req.method,
|
|
120
|
+
url: req.url,
|
|
121
|
+
headers: {
|
|
122
|
+
get(name) {
|
|
123
|
+
return req.headers.get(name);
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
text() {
|
|
127
|
+
return req.text();
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Bun adapter for MCPWebBridge.
|
|
133
|
+
* Provides a single-port server using Bun.serve() with native WebSocket support.
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* const bridge = new MCPWebBridgeBun({
|
|
138
|
+
* name: 'My App',
|
|
139
|
+
* description: 'My app',
|
|
140
|
+
* port: 3001,
|
|
141
|
+
* });
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export class MCPWebBridgeBun {
|
|
145
|
+
constructor(config) {
|
|
146
|
+
_MCPWebBridgeBun_core.set(this, void 0);
|
|
147
|
+
// biome-ignore lint/suspicious/noExplicitAny: Bun.Server type varies
|
|
148
|
+
_MCPWebBridgeBun_server.set(this, void 0);
|
|
149
|
+
_MCPWebBridgeBun_port.set(this, void 0);
|
|
150
|
+
_MCPWebBridgeBun_hostname.set(this, void 0);
|
|
151
|
+
__classPrivateFieldSet(this, _MCPWebBridgeBun_port, config.port ?? 3001, "f");
|
|
152
|
+
__classPrivateFieldSet(this, _MCPWebBridgeBun_hostname, config.hostname ?? '0.0.0.0', "f");
|
|
153
|
+
// Create the core with a timer-based scheduler
|
|
154
|
+
const scheduler = new TimerScheduler();
|
|
155
|
+
__classPrivateFieldSet(this, _MCPWebBridgeBun_core, new MCPWebBridge(config, scheduler), "f");
|
|
156
|
+
const handlers = __classPrivateFieldGet(this, _MCPWebBridgeBun_core, "f").getHandlers();
|
|
157
|
+
// Start Bun server with WebSocket support
|
|
158
|
+
// biome-ignore lint/suspicious/noExplicitAny: Bun global is runtime-specific
|
|
159
|
+
__classPrivateFieldSet(this, _MCPWebBridgeBun_server, globalThis.Bun.serve({
|
|
160
|
+
port: __classPrivateFieldGet(this, _MCPWebBridgeBun_port, "f"),
|
|
161
|
+
hostname: __classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f"),
|
|
162
|
+
// Handle HTTP requests
|
|
163
|
+
fetch: async (req, server) => {
|
|
164
|
+
const url = new URL(req.url);
|
|
165
|
+
// Handle WebSocket upgrade
|
|
166
|
+
if (req.headers.get('upgrade')?.toLowerCase() === 'websocket') {
|
|
167
|
+
const sessionId = url.searchParams.get('session');
|
|
168
|
+
if (!sessionId) {
|
|
169
|
+
return new Response('Missing session parameter', { status: 400 });
|
|
170
|
+
}
|
|
171
|
+
const { wrapped, messageHandlers, setSocket } = createBunWebSocketWrapper();
|
|
172
|
+
const success = server.upgrade(req, {
|
|
173
|
+
data: {
|
|
174
|
+
sessionId,
|
|
175
|
+
wrapped,
|
|
176
|
+
// Store these for the websocket handlers
|
|
177
|
+
messageHandlers,
|
|
178
|
+
setSocket,
|
|
179
|
+
handlers,
|
|
180
|
+
url,
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
if (success) {
|
|
184
|
+
return undefined; // Bun handles the upgrade
|
|
185
|
+
}
|
|
186
|
+
return new Response('WebSocket upgrade failed', { status: 500 });
|
|
187
|
+
}
|
|
188
|
+
// Handle regular HTTP requests
|
|
189
|
+
const wrappedReq = wrapBunRequest(req);
|
|
190
|
+
const httpResponse = await handlers.onHttpRequest(wrappedReq);
|
|
191
|
+
// Check if this is an SSE response
|
|
192
|
+
if (isSSEResponse(httpResponse)) {
|
|
193
|
+
// Create a ReadableStream for SSE
|
|
194
|
+
const stream = new ReadableStream({
|
|
195
|
+
start(controller) {
|
|
196
|
+
// Create writer function that sends SSE-formatted data
|
|
197
|
+
const writer = (data) => {
|
|
198
|
+
controller.enqueue(new TextEncoder().encode(`data: ${data}\n\n`));
|
|
199
|
+
};
|
|
200
|
+
// Set up the SSE stream
|
|
201
|
+
httpResponse.setup(writer, () => {
|
|
202
|
+
controller.close();
|
|
203
|
+
});
|
|
204
|
+
// Keep connection alive with periodic comments
|
|
205
|
+
const keepAlive = setInterval(() => {
|
|
206
|
+
try {
|
|
207
|
+
controller.enqueue(new TextEncoder().encode(': keepalive\n\n'));
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
clearInterval(keepAlive);
|
|
211
|
+
}
|
|
212
|
+
}, 30000);
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
return new Response(stream, {
|
|
216
|
+
status: httpResponse.status,
|
|
217
|
+
headers: httpResponse.headers,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
return new Response(httpResponse.body, {
|
|
221
|
+
status: httpResponse.status,
|
|
222
|
+
headers: httpResponse.headers,
|
|
223
|
+
});
|
|
224
|
+
},
|
|
225
|
+
// WebSocket handlers
|
|
226
|
+
websocket: {
|
|
227
|
+
// biome-ignore lint/suspicious/noExplicitAny: Bun's ServerWebSocket type varies
|
|
228
|
+
open(ws) {
|
|
229
|
+
const data = ws.data;
|
|
230
|
+
// Connect the socket to the wrapper
|
|
231
|
+
data.setSocket(ws);
|
|
232
|
+
// Notify the bridge
|
|
233
|
+
data.handlers.onWebSocketConnect(data.sessionId, data.wrapped, data.url);
|
|
234
|
+
},
|
|
235
|
+
// biome-ignore lint/suspicious/noExplicitAny: Bun's ServerWebSocket type varies
|
|
236
|
+
message(ws, message) {
|
|
237
|
+
const data = ws.data;
|
|
238
|
+
const str = typeof message === 'string' ? message : message.toString();
|
|
239
|
+
// Notify message handlers
|
|
240
|
+
for (const handler of data.messageHandlers) {
|
|
241
|
+
handler(str);
|
|
242
|
+
}
|
|
243
|
+
// Notify the bridge
|
|
244
|
+
data.handlers.onWebSocketMessage(data.sessionId, data.wrapped, str);
|
|
245
|
+
},
|
|
246
|
+
// biome-ignore lint/suspicious/noExplicitAny: Bun's ServerWebSocket type varies
|
|
247
|
+
close(ws) {
|
|
248
|
+
const data = ws.data;
|
|
249
|
+
data.handlers.onWebSocketClose(data.sessionId);
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
}), "f");
|
|
253
|
+
console.log(`🌉 MCP Web Bridge (Bun) listening on ${__classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f")}:${__classPrivateFieldGet(this, _MCPWebBridgeBun_port, "f")}`);
|
|
254
|
+
console.log(` WebSocket: ws://${__classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f") === '0.0.0.0' ? 'localhost' : __classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f")}:${__classPrivateFieldGet(this, _MCPWebBridgeBun_port, "f")}`);
|
|
255
|
+
console.log(` HTTP/MCP: http://${__classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f") === '0.0.0.0' ? 'localhost' : __classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f")}:${__classPrivateFieldGet(this, _MCPWebBridgeBun_port, "f")}`);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get the underlying MCPWebBridge core instance.
|
|
259
|
+
*/
|
|
260
|
+
get core() {
|
|
261
|
+
return __classPrivateFieldGet(this, _MCPWebBridgeBun_core, "f");
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get the bridge handlers for custom integrations.
|
|
265
|
+
*/
|
|
266
|
+
getHandlers() {
|
|
267
|
+
return __classPrivateFieldGet(this, _MCPWebBridgeBun_core, "f").getHandlers();
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Get the port the server is listening on.
|
|
271
|
+
*/
|
|
272
|
+
get port() {
|
|
273
|
+
return __classPrivateFieldGet(this, _MCPWebBridgeBun_port, "f");
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Gracefully shut down the bridge.
|
|
277
|
+
*/
|
|
278
|
+
async close() {
|
|
279
|
+
// Stop the server
|
|
280
|
+
__classPrivateFieldGet(this, _MCPWebBridgeBun_server, "f")?.stop();
|
|
281
|
+
// Close the core (cleans up sessions, timers)
|
|
282
|
+
await __classPrivateFieldGet(this, _MCPWebBridgeBun_core, "f").close();
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
_MCPWebBridgeBun_core = new WeakMap(), _MCPWebBridgeBun_server = new WeakMap(), _MCPWebBridgeBun_port = new WeakMap(), _MCPWebBridgeBun_hostname = new WeakMap();
|
|
286
|
+
//# sourceMappingURL=bun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bun.js","sourceRoot":"","sources":["../../src/adapters/bun.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCPWebBridgeDeno - Deno adapter for the MCP Web Bridge.
|
|
3
|
+
*
|
|
4
|
+
* Uses Deno.serve() with WebSocket upgrade for a single-port server.
|
|
5
|
+
* Handles both HTTP requests and WebSocket connections on the same port.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // main.ts
|
|
10
|
+
* import { MCPWebBridgeDeno } from '@mcp-web/bridge';
|
|
11
|
+
*
|
|
12
|
+
* const bridge = new MCPWebBridgeDeno({
|
|
13
|
+
* name: 'My App',
|
|
14
|
+
* description: 'My awesome app',
|
|
15
|
+
* port: 3001,
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Bridge is now listening on ws://localhost:3001 and http://localhost:3001
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @example Deploy to Deno Deploy
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // main.ts - Entry point for Deno Deploy
|
|
24
|
+
* import { MCPWebBridgeDeno } from '@mcp-web/bridge';
|
|
25
|
+
*
|
|
26
|
+
* new MCPWebBridgeDeno({
|
|
27
|
+
* name: 'My Production App',
|
|
28
|
+
* description: 'Production bridge server',
|
|
29
|
+
* // Port is typically provided by Deno Deploy via environment
|
|
30
|
+
* port: Number(Deno.env.get('PORT')) || 8000,
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @remarks
|
|
35
|
+
* This adapter requires Deno runtime. It uses:
|
|
36
|
+
* - `Deno.serve()` for the HTTP server
|
|
37
|
+
* - `Deno.upgradeWebSocket()` for WebSocket connections
|
|
38
|
+
*
|
|
39
|
+
* For Deno Deploy, ensure your entry point is at the root of your repository
|
|
40
|
+
* or configure the entry point in your deployment settings.
|
|
41
|
+
*
|
|
42
|
+
* @see https://docs.deno.com/deploy/
|
|
43
|
+
* @see https://deno.land/api?s=Deno.serve
|
|
44
|
+
*/
|
|
45
|
+
import type { MCPWebConfig } from '@mcp-web/types';
|
|
46
|
+
import { MCPWebBridge } from '../core.js';
|
|
47
|
+
/**
|
|
48
|
+
* Configuration for the Deno bridge adapter.
|
|
49
|
+
*/
|
|
50
|
+
export interface MCPWebBridgeDenoConfig extends Omit<MCPWebConfig, 'bridgeUrl'> {
|
|
51
|
+
/** Port to listen on (default: 3001, or PORT env var on Deno Deploy) */
|
|
52
|
+
port?: number;
|
|
53
|
+
/** Hostname to bind to (default: '0.0.0.0') */
|
|
54
|
+
hostname?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Deno adapter for MCPWebBridge.
|
|
58
|
+
* Provides a single-port server using Deno.serve() with WebSocket upgrade.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* const bridge = new MCPWebBridgeDeno({
|
|
63
|
+
* name: 'My App',
|
|
64
|
+
* description: 'My app',
|
|
65
|
+
* port: 3001,
|
|
66
|
+
* });
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export declare class MCPWebBridgeDeno {
|
|
70
|
+
#private;
|
|
71
|
+
constructor(config: MCPWebBridgeDenoConfig);
|
|
72
|
+
/**
|
|
73
|
+
* Get the underlying MCPWebBridge core instance.
|
|
74
|
+
*/
|
|
75
|
+
get core(): MCPWebBridge;
|
|
76
|
+
/**
|
|
77
|
+
* Get the bridge handlers for custom integrations.
|
|
78
|
+
*/
|
|
79
|
+
getHandlers(): import("../runtime/types.js").BridgeHandlers;
|
|
80
|
+
/**
|
|
81
|
+
* Get the port the server is listening on.
|
|
82
|
+
*/
|
|
83
|
+
get port(): number;
|
|
84
|
+
/**
|
|
85
|
+
* Gracefully shut down the bridge.
|
|
86
|
+
*/
|
|
87
|
+
close(): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=deno.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deno.d.ts","sourceRoot":"","sources":["../../src/adapters/deno.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK1C;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;IAC7E,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoED;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;;gBAMf,MAAM,EAAE,sBAAsB;IAuG1C;;OAEG;IACH,IAAI,IAAI,IAAI,YAAY,CAEvB;IAED;;OAEG;IACH,WAAW;IAIX;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCPWebBridgeDeno - Deno adapter for the MCP Web Bridge.
|
|
3
|
+
*
|
|
4
|
+
* Uses Deno.serve() with WebSocket upgrade for a single-port server.
|
|
5
|
+
* Handles both HTTP requests and WebSocket connections on the same port.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // main.ts
|
|
10
|
+
* import { MCPWebBridgeDeno } from '@mcp-web/bridge';
|
|
11
|
+
*
|
|
12
|
+
* const bridge = new MCPWebBridgeDeno({
|
|
13
|
+
* name: 'My App',
|
|
14
|
+
* description: 'My awesome app',
|
|
15
|
+
* port: 3001,
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Bridge is now listening on ws://localhost:3001 and http://localhost:3001
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @example Deploy to Deno Deploy
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // main.ts - Entry point for Deno Deploy
|
|
24
|
+
* import { MCPWebBridgeDeno } from '@mcp-web/bridge';
|
|
25
|
+
*
|
|
26
|
+
* new MCPWebBridgeDeno({
|
|
27
|
+
* name: 'My Production App',
|
|
28
|
+
* description: 'Production bridge server',
|
|
29
|
+
* // Port is typically provided by Deno Deploy via environment
|
|
30
|
+
* port: Number(Deno.env.get('PORT')) || 8000,
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @remarks
|
|
35
|
+
* This adapter requires Deno runtime. It uses:
|
|
36
|
+
* - `Deno.serve()` for the HTTP server
|
|
37
|
+
* - `Deno.upgradeWebSocket()` for WebSocket connections
|
|
38
|
+
*
|
|
39
|
+
* For Deno Deploy, ensure your entry point is at the root of your repository
|
|
40
|
+
* or configure the entry point in your deployment settings.
|
|
41
|
+
*
|
|
42
|
+
* @see https://docs.deno.com/deploy/
|
|
43
|
+
* @see https://deno.land/api?s=Deno.serve
|
|
44
|
+
*/
|
|
45
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
46
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
47
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
48
|
+
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");
|
|
49
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
50
|
+
};
|
|
51
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
52
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
53
|
+
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");
|
|
54
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
55
|
+
};
|
|
56
|
+
var _MCPWebBridgeDeno_core, _MCPWebBridgeDeno_controller, _MCPWebBridgeDeno_port, _MCPWebBridgeDeno_hostname;
|
|
57
|
+
import { MCPWebBridge } from '../core.js';
|
|
58
|
+
import { TimerScheduler } from '../runtime/scheduler.js';
|
|
59
|
+
import { isSSEResponse } from '../runtime/types.js';
|
|
60
|
+
/**
|
|
61
|
+
* Wraps a Deno WebSocket in our runtime-agnostic interface.
|
|
62
|
+
*/
|
|
63
|
+
function wrapDenoWebSocket(socket) {
|
|
64
|
+
const messageHandlers = new Set();
|
|
65
|
+
socket.onmessage = (event) => {
|
|
66
|
+
const data = typeof event.data === 'string' ? event.data : event.data.toString();
|
|
67
|
+
for (const handler of messageHandlers) {
|
|
68
|
+
handler(data);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
send(data) {
|
|
73
|
+
if (socket.readyState === WebSocket.OPEN) {
|
|
74
|
+
socket.send(data);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
close(code, reason) {
|
|
78
|
+
socket.close(code, reason);
|
|
79
|
+
},
|
|
80
|
+
get readyState() {
|
|
81
|
+
switch (socket.readyState) {
|
|
82
|
+
case WebSocket.CONNECTING:
|
|
83
|
+
return 'CONNECTING';
|
|
84
|
+
case WebSocket.OPEN:
|
|
85
|
+
return 'OPEN';
|
|
86
|
+
case WebSocket.CLOSING:
|
|
87
|
+
return 'CLOSING';
|
|
88
|
+
case WebSocket.CLOSED:
|
|
89
|
+
default:
|
|
90
|
+
return 'CLOSED';
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
onMessage(handler) {
|
|
94
|
+
messageHandlers.add(handler);
|
|
95
|
+
},
|
|
96
|
+
offMessage(handler) {
|
|
97
|
+
messageHandlers.delete(handler);
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Wraps a Deno Request in our runtime-agnostic HttpRequest interface.
|
|
103
|
+
*/
|
|
104
|
+
function wrapDenoRequest(req) {
|
|
105
|
+
return {
|
|
106
|
+
method: req.method,
|
|
107
|
+
url: req.url,
|
|
108
|
+
headers: {
|
|
109
|
+
get(name) {
|
|
110
|
+
return req.headers.get(name);
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
text() {
|
|
114
|
+
return req.text();
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Deno adapter for MCPWebBridge.
|
|
120
|
+
* Provides a single-port server using Deno.serve() with WebSocket upgrade.
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* const bridge = new MCPWebBridgeDeno({
|
|
125
|
+
* name: 'My App',
|
|
126
|
+
* description: 'My app',
|
|
127
|
+
* port: 3001,
|
|
128
|
+
* });
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export class MCPWebBridgeDeno {
|
|
132
|
+
constructor(config) {
|
|
133
|
+
_MCPWebBridgeDeno_core.set(this, void 0);
|
|
134
|
+
_MCPWebBridgeDeno_controller.set(this, void 0);
|
|
135
|
+
_MCPWebBridgeDeno_port.set(this, void 0);
|
|
136
|
+
_MCPWebBridgeDeno_hostname.set(this, void 0);
|
|
137
|
+
// biome-ignore lint/suspicious/noExplicitAny: Deno global is runtime-specific
|
|
138
|
+
const Deno = globalThis.Deno;
|
|
139
|
+
const envPort = Deno?.env?.get?.('PORT');
|
|
140
|
+
__classPrivateFieldSet(this, _MCPWebBridgeDeno_port, config.port ?? (envPort ? Number(envPort) : 3001), "f");
|
|
141
|
+
__classPrivateFieldSet(this, _MCPWebBridgeDeno_hostname, config.hostname ?? '0.0.0.0', "f");
|
|
142
|
+
__classPrivateFieldSet(this, _MCPWebBridgeDeno_controller, new AbortController(), "f");
|
|
143
|
+
// Create the core with a timer-based scheduler
|
|
144
|
+
const scheduler = new TimerScheduler();
|
|
145
|
+
__classPrivateFieldSet(this, _MCPWebBridgeDeno_core, new MCPWebBridge(config, scheduler), "f");
|
|
146
|
+
const handlers = __classPrivateFieldGet(this, _MCPWebBridgeDeno_core, "f").getHandlers();
|
|
147
|
+
// Start Deno server
|
|
148
|
+
Deno.serve({
|
|
149
|
+
port: __classPrivateFieldGet(this, _MCPWebBridgeDeno_port, "f"),
|
|
150
|
+
hostname: __classPrivateFieldGet(this, _MCPWebBridgeDeno_hostname, "f"),
|
|
151
|
+
signal: __classPrivateFieldGet(this, _MCPWebBridgeDeno_controller, "f").signal,
|
|
152
|
+
onListen: ({ port, hostname }) => {
|
|
153
|
+
console.log(`🌉 MCP Web Bridge (Deno) listening on ${hostname}:${port}`);
|
|
154
|
+
console.log(` WebSocket: ws://${hostname === '0.0.0.0' ? 'localhost' : hostname}:${port}`);
|
|
155
|
+
console.log(` HTTP/MCP: http://${hostname === '0.0.0.0' ? 'localhost' : hostname}:${port}`);
|
|
156
|
+
},
|
|
157
|
+
}, async (req) => {
|
|
158
|
+
const url = new URL(req.url);
|
|
159
|
+
// Handle WebSocket upgrade
|
|
160
|
+
if (req.headers.get('upgrade')?.toLowerCase() === 'websocket') {
|
|
161
|
+
const sessionId = url.searchParams.get('session');
|
|
162
|
+
if (!sessionId) {
|
|
163
|
+
return new Response('Missing session parameter', { status: 400 });
|
|
164
|
+
}
|
|
165
|
+
const { socket, response } = Deno.upgradeWebSocket(req);
|
|
166
|
+
const wrapped = wrapDenoWebSocket(socket);
|
|
167
|
+
socket.onopen = () => {
|
|
168
|
+
handlers.onWebSocketConnect(sessionId, wrapped, url);
|
|
169
|
+
};
|
|
170
|
+
socket.onmessage = (event) => {
|
|
171
|
+
const data = typeof event.data === 'string' ? event.data : event.data.toString();
|
|
172
|
+
handlers.onWebSocketMessage(sessionId, wrapped, data);
|
|
173
|
+
};
|
|
174
|
+
socket.onclose = () => {
|
|
175
|
+
handlers.onWebSocketClose(sessionId);
|
|
176
|
+
};
|
|
177
|
+
socket.onerror = (error) => {
|
|
178
|
+
console.error(`WebSocket error for session ${sessionId}:`, error);
|
|
179
|
+
};
|
|
180
|
+
return response;
|
|
181
|
+
}
|
|
182
|
+
// Handle regular HTTP requests
|
|
183
|
+
const wrappedReq = wrapDenoRequest(req);
|
|
184
|
+
const httpResponse = await handlers.onHttpRequest(wrappedReq);
|
|
185
|
+
// Check if this is an SSE response
|
|
186
|
+
if (isSSEResponse(httpResponse)) {
|
|
187
|
+
// Create a ReadableStream for SSE
|
|
188
|
+
const stream = new ReadableStream({
|
|
189
|
+
start(controller) {
|
|
190
|
+
// Create writer function that sends SSE-formatted data
|
|
191
|
+
const writer = (data) => {
|
|
192
|
+
controller.enqueue(new TextEncoder().encode(`data: ${data}\n\n`));
|
|
193
|
+
};
|
|
194
|
+
// Set up the SSE stream
|
|
195
|
+
httpResponse.setup(writer, () => {
|
|
196
|
+
controller.close();
|
|
197
|
+
});
|
|
198
|
+
// Keep connection alive with periodic comments
|
|
199
|
+
const keepAlive = setInterval(() => {
|
|
200
|
+
try {
|
|
201
|
+
controller.enqueue(new TextEncoder().encode(': keepalive\n\n'));
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
clearInterval(keepAlive);
|
|
205
|
+
}
|
|
206
|
+
}, 30000);
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
return new Response(stream, {
|
|
210
|
+
status: httpResponse.status,
|
|
211
|
+
headers: httpResponse.headers,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return new Response(httpResponse.body, {
|
|
215
|
+
status: httpResponse.status,
|
|
216
|
+
headers: httpResponse.headers,
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get the underlying MCPWebBridge core instance.
|
|
222
|
+
*/
|
|
223
|
+
get core() {
|
|
224
|
+
return __classPrivateFieldGet(this, _MCPWebBridgeDeno_core, "f");
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get the bridge handlers for custom integrations.
|
|
228
|
+
*/
|
|
229
|
+
getHandlers() {
|
|
230
|
+
return __classPrivateFieldGet(this, _MCPWebBridgeDeno_core, "f").getHandlers();
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get the port the server is listening on.
|
|
234
|
+
*/
|
|
235
|
+
get port() {
|
|
236
|
+
return __classPrivateFieldGet(this, _MCPWebBridgeDeno_port, "f");
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Gracefully shut down the bridge.
|
|
240
|
+
*/
|
|
241
|
+
async close() {
|
|
242
|
+
// Abort the server
|
|
243
|
+
__classPrivateFieldGet(this, _MCPWebBridgeDeno_controller, "f").abort();
|
|
244
|
+
// Close the core (cleans up sessions, timers)
|
|
245
|
+
await __classPrivateFieldGet(this, _MCPWebBridgeDeno_core, "f").close();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
_MCPWebBridgeDeno_core = new WeakMap(), _MCPWebBridgeDeno_controller = new WeakMap(), _MCPWebBridgeDeno_port = new WeakMap(), _MCPWebBridgeDeno_hostname = new WeakMap();
|
|
249
|
+
//# sourceMappingURL=deno.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deno.js","sourceRoot":"","sources":["../../src/adapters/deno.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge adapters for different JavaScript runtimes.
|
|
3
|
+
*
|
|
4
|
+
* Each adapter wraps the core MCPWebBridge class and provides
|
|
5
|
+
* runtime-specific I/O implementations.
|
|
6
|
+
*
|
|
7
|
+
* Available adapters:
|
|
8
|
+
* - `MCPWebBridgeNode` - Node.js (production ready)
|
|
9
|
+
* - `MCPWebBridgeDeno` - Deno / Deno Deploy
|
|
10
|
+
* - `MCPWebBridgeBun` - Bun runtime
|
|
11
|
+
* - `MCPWebBridgeParty` / `createPartyKitBridge` - PartyKit / Cloudflare
|
|
12
|
+
*/
|
|
13
|
+
export { Bridge, MCPWebBridgeNode } from './node.js';
|
|
14
|
+
export type { MCPWebBridgeNodeConfig, MCPWebBridgeNodeSSLConfig } from './node.js';
|
|
15
|
+
export { MCPWebBridgeDeno } from './deno.js';
|
|
16
|
+
export type { MCPWebBridgeDenoConfig } from './deno.js';
|
|
17
|
+
export { MCPWebBridgeBun } from './bun.js';
|
|
18
|
+
export type { MCPWebBridgeBunConfig } from './bun.js';
|
|
19
|
+
export { AlarmScheduler, createPartyKitBridge, MCPWebBridgeParty } from './partykit.js';
|
|
20
|
+
export type { MCPWebBridgePartyConfig } from './partykit.js';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|