agents 0.0.0-cec3cca → 0.0.0-cf3b3d7

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 (33) hide show
  1. package/dist/ai-chat-agent.d.ts +3 -3
  2. package/dist/ai-chat-agent.js +3 -3
  3. package/dist/ai-chat-agent.js.map +1 -1
  4. package/dist/ai-react.d.ts +4 -4
  5. package/dist/ai-react.js +8 -3
  6. package/dist/ai-react.js.map +1 -1
  7. package/dist/{client-Csp_m13H.d.ts → client-BaCHMay9.d.ts} +191 -79
  8. package/dist/{client-9Ld2_lnt.js → client-DpkZyXgJ.js} +239 -124
  9. package/dist/client-DpkZyXgJ.js.map +1 -0
  10. package/dist/codemode/ai.js +3 -3
  11. package/dist/do-oauth-client-provider-CnbnngL2.d.ts +134 -0
  12. package/dist/{do-oauth-client-provider-CswoD5Lu.js → do-oauth-client-provider-D2P1lSft.js} +2 -2
  13. package/dist/do-oauth-client-provider-D2P1lSft.js.map +1 -0
  14. package/dist/{index-DFqsR7mb.d.ts → index-DCRAdW9R.d.ts} +30 -18
  15. package/dist/index.d.ts +3 -3
  16. package/dist/index.js +3 -3
  17. package/dist/mcp/client.d.ts +3 -3
  18. package/dist/mcp/client.js +2 -1
  19. package/dist/mcp/do-oauth-client-provider.d.ts +1 -1
  20. package/dist/mcp/do-oauth-client-provider.js +1 -1
  21. package/dist/mcp/index.d.ts +68 -29
  22. package/dist/mcp/index.js +80 -10
  23. package/dist/mcp/index.js.map +1 -1
  24. package/dist/observability/index.js +3 -3
  25. package/dist/{react-NCPvtyCY.d.ts → react-DM_FD53F.d.ts} +31 -33
  26. package/dist/react.d.ts +4 -4
  27. package/dist/{src-Dz0H9hSU.js → src-Dk8lwxHf.js} +181 -138
  28. package/dist/src-Dk8lwxHf.js.map +1 -0
  29. package/package.json +46 -38
  30. package/dist/client-9Ld2_lnt.js.map +0 -1
  31. package/dist/do-oauth-client-provider-CswoD5Lu.js.map +0 -1
  32. package/dist/do-oauth-client-provider-DGc5pP0l.d.ts +0 -55
  33. package/dist/src-Dz0H9hSU.js.map +0 -1
@@ -1,8 +1,10 @@
1
+ import { t as DurableObjectOAuthClientProvider } from "./do-oauth-client-provider-D2P1lSft.js";
1
2
  import { nanoid } from "nanoid";
3
+ import { CfWorkerJsonSchemaValidator } from "@modelcontextprotocol/sdk/validation/cfworker-provider.js";
2
4
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
3
- import { ElicitRequestSchema, PromptListChangedNotificationSchema, ResourceListChangedNotificationSchema, ToolListChangedNotificationSchema } from "@modelcontextprotocol/sdk/types.js";
4
5
  import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
5
6
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
7
+ import { ElicitRequestSchema, PromptListChangedNotificationSchema, ResourceListChangedNotificationSchema, ToolListChangedNotificationSchema } from "@modelcontextprotocol/sdk/types.js";
6
8
 
7
9
  //#region src/core/events.ts
