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.
Files changed (78) hide show
  1. package/README.md +7 -7
  2. package/dist/server/app.d.ts +79 -60
  3. package/dist/server/app.js +61 -70
  4. package/dist/server/app.js.map +1 -1
  5. package/dist/server/app.test.js +97 -0
  6. package/dist/server/app.test.js.map +1 -0
  7. package/dist/server/auth/index.d.ts +19 -1
  8. package/dist/server/auth/index.js.map +1 -1
  9. package/dist/server/auth/providers/auth0.d.ts +2 -2
  10. package/dist/server/auth/providers/auth0.js +13 -8
  11. package/dist/server/auth/providers/auth0.js.map +1 -1
  12. package/dist/server/auth/providers/auth0.test.js +1 -1
  13. package/dist/server/auth/providers/auth0.test.js.map +1 -1
  14. package/dist/server/auth/providers/authplane.d.ts +2 -2
  15. package/dist/server/auth/providers/authplane.js.map +1 -1
  16. package/dist/server/auth/providers/authplane.test.js +10 -7
  17. package/dist/server/auth/providers/authplane.test.js.map +1 -1
  18. package/dist/server/auth/providers/clerk.d.ts +2 -2
  19. package/dist/server/auth/providers/clerk.js.map +1 -1
  20. package/dist/server/auth/providers/clerk.test.js +1 -1
  21. package/dist/server/auth/providers/clerk.test.js.map +1 -1
  22. package/dist/server/auth/providers/custom.d.ts +3 -3
  23. package/dist/server/auth/providers/custom.js +5 -2
  24. package/dist/server/auth/providers/custom.js.map +1 -1
  25. package/dist/server/auth/providers/custom.test.js +13 -10
  26. package/dist/server/auth/providers/custom.test.js.map +1 -1
  27. package/dist/server/auth/providers/descope.d.ts +2 -2
  28. package/dist/server/auth/providers/descope.js.map +1 -1
  29. package/dist/server/auth/providers/descope.test.js +3 -3
  30. package/dist/server/auth/providers/descope.test.js.map +1 -1
  31. package/dist/server/auth/providers/stytch.d.ts +2 -2
  32. package/dist/server/auth/providers/stytch.js.map +1 -1
  33. package/dist/server/auth/providers/workos.d.ts +2 -2
  34. package/dist/server/auth/providers/workos.js.map +1 -1
  35. package/dist/server/auth/setup.test.js +56 -54
  36. package/dist/server/auth/setup.test.js.map +1 -1
  37. package/dist/server/auth-extra.test-d.js +96 -37
  38. package/dist/server/auth-extra.test-d.js.map +1 -1
  39. package/dist/server/auth.d.ts +4 -4
  40. package/dist/server/auth.js +2 -2
  41. package/dist/server/auth.js.map +1 -1
  42. package/dist/server/build-manifest.test.js +1 -1
  43. package/dist/server/build-manifest.test.js.map +1 -1
  44. package/dist/server/express.d.ts +6 -6
  45. package/dist/server/express.js +16 -22
  46. package/dist/server/express.js.map +1 -1
  47. package/dist/server/express.test.js +120 -31
  48. package/dist/server/express.test.js.map +1 -1
  49. package/dist/server/index.d.ts +4 -3
  50. package/dist/server/index.js +2 -1
  51. package/dist/server/index.js.map +1 -1
  52. package/dist/server/mcp-errors.test.js +5 -1
  53. package/dist/server/mcp-errors.test.js.map +1 -1
  54. package/dist/server/middleware.test.js +184 -135
  55. package/dist/server/middleware.test.js.map +1 -1
  56. package/dist/server/register-tool.test.js +8 -4
  57. package/dist/server/register-tool.test.js.map +1 -1
  58. package/dist/server/server.d.ts +20 -45
  59. package/dist/server/server.js +18 -63
  60. package/dist/server/server.js.map +1 -1
  61. package/dist/server/skills-integration.test.js +11 -4
  62. package/dist/server/skills-integration.test.js.map +1 -1
  63. package/dist/server/tool-extra.test.js +30 -14
  64. package/dist/server/tool-extra.test.js.map +1 -1
  65. package/dist/server/view-resource-resolution.test.js +7 -3
  66. package/dist/server/view-resource-resolution.test.js.map +1 -1
  67. package/dist/test/utils.d.ts +3 -3
  68. package/dist/test/utils.js +211 -197
  69. package/dist/test/utils.js.map +1 -1
  70. package/dist/test/view.test.js +19 -15
  71. package/dist/test/view.test.js.map +1 -1
  72. package/dist/web/generate-helpers.d.ts +15 -12
  73. package/dist/web/generate-helpers.js +15 -12
  74. package/dist/web/generate-helpers.js.map +1 -1
  75. package/package.json +2 -3
  76. package/dist/server/factory-loader.test.js +0 -81
  77. package/dist/server/factory-loader.test.js.map +0 -1
  78. /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({ name: "test", version: "1.0.0" }, (server) => {
211
- const result = server.mcpMiddleware(async (_req, _extra, next) => next());
212
- expect(result).toBe(server);
213
- return server;
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({ name: "test", version: "1.0.0" }, (server) => {
220
- server.registerTool({
221
- name: "greet",
222
- description: "greet",
223
- inputSchema: { name: z.string() },
224
- }, (args) => ({
225
- content: [{ type: "text", text: `hi ${args.name}` }],
226
- }));
227
- server.mcpMiddleware("tools/call", async (request, _extra, next) => {
228
- capturedMethod = request.method;
229
- capturedParams = request.params;
230
- return next();
231
- });
232
- return server;
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({ name: "test", version: "1.0.0" }, (server) => {
255
- server.registerTool({ name: "t1", description: "t1" }, () => ({
256
- content: [{ type: "text", text: "ok" }],
257
- }));
258
- server.mcpMiddleware(["tools/call", "tools/list"], async (request, _extra, next) => {
259
- matchedMethods.push(request.method);
260
- return next();
261
- });
262
- return server;
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
- expect(() => new Skybridge({ name: "test", version: "1.0.0" }, (server) =>
277
- // @ts-expect-error intentionally passing filter without handler
278
- server.mcpMiddleware("tools/call"))).toThrow("mcpMiddleware requires a handler function");
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({ name: "test", version: "1.0.0" }, (server) => {
283
- server.registerTool({ name: "t1", description: "t1" }, () => ({
284
- content: [{ type: "text", text: "ok" }],
285
- }));
286
- server
287
- .mcpMiddleware(async (request, _extra, next) => {
288
- calls.push(`global:${request.method}`);
289
- return next();
290
- })
291
- .mcpMiddleware("tools/call", async (_req, _extra, next) => {
292
- calls.push("tools-only");
293
- return next();
294
- });
295
- return server;
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({ name: "test", version: "1.0.0" }, (server) => {
319
- server.registerTool({ name: "t1", description: "t1" }, () => ({
320
- content: [{ type: "text", text: "ok" }],
321
- }));
322
- server.mcpMiddleware("notification", async (_request, extra, next) => {
323
- capturedExtra = extra;
324
- return next();
325
- });
326
- return server;
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({ name: "test", version: "1.0.0" }, (server) => {
342
- server.registerTool({ name: "t1", description: "t1" }, () => ({
343
- content: [{ type: "text", text: "ok" }],
344
- }));
345
- server.mcpMiddleware("tools/*", async (request, _extra, next) => {
346
- matchedMethods.push(request.method);
347
- return next();
348
- });
349
- return server;
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({ name: "test", version: "1.0.0" }, (server) => {
368
- server.registerTool({
369
- name: "greet",
370
- description: "greet",
371
- inputSchema: { name: z.string() },
372
- }, (args) => ({
373
- content: [{ type: "text", text: `hi ${args.name}` }],
374
- }));
375
- server.mcpMiddleware("tools/call", async (_req, _extra, next) => {
376
- const result = (await next());
377
- return {
378
- ...result,
379
- content: [
380
- ...result.content,
381
- { type: "text", text: " (modified)" },
382
- ],
383
- };
384
- });
385
- return server;
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({ name: "test", version: "1.0.0" }, (server) => {
406
- server.registerTool({ name: "t1", description: "t1" }, () => {
407
- handlerCalled();
408
- return {
409
- content: [{ type: "text", text: "original" }],
410
- };
411
- });
412
- server.mcpMiddleware("tools/call", async () => ({
413
- content: [{ type: "text", text: "short-circuited" }],
414
- }));
415
- return server;
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({ name: "test", version: "1.0.0" }, (server) => {
433
- server.registerTool({
434
- name: "withSchema",
435
- description: "withSchema",
436
- inputSchema: { name: z.string() },
437
- }, () => {
438
- throw schemaError;
439
- });
440
- server.registerTool({ name: "withoutSchema", description: "withoutSchema" }, () => {
441
- throw schemalessError;
442
- });
443
- server.mcpMiddleware("tools/call", async (_request, extra, next) => {
444
- const result = await next();
445
- captured = getToolError(extra);
446
- return result;
447
- });
448
- return server;
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({ name: "test", version: "1.0.0" }, (server) => {
470
- server.registerTool({
471
- name: "greet",
472
- description: "greet",
473
- inputSchema: { name: z.string() },
474
- }, (args) => {
475
- receivedName = args.name;
476
- return {
477
- content: [{ type: "text", text: `hi ${args.name}` }],
478
- };
479
- });
480
- server.mcpMiddleware("tools/call", async (request, _extra, next) => {
481
- request.params.arguments = { name: "Overridden" };
482
- return next();
483
- });
484
- return server;
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({ name: "test", version: "1.0.0" }, (server) => {
502
- server.registerTool({ name: "t1", description: "t1" }, () => ({
503
- content: [{ type: "text", text: "ok" }],
504
- }));
505
- server.mcpMiddleware("request", async (request, _extra, next) => {
506
- matchedMethods.push(request.method);
507
- return next();
508
- });
509
- return server;
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();