agents 0.0.0-d4257c1 → 0.0.0-d6d6d60

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 (56) hide show
  1. package/dist/ai-chat-agent.d.ts +10 -10
  2. package/dist/ai-chat-agent.js +6 -6
  3. package/dist/ai-chat-agent.js.map +1 -1
  4. package/dist/{ai-chat-v5-migration-gdyLiTd8.js → ai-chat-v5-migration-DBHGW4Hv.js} +2 -2
  5. package/dist/{ai-chat-v5-migration-gdyLiTd8.js.map → ai-chat-v5-migration-DBHGW4Hv.js.map} +1 -1
  6. package/dist/ai-chat-v5-migration.js +1 -1
  7. package/dist/ai-react.d.ts +9 -9
  8. package/dist/ai-react.js +17 -11
  9. package/dist/ai-react.js.map +1 -1
  10. package/dist/{ai-types-UZlfLOYP.js → ai-types-B3aQaFv3.js} +2 -2
  11. package/dist/{ai-types-UZlfLOYP.js.map → ai-types-B3aQaFv3.js.map} +1 -1
  12. package/dist/{ai-types-BWW4umHY.d.ts → ai-types-D5YoPrBZ.d.ts} +2 -2
  13. package/dist/ai-types.d.ts +4 -4
  14. package/dist/ai-types.js +1 -1
  15. package/dist/cli.d.ts +8 -0
  16. package/dist/cli.js +27 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/{client-DjR-lC16.js → client-BfiZ3HQd.js} +3 -3
  19. package/dist/{client-DjR-lC16.js.map → client-BfiZ3HQd.js.map} +1 -1
  20. package/dist/{client-C-nwz-3N.d.ts → client-Bws9q38u.d.ts} +189 -75
  21. package/dist/{client-CmMi85Sj.d.ts → client-CbWe9FBd.d.ts} +10 -10
  22. package/dist/{client-CZBVDDoO.js → client-DvK0u9vD.js} +236 -124
  23. package/dist/client-DvK0u9vD.js.map +1 -0
  24. package/dist/client.d.ts +8 -8
  25. package/dist/client.js +2 -2
  26. package/dist/codemode/ai.js +5 -5
  27. package/dist/do-oauth-client-provider-CcTno-25.d.ts +142 -0
  28. package/dist/{do-oauth-client-provider-B2jr6UNq.js → do-oauth-client-provider-D2P1lSft.js} +3 -3
  29. package/dist/do-oauth-client-provider-D2P1lSft.js.map +1 -0
  30. package/dist/{index-CkQU40oY.d.ts → index-Bdzb2feZ.d.ts} +53 -39
  31. package/dist/{index-W4JUkafc.d.ts → index-DhJCaDWd.d.ts} +7 -3
  32. package/dist/index.d.ts +36 -36
  33. package/dist/index.js +5 -5
  34. package/dist/mcp/client.d.ts +4 -4
  35. package/dist/mcp/client.js +2 -1
  36. package/dist/mcp/do-oauth-client-provider.d.ts +1 -1
  37. package/dist/mcp/do-oauth-client-provider.js +1 -1
  38. package/dist/mcp/index.d.ts +127 -9
  39. package/dist/mcp/index.js +619 -26
  40. package/dist/mcp/index.js.map +1 -1
  41. package/dist/{mcp-BEwaCsxO.d.ts → mcp-Dw5vDrY8.d.ts} +2 -2
  42. package/dist/observability/index.d.ts +2 -2
  43. package/dist/observability/index.js +5 -5
  44. package/dist/{react-B4e1rDid.d.ts → react-DFNXTQzy.d.ts} +17 -17
  45. package/dist/react.d.ts +9 -9
  46. package/dist/react.js +1 -1
  47. package/dist/{serializable-gtr9YMhp.d.ts → serializable-CymX8ovI.d.ts} +8 -3
  48. package/dist/serializable.d.ts +5 -5
  49. package/dist/{src-COfG--3R.js → src-C1WWpbRo.js} +189 -121
  50. package/dist/src-C1WWpbRo.js.map +1 -0
  51. package/package.json +54 -39
  52. package/dist/client-CZBVDDoO.js.map +0 -1
  53. package/dist/do-oauth-client-provider-B2jr6UNq.js.map +0 -1
  54. package/dist/do-oauth-client-provider-CCwGwnrA.d.ts +0 -55
  55. package/dist/src-COfG--3R.js.map +0 -1
  56. package/src/index.ts +0 -2031
@@ -1,8 +1,9 @@
1
+ import { t as DurableObjectOAuthClientProvider } from "./do-oauth-client-provider-D2P1lSft.js";
1
2
  import { nanoid } from "nanoid";
2
3
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
3
- import { ElicitRequestSchema, PromptListChangedNotificationSchema, ResourceListChangedNotificationSchema, ToolListChangedNotificationSchema } from "@modelcontextprotocol/sdk/types.js";
4
4
  import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
5
5
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
6
+ import { ElicitRequestSchema, PromptListChangedNotificationSchema, ResourceListChangedNotificationSchema, ToolListChangedNotificationSchema } from "@modelcontextprotocol/sdk/types.js";
6
7
 
7
8
  //#region src/core/events.ts
