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.
- package/dist/ai-chat-agent.d.ts +10 -10
- package/dist/ai-chat-agent.js +6 -6
- package/dist/ai-chat-agent.js.map +1 -1
- package/dist/{ai-chat-v5-migration-gdyLiTd8.js → ai-chat-v5-migration-DBHGW4Hv.js} +2 -2
- package/dist/{ai-chat-v5-migration-gdyLiTd8.js.map → ai-chat-v5-migration-DBHGW4Hv.js.map} +1 -1
- package/dist/ai-chat-v5-migration.js +1 -1
- package/dist/ai-react.d.ts +9 -9
- package/dist/ai-react.js +17 -11
- package/dist/ai-react.js.map +1 -1
- package/dist/{ai-types-UZlfLOYP.js → ai-types-B3aQaFv3.js} +2 -2
- package/dist/{ai-types-UZlfLOYP.js.map → ai-types-B3aQaFv3.js.map} +1 -1
- package/dist/{ai-types-BWW4umHY.d.ts → ai-types-D5YoPrBZ.d.ts} +2 -2
- package/dist/ai-types.d.ts +4 -4
- package/dist/ai-types.js +1 -1
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +27 -0
- package/dist/cli.js.map +1 -0
- package/dist/{client-DjR-lC16.js → client-BfiZ3HQd.js} +3 -3
- package/dist/{client-DjR-lC16.js.map → client-BfiZ3HQd.js.map} +1 -1
- package/dist/{client-C-nwz-3N.d.ts → client-Bws9q38u.d.ts} +189 -75
- package/dist/{client-CmMi85Sj.d.ts → client-CbWe9FBd.d.ts} +10 -10
- package/dist/{client-CZBVDDoO.js → client-DvK0u9vD.js} +236 -124
- package/dist/client-DvK0u9vD.js.map +1 -0
- package/dist/client.d.ts +8 -8
- package/dist/client.js +2 -2
- package/dist/codemode/ai.js +5 -5
- package/dist/do-oauth-client-provider-CcTno-25.d.ts +142 -0
- package/dist/{do-oauth-client-provider-B2jr6UNq.js → do-oauth-client-provider-D2P1lSft.js} +3 -3
- package/dist/do-oauth-client-provider-D2P1lSft.js.map +1 -0
- package/dist/{index-CkQU40oY.d.ts → index-Bdzb2feZ.d.ts} +53 -39
- package/dist/{index-W4JUkafc.d.ts → index-DhJCaDWd.d.ts} +7 -3
- package/dist/index.d.ts +36 -36
- package/dist/index.js +5 -5
- package/dist/mcp/client.d.ts +4 -4
- package/dist/mcp/client.js +2 -1
- package/dist/mcp/do-oauth-client-provider.d.ts +1 -1
- package/dist/mcp/do-oauth-client-provider.js +1 -1
- package/dist/mcp/index.d.ts +127 -9
- package/dist/mcp/index.js +619 -26
- package/dist/mcp/index.js.map +1 -1
- package/dist/{mcp-BEwaCsxO.d.ts → mcp-Dw5vDrY8.d.ts} +2 -2
- package/dist/observability/index.d.ts +2 -2
- package/dist/observability/index.js +5 -5
- package/dist/{react-B4e1rDid.d.ts → react-DFNXTQzy.d.ts} +17 -17
- package/dist/react.d.ts +9 -9
- package/dist/react.js +1 -1
- package/dist/{serializable-gtr9YMhp.d.ts → serializable-CymX8ovI.d.ts} +8 -3
- package/dist/serializable.d.ts +5 -5
- package/dist/{src-COfG--3R.js → src-C1WWpbRo.js} +189 -121
- package/dist/src-C1WWpbRo.js.map +1 -0
- package/package.json +54 -39
- package/dist/client-CZBVDDoO.js.map +0 -1
- package/dist/do-oauth-client-provider-B2jr6UNq.js.map +0 -1
- package/dist/do-oauth-client-provider-CCwGwnrA.d.ts +0 -55
- package/dist/src-COfG--3R.js.map +0 -1
- 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
|
|
379
|
-
case "sse": return new
|
|
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
|
|
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.
|
|
473
|
-
this.
|
|
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
|
-
* @
|
|
479
|
-
*
|
|
480
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
544
|
-
id
|
|
621
|
+
clientId
|
|
545
622
|
};
|
|
546
623
|
}
|
|
547
|
-
|
|
624
|
+
if (conn.connectionState === "ready") this._onServerStateChanged.fire();
|
|
625
|
+
return { state: "ready" };
|
|
548
626
|
}
|
|
549
|
-
isCallbackRequest(req) {
|
|
550
|
-
|
|
551
|
-
|
|
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
|
|
557
|
-
return req.url.startsWith(
|
|
634
|
+
const matchingServer = (await this._storage.listServers()).find((server) => {
|
|
635
|
+
return server.callback_url && req.url.startsWith(server.callback_url);
|
|
558
636
|
});
|
|
559
|
-
if (!
|
|
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
|
|
563
|
-
const
|
|
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
|
|
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:
|
|
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.
|
|
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.
|
|
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
|
|
786
|
-
//# sourceMappingURL=client-
|
|
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-
|
|
1
|
+
import "./serializable-CymX8ovI.js";
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
} from "./client-
|
|
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,
|