@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,372 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCPWebBridgeParty - PartyKit adapter for the MCP Web Bridge.
|
|
3
|
+
*
|
|
4
|
+
* Enables deployment to Cloudflare's edge network via PartyKit.
|
|
5
|
+
* Uses PartyKit's Party.Server interface with Durable Objects for state management.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // server.ts - PartyKit server entry point
|
|
10
|
+
* import { createPartyKitBridge } from '@mcp-web/bridge';
|
|
11
|
+
*
|
|
12
|
+
* export default createPartyKitBridge({
|
|
13
|
+
* name: 'My App',
|
|
14
|
+
* description: 'My awesome app on the edge',
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @example With partykit.json configuration
|
|
19
|
+
* ```json
|
|
20
|
+
* {
|
|
21
|
+
* "name": "my-mcp-bridge",
|
|
22
|
+
* "main": "server.ts",
|
|
23
|
+
* "compatibility_date": "2024-01-01"
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @example Deploy to PartyKit
|
|
28
|
+
* ```bash
|
|
29
|
+
* npx partykit deploy
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @remarks
|
|
33
|
+
* PartyKit provides:
|
|
34
|
+
* - Global edge deployment via Cloudflare
|
|
35
|
+
* - Durable Objects for stateful WebSocket handling
|
|
36
|
+
* - Hibernation support for cost efficiency
|
|
37
|
+
* - Alarms for scheduled tasks (used instead of setInterval)
|
|
38
|
+
*
|
|
39
|
+
* Key differences from other adapters:
|
|
40
|
+
* - No explicit port configuration (managed by PartyKit/Cloudflare)
|
|
41
|
+
* - Uses `Party.storage.setAlarm()` for session timeout checks
|
|
42
|
+
* - State can persist across hibernation cycles
|
|
43
|
+
*
|
|
44
|
+
* @see https://docs.partykit.io/
|
|
45
|
+
* @see https://docs.partykit.io/guides/scheduling-tasks-with-alarms/
|
|
46
|
+
*/
|
|
47
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
48
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
49
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
50
|
+
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");
|
|
51
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
52
|
+
};
|
|
53
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
54
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
55
|
+
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");
|
|
56
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
57
|
+
};
|
|
58
|
+
var _AlarmScheduler_instances, _AlarmScheduler_room, _AlarmScheduler_callbacks, _AlarmScheduler_intervals, _AlarmScheduler_nextAlarmId, _AlarmScheduler_updateAlarm;
|
|
59
|
+
import { MCPWebBridge } from '../core.js';
|
|
60
|
+
import { isSSEResponse } from '../runtime/types.js';
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Alarm-based Scheduler
|
|
63
|
+
// ============================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Scheduler implementation using PartyKit alarms.
|
|
66
|
+
*
|
|
67
|
+
* PartyKit only supports one alarm at a time per room, so this scheduler
|
|
68
|
+
* tracks multiple scheduled callbacks and uses the alarm for the soonest one.
|
|
69
|
+
*
|
|
70
|
+
* @see https://docs.partykit.io/guides/scheduling-tasks-with-alarms/
|
|
71
|
+
*/
|
|
72
|
+
export class AlarmScheduler {
|
|
73
|
+
constructor(room) {
|
|
74
|
+
_AlarmScheduler_instances.add(this);
|
|
75
|
+
_AlarmScheduler_room.set(this, void 0);
|
|
76
|
+
_AlarmScheduler_callbacks.set(this, new Map());
|
|
77
|
+
_AlarmScheduler_intervals.set(this, new Map());
|
|
78
|
+
_AlarmScheduler_nextAlarmId.set(this, null);
|
|
79
|
+
__classPrivateFieldSet(this, _AlarmScheduler_room, room, "f");
|
|
80
|
+
}
|
|
81
|
+
schedule(callback, delayMs) {
|
|
82
|
+
const id = crypto.randomUUID();
|
|
83
|
+
const fireAt = Date.now() + delayMs;
|
|
84
|
+
__classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f").set(id, { callback, fireAt });
|
|
85
|
+
__classPrivateFieldGet(this, _AlarmScheduler_instances, "m", _AlarmScheduler_updateAlarm).call(this);
|
|
86
|
+
return id;
|
|
87
|
+
}
|
|
88
|
+
cancel(id) {
|
|
89
|
+
__classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f").delete(id);
|
|
90
|
+
__classPrivateFieldGet(this, _AlarmScheduler_instances, "m", _AlarmScheduler_updateAlarm).call(this);
|
|
91
|
+
}
|
|
92
|
+
scheduleInterval(callback, intervalMs) {
|
|
93
|
+
const id = crypto.randomUUID();
|
|
94
|
+
const nextFireAt = Date.now() + intervalMs;
|
|
95
|
+
__classPrivateFieldGet(this, _AlarmScheduler_intervals, "f").set(id, { callback, intervalMs, nextFireAt });
|
|
96
|
+
__classPrivateFieldGet(this, _AlarmScheduler_instances, "m", _AlarmScheduler_updateAlarm).call(this);
|
|
97
|
+
return id;
|
|
98
|
+
}
|
|
99
|
+
cancelInterval(id) {
|
|
100
|
+
__classPrivateFieldGet(this, _AlarmScheduler_intervals, "f").delete(id);
|
|
101
|
+
__classPrivateFieldGet(this, _AlarmScheduler_instances, "m", _AlarmScheduler_updateAlarm).call(this);
|
|
102
|
+
}
|
|
103
|
+
dispose() {
|
|
104
|
+
__classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f").clear();
|
|
105
|
+
__classPrivateFieldGet(this, _AlarmScheduler_intervals, "f").clear();
|
|
106
|
+
__classPrivateFieldGet(this, _AlarmScheduler_room, "f").storage.deleteAlarm().catch(() => { });
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Called by the PartyKit server's onAlarm() handler.
|
|
110
|
+
* Executes due callbacks and reschedules the next alarm.
|
|
111
|
+
*/
|
|
112
|
+
async handleAlarm() {
|
|
113
|
+
const now = Date.now();
|
|
114
|
+
// Execute due one-time callbacks
|
|
115
|
+
for (const [id, { callback, fireAt }] of __classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f")) {
|
|
116
|
+
if (fireAt <= now) {
|
|
117
|
+
__classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f").delete(id);
|
|
118
|
+
try {
|
|
119
|
+
callback();
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.error('Alarm callback error:', error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Execute due interval callbacks and reschedule them
|
|
127
|
+
for (const [id, interval] of __classPrivateFieldGet(this, _AlarmScheduler_intervals, "f")) {
|
|
128
|
+
if (interval.nextFireAt <= now) {
|
|
129
|
+
interval.nextFireAt = now + interval.intervalMs;
|
|
130
|
+
try {
|
|
131
|
+
interval.callback();
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error('Interval callback error:', error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Schedule next alarm
|
|
139
|
+
await __classPrivateFieldGet(this, _AlarmScheduler_instances, "m", _AlarmScheduler_updateAlarm).call(this);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
_AlarmScheduler_room = new WeakMap(), _AlarmScheduler_callbacks = new WeakMap(), _AlarmScheduler_intervals = new WeakMap(), _AlarmScheduler_nextAlarmId = new WeakMap(), _AlarmScheduler_instances = new WeakSet(), _AlarmScheduler_updateAlarm = async function _AlarmScheduler_updateAlarm() {
|
|
143
|
+
// Find the soonest scheduled callback
|
|
144
|
+
let soonest = null;
|
|
145
|
+
for (const { fireAt } of __classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f").values()) {
|
|
146
|
+
if (soonest === null || fireAt < soonest) {
|
|
147
|
+
soonest = fireAt;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
for (const { nextFireAt } of __classPrivateFieldGet(this, _AlarmScheduler_intervals, "f").values()) {
|
|
151
|
+
if (soonest === null || nextFireAt < soonest) {
|
|
152
|
+
soonest = nextFireAt;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (soonest !== null) {
|
|
156
|
+
await __classPrivateFieldGet(this, _AlarmScheduler_room, "f").storage.setAlarm(soonest);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
await __classPrivateFieldGet(this, _AlarmScheduler_room, "f").storage.deleteAlarm();
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Wraps a PartyKit Connection in our runtime-agnostic interface.
|
|
164
|
+
*/
|
|
165
|
+
function wrapPartyConnection(connection) {
|
|
166
|
+
const messageHandlers = new Set();
|
|
167
|
+
return {
|
|
168
|
+
send(data) {
|
|
169
|
+
if (connection.readyState === 1) {
|
|
170
|
+
// OPEN
|
|
171
|
+
connection.send(data);
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
close(code, reason) {
|
|
175
|
+
connection.close(code, reason);
|
|
176
|
+
},
|
|
177
|
+
get readyState() {
|
|
178
|
+
switch (connection.readyState) {
|
|
179
|
+
case 0:
|
|
180
|
+
return 'CONNECTING';
|
|
181
|
+
case 1:
|
|
182
|
+
return 'OPEN';
|
|
183
|
+
case 2:
|
|
184
|
+
return 'CLOSING';
|
|
185
|
+
case 3:
|
|
186
|
+
default:
|
|
187
|
+
return 'CLOSED';
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
onMessage(handler) {
|
|
191
|
+
messageHandlers.add(handler);
|
|
192
|
+
},
|
|
193
|
+
offMessage(handler) {
|
|
194
|
+
messageHandlers.delete(handler);
|
|
195
|
+
},
|
|
196
|
+
// Internal: called by the PartyKit server to dispatch messages
|
|
197
|
+
_dispatchMessage(data) {
|
|
198
|
+
for (const handler of messageHandlers) {
|
|
199
|
+
handler(data);
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Wraps a PartyKit/Cloudflare Request in our runtime-agnostic HttpRequest interface.
|
|
206
|
+
*/
|
|
207
|
+
function wrapPartyRequest(req) {
|
|
208
|
+
return {
|
|
209
|
+
method: req.method,
|
|
210
|
+
url: req.url,
|
|
211
|
+
headers: {
|
|
212
|
+
get(name) {
|
|
213
|
+
return req.headers.get(name);
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
text() {
|
|
217
|
+
return req.text();
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// ============================================================================
|
|
222
|
+
// PartyKit Bridge Server
|
|
223
|
+
// ============================================================================
|
|
224
|
+
/**
|
|
225
|
+
* Creates a PartyKit-compatible bridge server class.
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```typescript
|
|
229
|
+
* // server.ts
|
|
230
|
+
* import { createPartyKitBridge } from '@mcp-web/bridge';
|
|
231
|
+
*
|
|
232
|
+
* export default createPartyKitBridge({
|
|
233
|
+
* name: 'My Bridge',
|
|
234
|
+
* description: 'MCP Web bridge on the edge',
|
|
235
|
+
* });
|
|
236
|
+
* ```
|
|
237
|
+
*/
|
|
238
|
+
export function createPartyKitBridge(config) {
|
|
239
|
+
var _MCPWebBridgeParty_room, _MCPWebBridgeParty_core, _MCPWebBridgeParty_scheduler, _MCPWebBridgeParty_connections, _MCPWebBridgeParty_connectionSessionIds, _a;
|
|
240
|
+
return _a = class MCPWebBridgeParty {
|
|
241
|
+
constructor(room) {
|
|
242
|
+
_MCPWebBridgeParty_room.set(this, void 0);
|
|
243
|
+
_MCPWebBridgeParty_core.set(this, void 0);
|
|
244
|
+
_MCPWebBridgeParty_scheduler.set(this, void 0);
|
|
245
|
+
_MCPWebBridgeParty_connections.set(this, new Map());
|
|
246
|
+
_MCPWebBridgeParty_connectionSessionIds.set(this, new Map()); // connectionId -> sessionId
|
|
247
|
+
__classPrivateFieldSet(this, _MCPWebBridgeParty_room, room, "f");
|
|
248
|
+
__classPrivateFieldSet(this, _MCPWebBridgeParty_scheduler, new AlarmScheduler(room), "f");
|
|
249
|
+
__classPrivateFieldSet(this, _MCPWebBridgeParty_core, new MCPWebBridge(config, __classPrivateFieldGet(this, _MCPWebBridgeParty_scheduler, "f")), "f");
|
|
250
|
+
console.log(`🌉 MCP Web Bridge (PartyKit) initialized for room: ${room.id}`);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Handle new WebSocket connections.
|
|
254
|
+
*/
|
|
255
|
+
async onConnect(connection, ctx) {
|
|
256
|
+
const url = new URL(ctx.request.url);
|
|
257
|
+
const sessionId = url.searchParams.get('session');
|
|
258
|
+
if (!sessionId) {
|
|
259
|
+
connection.close(1008, 'Missing session parameter');
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
const wrapped = wrapPartyConnection(connection);
|
|
263
|
+
__classPrivateFieldGet(this, _MCPWebBridgeParty_connections, "f").set(connection.id, wrapped);
|
|
264
|
+
__classPrivateFieldGet(this, _MCPWebBridgeParty_connectionSessionIds, "f").set(connection.id, sessionId);
|
|
265
|
+
const handlers = __classPrivateFieldGet(this, _MCPWebBridgeParty_core, "f").getHandlers();
|
|
266
|
+
handlers.onWebSocketConnect(sessionId, wrapped, url);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Handle incoming WebSocket messages.
|
|
270
|
+
*/
|
|
271
|
+
async onMessage(message, sender) {
|
|
272
|
+
const sessionId = __classPrivateFieldGet(this, _MCPWebBridgeParty_connectionSessionIds, "f").get(sender.id);
|
|
273
|
+
const wrapped = __classPrivateFieldGet(this, _MCPWebBridgeParty_connections, "f").get(sender.id);
|
|
274
|
+
if (!sessionId || !wrapped) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
// Dispatch to message handlers on the wrapper
|
|
278
|
+
wrapped._dispatchMessage(message);
|
|
279
|
+
// Notify the bridge core
|
|
280
|
+
const handlers = __classPrivateFieldGet(this, _MCPWebBridgeParty_core, "f").getHandlers();
|
|
281
|
+
handlers.onWebSocketMessage(sessionId, wrapped, message);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Handle WebSocket connection close.
|
|
285
|
+
*/
|
|
286
|
+
async onClose(connection) {
|
|
287
|
+
const sessionId = __classPrivateFieldGet(this, _MCPWebBridgeParty_connectionSessionIds, "f").get(connection.id);
|
|
288
|
+
if (sessionId) {
|
|
289
|
+
const handlers = __classPrivateFieldGet(this, _MCPWebBridgeParty_core, "f").getHandlers();
|
|
290
|
+
handlers.onWebSocketClose(sessionId);
|
|
291
|
+
}
|
|
292
|
+
__classPrivateFieldGet(this, _MCPWebBridgeParty_connections, "f").delete(connection.id);
|
|
293
|
+
__classPrivateFieldGet(this, _MCPWebBridgeParty_connectionSessionIds, "f").delete(connection.id);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Handle WebSocket errors.
|
|
297
|
+
*/
|
|
298
|
+
async onError(connection, error) {
|
|
299
|
+
const sessionId = __classPrivateFieldGet(this, _MCPWebBridgeParty_connectionSessionIds, "f").get(connection.id);
|
|
300
|
+
console.error(`WebSocket error for session ${sessionId}:`, error);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Handle HTTP requests (MCP JSON-RPC, query endpoints).
|
|
304
|
+
*/
|
|
305
|
+
async onRequest(request) {
|
|
306
|
+
const wrappedReq = wrapPartyRequest(request);
|
|
307
|
+
const handlers = __classPrivateFieldGet(this, _MCPWebBridgeParty_core, "f").getHandlers();
|
|
308
|
+
const httpResponse = await handlers.onHttpRequest(wrappedReq);
|
|
309
|
+
// Check if this is an SSE response
|
|
310
|
+
if (isSSEResponse(httpResponse)) {
|
|
311
|
+
// Create a ReadableStream for SSE
|
|
312
|
+
const stream = new ReadableStream({
|
|
313
|
+
start(controller) {
|
|
314
|
+
// Create writer function that sends SSE-formatted data
|
|
315
|
+
const writer = (data) => {
|
|
316
|
+
controller.enqueue(new TextEncoder().encode(`data: ${data}\n\n`));
|
|
317
|
+
};
|
|
318
|
+
// Set up the SSE stream
|
|
319
|
+
httpResponse.setup(writer, () => {
|
|
320
|
+
controller.close();
|
|
321
|
+
});
|
|
322
|
+
// Keep connection alive with periodic comments
|
|
323
|
+
const keepAlive = setInterval(() => {
|
|
324
|
+
try {
|
|
325
|
+
controller.enqueue(new TextEncoder().encode(': keepalive\n\n'));
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
clearInterval(keepAlive);
|
|
329
|
+
}
|
|
330
|
+
}, 30000);
|
|
331
|
+
},
|
|
332
|
+
});
|
|
333
|
+
return new Response(stream, {
|
|
334
|
+
status: httpResponse.status,
|
|
335
|
+
headers: httpResponse.headers,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
return new Response(httpResponse.body, {
|
|
339
|
+
status: httpResponse.status,
|
|
340
|
+
headers: httpResponse.headers,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Handle PartyKit alarms for scheduled tasks.
|
|
345
|
+
* @see https://docs.partykit.io/guides/scheduling-tasks-with-alarms/
|
|
346
|
+
*/
|
|
347
|
+
async onAlarm() {
|
|
348
|
+
await __classPrivateFieldGet(this, _MCPWebBridgeParty_scheduler, "f").handleAlarm();
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
_MCPWebBridgeParty_room = new WeakMap(),
|
|
352
|
+
_MCPWebBridgeParty_core = new WeakMap(),
|
|
353
|
+
_MCPWebBridgeParty_scheduler = new WeakMap(),
|
|
354
|
+
_MCPWebBridgeParty_connections = new WeakMap(),
|
|
355
|
+
_MCPWebBridgeParty_connectionSessionIds = new WeakMap(),
|
|
356
|
+
_a;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Pre-configured bridge class for direct export.
|
|
360
|
+
* Use `createPartyKitBridge()` if you need custom configuration.
|
|
361
|
+
*
|
|
362
|
+
* @example
|
|
363
|
+
* ```typescript
|
|
364
|
+
* // For simple cases where you configure via environment
|
|
365
|
+
* export { MCPWebBridgeParty } from '@mcp-web/bridge';
|
|
366
|
+
* ```
|
|
367
|
+
*/
|
|
368
|
+
export const MCPWebBridgeParty = createPartyKitBridge({
|
|
369
|
+
name: 'MCP Web Bridge',
|
|
370
|
+
description: 'MCP Web bridge server on PartyKit',
|
|
371
|
+
});
|
|
372
|
+
//# sourceMappingURL=partykit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partykit.js","sourceRoot":"","sources":["../../src/adapters/partykit.ts"],"names":[],"mappings":"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"}
|
package/dist/bridge.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|