8
9
  function toDisposable(fn) {
@@ -56,80 +57,6 @@ function isTransportNotImplemented(error) {
56
57
  return msg.includes("404") || msg.includes("405") || msg.includes("Not Implemented") || msg.includes("not implemented");
57
58
  }
58
59
 
59
- //#endregion
60
- //#region src/mcp/sse-edge.ts
61
- var SSEEdgeClientTransport = class extends SSEClientTransport {
62
- /**
63
- * Creates a new EdgeSSEClientTransport, which overrides fetch to be compatible with the CF workers environment
64
- */
65
- constructor(url, options) {
66
- const fetchOverride = async (fetchUrl, fetchInit = {}) => {
67
- const headers = await this.authHeaders();
68
- const workerOptions = {
69
- ...fetchInit,
70
- headers: {
71
- ...options.requestInit?.headers,
72
- ...fetchInit?.headers,
73
- ...headers
74
- }
75
- };
76
- delete workerOptions.mode;
77
- return options.eventSourceInit?.fetch?.(fetchUrl, workerOptions) || fetch(fetchUrl, workerOptions);
78
- };
79
- super(url, {
80
- ...options,
81
- eventSourceInit: {
82
- ...options.eventSourceInit,
83
- fetch: fetchOverride
84
- }
85
- });
86
- this.authProvider = options.authProvider;
87
- }
88
- async authHeaders() {
89
- if (this.authProvider) {
90
- const tokens = await this.authProvider.tokens();
91
- if (tokens) return { Authorization: `Bearer ${tokens.access_token}` };
92
- }
93
- }
94
- };
95
-
96
- //#endregion
97
- //#region src/mcp/streamable-http-edge.ts
98
- var StreamableHTTPEdgeClientTransport = class extends StreamableHTTPClientTransport {
99
- /**
100
- * Creates a new StreamableHTTPEdgeClientTransport, which overrides fetch to be compatible with the CF workers environment
101
- */
102
- constructor(url, options) {
103
- const fetchOverride = async (fetchUrl, fetchInit = {}) => {
104
- const headers = await this.authHeaders();
105
- const workerOptions = {
106
- ...fetchInit,
107
- headers: {
108
- ...options.requestInit?.headers,
109
- ...fetchInit?.headers,
110
- ...headers
111
- }
112
- };
113
- delete workerOptions.mode;
114
- return options.requestInit?.fetch?.(fetchUrl, workerOptions) || fetch(fetchUrl, workerOptions);
115
- };
116
- super(url, {
117
- ...options,
118
- requestInit: {
119
- ...options.requestInit,
120
- fetch: fetchOverride
121
- }
122
- });
123
- this.authProvider = options.authProvider;
124
- }
125
- async authHeaders() {
126
- if (this.authProvider) {
127
- const tokens = await this.authProvider.tokens();
128
- if (tokens) return { Authorization: `Bearer ${tokens.access_token}` };
129
- }
130
- }
131
- };
132
-
133
60
  //#endregion
134
61
  //#region src/mcp/client-connection.ts
135
62
  var MCPClientConnection = class {
@@ -375,8 +302,8 @@ var MCPClientConnection = class {
375
302
  */
376
303
  getTransport(transportType) {
377
304
  switch (transportType) {
378
- case "streamable-http": return new StreamableHTTPEdgeClientTransport(this.url, this.options.transport);
379
- case "sse": return new SSEEdgeClientTransport(this.url, this.options.transport);
305
+ case "streamable-http": return new StreamableHTTPClientTransport(this.url, this.options.transport);
306
+ case "sse": return new SSEClientTransport(this.url, this.options.transport);
380
307
  default: throw new Error(`Unsupported transport type: ${transportType}`);
381
308
  }
382
309
  }
@@ -458,26 +385,89 @@ var MCPClientManager = class {
458
385
  /**
459
386
  * @param _name Name of the MCP client
460
387
  * @param _version Version of the MCP Client
461
- * @param auth Auth paramters if being used to create a DurableObjectOAuthClientProvider
388
+ * @param options Storage adapter for persisting MCP server state
462
389
  */
463
- constructor(_name, _version) {
390
+ constructor(_name, _version, options) {
464
391
  this._name = _name;
465
392
  this._version = _version;
466
393
  this.mcpConnections = {};
467
- this._callbackUrls = [];
468
394
  this._didWarnAboutUnstableGetAITools = false;
469
395
  this._connectionDisposables = /* @__PURE__ */ new Map();
396
+ this._isRestored = false;
470
397
  this._onObservabilityEvent = new Emitter();
471
398
  this.onObservabilityEvent = this._onObservabilityEvent.event;
472
- this._onConnected = new Emitter();
473
- this.onConnected = this._onConnected.event;
399
+ this._onServerStateChanged = new Emitter();
400
+ this.onServerStateChanged = this._onServerStateChanged.event;
401
+ this._storage = options.storage;
402
+ }
403
+ /**
404
+ * Create an auth provider for a server
405
+ * @internal
406
+ */
407
+ createAuthProvider(serverId, callbackUrl, clientName, clientId) {
408
+ const authProvider = new DurableObjectOAuthClientProvider(this._storage, clientName, callbackUrl);
409
+ authProvider.serverId = serverId;
410
+ if (clientId) authProvider.clientId = clientId;
411
+ return authProvider;
412
+ }
413
+ /**
414
+ * Restore MCP server connections from storage
415
+ * This method is called on Agent initialization to restore previously connected servers
416
+ *
417
+ * @param clientName Name to use for OAuth client (typically the agent instance name)
418
+ */
419
+ async restoreConnectionsFromStorage(clientName) {
420
+ if (this._isRestored) return;
421
+ await this._storage.create();
422
+ const servers = await this._storage.listServers();
423
+ if (!servers || servers.length === 0) {
424
+ this._isRestored = true;
425
+ return;
426
+ }
427
+ for (const server of servers) {
428
+ const existingConn = this.mcpConnections[server.id];
429
+ if (existingConn) {
430
+ if (existingConn.connectionState === "ready") {
431
+ console.warn(`[MCPClientManager] Server ${server.id} already has a ready connection. Skipping recreation.`);
432
+ continue;
433
+ }
434
+ if (existingConn.connectionState === "authenticating" || existingConn.connectionState === "connecting" || existingConn.connectionState === "discovering") continue;
435
+ if (existingConn.connectionState === "failed") {
436
+ try {
437
+ await existingConn.client.close();
438
+ } catch (error) {
439
+ console.warn(`[MCPClientManager] Error closing failed connection ${server.id}:`, error);
440
+ }
441
+ delete this.mcpConnections[server.id];
442
+ this._connectionDisposables.get(server.id)?.dispose();
443
+ this._connectionDisposables.delete(server.id);
444
+ }
445
+ }
446
+ const parsedOptions = server.server_options ? JSON.parse(server.server_options) : null;
447
+ const authProvider = this.createAuthProvider(server.id, server.callback_url, clientName, server.client_id ?? void 0);
448
+ this.createConnection(server.id, server.server_url, {
449
+ client: parsedOptions?.client ?? {},
450
+ transport: {
451
+ ...parsedOptions?.transport ?? {},
452
+ type: parsedOptions?.transport?.type ?? "auto",
453
+ authProvider
454
+ }
455
+ });
456
+ await this.connectToServer(server.id).catch((error) => {
457
+ console.error(`Error restoring ${server.id}:`, error);
458
+ });
459
+ }
460
+ this._isRestored = true;
474
461
  }
475
462
  /**
476
463
  * Connect to and register an MCP server
477
464
  *
478
- * @param transportConfig Transport config
479
- * @param clientConfig Client config
480
- * @param capabilities Client capabilities (i.e. if the client supports roots/sampling)
465
+ * @deprecated This method is maintained for backward compatibility.
466
+ * For new code, use registerServer() and connectToServer() separately.
467
+ *
468
+ * @param url Server URL
469
+ * @param options Connection options
470
+ * @returns Object with server ID, auth URL (if OAuth), and client ID (if OAuth)
481
471
  */
482
472
  async connect(url, options = {}) {
483
473
  /**
@@ -487,10 +477,7 @@ var MCPClientManager = class {
487
477
  * .connect() is called on at least one server.
488
478
  * So it's safe to delay loading it until .connect() is called.
489
479
  */
490
- if (!this.jsonSchema) {
491
- const { jsonSchema } = await import("ai");
492
- this.jsonSchema = jsonSchema;
493
- }
480
+ await this.ensureJsonSchema();
494
481
  const id = options.reconnect?.id ?? nanoid(8);
495
482
  if (options.transport?.authProvider) {
496
483
  options.transport.authProvider.serverId = id;
@@ -536,35 +523,136 @@ var MCPClientManager = class {
536
523
  throw error;
537
524
  }
538
525
  const authUrl = options.transport?.authProvider?.authUrl;
539
- if (this.mcpConnections[id].connectionState === "authenticating" && authUrl && options.transport?.authProvider?.redirectUrl) {
540
- this._callbackUrls.push(options.transport.authProvider.redirectUrl.toString());
526
+ if (this.mcpConnections[id].connectionState === "authenticating" && authUrl && options.transport?.authProvider?.redirectUrl) return {
527
+ authUrl,
528
+ clientId: options.transport?.authProvider?.clientId,
529
+ id
530
+ };
531
+ return { id };
532
+ }
533
+ /**
534
+ * Create an in-memory connection object and set up observability
535
+ * Does NOT save to storage - use registerServer() for that
536
+ */
537
+ createConnection(id, url, options) {
538
+ if (this.mcpConnections[id]) return;
539
+ const normalizedTransport = {
540
+ ...options.transport,
541
+ type: options.transport?.type ?? "auto"
542
+ };
543
+ this.mcpConnections[id] = new MCPClientConnection(new URL(url), {
544
+ name: this._name,
545
+ version: this._version
546
+ }, {
547
+ client: options.client ?? {},
548
+ transport: normalizedTransport
549
+ });
550
+ const store = new DisposableStore();
551
+ const existing = this._connectionDisposables.get(id);
552
+ if (existing) existing.dispose();
553
+ this._connectionDisposables.set(id, store);
554
+ store.add(this.mcpConnections[id].onObservabilityEvent((event) => {
555
+ this._onObservabilityEvent.fire(event);
556
+ }));
557
+ }
558
+ /**
559
+ * Register an MCP server connection without connecting
560
+ * Creates the connection object, sets up observability, and saves to storage
561
+ *
562
+ * @param id Server ID
563
+ * @param options Registration options including URL, name, callback URL, and connection config
564
+ * @returns Server ID
565
+ */
566
+ async registerServer(id, options) {
567
+ this.createConnection(id, options.url, {
568
+ client: options.client,
569
+ transport: {
570
+ ...options.transport,
571
+ type: options.transport?.type ?? "auto"
572
+ }
573
+ });
574
+ await this._storage.saveServer({
575
+ id,
576
+ name: options.name,
577
+ server_url: options.url,
578
+ callback_url: options.callbackUrl,
579
+ client_id: options.clientId ?? null,
580
+ auth_url: options.authUrl ?? null,
581
+ server_options: JSON.stringify({
582
+ client: options.client,
583
+ transport: options.transport
584
+ })
585
+ });
586
+ this._onServerStateChanged.fire();
587
+ return id;
588
+ }
589
+ /**
590
+ * Connect to an already registered MCP server and initialize the connection.
591
+ *
592
+ * For OAuth servers, this returns `{ state: "authenticating", authUrl, clientId? }`
593
+ * without establishing the connection. The user must complete the OAuth flow via
594
+ * the authUrl, which will trigger a callback handled by `handleCallbackRequest()`.
595
+ *
596
+ * For non-OAuth servers, this establishes the connection immediately and returns
597
+ * `{ state: "ready" }`.
598
+ *
599
+ * Updates storage with auth URL and client ID after connection.
600
+ *
601
+ * @param id Server ID (must be registered first via registerServer())
602
+ * @returns Connection result with current state and OAuth info (if applicable)
603
+ */
604
+ async connectToServer(id) {
605
+ const conn = this.mcpConnections[id];
606
+ if (!conn) throw new Error(`Server ${id} is not registered. Call registerServer() first.`);
607
+ await conn.init();
608
+ const authUrl = conn.options.transport.authProvider?.authUrl;
609
+ if (conn.connectionState === "authenticating" && authUrl && conn.options.transport.authProvider?.redirectUrl) {
610
+ const clientId = conn.options.transport.authProvider?.clientId;
611
+ const serverRow = (await this._storage.listServers()).find((s) => s.id === id);
612
+ if (serverRow) await this._storage.saveServer({
613
+ ...serverRow,
614
+ auth_url: authUrl,
615
+ client_id: clientId ?? null
616
+ });
617
+ this._onServerStateChanged.fire();
541
618
  return {
619
+ state: "authenticating",
542
620
  authUrl,
543
- clientId: options.transport?.authProvider?.clientId,
544
- id
621
+ clientId
545
622
  };
546
623
  }
547
- return { id };
624
+ if (conn.connectionState === "ready") this._onServerStateChanged.fire();
625
+ return { state: "ready" };
548
626
  }
549
- isCallbackRequest(req) {
550
- return req.method === "GET" && !!this._callbackUrls.find((url) => {
551
- return req.url.startsWith(url);
552
- });
627
+ async isCallbackRequest(req) {
628
+ if (req.method !== "GET") return false;
629
+ if (!req.url.includes("/callback")) return false;
630
+ return (await this._storage.listServers()).some((server) => server.callback_url && req.url.startsWith(server.callback_url));
553
631
  }
554
632
  async handleCallbackRequest(req) {
555
633
  const url = new URL(req.url);
556
- const urlMatch = this._callbackUrls.find((url$1) => {
557
- return req.url.startsWith(url$1);
634
+ const matchingServer = (await this._storage.listServers()).find((server) => {
635
+ return server.callback_url && req.url.startsWith(server.callback_url);
558
636
  });
559
- if (!urlMatch) throw new Error(`No callback URI match found for the request url: ${req.url}. Was the request matched with \`isCallbackRequest()\`?`);
637
+ if (!matchingServer) throw new Error(`No callback URI match found for the request url: ${req.url}. Was the request matched with \`isCallbackRequest()\`?`);
638
+ const serverId = matchingServer.id;
560
639
  const code = url.searchParams.get("code");
561
640
  const state = url.searchParams.get("state");
562
- const urlParams = urlMatch.split("/");
563
- const serverId = urlParams[urlParams.length - 1];
641
+ const error = url.searchParams.get("error");
642
+ const errorDescription = url.searchParams.get("error_description");
643
+ if (error) return {
644
+ serverId,
645
+ authSuccess: false,
646
+ authError: errorDescription || error
647
+ };
564
648
  if (!code) throw new Error("Unauthorized: no code provided");
565
649
  if (!state) throw new Error("Unauthorized: no state provided");
566
650
  if (this.mcpConnections[serverId] === void 0) throw new Error(`Could not find serverId: ${serverId}`);
567
- if (this.mcpConnections[serverId].connectionState !== "authenticating") throw new Error("Failed to authenticate: the client isn't in the `authenticating` state");
651
+ if (this.mcpConnections[serverId].connectionState === "ready") return {
652
+ serverId,
653
+ authSuccess: true
654
+ };
655
+ if (this.mcpConnections[serverId].connectionState !== "authenticating") throw new Error(`Failed to authenticate: the client is in "${this.mcpConnections[serverId].connectionState}" state, expected "authenticating"`);
568
656
  const conn = this.mcpConnections[serverId];
569
657
  if (!conn.options.transport.authProvider) throw new Error("Trying to finalize authentication for a server connection without an authProvider");
570
658
  const clientId = conn.options.transport.authProvider.clientId || state;
@@ -572,15 +660,19 @@ var MCPClientManager = class {
572
660
  conn.options.transport.authProvider.serverId = serverId;
573
661
  try {
574
662
  await conn.completeAuthorization(code);
663
+ await this._storage.clearAuthUrl(serverId);
664
+ this._onServerStateChanged.fire();
575
665
  return {
576
666
  serverId,
577
667
  authSuccess: true
578
668
  };
579
- } catch (error) {
669
+ } catch (error$1) {
670
+ const errorMessage = error$1 instanceof Error ? error$1.message : String(error$1);
671
+ this._onServerStateChanged.fire();
580
672
  return {
581
673
  serverId,
582
674
  authSuccess: false,
583
- authError: error instanceof Error ? error.message : String(error)
675
+ authError: errorMessage
584
676
  };
585
677
  }
586
678
  }
@@ -603,7 +695,7 @@ var MCPClientManager = class {
603
695
  }
604
696
  try {
605
697
  await conn.establishConnection();
606
- this._onConnected.fire(serverId);
698
+ this._onServerStateChanged.fire();
607
699
  } catch (error) {
608
700
  const url = conn.url.toString();
609
701
  this._onObservabilityEvent.fire({
@@ -618,23 +710,10 @@ var MCPClientManager = class {
618
710
  timestamp: Date.now(),
619
711
  id: nanoid()
620
712
  });
713
+ this._onServerStateChanged.fire();
621
714
  }
622
715
  }
623
716
  /**
624
- * Register a callback URL for OAuth handling
625
- * @param url The callback URL to register
626
- */
627
- registerCallbackUrl(url) {
628
- if (!this._callbackUrls.includes(url)) this._callbackUrls.push(url);
629
- }
630
- /**
631
- * Unregister a callback URL
632
- * @param serverId The server ID whose callback URL should be removed
633
- */
634
- unregisterCallbackUrl(serverId) {
635
- this._callbackUrls = this._callbackUrls.filter((url) => !url.endsWith(`/${serverId}`));
636
- }
637
- /**
638
717
  * Configure OAuth callback handling
639
718
  * @param config OAuth callback configuration
640
719
  */
@@ -655,9 +734,28 @@ var MCPClientManager = class {
655
734
  return getNamespacedData(this.mcpConnections, "tools");
656
735
  }
657
736
  /**
737
+ * Lazy-loads the jsonSchema function from the AI SDK.
738
+ *
739
+ * This defers importing the "ai" package until it's actually needed, which helps reduce
740
+ * initial bundle size and startup time. The jsonSchema function is required for converting
741
+ * MCP tools into AI SDK tool definitions via getAITools().
742
+ *
743
+ * @internal This method is for internal use only. It's automatically called before operations
744
+ * that need jsonSchema (like getAITools() or OAuth flows). External consumers should not need
745
+ * to call this directly.
746
+ */
747
+ async ensureJsonSchema() {
748
+ if (!this.jsonSchema) {
749
+ const { jsonSchema } = await import("ai");
750
+ this.jsonSchema = jsonSchema;
751
+ }
752
+ }
753
+ /**
658
754
  * @returns a set of tools that you can use with the AI SDK
659
755
  */
660
756
  getAITools() {
757
+ if (!this.jsonSchema) throw new Error("jsonSchema not initialized.");
758
+ for (const [id, conn] of Object.entries(this.mcpConnections)) if (conn.connectionState !== "ready" && conn.connectionState !== "authenticating") console.warn(`[getAITools] WARNING: Reading tools from connection ${id} in state "${conn.connectionState}". Tools may not be loaded yet.`);
661
759
  return Object.fromEntries(getNamespacedData(this.mcpConnections, "tools").map((tool) => {
662
760
  return [`tool_${tool.serverId.replace(/-/g, "")}_${tool.name}`, {
663
761
  description: tool.description,
@@ -714,14 +812,28 @@ var MCPClientManager = class {
714
812
  this._connectionDisposables.delete(id);
715
813
  }
716
814
  /**
815
+ * Remove an MCP server from storage
816
+ */
817
+ async removeServer(serverId) {
818
+ await this._storage.removeServer(serverId);
819
+ this._onServerStateChanged.fire();
820
+ }
821
+ /**
822
+ * List all MCP servers from storage
823
+ */
824
+ async listServers() {
825
+ return await this._storage.listServers();
826
+ }
827
+ /**
717
828
  * Dispose the manager and all resources.
718
829
  */
719
830
  async dispose() {
720
831
  try {
721
832
  await this.closeAllConnections();
722
833
  } finally {
723
- this._onConnected.dispose();
834
+ this._onServerStateChanged.dispose();
724
835
  this._onObservabilityEvent.dispose();
836
+ await this._storage.destroy();
725
837
  }
726
838
  }
727
839
  /**
@@ -782,5 +894,5 @@ function getNamespacedData(mcpClients, type) {
782
894
  }
783
895
 
784
896
  //#endregion
785
- export { DisposableStore, MCPClientManager, SSEEdgeClientTransport, StreamableHTTPEdgeClientTransport, getNamespacedData };
786
- //# sourceMappingURL=client-CZBVDDoO.js.map
897
+ export { getNamespacedData as n, DisposableStore as r, MCPClientManager as t };
898
+ //# sourceMappingURL=client-DvK0u9vD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-DvK0u9vD.js","names":["url: URL","options: {\n transport: MCPTransportOptions;\n client: ConstructorParameters<typeof Client>[1];\n }","toolsAgg: Tool[]","toolsResult: ListToolsResult","resourcesAgg: Resource[]","resourcesResult: ListResourcesResult","promptsAgg: Prompt[]","promptsResult: ListPromptsResult","templatesAgg: ResourceTemplate[]","templatesResult: ListResourceTemplatesResult","transports: BaseTransportType[]","_name: string","_version: string","parsedOptions: MCPServerOptions | null","error"],"sources":["../src/core/events.ts","../src/mcp/errors.ts","../src/mcp/client-connection.ts","../src/mcp/client.ts"],"sourcesContent":["export interface Disposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): Disposable {\n return { dispose: fn };\n}\n\nexport class DisposableStore implements Disposable {\n private readonly _items: Disposable[] = [];\n\n add<T extends Disposable>(d: T): T {\n this._items.push(d);\n return d;\n }\n\n dispose(): void {\n while (this._items.length) {\n try {\n this._items.pop()!.dispose();\n } catch {\n // best-effort cleanup\n }\n }\n }\n}\n\nexport type Event<T> = (listener: (e: T) => void) => Disposable;\n\nexport class Emitter<T> implements Disposable {\n private _listeners: Set<(e: T) => void> = new Set();\n\n readonly event: Event<T> = (listener) => {\n this._listeners.add(listener);\n return toDisposable(() => this._listeners.delete(listener));\n };\n\n fire(data: T): void {\n for (const listener of [...this._listeners]) {\n try {\n listener(data);\n } catch (err) {\n // do not let one bad listener break others\n console.error(\"Emitter listener error:\", err);\n }\n }\n }\n\n dispose(): void {\n this._listeners.clear();\n }\n}\n","export function toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function isUnauthorized(error: unknown): boolean {\n const msg = toErrorMessage(error);\n return msg.includes(\"Unauthorized\") || msg.includes(\"401\");\n}\n\nexport function isTransportNotImplemented(error: unknown): boolean {\n const msg = toErrorMessage(error);\n // Treat common \"not implemented\" surfaces as transport not supported\n return (\n msg.includes(\"404\") ||\n msg.includes(\"405\") ||\n msg.includes(\"Not Implemented\") ||\n msg.includes(\"not implemented\")\n );\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport {\n SSEClientTransport,\n type SSEClientTransportOptions\n} from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport {\n StreamableHTTPClientTransport,\n type StreamableHTTPClientTransportOptions\n} from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\n// Import types directly from MCP SDK\nimport type {\n Prompt,\n Resource,\n Tool\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n type ClientCapabilities,\n type ElicitRequest,\n ElicitRequestSchema,\n type ElicitResult,\n type ListPromptsResult,\n type ListResourceTemplatesResult,\n type ListResourcesResult,\n type ListToolsResult,\n PromptListChangedNotificationSchema,\n ResourceListChangedNotificationSchema,\n type ResourceTemplate,\n type ServerCapabilities,\n ToolListChangedNotificationSchema\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { nanoid } from \"nanoid\";\nimport { Emitter, type Event } from \"../core/events\";\nimport type { MCPObservabilityEvent } from \"../observability/mcp\";\nimport type { AgentsOAuthProvider } from \"./do-oauth-client-provider\";\nimport {\n isTransportNotImplemented,\n isUnauthorized,\n toErrorMessage\n} from \"./errors\";\nimport type { BaseTransportType, TransportType } from \"./types\";\n\n/**\n * Connection state machine for MCP client connections.\n *\n * State transitions:\n * - Non-OAuth: init() → \"connecting\" → \"discovering\" → \"ready\"\n * - OAuth: init() → \"authenticating\" → (callback) → \"connecting\" → \"discovering\" → \"ready\"\n * - Any state can transition to \"failed\" on error\n */\nexport type MCPConnectionState =\n /**\n * Waiting for OAuth authorization to complete.\n * Server requires OAuth and user must complete the authorization flow.\n * Next state: \"connecting\" (after handleCallbackRequest + establishConnection)\n */\n | \"authenticating\"\n /**\n * Establishing transport connection to MCP server.\n * OAuth (if required) is complete, now connecting to the actual MCP endpoint.\n * Next state: \"discovering\" (after transport connected)\n */\n | \"connecting\"\n /**\n * Fully connected and ready to use.\n * Tools, resources, and prompts have been discovered and registered.\n * This is the terminal success state.\n */\n | \"ready\"\n /**\n * Discovering server capabilities (tools, resources, prompts).\n * Transport is connected, now fetching available capabilities via MCP protocol.\n * Next state: \"ready\" (after capabilities fetched)\n */\n | \"discovering\"\n /**\n * Connection failed at some point.\n * Check observability events for error details.\n * This is a terminal error state.\n */\n | \"failed\";\n\nexport type MCPTransportOptions = (\n | SSEClientTransportOptions\n | StreamableHTTPClientTransportOptions\n) & {\n authProvider?: AgentsOAuthProvider;\n type?: TransportType;\n};\n\nexport class MCPClientConnection {\n client: Client;\n connectionState: MCPConnectionState = \"connecting\";\n lastConnectedTransport: BaseTransportType | undefined;\n instructions?: string;\n tools: Tool[] = [];\n prompts: Prompt[] = [];\n resources: Resource[] = [];\n resourceTemplates: ResourceTemplate[] = [];\n serverCapabilities: ServerCapabilities | undefined;\n\n private readonly _onObservabilityEvent = new Emitter<MCPObservabilityEvent>();\n public readonly onObservabilityEvent: Event<MCPObservabilityEvent> =\n this._onObservabilityEvent.event;\n\n constructor(\n public url: URL,\n info: ConstructorParameters<typeof Client>[0],\n public options: {\n transport: MCPTransportOptions;\n client: ConstructorParameters<typeof Client>[1];\n } = { client: {}, transport: {} }\n ) {\n const clientOptions = {\n ...options.client,\n capabilities: {\n ...options.client?.capabilities,\n elicitation: {}\n } as ClientCapabilities\n };\n\n this.client = new Client(info, clientOptions);\n }\n\n /**\n * Initialize a client connection\n *\n * @returns\n */\n async init() {\n const transportType = this.options.transport.type;\n if (!transportType) {\n throw new Error(\"Transport type must be specified\");\n }\n\n try {\n await this.tryConnect(transportType);\n } catch (e) {\n if (isUnauthorized(e)) {\n // unauthorized, we should wait for the user to authenticate\n this.connectionState = \"authenticating\";\n return;\n }\n // For explicit transport mismatches or other errors, mark as failed\n // and do not throw to avoid bubbling errors to the client runtime.\n this._onObservabilityEvent.fire({\n type: \"mcp:client:connect\",\n displayMessage: `Connection initialization failed for ${this.url.toString()}`,\n payload: {\n url: this.url.toString(),\n transport: transportType,\n state: this.connectionState,\n error: toErrorMessage(e)\n },\n timestamp: Date.now(),\n id: nanoid()\n });\n this.connectionState = \"failed\";\n return;\n }\n\n await this.discoverAndRegister();\n }\n\n /**\n * Finish OAuth by probing transports based on configured type.\n * - Explicit: finish on that transport\n * - Auto: try streamable-http, then sse on 404/405/Not Implemented\n */\n private async finishAuthProbe(code: string): Promise<void> {\n if (!this.options.transport.authProvider) {\n throw new Error(\"No auth provider configured\");\n }\n\n const configuredType = this.options.transport.type;\n if (!configuredType) {\n throw new Error(\"Transport type must be specified\");\n }\n\n const finishAuth = async (base: BaseTransportType) => {\n const transport = this.getTransport(base);\n await transport.finishAuth(code);\n };\n\n if (configuredType === \"sse\" || configuredType === \"streamable-http\") {\n await finishAuth(configuredType);\n return;\n }\n\n // For \"auto\" mode, try streamable-http first, then fall back to SSE\n try {\n await finishAuth(\"streamable-http\");\n } catch (e) {\n if (isTransportNotImplemented(e)) {\n await finishAuth(\"sse\");\n return;\n }\n throw e;\n }\n }\n\n /**\n * Complete OAuth authorization\n */\n async completeAuthorization(code: string): Promise<void> {\n if (this.connectionState !== \"authenticating\") {\n throw new Error(\n \"Connection must be in authenticating state to complete authorization\"\n );\n }\n\n try {\n // Finish OAuth by probing transports per configuration\n await this.finishAuthProbe(code);\n\n // Mark as connecting\n this.connectionState = \"connecting\";\n } catch (error) {\n this.connectionState = \"failed\";\n throw error;\n }\n }\n\n /**\n * Establish connection after successful authorization\n */\n async establishConnection(): Promise<void> {\n if (this.connectionState !== \"connecting\") {\n throw new Error(\n \"Connection must be in connecting state to establish connection\"\n );\n }\n\n try {\n const transportType = this.options.transport.type;\n if (!transportType) {\n throw new Error(\"Transport type must be specified\");\n }\n await this.tryConnect(transportType);\n\n await this.discoverAndRegister();\n } catch (error) {\n this.connectionState = \"failed\";\n throw error;\n }\n }\n\n /**\n * Discover server capabilities and register tools, resources, prompts, and templates\n */\n private async discoverAndRegister(): Promise<void> {\n this.connectionState = \"discovering\";\n\n this.serverCapabilities = this.client.getServerCapabilities();\n if (!this.serverCapabilities) {\n throw new Error(\"The MCP Server failed to return server capabilities\");\n }\n\n const [\n instructionsResult,\n toolsResult,\n resourcesResult,\n promptsResult,\n resourceTemplatesResult\n ] = await Promise.allSettled([\n this.client.getInstructions(),\n this.registerTools(),\n this.registerResources(),\n this.registerPrompts(),\n this.registerResourceTemplates()\n ]);\n\n const operations = [\n { name: \"instructions\", result: instructionsResult },\n { name: \"tools\", result: toolsResult },\n { name: \"resources\", result: resourcesResult },\n { name: \"prompts\", result: promptsResult },\n { name: \"resource templates\", result: resourceTemplatesResult }\n ];\n\n for (const { name, result } of operations) {\n if (result.status === \"rejected\") {\n const url = this.url.toString();\n this._onObservabilityEvent.fire({\n type: \"mcp:client:discover\",\n displayMessage: `Failed to discover ${name} for ${url}`,\n payload: {\n url,\n capability: name,\n error: result.reason\n },\n timestamp: Date.now(),\n id: nanoid()\n });\n }\n }\n\n this.instructions =\n instructionsResult.status === \"fulfilled\"\n ? instructionsResult.value\n : undefined;\n this.tools = toolsResult.status === \"fulfilled\" ? toolsResult.value : [];\n this.resources =\n resourcesResult.status === \"fulfilled\" ? resourcesResult.value : [];\n this.prompts =\n promptsResult.status === \"fulfilled\" ? promptsResult.value : [];\n this.resourceTemplates =\n resourceTemplatesResult.status === \"fulfilled\"\n ? resourceTemplatesResult.value\n : [];\n\n this.connectionState = \"ready\";\n }\n\n /**\n * Notification handler registration\n */\n async registerTools(): Promise<Tool[]> {\n if (!this.serverCapabilities || !this.serverCapabilities.tools) {\n return [];\n }\n\n if (this.serverCapabilities.tools.listChanged) {\n this.client.setNotificationHandler(\n ToolListChangedNotificationSchema,\n async (_notification) => {\n this.tools = await this.fetchTools();\n }\n );\n }\n\n return this.fetchTools();\n }\n\n async registerResources(): Promise<Resource[]> {\n if (!this.serverCapabilities || !this.serverCapabilities.resources) {\n return [];\n }\n\n if (this.serverCapabilities.resources.listChanged) {\n this.client.setNotificationHandler(\n ResourceListChangedNotificationSchema,\n async (_notification) => {\n this.resources = await this.fetchResources();\n }\n );\n }\n\n return this.fetchResources();\n }\n\n async registerPrompts(): Promise<Prompt[]> {\n if (!this.serverCapabilities || !this.serverCapabilities.prompts) {\n return [];\n }\n\n if (this.serverCapabilities.prompts.listChanged) {\n this.client.setNotificationHandler(\n PromptListChangedNotificationSchema,\n async (_notification) => {\n this.prompts = await this.fetchPrompts();\n }\n );\n }\n\n return this.fetchPrompts();\n }\n\n async registerResourceTemplates(): Promise<ResourceTemplate[]> {\n if (!this.serverCapabilities || !this.serverCapabilities.resources) {\n return [];\n }\n\n return this.fetchResourceTemplates();\n }\n\n async fetchTools() {\n let toolsAgg: Tool[] = [];\n let toolsResult: ListToolsResult = { tools: [] };\n do {\n toolsResult = await this.client\n .listTools({\n cursor: toolsResult.nextCursor\n })\n .catch(this._capabilityErrorHandler({ tools: [] }, \"tools/list\"));\n toolsAgg = toolsAgg.concat(toolsResult.tools);\n } while (toolsResult.nextCursor);\n return toolsAgg;\n }\n\n async fetchResources() {\n let resourcesAgg: Resource[] = [];\n let resourcesResult: ListResourcesResult = { resources: [] };\n do {\n resourcesResult = await this.client\n .listResources({\n cursor: resourcesResult.nextCursor\n })\n .catch(\n this._capabilityErrorHandler({ resources: [] }, \"resources/list\")\n );\n resourcesAgg = resourcesAgg.concat(resourcesResult.resources);\n } while (resourcesResult.nextCursor);\n return resourcesAgg;\n }\n\n async fetchPrompts() {\n let promptsAgg: Prompt[] = [];\n let promptsResult: ListPromptsResult = { prompts: [] };\n do {\n promptsResult = await this.client\n .listPrompts({\n cursor: promptsResult.nextCursor\n })\n .catch(this._capabilityErrorHandler({ prompts: [] }, \"prompts/list\"));\n promptsAgg = promptsAgg.concat(promptsResult.prompts);\n } while (promptsResult.nextCursor);\n return promptsAgg;\n }\n\n async fetchResourceTemplates() {\n let templatesAgg: ResourceTemplate[] = [];\n let templatesResult: ListResourceTemplatesResult = {\n resourceTemplates: []\n };\n do {\n templatesResult = await this.client\n .listResourceTemplates({\n cursor: templatesResult.nextCursor\n })\n .catch(\n this._capabilityErrorHandler(\n { resourceTemplates: [] },\n \"resources/templates/list\"\n )\n );\n templatesAgg = templatesAgg.concat(templatesResult.resourceTemplates);\n } while (templatesResult.nextCursor);\n return templatesAgg;\n }\n\n /**\n * Handle elicitation request from server\n * Automatically uses the Agent's built-in elicitation handling if available\n */\n async handleElicitationRequest(\n _request: ElicitRequest\n ): Promise<ElicitResult> {\n // Elicitation handling must be implemented by the platform\n // For MCP servers, this should be handled by McpAgent.elicitInput()\n throw new Error(\n \"Elicitation handler must be implemented for your platform. Override handleElicitationRequest method.\"\n );\n }\n /**\n * Get the transport for the client\n * @param transportType - The transport type to get\n * @returns The transport for the client\n */\n getTransport(transportType: BaseTransportType) {\n switch (transportType) {\n case \"streamable-http\":\n return new StreamableHTTPClientTransport(\n this.url,\n this.options.transport as StreamableHTTPClientTransportOptions\n );\n case \"sse\":\n return new SSEClientTransport(\n this.url,\n this.options.transport as SSEClientTransportOptions\n );\n default:\n throw new Error(`Unsupported transport type: ${transportType}`);\n }\n }\n\n private async tryConnect(transportType: TransportType) {\n const transports: BaseTransportType[] =\n transportType === \"auto\" ? [\"streamable-http\", \"sse\"] : [transportType];\n\n for (const currentTransportType of transports) {\n const isLastTransport =\n currentTransportType === transports[transports.length - 1];\n const hasFallback =\n transportType === \"auto\" &&\n currentTransportType === \"streamable-http\" &&\n !isLastTransport;\n\n const transport = this.getTransport(currentTransportType);\n\n try {\n await this.client.connect(transport);\n this.lastConnectedTransport = currentTransportType;\n const url = this.url.toString();\n this._onObservabilityEvent.fire({\n type: \"mcp:client:connect\",\n displayMessage: `Connected successfully using ${currentTransportType} transport for ${url}`,\n payload: {\n url,\n transport: currentTransportType,\n state: this.connectionState\n },\n timestamp: Date.now(),\n id: nanoid()\n });\n break;\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n\n // If unauthorized, bubble up for proper auth handling\n if (isUnauthorized(error)) {\n throw e;\n }\n\n if (hasFallback && isTransportNotImplemented(error)) {\n // Try the next transport silently\n const url = this.url.toString();\n this._onObservabilityEvent.fire({\n type: \"mcp:client:connect\",\n displayMessage: `${currentTransportType} transport not available, trying ${transports[transports.indexOf(currentTransportType) + 1]} for ${url}`,\n payload: {\n url,\n transport: currentTransportType,\n state: this.connectionState\n },\n timestamp: Date.now(),\n id: nanoid()\n });\n continue;\n }\n\n throw e;\n }\n }\n\n // Set up elicitation request handler\n this.client.setRequestHandler(\n ElicitRequestSchema,\n async (request: ElicitRequest) => {\n return await this.handleElicitationRequest(request);\n }\n );\n }\n\n private _capabilityErrorHandler<T>(empty: T, method: string) {\n return (e: { code: number }) => {\n // server is badly behaved and returning invalid capabilities. This commonly occurs for resource templates\n if (e.code === -32601) {\n const url = this.url.toString();\n this._onObservabilityEvent.fire({\n type: \"mcp:client:discover\",\n displayMessage: `The server advertised support for the capability ${method.split(\"/\")[0]}, but returned \"Method not found\" for '${method}' for ${url}`,\n payload: {\n url,\n capability: method.split(\"/\")[0],\n error: toErrorMessage(e)\n },\n timestamp: Date.now(),\n id: nanoid()\n });\n return empty;\n }\n throw e;\n };\n }\n}\n","import type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n CallToolRequest,\n CallToolResultSchema,\n CompatibilityCallToolResultSchema,\n GetPromptRequest,\n Prompt,\n ReadResourceRequest,\n Resource,\n ResourceTemplate,\n Tool\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ToolSet } from \"ai\";\nimport type { JSONSchema7 } from \"json-schema\";\nimport { nanoid } from \"nanoid\";\nimport { Emitter, type Event, DisposableStore } from \"../core/events\";\nimport type { MCPObservabilityEvent } from \"../observability/mcp\";\nimport {\n MCPClientConnection,\n type MCPTransportOptions\n} from \"./client-connection\";\nimport { toErrorMessage } from \"./errors\";\nimport type { TransportType } from \"./types\";\nimport type { MCPClientStorage, MCPServerRow } from \"./client-storage\";\nimport type { AgentsOAuthProvider } from \"./do-oauth-client-provider\";\nimport { DurableObjectOAuthClientProvider } from \"./do-oauth-client-provider\";\n\n/**\n * Options that can be stored in the server_options column\n * This is what gets JSON.stringify'd and stored in the database\n */\nexport type MCPServerOptions = {\n client?: ConstructorParameters<typeof Client>[1];\n transport?: {\n headers?: HeadersInit;\n type?: TransportType;\n };\n};\n\n/**\n * Options for registering an MCP server\n */\nexport type RegisterServerOptions = {\n url: string;\n name: string;\n callbackUrl: string;\n client?: ConstructorParameters<typeof Client>[1];\n transport?: MCPTransportOptions;\n authUrl?: string;\n clientId?: string;\n};\n\n/**\n * Result of attempting to connect to an MCP server.\n * Returns the current connection state after the operation.\n *\n * - \"ready\": Connection established and ready to use (non-OAuth)\n * - \"authenticating\": OAuth required, user must visit authUrl to authorize\n */\nexport type MCPConnectionResult =\n | { state: \"ready\" }\n | { state: \"authenticating\"; authUrl: string; clientId?: string };\n\nexport type MCPClientOAuthCallbackConfig = {\n successRedirect?: string;\n errorRedirect?: string;\n customHandler?: (result: MCPClientOAuthResult) => Response;\n};\n\nexport type MCPClientOAuthResult = {\n serverId: string;\n authSuccess: boolean;\n authError?: string;\n};\n\nexport type MCPClientManagerOptions = {\n storage: MCPClientStorage;\n};\n\n/**\n * Utility class that aggregates multiple MCP clients into one\n */\nexport class MCPClientManager {\n public mcpConnections: Record<string, MCPClientConnection> = {};\n private _didWarnAboutUnstableGetAITools = false;\n private _oauthCallbackConfig?: MCPClientOAuthCallbackConfig;\n private _connectionDisposables = new Map<string, DisposableStore>();\n private _storage: MCPClientStorage;\n private _isRestored = false;\n\n private readonly _onObservabilityEvent = new Emitter<MCPObservabilityEvent>();\n public readonly onObservabilityEvent: Event<MCPObservabilityEvent> =\n this._onObservabilityEvent.event;\n\n private readonly _onServerStateChanged = new Emitter<void>();\n /**\n * Event that fires whenever any MCP server state changes (registered, connected, removed, etc.)\n * This is useful for broadcasting server state to clients.\n */\n public readonly onServerStateChanged: Event<void> =\n this._onServerStateChanged.event;\n\n /**\n * @param _name Name of the MCP client\n * @param _version Version of the MCP Client\n * @param options Storage adapter for persisting MCP server state\n */\n constructor(\n private _name: string,\n private _version: string,\n options: MCPClientManagerOptions\n ) {\n this._storage = options.storage;\n }\n\n jsonSchema: typeof import(\"ai\").jsonSchema | undefined;\n\n /**\n * Create an auth provider for a server\n * @internal\n */\n private createAuthProvider(\n serverId: string,\n callbackUrl: string,\n clientName: string,\n clientId?: string\n ): AgentsOAuthProvider {\n const authProvider = new DurableObjectOAuthClientProvider(\n this._storage,\n clientName,\n callbackUrl\n );\n authProvider.serverId = serverId;\n if (clientId) {\n authProvider.clientId = clientId;\n }\n return authProvider;\n }\n\n /**\n * Restore MCP server connections from storage\n * This method is called on Agent initialization to restore previously connected servers\n *\n * @param clientName Name to use for OAuth client (typically the agent instance name)\n */\n async restoreConnectionsFromStorage(clientName: string): Promise<void> {\n if (this._isRestored) {\n return;\n }\n\n await this._storage.create();\n const servers = await this._storage.listServers();\n\n if (!servers || servers.length === 0) {\n this._isRestored = true;\n return;\n }\n\n for (const server of servers) {\n const existingConn = this.mcpConnections[server.id];\n\n // Skip if connection already exists and is in a good state\n if (existingConn) {\n if (existingConn.connectionState === \"ready\") {\n console.warn(\n `[MCPClientManager] Server ${server.id} already has a ready connection. Skipping recreation.`\n );\n continue;\n }\n\n // Don't interrupt in-flight OAuth or connections\n if (\n existingConn.connectionState === \"authenticating\" ||\n existingConn.connectionState === \"connecting\" ||\n existingConn.connectionState === \"discovering\"\n ) {\n // Let the existing flow complete\n continue;\n }\n\n // If failed, clean up the old connection before recreating\n if (existingConn.connectionState === \"failed\") {\n try {\n await existingConn.client.close();\n } catch (error) {\n console.warn(\n `[MCPClientManager] Error closing failed connection ${server.id}:`,\n error\n );\n }\n delete this.mcpConnections[server.id];\n this._connectionDisposables.get(server.id)?.dispose();\n this._connectionDisposables.delete(server.id);\n }\n }\n\n const parsedOptions: MCPServerOptions | null = server.server_options\n ? JSON.parse(server.server_options)\n : null;\n\n const authProvider = this.createAuthProvider(\n server.id,\n server.callback_url,\n clientName,\n server.client_id ?? undefined\n );\n\n // Create the in-memory connection object (no need to save to storage - we just read from it!)\n this.createConnection(server.id, server.server_url, {\n client: parsedOptions?.client ?? {},\n transport: {\n ...(parsedOptions?.transport ?? {}),\n type: parsedOptions?.transport?.type ?? (\"auto\" as TransportType),\n authProvider\n }\n });\n\n // Always try to connect - the connection logic will determine if OAuth is needed\n // If stored OAuth tokens are valid, connection will succeed automatically\n // If tokens are missing/invalid, connection will fail with Unauthorized\n // and state will be set to \"authenticating\"\n await this.connectToServer(server.id).catch((error) => {\n console.error(`Error restoring ${server.id}:`, error);\n });\n }\n\n this._isRestored = true;\n }\n\n /**\n * Connect to and register an MCP server\n *\n * @deprecated This method is maintained for backward compatibility.\n * For new code, use registerServer() and connectToServer() separately.\n *\n * @param url Server URL\n * @param options Connection options\n * @returns Object with server ID, auth URL (if OAuth), and client ID (if OAuth)\n */\n async connect(\n url: string,\n options: {\n // Allows you to reconnect to a server (in the case of an auth reconnect)\n reconnect?: {\n // server id\n id: string;\n oauthClientId?: string;\n oauthCode?: string;\n };\n // we're overriding authProvider here because we want to be able to access the auth URL\n transport?: MCPTransportOptions;\n client?: ConstructorParameters<typeof Client>[1];\n } = {}\n ): Promise<{\n id: string;\n authUrl?: string;\n clientId?: string;\n }> {\n /* Late initialization of jsonSchemaFn */\n /**\n * We need to delay loading ai sdk, because putting it in module scope is\n * causing issues with startup time.\n * The only place it's used is in getAITools, which only matters after\n * .connect() is called on at least one server.\n * So it's safe to delay loading it until .connect() is called.\n */\n await this.ensureJsonSchema();\n\n const id = options.reconnect?.id ?? nanoid(8);\n\n if (options.transport?.authProvider) {\n options.transport.authProvider.serverId = id;\n // reconnect with auth\n if (options.reconnect?.oauthClientId) {\n options.transport.authProvider.clientId =\n options.reconnect?.oauthClientId;\n }\n }\n\n // During OAuth reconnect, reuse existing connection to preserve state\n if (!options.reconnect?.oauthCode || !this.mcpConnections[id]) {\n const normalizedTransport = {\n ...options.transport,\n type: options.transport?.type ?? (\"auto\" as TransportType)\n };\n\n this.mcpConnections[id] = new MCPClientConnection(\n new URL(url),\n {\n name: this._name,\n version: this._version\n },\n {\n client: options.client ?? {},\n transport: normalizedTransport\n }\n );\n\n // Pipe connection-level observability events to the manager-level emitter\n // and track the subscription for cleanup.\n const store = new DisposableStore();\n // If we somehow already had disposables for this id, clear them first\n const existing = this._connectionDisposables.get(id);\n if (existing) existing.dispose();\n this._connectionDisposables.set(id, store);\n store.add(\n this.mcpConnections[id].onObservabilityEvent((event) => {\n this._onObservabilityEvent.fire(event);\n })\n );\n }\n\n // Initialize connection first\n await this.mcpConnections[id].init();\n\n // Handle OAuth completion if we have a reconnect code\n if (options.reconnect?.oauthCode) {\n try {\n await this.mcpConnections[id].completeAuthorization(\n options.reconnect.oauthCode\n );\n await this.mcpConnections[id].establishConnection();\n } catch (error) {\n this._onObservabilityEvent.fire({\n type: \"mcp:client:connect\",\n displayMessage: `Failed to complete OAuth reconnection for ${id} for ${url}`,\n payload: {\n url: url,\n transport: options.transport?.type ?? \"auto\",\n state: this.mcpConnections[id].connectionState,\n error: toErrorMessage(error)\n },\n timestamp: Date.now(),\n id\n });\n // Re-throw to signal failure to the caller\n throw error;\n }\n }\n\n // If connection is in authenticating state, return auth URL for OAuth flow\n const authUrl = options.transport?.authProvider?.authUrl;\n if (\n this.mcpConnections[id].connectionState === \"authenticating\" &&\n authUrl &&\n options.transport?.authProvider?.redirectUrl\n ) {\n return {\n authUrl,\n clientId: options.transport?.authProvider?.clientId,\n id\n };\n }\n\n return {\n id\n };\n }\n\n /**\n * Create an in-memory connection object and set up observability\n * Does NOT save to storage - use registerServer() for that\n */\n private createConnection(\n id: string,\n url: string,\n options: {\n client?: ConstructorParameters<typeof Client>[1];\n transport: MCPTransportOptions;\n }\n ): void {\n // Skip if connection already exists\n if (this.mcpConnections[id]) {\n return;\n }\n\n const normalizedTransport = {\n ...options.transport,\n type: options.transport?.type ?? (\"auto\" as TransportType)\n };\n\n this.mcpConnections[id] = new MCPClientConnection(\n new URL(url),\n {\n name: this._name,\n version: this._version\n },\n {\n client: options.client ?? {},\n transport: normalizedTransport\n }\n );\n\n // Pipe connection-level observability events to the manager-level emitter\n const store = new DisposableStore();\n const existing = this._connectionDisposables.get(id);\n if (existing) existing.dispose();\n this._connectionDisposables.set(id, store);\n store.add(\n this.mcpConnections[id].onObservabilityEvent((event) => {\n this._onObservabilityEvent.fire(event);\n })\n );\n }\n\n /**\n * Register an MCP server connection without connecting\n * Creates the connection object, sets up observability, and saves to storage\n *\n * @param id Server ID\n * @param options Registration options including URL, name, callback URL, and connection config\n * @returns Server ID\n */\n async registerServer(\n id: string,\n options: RegisterServerOptions\n ): Promise<string> {\n // Create the in-memory connection\n this.createConnection(id, options.url, {\n client: options.client,\n transport: {\n ...options.transport,\n type: options.transport?.type ?? (\"auto\" as TransportType)\n }\n });\n\n // Save to storage\n await this._storage.saveServer({\n id,\n name: options.name,\n server_url: options.url,\n callback_url: options.callbackUrl,\n client_id: options.clientId ?? null,\n auth_url: options.authUrl ?? null,\n server_options: JSON.stringify({\n client: options.client,\n transport: options.transport\n })\n });\n\n this._onServerStateChanged.fire();\n\n return id;\n }\n\n /**\n * Connect to an already registered MCP server and initialize the connection.\n *\n * For OAuth servers, this returns `{ state: \"authenticating\", authUrl, clientId? }`\n * without establishing the connection. The user must complete the OAuth flow via\n * the authUrl, which will trigger a callback handled by `handleCallbackRequest()`.\n *\n * For non-OAuth servers, this establishes the connection immediately and returns\n * `{ state: \"ready\" }`.\n *\n * Updates storage with auth URL and client ID after connection.\n *\n * @param id Server ID (must be registered first via registerServer())\n * @returns Connection result with current state and OAuth info (if applicable)\n */\n async connectToServer(id: string): Promise<MCPConnectionResult> {\n const conn = this.mcpConnections[id];\n if (!conn) {\n throw new Error(\n `Server ${id} is not registered. Call registerServer() first.`\n );\n }\n\n // Initialize connection\n await conn.init();\n\n // If connection is in authenticating state, return auth URL for OAuth flow\n const authUrl = conn.options.transport.authProvider?.authUrl;\n\n if (\n conn.connectionState === \"authenticating\" &&\n authUrl &&\n conn.options.transport.authProvider?.redirectUrl\n ) {\n const clientId = conn.options.transport.authProvider?.clientId;\n\n // Update storage with auth URL and client ID\n const servers = await this._storage.listServers();\n const serverRow = servers.find((s) => s.id === id);\n if (serverRow) {\n await this._storage.saveServer({\n ...serverRow,\n auth_url: authUrl,\n client_id: clientId ?? null\n });\n }\n\n this._onServerStateChanged.fire();\n\n return {\n state: \"authenticating\",\n authUrl,\n clientId\n };\n }\n\n // Fire state changed event for non-OAuth connections that reached ready state\n if (conn.connectionState === \"ready\") {\n this._onServerStateChanged.fire();\n }\n\n return { state: \"ready\" };\n }\n\n async isCallbackRequest(req: Request): Promise<boolean> {\n if (req.method !== \"GET\") {\n return false;\n }\n\n // Quick heuristic check: most callback URLs contain \"/callback\"\n // This avoids DB queries for obviously non-callback requests\n if (!req.url.includes(\"/callback\")) {\n return false;\n }\n\n // Check database for matching callback URL\n const servers = await this._storage.listServers();\n return servers.some(\n (server) => server.callback_url && req.url.startsWith(server.callback_url)\n );\n }\n\n async handleCallbackRequest(req: Request) {\n const url = new URL(req.url);\n\n // Find the matching server from database\n const servers = await this._storage.listServers();\n const matchingServer = servers.find((server: MCPServerRow) => {\n return server.callback_url && req.url.startsWith(server.callback_url);\n });\n\n if (!matchingServer) {\n throw new Error(\n `No callback URI match found for the request url: ${req.url}. Was the request matched with \\`isCallbackRequest()\\`?`\n );\n }\n\n const serverId = matchingServer.id;\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n const errorDescription = url.searchParams.get(\"error_description\");\n\n // Handle OAuth error responses from the provider\n if (error) {\n return {\n serverId,\n authSuccess: false,\n authError: errorDescription || error\n };\n }\n\n if (!code) {\n throw new Error(\"Unauthorized: no code provided\");\n }\n if (!state) {\n throw new Error(\"Unauthorized: no state provided\");\n }\n\n if (this.mcpConnections[serverId] === undefined) {\n throw new Error(`Could not find serverId: ${serverId}`);\n }\n\n // If connection is already ready, this is likely a duplicate callback\n if (this.mcpConnections[serverId].connectionState === \"ready\") {\n // Already authenticated and ready, treat as success\n return {\n serverId,\n authSuccess: true\n };\n }\n\n if (this.mcpConnections[serverId].connectionState !== \"authenticating\") {\n throw new Error(\n `Failed to authenticate: the client is in \"${this.mcpConnections[serverId].connectionState}\" state, expected \"authenticating\"`\n );\n }\n\n const conn = this.mcpConnections[serverId];\n if (!conn.options.transport.authProvider) {\n throw new Error(\n \"Trying to finalize authentication for a server connection without an authProvider\"\n );\n }\n\n // Get clientId from auth provider (stored during redirectToAuthorization) or fallback to state for backward compatibility\n const clientId = conn.options.transport.authProvider.clientId || state;\n\n // Set the OAuth credentials\n conn.options.transport.authProvider.clientId = clientId;\n conn.options.transport.authProvider.serverId = serverId;\n\n try {\n await conn.completeAuthorization(code);\n await this._storage.clearAuthUrl(serverId);\n this._onServerStateChanged.fire();\n\n return {\n serverId,\n authSuccess: true\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n this._onServerStateChanged.fire();\n\n return {\n serverId,\n authSuccess: false,\n authError: errorMessage\n };\n }\n }\n\n /**\n * Establish connection in the background after OAuth completion\n * This method is called asynchronously and doesn't block the OAuth callback response\n * @param serverId The server ID to establish connection for\n */\n async establishConnection(serverId: string): Promise<void> {\n const conn = this.mcpConnections[serverId];\n if (!conn) {\n this._onObservabilityEvent.fire({\n type: \"mcp:client:preconnect\",\n displayMessage: `Connection not found for serverId: ${serverId}`,\n payload: { serverId },\n timestamp: Date.now(),\n id: nanoid()\n });\n return;\n }\n\n try {\n await conn.establishConnection();\n this._onServerStateChanged.fire();\n } catch (error) {\n const url = conn.url.toString();\n this._onObservabilityEvent.fire({\n type: \"mcp:client:connect\",\n displayMessage: `Failed to establish connection to server ${serverId} with url ${url}`,\n payload: {\n url,\n transport: conn.options.transport.type ?? \"auto\",\n state: conn.connectionState,\n error: toErrorMessage(error)\n },\n timestamp: Date.now(),\n id: nanoid()\n });\n this._onServerStateChanged.fire();\n }\n }\n\n /**\n * Configure OAuth callback handling\n * @param config OAuth callback configuration\n */\n configureOAuthCallback(config: MCPClientOAuthCallbackConfig): void {\n this._oauthCallbackConfig = config;\n }\n\n /**\n * Get the current OAuth callback configuration\n * @returns The current OAuth callback configuration\n */\n getOAuthCallbackConfig(): MCPClientOAuthCallbackConfig | undefined {\n return this._oauthCallbackConfig;\n }\n\n /**\n * @returns namespaced list of tools\n */\n listTools(): NamespacedData[\"tools\"] {\n return getNamespacedData(this.mcpConnections, \"tools\");\n }\n\n /**\n * Lazy-loads the jsonSchema function from the AI SDK.\n *\n * This defers importing the \"ai\" package until it's actually needed, which helps reduce\n * initial bundle size and startup time. The jsonSchema function is required for converting\n * MCP tools into AI SDK tool definitions via getAITools().\n *\n * @internal This method is for internal use only. It's automatically called before operations\n * that need jsonSchema (like getAITools() or OAuth flows). External consumers should not need\n * to call this directly.\n */\n async ensureJsonSchema() {\n if (!this.jsonSchema) {\n const { jsonSchema } = await import(\"ai\");\n this.jsonSchema = jsonSchema;\n }\n }\n\n /**\n * @returns a set of tools that you can use with the AI SDK\n */\n getAITools(): ToolSet {\n if (!this.jsonSchema) {\n throw new Error(\"jsonSchema not initialized.\");\n }\n\n // Warn if tools are being read from non-ready connections\n for (const [id, conn] of Object.entries(this.mcpConnections)) {\n if (\n conn.connectionState !== \"ready\" &&\n conn.connectionState !== \"authenticating\"\n ) {\n console.warn(\n `[getAITools] WARNING: Reading tools from connection ${id} in state \"${conn.connectionState}\". Tools may not be loaded yet.`\n );\n }\n }\n\n return Object.fromEntries(\n getNamespacedData(this.mcpConnections, \"tools\").map((tool) => {\n return [\n `tool_${tool.serverId.replace(/-/g, \"\")}_${tool.name}`,\n {\n description: tool.description,\n execute: async (args) => {\n const result = await this.callTool({\n arguments: args,\n name: tool.name,\n serverId: tool.serverId\n });\n if (result.isError) {\n // @ts-expect-error TODO we should fix this\n throw new Error(result.content[0].text);\n }\n return result;\n },\n inputSchema: this.jsonSchema!(tool.inputSchema as JSONSchema7),\n outputSchema: tool.outputSchema\n ? this.jsonSchema!(tool.outputSchema as JSONSchema7)\n : undefined\n }\n ];\n })\n );\n }\n\n /**\n * @deprecated this has been renamed to getAITools(), and unstable_getAITools will be removed in the next major version\n * @returns a set of tools that you can use with the AI SDK\n */\n unstable_getAITools(): ToolSet {\n if (!this._didWarnAboutUnstableGetAITools) {\n this._didWarnAboutUnstableGetAITools = true;\n console.warn(\n \"unstable_getAITools is deprecated, use getAITools instead. unstable_getAITools will be removed in the next major version.\"\n );\n }\n return this.getAITools();\n }\n\n /**\n * Closes all connections to MCP servers\n */\n async closeAllConnections() {\n const ids = Object.keys(this.mcpConnections);\n await Promise.all(\n ids.map(async (id) => {\n await this.mcpConnections[id].client.close();\n })\n );\n // Dispose all per-connection subscriptions\n for (const id of ids) {\n const store = this._connectionDisposables.get(id);\n if (store) store.dispose();\n this._connectionDisposables.delete(id);\n delete this.mcpConnections[id];\n }\n }\n\n /**\n * Closes a connection to an MCP server\n * @param id The id of the connection to close\n */\n async closeConnection(id: string) {\n if (!this.mcpConnections[id]) {\n throw new Error(`Connection with id \"${id}\" does not exist.`);\n }\n await this.mcpConnections[id].client.close();\n delete this.mcpConnections[id];\n\n const store = this._connectionDisposables.get(id);\n if (store) store.dispose();\n this._connectionDisposables.delete(id);\n }\n\n /**\n * Remove an MCP server from storage\n */\n async removeServer(serverId: string): Promise<void> {\n await this._storage.removeServer(serverId);\n this._onServerStateChanged.fire();\n }\n\n /**\n * List all MCP servers from storage\n */\n async listServers(): Promise<MCPServerRow[]> {\n return await this._storage.listServers();\n }\n\n /**\n * Dispose the manager and all resources.\n */\n async dispose(): Promise<void> {\n try {\n await this.closeAllConnections();\n } finally {\n // Dispose manager-level emitters\n this._onServerStateChanged.dispose();\n this._onObservabilityEvent.dispose();\n\n // Drop the storage table\n await this._storage.destroy();\n }\n }\n\n /**\n * @returns namespaced list of prompts\n */\n listPrompts(): NamespacedData[\"prompts\"] {\n return getNamespacedData(this.mcpConnections, \"prompts\");\n }\n\n /**\n * @returns namespaced list of tools\n */\n listResources(): NamespacedData[\"resources\"] {\n return getNamespacedData(this.mcpConnections, \"resources\");\n }\n\n /**\n * @returns namespaced list of resource templates\n */\n listResourceTemplates(): NamespacedData[\"resourceTemplates\"] {\n return getNamespacedData(this.mcpConnections, \"resourceTemplates\");\n }\n\n /**\n * Namespaced version of callTool\n */\n async callTool(\n params: CallToolRequest[\"params\"] & { serverId: string },\n resultSchema?:\n | typeof CallToolResultSchema\n | typeof CompatibilityCallToolResultSchema,\n options?: RequestOptions\n ) {\n const unqualifiedName = params.name.replace(`${params.serverId}.`, \"\");\n return this.mcpConnections[params.serverId].client.callTool(\n {\n ...params,\n name: unqualifiedName\n },\n resultSchema,\n options\n );\n }\n\n /**\n * Namespaced version of readResource\n */\n readResource(\n params: ReadResourceRequest[\"params\"] & { serverId: string },\n options: RequestOptions\n ) {\n return this.mcpConnections[params.serverId].client.readResource(\n params,\n options\n );\n }\n\n /**\n * Namespaced version of getPrompt\n */\n getPrompt(\n params: GetPromptRequest[\"params\"] & { serverId: string },\n options: RequestOptions\n ) {\n return this.mcpConnections[params.serverId].client.getPrompt(\n params,\n options\n );\n }\n}\n\ntype NamespacedData = {\n tools: (Tool & { serverId: string })[];\n prompts: (Prompt & { serverId: string })[];\n resources: (Resource & { serverId: string })[];\n resourceTemplates: (ResourceTemplate & { serverId: string })[];\n};\n\nexport function getNamespacedData<T extends keyof NamespacedData>(\n mcpClients: Record<string, MCPClientConnection>,\n type: T\n): NamespacedData[T] {\n const sets = Object.entries(mcpClients).map(([name, conn]) => {\n return { data: conn[type], name };\n });\n\n const namespacedData = sets.flatMap(({ name: serverId, data }) => {\n return data.map((item) => {\n return {\n ...item,\n // we add a serverId so we can easily pull it out and send the tool call to the right server\n serverId\n };\n });\n });\n\n return namespacedData as NamespacedData[T]; // Type assertion needed due to TS limitations with conditional return types\n}\n"],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- import "./serializable-gtr9YMhp.js";
1
+ import "./serializable-CymX8ovI.js";
2
2
  import {
3
- AgentClient,
4
- AgentClientFetchOptions,
5
- AgentClientOptions,
6
- StreamOptions,
7
- agentFetch,
8
- camelCaseToKebabCase
9
- } from "./client-CmMi85Sj.js";
3
+ a as agentFetch,
4
+ i as StreamOptions,
5
+ n as AgentClientFetchOptions,
6
+ o as camelCaseToKebabCase,
7
+ r as AgentClientOptions,
8
+ t as AgentClient
9
+ } from "./client-CbWe9FBd.js";
10
10
  export {
11
11
  AgentClient,
12
12
  AgentClientFetchOptions,