8
10
  function toDisposable(fn) {
@@ -56,80 +58,6 @@ function isTransportNotImplemented(error) {
56
58
  return msg.includes("404") || msg.includes("405") || msg.includes("Not Implemented") || msg.includes("not implemented");
57
59
  }
58
60
 
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
61
  //#endregion
134
62
  //#region src/mcp/client-connection.ts
135
63
  var MCPClientConnection = class {
@@ -375,8 +303,8 @@ var MCPClientConnection = class {
375
303
  */
376
304
  getTransport(transportType) {
377
305
  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);
306
+ case "streamable-http": return new StreamableHTTPClientTransport(this.url, this.options.transport);
307
+ case "sse": return new SSEClientTransport(this.url, this.options.transport);
380
308
  default: throw new Error(`Unsupported transport type: ${transportType}`);
381
309
  }
382
310
  }
@@ -451,6 +379,7 @@ var MCPClientConnection = class {
451
379
 
452
380
  //#endregion
453
381
  //#region src/mcp/client.ts
382
+ const defaultClientOptions = { jsonSchemaValidator: new CfWorkerJsonSchemaValidator() };
454
383
  /**
455
384
  * Utility class that aggregates multiple MCP clients into one
456
385
  */
@@ -458,26 +387,88 @@ var MCPClientManager = class {
458
387
  /**
459
388
  * @param _name Name of the MCP client
460
389
  * @param _version Version of the MCP Client
461
- * @param auth Auth paramters if being used to create a DurableObjectOAuthClientProvider
390
+ * @param options Storage adapter for persisting MCP server state
462
391
  */
463
- constructor(_name, _version) {
392
+ constructor(_name, _version, options) {
464
393
  this._name = _name;
465
394
  this._version = _version;
466
395
  this.mcpConnections = {};
467
- this._callbackUrls = [];
468
396
  this._didWarnAboutUnstableGetAITools = false;
469
397
  this._connectionDisposables = /* @__PURE__ */ new Map();
398
+ this._isRestored = false;
470
399
  this._onObservabilityEvent = new Emitter();
471
400
  this.onObservabilityEvent = this._onObservabilityEvent.event;
472
- this._onConnected = new Emitter();
473
- this.onConnected = this._onConnected.event;
401
+ this._onServerStateChanged = new Emitter();
402
+ this.onServerStateChanged = this._onServerStateChanged.event;
403
+ this._storage = options.storage;
404
+ }
405
+ /**
406
+ * Create an auth provider for a server
407
+ * @internal
408
+ */
409
+ createAuthProvider(serverId, callbackUrl, clientName, clientId) {
410
+ const authProvider = new DurableObjectOAuthClientProvider(this._storage, clientName, callbackUrl);
411
+ authProvider.serverId = serverId;
412
+ if (clientId) authProvider.clientId = clientId;
413
+ return authProvider;
414
+ }
415
+ /**
416
+ * Restore MCP server connections from storage
417
+ * This method is called on Agent initialization to restore previously connected servers
418
+ *
419
+ * @param clientName Name to use for OAuth client (typically the agent instance name)
420
+ */
421
+ async restoreConnectionsFromStorage(clientName) {
422
+ if (this._isRestored) return;
423
+ const servers = await this._storage.listServers();
424
+ if (!servers || servers.length === 0) {
425
+ this._isRestored = true;
426
+ return;
427
+ }
428
+ for (const server of servers) {
429
+ const existingConn = this.mcpConnections[server.id];
430
+ if (existingConn) {
431
+ if (existingConn.connectionState === "ready") {
432
+ console.warn(`[MCPClientManager] Server ${server.id} already has a ready connection. Skipping recreation.`);
433
+ continue;
434
+ }
435
+ if (existingConn.connectionState === "authenticating" || existingConn.connectionState === "connecting" || existingConn.connectionState === "discovering") continue;
436
+ if (existingConn.connectionState === "failed") {
437
+ try {
438
+ await existingConn.client.close();
439
+ } catch (error) {
440
+ console.warn(`[MCPClientManager] Error closing failed connection ${server.id}:`, error);
441
+ }
442
+ delete this.mcpConnections[server.id];
443
+ this._connectionDisposables.get(server.id)?.dispose();
444
+ this._connectionDisposables.delete(server.id);
445
+ }
446
+ }
447
+ const parsedOptions = server.server_options ? JSON.parse(server.server_options) : null;
448
+ const authProvider = this.createAuthProvider(server.id, server.callback_url, clientName, server.client_id ?? void 0);
449
+ this.createConnection(server.id, server.server_url, {
450
+ client: parsedOptions?.client ?? {},
451
+ transport: {
452
+ ...parsedOptions?.transport ?? {},
453
+ type: parsedOptions?.transport?.type ?? "auto",
454
+ authProvider
455
+ }
456
+ });
457
+ await this.connectToServer(server.id).catch((error) => {
458
+ console.error(`Error restoring ${server.id}:`, error);
459
+ });
460
+ }
461
+ this._isRestored = true;
474
462
  }
475
463
  /**
476
464
  * Connect to and register an MCP server
477
465
  *
478
- * @param transportConfig Transport config
479
- * @param clientConfig Client config
480
- * @param capabilities Client capabilities (i.e. if the client supports roots/sampling)
466
+ * @deprecated This method is maintained for backward compatibility.
467
+ * For new code, use registerServer() and connectToServer() separately.
468
+ *
469
+ * @param url Server URL
470
+ * @param options Connection options
471
+ * @returns Object with server ID, auth URL (if OAuth), and client ID (if OAuth)
481
472
  */
482
473
  async connect(url, options = {}) {
483
474
  /**
@@ -487,10 +478,7 @@ var MCPClientManager = class {
487
478
  * .connect() is called on at least one server.
488
479
  * So it's safe to delay loading it until .connect() is called.
489
480
  */
490
- if (!this.jsonSchema) {
491
- const { jsonSchema } = await import("ai");
492
- this.jsonSchema = jsonSchema;
493
- }
481
+ await this.ensureJsonSchema();
494
482
  const id = options.reconnect?.id ?? nanoid(8);
495
483
  if (options.transport?.authProvider) {
496
484
  options.transport.authProvider.serverId = id;
@@ -536,35 +524,139 @@ var MCPClientManager = class {
536
524
  throw error;
537
525
  }
538
526
  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());
527
+ if (this.mcpConnections[id].connectionState === "authenticating" && authUrl && options.transport?.authProvider?.redirectUrl) return {
528
+ authUrl,
529
+ clientId: options.transport?.authProvider?.clientId,
530
+ id
531
+ };
532
+ return { id };
533
+ }
534
+ /**
535
+ * Create an in-memory connection object and set up observability
536
+ * Does NOT save to storage - use registerServer() for that
537
+ */
538
+ createConnection(id, url, options) {
539
+ if (this.mcpConnections[id]) return;
540
+ const normalizedTransport = {
541
+ ...options.transport,
542
+ type: options.transport?.type ?? "auto"
543
+ };
544
+ this.mcpConnections[id] = new MCPClientConnection(new URL(url), {
545
+ name: this._name,
546
+ version: this._version
547
+ }, {
548
+ client: {
549
+ ...defaultClientOptions,
550
+ ...options.client
551
+ },
552
+ transport: normalizedTransport
553
+ });
554
+ const store = new DisposableStore();
555
+ const existing = this._connectionDisposables.get(id);
556
+ if (existing) existing.dispose();
557
+ this._connectionDisposables.set(id, store);
558
+ store.add(this.mcpConnections[id].onObservabilityEvent((event) => {
559
+ this._onObservabilityEvent.fire(event);
560
+ }));
561
+ }
562
+ /**
563
+ * Register an MCP server connection without connecting
564
+ * Creates the connection object, sets up observability, and saves to storage
565
+ *
566
+ * @param id Server ID
567
+ * @param options Registration options including URL, name, callback URL, and connection config
568
+ * @returns Server ID
569
+ */
570
+ async registerServer(id, options) {
571
+ this.createConnection(id, options.url, {
572
+ client: options.client,
573
+ transport: {
574
+ ...options.transport,
575
+ type: options.transport?.type ?? "auto"
576
+ }
577
+ });
578
+ await this._storage.saveServer({
579
+ id,
580
+ name: options.name,
581
+ server_url: options.url,
582
+ callback_url: options.callbackUrl,
583
+ client_id: options.clientId ?? null,
584
+ auth_url: options.authUrl ?? null,
585
+ server_options: JSON.stringify({
586
+ client: options.client,
587
+ transport: options.transport
588
+ })
589
+ });
590
+ this._onServerStateChanged.fire();
591
+ return id;
592
+ }
593
+ /**
594
+ * Connect to an already registered MCP server and initialize the connection.
595
+ *
596
+ * For OAuth servers, this returns `{ state: "authenticating", authUrl, clientId? }`
597
+ * without establishing the connection. The user must complete the OAuth flow via
598
+ * the authUrl, which will trigger a callback handled by `handleCallbackRequest()`.
599
+ *
600
+ * For non-OAuth servers, this establishes the connection immediately and returns
601
+ * `{ state: "ready" }`.
602
+ *
603
+ * Updates storage with auth URL and client ID after connection.
604
+ *
605
+ * @param id Server ID (must be registered first via registerServer())
606
+ * @returns Connection result with current state and OAuth info (if applicable)
607
+ */
608
+ async connectToServer(id) {
609
+ const conn = this.mcpConnections[id];
610
+ if (!conn) throw new Error(`Server ${id} is not registered. Call registerServer() first.`);
611
+ await conn.init();
612
+ const authUrl = conn.options.transport.authProvider?.authUrl;
613
+ if (conn.connectionState === "authenticating" && authUrl && conn.options.transport.authProvider?.redirectUrl) {
614
+ const clientId = conn.options.transport.authProvider?.clientId;
615
+ const serverRow = (await this._storage.listServers()).find((s) => s.id === id);
616
+ if (serverRow) await this._storage.saveServer({
617
+ ...serverRow,
618
+ auth_url: authUrl,
619
+ client_id: clientId ?? null
620
+ });
621
+ this._onServerStateChanged.fire();
541
622
  return {
623
+ state: "authenticating",
542
624
  authUrl,
543
- clientId: options.transport?.authProvider?.clientId,
544
- id
625
+ clientId
545
626
  };
546
627
  }
547
- return { id };
628
+ if (conn.connectionState === "ready") this._onServerStateChanged.fire();
629
+ return { state: "ready" };
548
630
  }
549
- isCallbackRequest(req) {
550
- return req.method === "GET" && !!this._callbackUrls.find((url) => {
551
- return req.url.startsWith(url);
552
- });
631
+ async isCallbackRequest(req) {
632
+ if (req.method !== "GET") return false;
633
+ if (!req.url.includes("/callback")) return false;
634
+ return (await this._storage.listServers()).some((server) => server.callback_url && req.url.startsWith(server.callback_url));
553
635
  }
554
636
  async handleCallbackRequest(req) {
555
637
  const url = new URL(req.url);
556
- const urlMatch = this._callbackUrls.find((url$1) => {
557
- return req.url.startsWith(url$1);
638
+ const matchingServer = (await this._storage.listServers()).find((server) => {
639
+ return server.callback_url && req.url.startsWith(server.callback_url);
558
640
  });
559
- if (!urlMatch) throw new Error(`No callback URI match found for the request url: ${req.url}. Was the request matched with \`isCallbackRequest()\`?`);
641
+ if (!matchingServer) throw new Error(`No callback URI match found for the request url: ${req.url}. Was the request matched with \`isCallbackRequest()\`?`);
642
+ const serverId = matchingServer.id;
560
643
  const code = url.searchParams.get("code");
561
644
  const state = url.searchParams.get("state");
562
- const urlParams = urlMatch.split("/");
563
- const serverId = urlParams[urlParams.length - 1];
645
+ const error = url.searchParams.get("error");
646
+ const errorDescription = url.searchParams.get("error_description");
647
+ if (error) return {
648
+ serverId,
649
+ authSuccess: false,
650
+ authError: errorDescription || error
651
+ };
564
652
  if (!code) throw new Error("Unauthorized: no code provided");
565
653
  if (!state) throw new Error("Unauthorized: no state provided");
566
654
  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");
655
+ if (this.mcpConnections[serverId].connectionState === "ready") return {
656
+ serverId,
657
+ authSuccess: true
658
+ };
659
+ if (this.mcpConnections[serverId].connectionState !== "authenticating") throw new Error(`Failed to authenticate: the client is in "${this.mcpConnections[serverId].connectionState}" state, expected "authenticating"`);
568
660
  const conn = this.mcpConnections[serverId];
569
661
  if (!conn.options.transport.authProvider) throw new Error("Trying to finalize authentication for a server connection without an authProvider");
570
662
  const clientId = conn.options.transport.authProvider.clientId || state;
@@ -572,15 +664,19 @@ var MCPClientManager = class {
572
664
  conn.options.transport.authProvider.serverId = serverId;
573
665
  try {
574
666
  await conn.completeAuthorization(code);
667
+ await this._storage.clearAuthUrl(serverId);
668
+ this._onServerStateChanged.fire();
575
669
  return {
576
670
  serverId,
577
671
  authSuccess: true
578
672
  };
579
- } catch (error) {
673
+ } catch (error$1) {
674
+ const errorMessage = error$1 instanceof Error ? error$1.message : String(error$1);
675
+ this._onServerStateChanged.fire();
580
676
  return {
581
677
  serverId,
582
678
  authSuccess: false,
583
- authError: error instanceof Error ? error.message : String(error)
679
+ authError: errorMessage
584
680
  };
585
681
  }
586
682
  }
@@ -603,7 +699,7 @@ var MCPClientManager = class {
603
699
  }
604
700
  try {
605
701
  await conn.establishConnection();
606
- this._onConnected.fire(serverId);
702
+ this._onServerStateChanged.fire();
607
703
  } catch (error) {
608
704
  const url = conn.url.toString();
609
705
  this._onObservabilityEvent.fire({
@@ -618,23 +714,10 @@ var MCPClientManager = class {
618
714
  timestamp: Date.now(),
619
715
  id: nanoid()
620
716
  });
717
+ this._onServerStateChanged.fire();
621
718
  }
622
719
  }
623
720
  /**
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
721
  * Configure OAuth callback handling
639
722
  * @param config OAuth callback configuration
640
723
  */
@@ -655,9 +738,28 @@ var MCPClientManager = class {
655
738
  return getNamespacedData(this.mcpConnections, "tools");
656
739
  }
657
740
  /**
741
+ * Lazy-loads the jsonSchema function from the AI SDK.
742
+ *
743
+ * This defers importing the "ai" package until it's actually needed, which helps reduce
744
+ * initial bundle size and startup time. The jsonSchema function is required for converting
745
+ * MCP tools into AI SDK tool definitions via getAITools().
746
+ *
747
+ * @internal This method is for internal use only. It's automatically called before operations
748
+ * that need jsonSchema (like getAITools() or OAuth flows). External consumers should not need
749
+ * to call this directly.
750
+ */
751
+ async ensureJsonSchema() {
752
+ if (!this.jsonSchema) {
753
+ const { jsonSchema } = await import("ai");
754
+ this.jsonSchema = jsonSchema;
755
+ }
756
+ }
757
+ /**
658
758
  * @returns a set of tools that you can use with the AI SDK
659
759
  */
660
760
  getAITools() {
761
+ if (!this.jsonSchema) throw new Error("jsonSchema not initialized.");
762
+ 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
763
  return Object.fromEntries(getNamespacedData(this.mcpConnections, "tools").map((tool) => {
662
764
  return [`tool_${tool.serverId.replace(/-/g, "")}_${tool.name}`, {
663
765
  description: tool.description,
@@ -714,13 +816,26 @@ var MCPClientManager = class {
714
816
  this._connectionDisposables.delete(id);
715
817
  }
716
818
  /**
819
+ * Remove an MCP server from storage
820
+ */
821
+ async removeServer(serverId) {
822
+ await this._storage.removeServer(serverId);
823
+ this._onServerStateChanged.fire();
824
+ }
825
+ /**
826
+ * List all MCP servers from storage
827
+ */
828
+ async listServers() {
829
+ return await this._storage.listServers();
830
+ }
831
+ /**
717
832
  * Dispose the manager and all resources.
718
833
  */
719
834
  async dispose() {
720
835
  try {
721
836
  await this.closeAllConnections();
722
837
  } finally {
723
- this._onConnected.dispose();
838
+ this._onServerStateChanged.dispose();
724
839
  this._onObservabilityEvent.dispose();
725
840
  }
726
841
  }
@@ -782,5 +897,5 @@ function getNamespacedData(mcpClients, type) {
782
897
  }
783
898
 
784
899
  //#endregion
785
- export { SSEEdgeClientTransport as a, StreamableHTTPEdgeClientTransport as i, getNamespacedData as n, DisposableStore as o, MCPClientConnection as r, MCPClientManager as t };
786
- //# sourceMappingURL=client-9Ld2_lnt.js.map
900
+ export { getNamespacedData as n, DisposableStore as r, MCPClientManager as t };
901
+ //# sourceMappingURL=client-DpkZyXgJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-DpkZyXgJ.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[]","defaultClientOptions: ConstructorParameters<typeof Client>[1]","_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 { CfWorkerJsonSchemaValidator } from \"@modelcontextprotocol/sdk/validation/cfworker-provider.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\nconst defaultClientOptions: ConstructorParameters<typeof Client>[1] = {\n jsonSchemaValidator: new CfWorkerJsonSchemaValidator()\n};\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 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: { ...defaultClientOptions, ...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 }\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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"}
@@ -1,8 +1,8 @@
1
1
  import "../ai-types-B3aQaFv3.js";
2
2
  import "../client-BfiZ3HQd.js";
3
- import "../client-9Ld2_lnt.js";
4
- import "../do-oauth-client-provider-CswoD5Lu.js";
5
- import { s as getAgentByName } from "../src-Dz0H9hSU.js";
3
+ import "../client-DpkZyXgJ.js";
4
+ import "../do-oauth-client-provider-D2P1lSft.js";
5
+ import { s as getAgentByName } from "../src-Dk8lwxHf.js";
6
6
  import { generateObject, tool } from "ai";
7
7
  import { openai } from "@ai-sdk/openai";
8
8
  import { z } from "zod/v3";