mcp-use 1.2.2-canary.0 → 1.2.2-canary.1
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/.tsbuildinfo +1 -1
- package/dist/{chunk-VPPILX7B.js → chunk-3RJENWH4.js} +15 -6
- package/dist/{chunk-UVUM35MV.js → chunk-7UX634PO.js} +307 -112
- package/dist/{chunk-CPV4QNHD.js → chunk-KLIBVJ3Z.js} +145 -79
- package/dist/{chunk-EYAIJPBH.js → chunk-MZLETWQQ.js} +55 -17
- package/dist/{chunk-C3SRZK7H.js → chunk-RSGKBEHH.js} +144 -72
- package/dist/index.cjs +719 -300
- package/dist/index.d.ts +24 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -28
- package/dist/{langfuse-MO3AMDBE.js → langfuse-LCJ6VJEP.js} +2 -2
- package/dist/src/adapters/base.d.ts +2 -2
- package/dist/src/adapters/base.d.ts.map +1 -1
- package/dist/src/adapters/index.d.ts +2 -2
- package/dist/src/adapters/index.d.ts.map +1 -1
- package/dist/src/adapters/langchain_adapter.d.ts +4 -4
- package/dist/src/adapters/langchain_adapter.d.ts.map +1 -1
- package/dist/src/agents/base.d.ts +1 -1
- package/dist/src/agents/base.d.ts.map +1 -1
- package/dist/src/agents/index.d.ts +3 -3
- package/dist/src/agents/index.d.ts.map +1 -1
- package/dist/src/agents/mcp_agent.d.ts +12 -12
- package/dist/src/agents/mcp_agent.d.ts.map +1 -1
- package/dist/src/agents/prompts/system_prompt_builder.d.ts +2 -2
- package/dist/src/agents/prompts/system_prompt_builder.d.ts.map +1 -1
- package/dist/src/agents/prompts/templates.d.ts.map +1 -1
- package/dist/src/agents/remote.d.ts +2 -2
- package/dist/src/agents/remote.d.ts.map +1 -1
- package/dist/src/agents/types.d.ts +1 -1
- package/dist/src/agents/types.d.ts.map +1 -1
- package/dist/src/agents/utils/ai_sdk.d.ts +1 -1
- package/dist/src/agents/utils/ai_sdk.d.ts.map +1 -1
- package/dist/src/agents/utils/index.d.ts +1 -1
- package/dist/src/agents/utils/index.d.ts.map +1 -1
- package/dist/src/auth/browser-provider.d.ts +2 -2
- package/dist/src/auth/browser-provider.d.ts.map +1 -1
- package/dist/src/auth/callback.d.ts.map +1 -1
- package/dist/src/auth/index.d.ts +3 -3
- package/dist/src/auth/index.d.ts.map +1 -1
- package/dist/src/auth/types.d.ts +1 -1
- package/dist/src/auth/types.d.ts.map +1 -1
- package/dist/src/browser.cjs +508 -201
- package/dist/src/browser.d.ts +17 -17
- package/dist/src/browser.d.ts.map +1 -1
- package/dist/src/browser.js +11 -5
- package/dist/src/client/base.d.ts +2 -2
- package/dist/src/client/base.d.ts.map +1 -1
- package/dist/src/client/browser.d.ts +2 -2
- package/dist/src/client/browser.d.ts.map +1 -1
- package/dist/src/client.d.ts +2 -2
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/config.d.ts +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/connectors/base.d.ts +5 -5
- package/dist/src/connectors/base.d.ts.map +1 -1
- package/dist/src/connectors/http.d.ts +3 -3
- package/dist/src/connectors/http.d.ts.map +1 -1
- package/dist/src/connectors/index.d.ts +4 -4
- package/dist/src/connectors/index.d.ts.map +1 -1
- package/dist/src/connectors/stdio.d.ts +3 -3
- package/dist/src/connectors/stdio.d.ts.map +1 -1
- package/dist/src/connectors/websocket.d.ts +3 -3
- package/dist/src/connectors/websocket.d.ts.map +1 -1
- package/dist/src/logging.d.ts +4 -4
- package/dist/src/logging.d.ts.map +1 -1
- package/dist/src/managers/index.d.ts +2 -2
- package/dist/src/managers/index.d.ts.map +1 -1
- package/dist/src/managers/server_manager.d.ts +4 -4
- package/dist/src/managers/server_manager.d.ts.map +1 -1
- package/dist/src/managers/tools/acquire_active_mcp_server.d.ts +3 -3
- package/dist/src/managers/tools/acquire_active_mcp_server.d.ts.map +1 -1
- package/dist/src/managers/tools/add_server_from_config.d.ts +3 -3
- package/dist/src/managers/tools/add_server_from_config.d.ts.map +1 -1
- package/dist/src/managers/tools/base.d.ts +6 -6
- package/dist/src/managers/tools/base.d.ts.map +1 -1
- package/dist/src/managers/tools/connect_mcp_server.d.ts +4 -4
- package/dist/src/managers/tools/connect_mcp_server.d.ts.map +1 -1
- package/dist/src/managers/tools/index.d.ts +5 -5
- package/dist/src/managers/tools/index.d.ts.map +1 -1
- package/dist/src/managers/tools/list_mcp_servers.d.ts +3 -3
- package/dist/src/managers/tools/list_mcp_servers.d.ts.map +1 -1
- package/dist/src/managers/tools/release_mcp_server_connection.d.ts +3 -3
- package/dist/src/managers/tools/release_mcp_server_connection.d.ts.map +1 -1
- package/dist/src/managers/types.d.ts +3 -3
- package/dist/src/managers/types.d.ts.map +1 -1
- package/dist/src/oauth-helper.d.ts.map +1 -1
- package/dist/src/observability/index.d.ts +3 -3
- package/dist/src/observability/index.d.ts.map +1 -1
- package/dist/src/observability/langfuse.d.ts +1 -1
- package/dist/src/observability/langfuse.d.ts.map +1 -1
- package/dist/src/observability/manager.d.ts +1 -1
- package/dist/src/observability/manager.d.ts.map +1 -1
- package/dist/src/observability/types.d.ts +1 -1
- package/dist/src/observability/types.d.ts.map +1 -1
- package/dist/src/react/index.cjs +295 -154
- package/dist/src/react/index.d.ts +6 -6
- package/dist/src/react/index.d.ts.map +1 -1
- package/dist/src/react/index.js +3 -3
- package/dist/src/react/types.d.ts +6 -6
- package/dist/src/react/types.d.ts.map +1 -1
- package/dist/src/react/useMcp.d.ts +1 -1
- package/dist/src/react/useMcp.d.ts.map +1 -1
- package/dist/src/react/useWidget.d.ts +5 -2
- package/dist/src/react/useWidget.d.ts.map +1 -1
- package/dist/src/react/widget-types.d.ts +3 -3
- package/dist/src/react/widget-types.d.ts.map +1 -1
- package/dist/src/server/adapters/mcp-ui-adapter.d.ts +3 -3
- package/dist/src/server/adapters/mcp-ui-adapter.d.ts.map +1 -1
- package/dist/src/server/index.cjs +170 -50
- package/dist/src/server/index.d.ts +4 -4
- package/dist/src/server/index.d.ts.map +1 -1
- package/dist/src/server/index.js +174 -51
- package/dist/src/server/logging.d.ts +1 -1
- package/dist/src/server/logging.d.ts.map +1 -1
- package/dist/src/server/mcp-server.d.ts +29 -29
- package/dist/src/server/mcp-server.d.ts.map +1 -1
- package/dist/src/server/types/common.d.ts +2 -2
- package/dist/src/server/types/common.d.ts.map +1 -1
- package/dist/src/server/types/index.d.ts +4 -4
- package/dist/src/server/types/index.d.ts.map +1 -1
- package/dist/src/server/types/prompt.d.ts +2 -2
- package/dist/src/server/types/prompt.d.ts.map +1 -1
- package/dist/src/server/types/resource.d.ts +24 -24
- package/dist/src/server/types/resource.d.ts.map +1 -1
- package/dist/src/server/types/tool.d.ts +3 -3
- package/dist/src/server/types/tool.d.ts.map +1 -1
- package/dist/src/server/types/widget.d.ts +1 -1
- package/dist/src/server/types.d.ts +1 -1
- package/dist/src/server/types.d.ts.map +1 -1
- package/dist/src/session.d.ts +1 -1
- package/dist/src/session.d.ts.map +1 -1
- package/dist/src/task_managers/base.d.ts.map +1 -1
- package/dist/src/task_managers/index.d.ts +5 -5
- package/dist/src/task_managers/index.d.ts.map +1 -1
- package/dist/src/task_managers/sse.d.ts +3 -3
- package/dist/src/task_managers/sse.d.ts.map +1 -1
- package/dist/src/task_managers/stdio.d.ts +4 -4
- package/dist/src/task_managers/stdio.d.ts.map +1 -1
- package/dist/src/task_managers/streamable_http.d.ts +3 -3
- package/dist/src/task_managers/streamable_http.d.ts.map +1 -1
- package/dist/src/task_managers/websocket.d.ts +2 -2
- package/dist/src/task_managers/websocket.d.ts.map +1 -1
- package/dist/src/telemetry/events.d.ts.map +1 -1
- package/dist/src/telemetry/index.d.ts +4 -4
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/telemetry.d.ts +1 -1
- package/dist/src/telemetry/telemetry.d.ts.map +1 -1
- package/dist/src/telemetry/utils.d.ts +1 -1
- package/dist/src/telemetry/utils.d.ts.map +1 -1
- package/dist/tsup.config.d.ts.map +1 -1
- package/dist/vitest.config.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
logger
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-3RJENWH4.js";
|
|
4
4
|
import {
|
|
5
5
|
__name
|
|
6
6
|
} from "./chunk-SHUYVCID.js";
|
|
@@ -76,7 +76,10 @@ var BaseConnector = class {
|
|
|
76
76
|
logger.debug("Caching server capabilities & tools");
|
|
77
77
|
const capabilities = this.client.getServerCapabilities();
|
|
78
78
|
this.capabilitiesCache = capabilities;
|
|
79
|
-
const listToolsRes = await this.client.listTools(
|
|
79
|
+
const listToolsRes = await this.client.listTools(
|
|
80
|
+
void 0,
|
|
81
|
+
defaultRequestOptions
|
|
82
|
+
);
|
|
80
83
|
this.toolsCache = listToolsRes.tools ?? [];
|
|
81
84
|
logger.debug(`Fetched ${this.toolsCache.length} tools from server`);
|
|
82
85
|
logger.debug("Server capabilities:", capabilities);
|
|
@@ -95,7 +98,11 @@ var BaseConnector = class {
|
|
|
95
98
|
throw new Error("MCP client is not connected");
|
|
96
99
|
}
|
|
97
100
|
logger.debug(`Calling tool '${name}' with args`, args);
|
|
98
|
-
const res = await this.client.callTool(
|
|
101
|
+
const res = await this.client.callTool(
|
|
102
|
+
{ name, arguments: args },
|
|
103
|
+
void 0,
|
|
104
|
+
options
|
|
105
|
+
);
|
|
99
106
|
logger.debug(`Tool '${name}' returned`, res);
|
|
100
107
|
return res;
|
|
101
108
|
}
|
|
@@ -225,7 +232,11 @@ var BaseConnector = class {
|
|
|
225
232
|
throw new Error("MCP client is not connected");
|
|
226
233
|
}
|
|
227
234
|
logger.debug(`Sending raw request '${method}' with params`, params);
|
|
228
|
-
return await this.client.request(
|
|
235
|
+
return await this.client.request(
|
|
236
|
+
{ method, params: params ?? {} },
|
|
237
|
+
void 0,
|
|
238
|
+
options
|
|
239
|
+
);
|
|
229
240
|
}
|
|
230
241
|
/**
|
|
231
242
|
* Helper to tear down the client & connection manager safely.
|
|
@@ -356,7 +367,9 @@ var ConnectionManager = class {
|
|
|
356
367
|
try {
|
|
357
368
|
await this.closeConnection(this._connection);
|
|
358
369
|
} catch (closeErr) {
|
|
359
|
-
logger.warn(
|
|
370
|
+
logger.warn(
|
|
371
|
+
`Error closing connection in ${this.constructor.name}: ${closeErr}`
|
|
372
|
+
);
|
|
360
373
|
}
|
|
361
374
|
this._connection = null;
|
|
362
375
|
}
|
|
@@ -500,7 +513,10 @@ var HttpConnector = class extends BaseConnector {
|
|
|
500
513
|
}
|
|
501
514
|
this.timeout = opts.timeout ?? 3e4;
|
|
502
515
|
this.sseReadTimeout = opts.sseReadTimeout ?? 3e5;
|
|
503
|
-
this.clientInfo = opts.clientInfo ?? {
|
|
516
|
+
this.clientInfo = opts.clientInfo ?? {
|
|
517
|
+
name: "http-connector",
|
|
518
|
+
version: "1.0.0"
|
|
519
|
+
};
|
|
504
520
|
this.preferSse = opts.preferSse ?? false;
|
|
505
521
|
}
|
|
506
522
|
/** Establish connection to the MCP implementation via HTTP (streamable or SSE). */
|
|
@@ -571,29 +587,28 @@ var HttpConnector = class extends BaseConnector {
|
|
|
571
587
|
authError.code = 401;
|
|
572
588
|
throw authError;
|
|
573
589
|
}
|
|
574
|
-
throw new Error(
|
|
590
|
+
throw new Error(
|
|
591
|
+
"Could not connect to server with any available transport"
|
|
592
|
+
);
|
|
575
593
|
}
|
|
576
594
|
}
|
|
577
595
|
}
|
|
578
596
|
async connectWithStreamableHttp(baseUrl) {
|
|
579
597
|
try {
|
|
580
|
-
this.connectionManager = new StreamableHttpConnectionManager(
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
reconnectionDelayGrowFactor: 1.5,
|
|
593
|
-
maxRetries: 2
|
|
594
|
-
}
|
|
598
|
+
this.connectionManager = new StreamableHttpConnectionManager(baseUrl, {
|
|
599
|
+
authProvider: this.opts.authProvider,
|
|
600
|
+
// ← Pass OAuth provider to SDK
|
|
601
|
+
requestInit: {
|
|
602
|
+
headers: this.headers
|
|
603
|
+
},
|
|
604
|
+
// Pass through timeout and other options
|
|
605
|
+
reconnectionOptions: {
|
|
606
|
+
maxReconnectionDelay: 3e4,
|
|
607
|
+
initialReconnectionDelay: 1e3,
|
|
608
|
+
reconnectionDelayGrowFactor: 1.5,
|
|
609
|
+
maxRetries: 2
|
|
595
610
|
}
|
|
596
|
-
);
|
|
611
|
+
});
|
|
597
612
|
const transport = await this.connectionManager.start();
|
|
598
613
|
this.client = new Client(this.clientInfo, this.opts.clientOptions);
|
|
599
614
|
try {
|
|
@@ -602,7 +617,9 @@ var HttpConnector = class extends BaseConnector {
|
|
|
602
617
|
if (connectErr instanceof Error) {
|
|
603
618
|
const errMsg = connectErr.message || connectErr.toString();
|
|
604
619
|
if (errMsg.includes("Missing session ID") || errMsg.includes("Bad Request: Missing session ID")) {
|
|
605
|
-
const wrappedError = new Error(
|
|
620
|
+
const wrappedError = new Error(
|
|
621
|
+
`FastMCP session ID error: ${errMsg}`
|
|
622
|
+
);
|
|
606
623
|
wrappedError.cause = connectErr;
|
|
607
624
|
throw wrappedError;
|
|
608
625
|
}
|
|
@@ -611,7 +628,9 @@ var HttpConnector = class extends BaseConnector {
|
|
|
611
628
|
}
|
|
612
629
|
this.connected = true;
|
|
613
630
|
this.transportType = "streamable-http";
|
|
614
|
-
logger.debug(
|
|
631
|
+
logger.debug(
|
|
632
|
+
`Successfully connected to MCP implementation via streamable HTTP: ${baseUrl}`
|
|
633
|
+
);
|
|
615
634
|
} catch (err) {
|
|
616
635
|
await this.cleanupResources();
|
|
617
636
|
throw err;
|
|
@@ -619,20 +638,19 @@ var HttpConnector = class extends BaseConnector {
|
|
|
619
638
|
}
|
|
620
639
|
async connectWithSse(baseUrl) {
|
|
621
640
|
try {
|
|
622
|
-
this.connectionManager = new SseConnectionManager(
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
requestInit: {
|
|
626
|
-
headers: this.headers
|
|
627
|
-
}
|
|
641
|
+
this.connectionManager = new SseConnectionManager(baseUrl, {
|
|
642
|
+
requestInit: {
|
|
643
|
+
headers: this.headers
|
|
628
644
|
}
|
|
629
|
-
);
|
|
645
|
+
});
|
|
630
646
|
const transport = await this.connectionManager.start();
|
|
631
647
|
this.client = new Client(this.clientInfo, this.opts.clientOptions);
|
|
632
648
|
await this.client.connect(transport);
|
|
633
649
|
this.connected = true;
|
|
634
650
|
this.transportType = "sse";
|
|
635
|
-
logger.debug(
|
|
651
|
+
logger.debug(
|
|
652
|
+
`Successfully connected to MCP implementation via HTTP/SSE: ${baseUrl}`
|
|
653
|
+
);
|
|
636
654
|
} catch (err) {
|
|
637
655
|
await this.cleanupResources();
|
|
638
656
|
throw err;
|
|
@@ -678,7 +696,9 @@ var WebSocketConnectionManager = class extends ConnectionManager {
|
|
|
678
696
|
async establishConnection() {
|
|
679
697
|
logger.debug(`Connecting to WebSocket: ${this.url}`);
|
|
680
698
|
return new Promise((resolve, reject) => {
|
|
681
|
-
const ws = new WS(this.url, {
|
|
699
|
+
const ws = new WS(this.url, {
|
|
700
|
+
headers: this.headers
|
|
701
|
+
});
|
|
682
702
|
this._ws = ws;
|
|
683
703
|
const onOpen = /* @__PURE__ */ __name(() => {
|
|
684
704
|
cleanup();
|
|
@@ -738,8 +758,7 @@ var WebSocketConnector = class extends BaseConnector {
|
|
|
738
758
|
super();
|
|
739
759
|
this.url = url;
|
|
740
760
|
this.headers = { ...opts.headers ?? {} };
|
|
741
|
-
if (opts.authToken)
|
|
742
|
-
this.headers.Authorization = `Bearer ${opts.authToken}`;
|
|
761
|
+
if (opts.authToken) this.headers.Authorization = `Bearer ${opts.authToken}`;
|
|
743
762
|
}
|
|
744
763
|
async connect() {
|
|
745
764
|
if (this.connected) {
|
|
@@ -748,7 +767,10 @@ var WebSocketConnector = class extends BaseConnector {
|
|
|
748
767
|
}
|
|
749
768
|
logger.debug(`Connecting via WebSocket: ${this.url}`);
|
|
750
769
|
try {
|
|
751
|
-
this.connectionManager = new WebSocketConnectionManager(
|
|
770
|
+
this.connectionManager = new WebSocketConnectionManager(
|
|
771
|
+
this.url,
|
|
772
|
+
this.headers
|
|
773
|
+
);
|
|
752
774
|
this.ws = await this.connectionManager.start();
|
|
753
775
|
this.receiverTask = this.receiveLoop();
|
|
754
776
|
this.connected = true;
|
|
@@ -769,8 +791,7 @@ var WebSocketConnector = class extends BaseConnector {
|
|
|
769
791
|
this.connected = false;
|
|
770
792
|
}
|
|
771
793
|
sendRequest(method, params = null) {
|
|
772
|
-
if (!this.ws)
|
|
773
|
-
throw new Error("WebSocket is not connected");
|
|
794
|
+
if (!this.ws) throw new Error("WebSocket is not connected");
|
|
774
795
|
const id = uuidv4();
|
|
775
796
|
const payload = JSON.stringify({ id, method, params: params ?? {} });
|
|
776
797
|
return new Promise((resolve, reject) => {
|
|
@@ -784,8 +805,7 @@ var WebSocketConnector = class extends BaseConnector {
|
|
|
784
805
|
});
|
|
785
806
|
}
|
|
786
807
|
async receiveLoop() {
|
|
787
|
-
if (!this.ws)
|
|
788
|
-
return;
|
|
808
|
+
if (!this.ws) return;
|
|
789
809
|
const socket = this.ws;
|
|
790
810
|
const onMessage = /* @__PURE__ */ __name((msg) => {
|
|
791
811
|
let data;
|
|
@@ -799,10 +819,8 @@ var WebSocketConnector = class extends BaseConnector {
|
|
|
799
819
|
if (id && this.pending.has(id)) {
|
|
800
820
|
const { resolve, reject } = this.pending.get(id);
|
|
801
821
|
this.pending.delete(id);
|
|
802
|
-
if ("result" in data)
|
|
803
|
-
|
|
804
|
-
else if ("error" in data)
|
|
805
|
-
reject(data.error);
|
|
822
|
+
if ("result" in data) resolve(data.result);
|
|
823
|
+
else if ("error" in data) reject(data.error);
|
|
806
824
|
} else {
|
|
807
825
|
logger.debug("Received unsolicited message", data);
|
|
808
826
|
}
|
|
@@ -860,14 +878,12 @@ var WebSocketConnector = class extends BaseConnector {
|
|
|
860
878
|
return await this.sendRequest(method, params);
|
|
861
879
|
}
|
|
862
880
|
get tools() {
|
|
863
|
-
if (!this.toolsCache)
|
|
864
|
-
throw new Error("MCP client is not initialized");
|
|
881
|
+
if (!this.toolsCache) throw new Error("MCP client is not initialized");
|
|
865
882
|
return this.toolsCache;
|
|
866
883
|
}
|
|
867
884
|
async cleanupResources() {
|
|
868
|
-
if (this.receiverTask)
|
|
869
|
-
|
|
870
|
-
});
|
|
885
|
+
if (this.receiverTask) await this.receiverTask.catch(() => {
|
|
886
|
+
});
|
|
871
887
|
this.receiverTask = null;
|
|
872
888
|
this.rejectAll(new Error("WebSocket disconnected"));
|
|
873
889
|
if (this.connectionManager) {
|
|
@@ -934,7 +950,10 @@ var BrowserOAuthClientProvider = class {
|
|
|
934
950
|
try {
|
|
935
951
|
return JSON.parse(data);
|
|
936
952
|
} catch (e) {
|
|
937
|
-
console.warn(
|
|
953
|
+
console.warn(
|
|
954
|
+
`[${this.storageKeyPrefix}] Failed to parse client information:`,
|
|
955
|
+
e
|
|
956
|
+
);
|
|
938
957
|
localStorage.removeItem(key);
|
|
939
958
|
return void 0;
|
|
940
959
|
}
|
|
@@ -1016,7 +1035,11 @@ var BrowserOAuthClientProvider = class {
|
|
|
1016
1035
|
const sanitizedAuthUrl = await this.prepareAuthorizationUrl(authorizationUrl);
|
|
1017
1036
|
const popupFeatures = "width=600,height=700,resizable=yes,scrollbars=yes,status=yes";
|
|
1018
1037
|
try {
|
|
1019
|
-
const popup = window.open(
|
|
1038
|
+
const popup = window.open(
|
|
1039
|
+
sanitizedAuthUrl,
|
|
1040
|
+
`mcp_auth_${this.serverUrlHash}`,
|
|
1041
|
+
popupFeatures
|
|
1042
|
+
);
|
|
1020
1043
|
if (this.onPopupWindow) {
|
|
1021
1044
|
this.onPopupWindow(sanitizedAuthUrl, popupFeatures, popup);
|
|
1022
1045
|
}
|
|
@@ -1026,10 +1049,15 @@ var BrowserOAuthClientProvider = class {
|
|
|
1026
1049
|
);
|
|
1027
1050
|
} else {
|
|
1028
1051
|
popup.focus();
|
|
1029
|
-
console.info(
|
|
1052
|
+
console.info(
|
|
1053
|
+
`[${this.storageKeyPrefix}] Redirecting to authorization URL in popup.`
|
|
1054
|
+
);
|
|
1030
1055
|
}
|
|
1031
1056
|
} catch (e) {
|
|
1032
|
-
console.error(
|
|
1057
|
+
console.error(
|
|
1058
|
+
`[${this.storageKeyPrefix}] Error opening popup window:`,
|
|
1059
|
+
e
|
|
1060
|
+
);
|
|
1033
1061
|
}
|
|
1034
1062
|
}
|
|
1035
1063
|
// --- Helper Methods ---
|
|
@@ -1060,7 +1088,10 @@ var BrowserOAuthClientProvider = class {
|
|
|
1060
1088
|
}
|
|
1061
1089
|
}
|
|
1062
1090
|
} catch (e) {
|
|
1063
|
-
console.warn(
|
|
1091
|
+
console.warn(
|
|
1092
|
+
`[${this.storageKeyPrefix}] Error parsing state key ${key} during clearStorage:`,
|
|
1093
|
+
e
|
|
1094
|
+
);
|
|
1064
1095
|
}
|
|
1065
1096
|
}
|
|
1066
1097
|
}
|
|
@@ -1094,23 +1125,36 @@ async function onMcpAuthorization() {
|
|
|
1094
1125
|
const error = queryParams.get("error");
|
|
1095
1126
|
const errorDescription = queryParams.get("error_description");
|
|
1096
1127
|
const logPrefix = "[mcp-callback]";
|
|
1097
|
-
console.log(`${logPrefix} Handling callback...`, {
|
|
1128
|
+
console.log(`${logPrefix} Handling callback...`, {
|
|
1129
|
+
code,
|
|
1130
|
+
state,
|
|
1131
|
+
error,
|
|
1132
|
+
errorDescription
|
|
1133
|
+
});
|
|
1098
1134
|
let provider = null;
|
|
1099
1135
|
let storedStateData = null;
|
|
1100
1136
|
const stateKey = state ? `mcp:auth:state_${state}` : null;
|
|
1101
1137
|
try {
|
|
1102
1138
|
if (error) {
|
|
1103
|
-
throw new Error(
|
|
1139
|
+
throw new Error(
|
|
1140
|
+
`OAuth error: ${error} - ${errorDescription || "No description provided."}`
|
|
1141
|
+
);
|
|
1104
1142
|
}
|
|
1105
1143
|
if (!code) {
|
|
1106
|
-
throw new Error(
|
|
1144
|
+
throw new Error(
|
|
1145
|
+
"Authorization code not found in callback query parameters."
|
|
1146
|
+
);
|
|
1107
1147
|
}
|
|
1108
1148
|
if (!state || !stateKey) {
|
|
1109
|
-
throw new Error(
|
|
1149
|
+
throw new Error(
|
|
1150
|
+
"State parameter not found or invalid in callback query parameters."
|
|
1151
|
+
);
|
|
1110
1152
|
}
|
|
1111
1153
|
const storedStateJSON = localStorage.getItem(stateKey);
|
|
1112
1154
|
if (!storedStateJSON) {
|
|
1113
|
-
throw new Error(
|
|
1155
|
+
throw new Error(
|
|
1156
|
+
`Invalid or expired state parameter "${state}". No matching state found in storage.`
|
|
1157
|
+
);
|
|
1114
1158
|
}
|
|
1115
1159
|
try {
|
|
1116
1160
|
storedStateData = JSON.parse(storedStateJSON);
|
|
@@ -1119,38 +1163,59 @@ async function onMcpAuthorization() {
|
|
|
1119
1163
|
}
|
|
1120
1164
|
if (!storedStateData.expiry || storedStateData.expiry < Date.now()) {
|
|
1121
1165
|
localStorage.removeItem(stateKey);
|
|
1122
|
-
throw new Error(
|
|
1166
|
+
throw new Error(
|
|
1167
|
+
"OAuth state has expired. Please try initiating authentication again."
|
|
1168
|
+
);
|
|
1123
1169
|
}
|
|
1124
1170
|
if (!storedStateData.providerOptions) {
|
|
1125
1171
|
throw new Error("Stored state is missing required provider options.");
|
|
1126
1172
|
}
|
|
1127
1173
|
const { serverUrl, ...providerOptions } = storedStateData.providerOptions;
|
|
1128
|
-
console.log(
|
|
1174
|
+
console.log(
|
|
1175
|
+
`${logPrefix} Re-instantiating provider for server: ${serverUrl}`
|
|
1176
|
+
);
|
|
1129
1177
|
provider = new BrowserOAuthClientProvider(serverUrl, providerOptions);
|
|
1130
1178
|
console.log(`${logPrefix} Calling SDK auth() to exchange code...`);
|
|
1131
1179
|
const baseUrl = new URL(serverUrl).origin;
|
|
1132
|
-
const authResult = await auth(provider, {
|
|
1180
|
+
const authResult = await auth(provider, {
|
|
1181
|
+
serverUrl: baseUrl,
|
|
1182
|
+
authorizationCode: code
|
|
1183
|
+
});
|
|
1133
1184
|
if (authResult === "AUTHORIZED") {
|
|
1134
|
-
console.log(
|
|
1185
|
+
console.log(
|
|
1186
|
+
`${logPrefix} Authorization successful via SDK auth(). Notifying opener...`
|
|
1187
|
+
);
|
|
1135
1188
|
if (window.opener && !window.opener.closed) {
|
|
1136
|
-
window.opener.postMessage(
|
|
1189
|
+
window.opener.postMessage(
|
|
1190
|
+
{ type: "mcp_auth_callback", success: true },
|
|
1191
|
+
window.location.origin
|
|
1192
|
+
);
|
|
1137
1193
|
window.close();
|
|
1138
1194
|
} else {
|
|
1139
|
-
console.warn(
|
|
1195
|
+
console.warn(
|
|
1196
|
+
`${logPrefix} No opener window detected. Redirecting to root.`
|
|
1197
|
+
);
|
|
1140
1198
|
const pathParts = window.location.pathname.split("/").filter(Boolean);
|
|
1141
1199
|
const basePath = pathParts.length > 0 && pathParts[pathParts.length - 1] === "callback" ? "/" + pathParts.slice(0, -2).join("/") : "/";
|
|
1142
1200
|
window.location.href = basePath || "/";
|
|
1143
1201
|
}
|
|
1144
1202
|
localStorage.removeItem(stateKey);
|
|
1145
1203
|
} else {
|
|
1146
|
-
console.warn(
|
|
1147
|
-
|
|
1204
|
+
console.warn(
|
|
1205
|
+
`${logPrefix} SDK auth() returned unexpected status: ${authResult}`
|
|
1206
|
+
);
|
|
1207
|
+
throw new Error(
|
|
1208
|
+
`Unexpected result from authentication library: ${authResult}`
|
|
1209
|
+
);
|
|
1148
1210
|
}
|
|
1149
1211
|
} catch (err) {
|
|
1150
1212
|
console.error(`${logPrefix} Error during OAuth callback handling:`, err);
|
|
1151
1213
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
1152
1214
|
if (window.opener && !window.opener.closed) {
|
|
1153
|
-
window.opener.postMessage(
|
|
1215
|
+
window.opener.postMessage(
|
|
1216
|
+
{ type: "mcp_auth_callback", success: false, error: errorMessage },
|
|
1217
|
+
window.location.origin
|
|
1218
|
+
);
|
|
1154
1219
|
}
|
|
1155
1220
|
try {
|
|
1156
1221
|
document.body.innerHTML = `
|
|
@@ -1164,7 +1229,10 @@ async function onMcpAuthorization() {
|
|
|
1164
1229
|
</div>
|
|
1165
1230
|
`;
|
|
1166
1231
|
} catch (displayError) {
|
|
1167
|
-
console.error(
|
|
1232
|
+
console.error(
|
|
1233
|
+
`${logPrefix} Could not display error in callback window:`,
|
|
1234
|
+
displayError
|
|
1235
|
+
);
|
|
1168
1236
|
}
|
|
1169
1237
|
if (stateKey) {
|
|
1170
1238
|
localStorage.removeItem(stateKey);
|
|
@@ -1256,7 +1324,9 @@ var BaseMCPClient = class {
|
|
|
1256
1324
|
async closeSession(serverName) {
|
|
1257
1325
|
const session = this.sessions[serverName];
|
|
1258
1326
|
if (!session) {
|
|
1259
|
-
logger.warn(
|
|
1327
|
+
logger.warn(
|
|
1328
|
+
`No session exists for server ${serverName}, nothing to close`
|
|
1329
|
+
);
|
|
1260
1330
|
return;
|
|
1261
1331
|
}
|
|
1262
1332
|
try {
|
|
@@ -1283,7 +1353,9 @@ var BaseMCPClient = class {
|
|
|
1283
1353
|
}
|
|
1284
1354
|
}
|
|
1285
1355
|
if (errors.length) {
|
|
1286
|
-
logger.error(
|
|
1356
|
+
logger.error(
|
|
1357
|
+
`Encountered ${errors.length} errors while closing sessions`
|
|
1358
|
+
);
|
|
1287
1359
|
} else {
|
|
1288
1360
|
logger.debug("All sessions closed successfully");
|
|
1289
1361
|
}
|