skybridge 2.0.0-beta.dd3cba3 → 2.0.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/README.md +7 -7
- package/dist/server/app.d.ts +79 -60
- package/dist/server/app.js +61 -70
- package/dist/server/app.js.map +1 -1
- package/dist/server/app.test.js +97 -0
- package/dist/server/app.test.js.map +1 -0
- package/dist/server/auth/index.d.ts +19 -1
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/auth/providers/auth0.d.ts +2 -2
- package/dist/server/auth/providers/auth0.js +13 -8
- package/dist/server/auth/providers/auth0.js.map +1 -1
- package/dist/server/auth/providers/auth0.test.js +1 -1
- package/dist/server/auth/providers/auth0.test.js.map +1 -1
- package/dist/server/auth/providers/authplane.d.ts +2 -2
- package/dist/server/auth/providers/authplane.js.map +1 -1
- package/dist/server/auth/providers/authplane.test.js +10 -7
- package/dist/server/auth/providers/authplane.test.js.map +1 -1
- package/dist/server/auth/providers/clerk.d.ts +2 -2
- package/dist/server/auth/providers/clerk.js.map +1 -1
- package/dist/server/auth/providers/clerk.test.js +1 -1
- package/dist/server/auth/providers/clerk.test.js.map +1 -1
- package/dist/server/auth/providers/custom.d.ts +3 -3
- package/dist/server/auth/providers/custom.js +5 -2
- package/dist/server/auth/providers/custom.js.map +1 -1
- package/dist/server/auth/providers/custom.test.js +13 -10
- package/dist/server/auth/providers/custom.test.js.map +1 -1
- package/dist/server/auth/providers/descope.d.ts +2 -2
- package/dist/server/auth/providers/descope.js.map +1 -1
- package/dist/server/auth/providers/descope.test.js +3 -3
- package/dist/server/auth/providers/descope.test.js.map +1 -1
- package/dist/server/auth/providers/stytch.d.ts +2 -2
- package/dist/server/auth/providers/stytch.js.map +1 -1
- package/dist/server/auth/providers/workos.d.ts +2 -2
- package/dist/server/auth/providers/workos.js.map +1 -1
- package/dist/server/auth/setup.test.js +56 -54
- package/dist/server/auth/setup.test.js.map +1 -1
- package/dist/server/auth-extra.test-d.js +96 -37
- package/dist/server/auth-extra.test-d.js.map +1 -1
- package/dist/server/auth.d.ts +4 -4
- package/dist/server/auth.js +2 -2
- package/dist/server/auth.js.map +1 -1
- package/dist/server/build-manifest.test.js +1 -1
- package/dist/server/build-manifest.test.js.map +1 -1
- package/dist/server/express.d.ts +6 -6
- package/dist/server/express.js +16 -22
- package/dist/server/express.js.map +1 -1
- package/dist/server/express.test.js +120 -31
- package/dist/server/express.test.js.map +1 -1
- package/dist/server/index.d.ts +4 -3
- package/dist/server/index.js +2 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp-errors.test.js +5 -1
- package/dist/server/mcp-errors.test.js.map +1 -1
- package/dist/server/middleware.test.js +184 -135
- package/dist/server/middleware.test.js.map +1 -1
- package/dist/server/register-tool.test.js +8 -4
- package/dist/server/register-tool.test.js.map +1 -1
- package/dist/server/server.d.ts +20 -45
- package/dist/server/server.js +18 -63
- package/dist/server/server.js.map +1 -1
- package/dist/server/skills-integration.test.js +11 -4
- package/dist/server/skills-integration.test.js.map +1 -1
- package/dist/server/tool-extra.test.js +30 -14
- package/dist/server/tool-extra.test.js.map +1 -1
- package/dist/server/view-resource-resolution.test.js +7 -3
- package/dist/server/view-resource-resolution.test.js.map +1 -1
- package/dist/test/utils.d.ts +3 -3
- package/dist/test/utils.js +211 -197
- package/dist/test/utils.js.map +1 -1
- package/dist/test/view.test.js +19 -15
- package/dist/test/view.test.js.map +1 -1
- package/dist/web/generate-helpers.d.ts +15 -12
- package/dist/web/generate-helpers.js +15 -12
- package/dist/web/generate-helpers.js.map +1 -1
- package/package.json +2 -3
- package/dist/server/factory-loader.test.js +0 -81
- package/dist/server/factory-loader.test.js.map +0 -1
- /package/dist/server/{factory-loader.test.d.ts → app.test.d.ts} +0 -0
|
@@ -207,29 +207,37 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
207
207
|
return new Client({ name: "test-client", version: "1.0.0" });
|
|
208
208
|
}
|
|
209
209
|
it("returns this for chaining", () => {
|
|
210
|
-
new Skybridge({
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
210
|
+
new Skybridge({
|
|
211
|
+
name: "test",
|
|
212
|
+
version: "1.0.0",
|
|
213
|
+
handler: (server) => {
|
|
214
|
+
const result = server.mcpMiddleware(async (_req, _extra, next) => next());
|
|
215
|
+
expect(result).toBe(server);
|
|
216
|
+
return server;
|
|
217
|
+
},
|
|
214
218
|
});
|
|
215
219
|
});
|
|
216
220
|
it("intercepts tools/call and exposes request params", async () => {
|
|
217
221
|
let capturedMethod = "";
|
|
218
222
|
let capturedParams = {};
|
|
219
|
-
const app = new Skybridge({
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
223
|
+
const app = new Skybridge({
|
|
224
|
+
name: "test",
|
|
225
|
+
version: "1.0.0",
|
|
226
|
+
handler: (server) => {
|
|
227
|
+
server.registerTool({
|
|
228
|
+
name: "greet",
|
|
229
|
+
description: "greet",
|
|
230
|
+
inputSchema: { name: z.string() },
|
|
231
|
+
}, (args) => ({
|
|
232
|
+
content: [{ type: "text", text: `hi ${args.name}` }],
|
|
233
|
+
}));
|
|
234
|
+
server.mcpMiddleware("tools/call", async (request, _extra, next) => {
|
|
235
|
+
capturedMethod = request.method;
|
|
236
|
+
capturedParams = request.params;
|
|
237
|
+
return next();
|
|
238
|
+
});
|
|
239
|
+
return server;
|
|
240
|
+
},
|
|
233
241
|
});
|
|
234
242
|
const client = createClient();
|
|
235
243
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
@@ -251,15 +259,19 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
251
259
|
});
|
|
252
260
|
it("array filter works", async () => {
|
|
253
261
|
const matchedMethods = [];
|
|
254
|
-
const app = new Skybridge({
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
262
|
+
const app = new Skybridge({
|
|
263
|
+
name: "test",
|
|
264
|
+
version: "1.0.0",
|
|
265
|
+
handler: (server) => {
|
|
266
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
267
|
+
content: [{ type: "text", text: "ok" }],
|
|
268
|
+
}));
|
|
269
|
+
server.mcpMiddleware(["tools/call", "tools/list"], async (request, _extra, next) => {
|
|
270
|
+
matchedMethods.push(request.method);
|
|
271
|
+
return next();
|
|
272
|
+
});
|
|
273
|
+
return server;
|
|
274
|
+
},
|
|
263
275
|
});
|
|
264
276
|
const client = createClient();
|
|
265
277
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
@@ -272,27 +284,36 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
272
284
|
await client.close();
|
|
273
285
|
await instance.close();
|
|
274
286
|
});
|
|
275
|
-
it("throws when filter provided without handler", () => {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
287
|
+
it("throws when filter provided without handler", async () => {
|
|
288
|
+
const app = new Skybridge({
|
|
289
|
+
name: "test",
|
|
290
|
+
version: "1.0.0",
|
|
291
|
+
handler: (server) =>
|
|
292
|
+
// @ts-expect-error intentionally passing filter without handler
|
|
293
|
+
server.mcpMiddleware("tools/call"),
|
|
294
|
+
});
|
|
295
|
+
await expect(app.createServerInstance()).rejects.toThrow("mcpMiddleware requires a handler function");
|
|
279
296
|
});
|
|
280
297
|
it("catch-all middleware + filtered middleware stack correctly", async () => {
|
|
281
298
|
const calls = [];
|
|
282
|
-
const app = new Skybridge({
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
299
|
+
const app = new Skybridge({
|
|
300
|
+
name: "test",
|
|
301
|
+
version: "1.0.0",
|
|
302
|
+
handler: (server) => {
|
|
303
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
304
|
+
content: [{ type: "text", text: "ok" }],
|
|
305
|
+
}));
|
|
306
|
+
server
|
|
307
|
+
.mcpMiddleware(async (request, _extra, next) => {
|
|
308
|
+
calls.push(`global:${request.method}`);
|
|
309
|
+
return next();
|
|
310
|
+
})
|
|
311
|
+
.mcpMiddleware("tools/call", async (_req, _extra, next) => {
|
|
312
|
+
calls.push("tools-only");
|
|
313
|
+
return next();
|
|
314
|
+
});
|
|
315
|
+
return server;
|
|
316
|
+
},
|
|
296
317
|
});
|
|
297
318
|
const client = createClient();
|
|
298
319
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
@@ -315,15 +336,19 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
315
336
|
});
|
|
316
337
|
it("notification middleware receives extra as undefined", async () => {
|
|
317
338
|
let capturedExtra = "sentinel";
|
|
318
|
-
const app = new Skybridge({
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
339
|
+
const app = new Skybridge({
|
|
340
|
+
name: "test",
|
|
341
|
+
version: "1.0.0",
|
|
342
|
+
handler: (server) => {
|
|
343
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
344
|
+
content: [{ type: "text", text: "ok" }],
|
|
345
|
+
}));
|
|
346
|
+
server.mcpMiddleware("notification", async (_request, extra, next) => {
|
|
347
|
+
capturedExtra = extra;
|
|
348
|
+
return next();
|
|
349
|
+
});
|
|
350
|
+
return server;
|
|
351
|
+
},
|
|
327
352
|
});
|
|
328
353
|
const client = createClient();
|
|
329
354
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
@@ -338,15 +363,19 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
338
363
|
});
|
|
339
364
|
it("wildcard filter intercepts matching methods only", async () => {
|
|
340
365
|
const matchedMethods = [];
|
|
341
|
-
const app = new Skybridge({
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
366
|
+
const app = new Skybridge({
|
|
367
|
+
name: "test",
|
|
368
|
+
version: "1.0.0",
|
|
369
|
+
handler: (server) => {
|
|
370
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
371
|
+
content: [{ type: "text", text: "ok" }],
|
|
372
|
+
}));
|
|
373
|
+
server.mcpMiddleware("tools/*", async (request, _extra, next) => {
|
|
374
|
+
matchedMethods.push(request.method);
|
|
375
|
+
return next();
|
|
376
|
+
});
|
|
377
|
+
return server;
|
|
378
|
+
},
|
|
350
379
|
});
|
|
351
380
|
const client = createClient();
|
|
352
381
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
@@ -364,25 +393,29 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
364
393
|
await instance.close();
|
|
365
394
|
});
|
|
366
395
|
it("middleware can modify tool result via Skybridge integration", async () => {
|
|
367
|
-
const app = new Skybridge({
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
396
|
+
const app = new Skybridge({
|
|
397
|
+
name: "test",
|
|
398
|
+
version: "1.0.0",
|
|
399
|
+
handler: (server) => {
|
|
400
|
+
server.registerTool({
|
|
401
|
+
name: "greet",
|
|
402
|
+
description: "greet",
|
|
403
|
+
inputSchema: { name: z.string() },
|
|
404
|
+
}, (args) => ({
|
|
405
|
+
content: [{ type: "text", text: `hi ${args.name}` }],
|
|
406
|
+
}));
|
|
407
|
+
server.mcpMiddleware("tools/call", async (_req, _extra, next) => {
|
|
408
|
+
const result = (await next());
|
|
409
|
+
return {
|
|
410
|
+
...result,
|
|
411
|
+
content: [
|
|
412
|
+
...result.content,
|
|
413
|
+
{ type: "text", text: " (modified)" },
|
|
414
|
+
],
|
|
415
|
+
};
|
|
416
|
+
});
|
|
417
|
+
return server;
|
|
418
|
+
},
|
|
386
419
|
});
|
|
387
420
|
const client = createClient();
|
|
388
421
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
@@ -402,17 +435,21 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
402
435
|
});
|
|
403
436
|
it("middleware can short-circuit via Skybridge integration", async () => {
|
|
404
437
|
const handlerCalled = vi.fn();
|
|
405
|
-
const app = new Skybridge({
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
438
|
+
const app = new Skybridge({
|
|
439
|
+
name: "test",
|
|
440
|
+
version: "1.0.0",
|
|
441
|
+
handler: (server) => {
|
|
442
|
+
server.registerTool({ name: "t1", description: "t1" }, () => {
|
|
443
|
+
handlerCalled();
|
|
444
|
+
return {
|
|
445
|
+
content: [{ type: "text", text: "original" }],
|
|
446
|
+
};
|
|
447
|
+
});
|
|
448
|
+
server.mcpMiddleware("tools/call", async () => ({
|
|
449
|
+
content: [{ type: "text", text: "short-circuited" }],
|
|
450
|
+
}));
|
|
451
|
+
return server;
|
|
452
|
+
},
|
|
416
453
|
});
|
|
417
454
|
const client = createClient();
|
|
418
455
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
@@ -429,23 +466,27 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
429
466
|
const schemaError = new Error("boom with schema");
|
|
430
467
|
const schemalessError = new Error("boom without schema");
|
|
431
468
|
let captured;
|
|
432
|
-
const app = new Skybridge({
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
469
|
+
const app = new Skybridge({
|
|
470
|
+
name: "test",
|
|
471
|
+
version: "1.0.0",
|
|
472
|
+
handler: (server) => {
|
|
473
|
+
server.registerTool({
|
|
474
|
+
name: "withSchema",
|
|
475
|
+
description: "withSchema",
|
|
476
|
+
inputSchema: { name: z.string() },
|
|
477
|
+
}, () => {
|
|
478
|
+
throw schemaError;
|
|
479
|
+
});
|
|
480
|
+
server.registerTool({ name: "withoutSchema", description: "withoutSchema" }, () => {
|
|
481
|
+
throw schemalessError;
|
|
482
|
+
});
|
|
483
|
+
server.mcpMiddleware("tools/call", async (_request, extra, next) => {
|
|
484
|
+
const result = await next();
|
|
485
|
+
captured = getToolError(extra);
|
|
486
|
+
return result;
|
|
487
|
+
});
|
|
488
|
+
return server;
|
|
489
|
+
},
|
|
449
490
|
});
|
|
450
491
|
const client = createClient();
|
|
451
492
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
@@ -466,22 +507,26 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
466
507
|
});
|
|
467
508
|
it("middleware can mutate tool call params via Skybridge integration", async () => {
|
|
468
509
|
let receivedName = "";
|
|
469
|
-
const app = new Skybridge({
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
510
|
+
const app = new Skybridge({
|
|
511
|
+
name: "test",
|
|
512
|
+
version: "1.0.0",
|
|
513
|
+
handler: (server) => {
|
|
514
|
+
server.registerTool({
|
|
515
|
+
name: "greet",
|
|
516
|
+
description: "greet",
|
|
517
|
+
inputSchema: { name: z.string() },
|
|
518
|
+
}, (args) => {
|
|
519
|
+
receivedName = args.name;
|
|
520
|
+
return {
|
|
521
|
+
content: [{ type: "text", text: `hi ${args.name}` }],
|
|
522
|
+
};
|
|
523
|
+
});
|
|
524
|
+
server.mcpMiddleware("tools/call", async (request, _extra, next) => {
|
|
525
|
+
request.params.arguments = { name: "Overridden" };
|
|
526
|
+
return next();
|
|
527
|
+
});
|
|
528
|
+
return server;
|
|
529
|
+
},
|
|
485
530
|
});
|
|
486
531
|
const client = createClient();
|
|
487
532
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
@@ -498,15 +543,19 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
498
543
|
});
|
|
499
544
|
it("category 'request' filter matches requests but not notifications", async () => {
|
|
500
545
|
const matchedMethods = [];
|
|
501
|
-
const app = new Skybridge({
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
546
|
+
const app = new Skybridge({
|
|
547
|
+
name: "test",
|
|
548
|
+
version: "1.0.0",
|
|
549
|
+
handler: (server) => {
|
|
550
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
551
|
+
content: [{ type: "text", text: "ok" }],
|
|
552
|
+
}));
|
|
553
|
+
server.mcpMiddleware("request", async (request, _extra, next) => {
|
|
554
|
+
matchedMethods.push(request.method);
|
|
555
|
+
return next();
|
|
556
|
+
});
|
|
557
|
+
return server;
|
|
558
|
+
},
|
|
510
559
|
});
|
|
511
560
|
const client = createClient();
|
|
512
561
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|