@mcp-use/client 2.0.0-beta.13 → 2.0.0-beta.15
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/README.md +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/auth/browser.d.ts +3 -0
- package/dist/auth/browser.d.ts.map +1 -1
- package/dist/auth/callback.d.ts.map +1 -1
- package/dist/auth/flow.d.ts.map +1 -1
- package/dist/auth/node.d.ts +16 -1
- package/dist/auth/node.d.ts.map +1 -1
- package/dist/index-browser.js +124 -64
- package/dist/index-browser.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +137 -47
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +424 -152
- package/dist/react/index.js.map +1 -1
- package/dist/react/storage.d.ts.map +1 -1
- package/dist/react/token-expiry.d.ts +9 -0
- package/dist/react/token-expiry.d.ts.map +1 -0
- package/dist/react/useMcp.d.ts.map +1 -1
- package/dist/react/view/ViewRenderer.d.ts +5 -4
- package/dist/react/view/ViewRenderer.d.ts.map +1 -1
- package/dist/react/view/ext-apps-bridge.d.ts +1 -1
- package/dist/react/view/ext-apps-bridge.d.ts.map +1 -1
- package/dist/react/view/sandbox-blob-url.d.ts +2 -0
- package/dist/react/view/sandbox-blob-url.d.ts.map +1 -1
- package/dist/react/view/types.d.ts +22 -4
- package/dist/react/view/types.d.ts.map +1 -1
- package/dist/react/view/view-host-policy.d.ts +26 -0
- package/dist/react/view/view-host-policy.d.ts.map +1 -0
- package/dist/telemetry/events.d.ts.map +1 -1
- package/dist/telemetry/tel-fetch.d.ts.map +1 -1
- package/dist/transport/connection-manager.d.ts +4 -0
- package/dist/transport/connection-manager.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/auth/browser.d.ts
CHANGED
|
@@ -48,6 +48,7 @@ export declare class BrowserOAuthClientProvider implements OAuthClientProvider {
|
|
|
48
48
|
private connectionUrl?;
|
|
49
49
|
private proxyOAuthRequests;
|
|
50
50
|
private lastAttemptedAuthUrl;
|
|
51
|
+
private authorizationPending;
|
|
51
52
|
readonly onPopupWindow: ((url: string, features: string, window: globalThis.Window | null) => void) | undefined;
|
|
52
53
|
constructor(serverUrl: string, options?: BrowserOAuthOptions);
|
|
53
54
|
get storageKeyPrefix(): string;
|
|
@@ -59,6 +60,8 @@ export declare class BrowserOAuthClientProvider implements OAuthClientProvider {
|
|
|
59
60
|
get scope(): string | undefined;
|
|
60
61
|
get clientMetadataUrl(): string | undefined;
|
|
61
62
|
getKey(keySuffix: string): string;
|
|
63
|
+
get hasPendingFlow(): boolean;
|
|
64
|
+
markFlowComplete(): void;
|
|
62
65
|
/**
|
|
63
66
|
* Re-anchor an SDK-derived OAuth discovery URL from the MCP connection
|
|
64
67
|
* (proxy) origin onto the actual MCP server.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/auth/browser.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/auth/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../src/auth/callback.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../src/auth/callback.ts"],"names":[],"mappings":"AAuMA;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD"}
|
package/dist/auth/flow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/auth/flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/auth/flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,8BAA8B,CAAC;AAmBtC;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,OAAO,CAgB/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GAC3D,OAAO,CAAC,IAAI,CAAC,CAgCf"}
|
package/dist/auth/node.d.ts
CHANGED
|
@@ -19,6 +19,13 @@ export declare class OAuthFlowError extends Error {
|
|
|
19
19
|
readonly description?: string;
|
|
20
20
|
constructor(code: string, description?: string);
|
|
21
21
|
}
|
|
22
|
+
/** Authorization response captured by the Node loopback callback. */
|
|
23
|
+
export interface NodeOAuthAuthorizationResponse {
|
|
24
|
+
/** Authorization code returned by the authorization server. */
|
|
25
|
+
code: string;
|
|
26
|
+
/** RFC 9207 authorization-server issuer, when present in the callback. */
|
|
27
|
+
iss?: string;
|
|
28
|
+
}
|
|
22
29
|
/**
|
|
23
30
|
* Node/CLI OAuth client provider for MCP. Owns a localhost loopback callback
|
|
24
31
|
* server, opens the user's browser, and resolves the authorization code via
|
|
@@ -38,7 +45,7 @@ export declare class NodeOAuthClientProvider implements OAuthClientProvider {
|
|
|
38
45
|
private server;
|
|
39
46
|
/** Currently in-flight deferred — used to prevent overlapping flows. */
|
|
40
47
|
private pending;
|
|
41
|
-
/** Latest deferred (settled or in-flight)
|
|
48
|
+
/** Latest deferred (settled or in-flight) for the loopback response. */
|
|
42
49
|
private lastFlow;
|
|
43
50
|
private pendingTimer;
|
|
44
51
|
private constructor();
|
|
@@ -67,11 +74,19 @@ export declare class NodeOAuthClientProvider implements OAuthClientProvider {
|
|
|
67
74
|
redirectToAuthorization(authorizationUrl: URL): Promise<void>;
|
|
68
75
|
/**
|
|
69
76
|
* Resolves with the authorization code captured by the loopback callback.
|
|
77
|
+
*
|
|
78
|
+
* @remarks This compatibility method omits the RFC 9207 issuer. OAuth flow
|
|
79
|
+
* orchestrators should use {@link getAuthorizationResponse} when available.
|
|
70
80
|
* Must be called after `redirectToAuthorization()`. Returns the same
|
|
71
81
|
* promise whether the callback has fired or not — callers may subscribe
|
|
72
82
|
* before or after.
|
|
73
83
|
*/
|
|
74
84
|
getAuthorizationCode(): Promise<string>;
|
|
85
|
+
/**
|
|
86
|
+
* Resolves with the authorization code and RFC 9207 issuer captured by the
|
|
87
|
+
* loopback callback.
|
|
88
|
+
*/
|
|
89
|
+
getAuthorizationResponse(): Promise<NodeOAuthAuthorizationResponse>;
|
|
75
90
|
/**
|
|
76
91
|
* Cancel an in-progress flow (timeout, SIGINT, etc.) and close the loopback.
|
|
77
92
|
*/
|
package/dist/auth/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/auth/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,6BAA6B,EAC7B,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACZ,MAAM,8BAA8B,CAAC;AAItC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,oBAAoB,CAAC;AAM5B,MAAM,WAAW,gBAAiB,SAAQ,wBAAwB;IAChE,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACrD;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;gBAClB,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;CAM/C;AA+DD;;;;;;;;GAQG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,EAAE,CAAU;IACpB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,mBAAmB,CAAC,CAAwC;IAEpE,OAAO,CAAC,MAAM,CAAuB;IACrC,wEAAwE;IACxE,OAAO,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/auth/node.ts"],"names":[],"mappings":"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"}
|
package/dist/index-browser.js
CHANGED
|
@@ -128,7 +128,7 @@ var Logger = class {
|
|
|
128
128
|
var logger = Logger.get();
|
|
129
129
|
|
|
130
130
|
// src/utils/version.ts
|
|
131
|
-
var VERSION = "2.0.0-beta.
|
|
131
|
+
var VERSION = "2.0.0-beta.15";
|
|
132
132
|
function getPackageVersion() {
|
|
133
133
|
return VERSION;
|
|
134
134
|
}
|
|
@@ -148,16 +148,13 @@ var MCPAgentExecutionEvent = class extends BaseTelemetryEvent {
|
|
|
148
148
|
return {
|
|
149
149
|
// Core execution info
|
|
150
150
|
execution_method: this.data.executionMethod,
|
|
151
|
-
query: this.data.query,
|
|
152
151
|
query_length: this.data.query.length,
|
|
153
152
|
success: this.data.success,
|
|
154
153
|
// Agent configuration
|
|
155
154
|
model_provider: this.data.modelProvider,
|
|
156
155
|
model_name: this.data.modelName,
|
|
157
156
|
server_count: this.data.serverCount,
|
|
158
|
-
server_identifiers: this.data.serverIdentifiers,
|
|
159
157
|
total_tools_available: this.data.totalToolsAvailable,
|
|
160
|
-
tools_available_names: this.data.toolsAvailableNames,
|
|
161
158
|
max_steps_configured: this.data.maxStepsConfigured,
|
|
162
159
|
memory_enabled: this.data.memoryEnabled,
|
|
163
160
|
use_server_manager: this.data.useServerManager,
|
|
@@ -168,8 +165,6 @@ var MCPAgentExecutionEvent = class extends BaseTelemetryEvent {
|
|
|
168
165
|
// Execution results (always include, even if null)
|
|
169
166
|
steps_taken: this.data.stepsTaken ?? null,
|
|
170
167
|
tools_used_count: this.data.toolsUsedCount ?? null,
|
|
171
|
-
tools_used_names: this.data.toolsUsedNames ?? null,
|
|
172
|
-
response: this.data.response ?? null,
|
|
173
168
|
response_length: this.data.response ? this.data.response.length : null,
|
|
174
169
|
execution_time_ms: this.data.executionTimeMs ?? null,
|
|
175
170
|
error_type: this.data.errorType ?? null,
|
|
@@ -265,21 +260,72 @@ async function telFetch(url, init) {
|
|
|
265
260
|
}
|
|
266
261
|
var POSTHOG_HOST = "https://eu.i.posthog.com";
|
|
267
262
|
var POSTHOG_API_KEY = "phc_lyTtbYwvkdSbrcMQNPiKiiRWrrM1seyKIMjycSvItEI";
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
263
|
+
var CONTENT_PROPERTY = /(^|_)(arguments?|args|body|command|headers?|location|message|query|response|secret|subject|token|uri|url|user_agent)(_|$)/i;
|
|
264
|
+
var IDENTIFYING_PROPERTY = /(^|_)(server_identifiers?|server_names?|servers|tool_names?|tools_(available|used)_names)(_|$)/i;
|
|
265
|
+
var AGGREGATE_PROPERTY = /(_count|_length|_duration(?:_ms)?|_time_ms|(^|_)num_[a-z0-9_]+)$/i;
|
|
266
|
+
function normalizePropertyKey(key) {
|
|
267
|
+
return key.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/[^a-z0-9_$]+/gi, "_").toLowerCase();
|
|
268
|
+
}
|
|
269
|
+
function sanitizeValue(value, seen) {
|
|
270
|
+
if (Array.isArray(value)) {
|
|
271
|
+
if (seen.has(value)) {
|
|
272
|
+
throw new TypeError("Cyclic telemetry properties are not supported");
|
|
273
|
+
}
|
|
274
|
+
seen.add(value);
|
|
275
|
+
const sanitized = value.map((item) => sanitizeValue(item, seen));
|
|
276
|
+
seen.delete(value);
|
|
277
|
+
return sanitized;
|
|
278
|
+
}
|
|
279
|
+
if (value !== null && typeof value === "object" && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)) {
|
|
280
|
+
if (seen.has(value)) {
|
|
281
|
+
throw new TypeError("Cyclic telemetry properties are not supported");
|
|
282
|
+
}
|
|
283
|
+
seen.add(value);
|
|
284
|
+
const sanitized = sanitizeProperties(
|
|
285
|
+
value,
|
|
286
|
+
seen
|
|
287
|
+
);
|
|
288
|
+
seen.delete(value);
|
|
289
|
+
return sanitized;
|
|
290
|
+
}
|
|
291
|
+
return value;
|
|
292
|
+
}
|
|
293
|
+
function sanitizeProperties(properties, seen = /* @__PURE__ */ new WeakSet()) {
|
|
294
|
+
const sanitized = {};
|
|
295
|
+
for (const [key, value] of Object.entries(properties)) {
|
|
296
|
+
const normalizedKey = normalizePropertyKey(key);
|
|
297
|
+
if (AGGREGATE_PROPERTY.test(normalizedKey)) {
|
|
298
|
+
if (value === null || typeof value === "number") {
|
|
299
|
+
sanitized[key] = value;
|
|
300
|
+
}
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (IDENTIFYING_PROPERTY.test(normalizedKey) || CONTENT_PROPERTY.test(normalizedKey)) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
sanitized[key] = sanitizeValue(value, seen);
|
|
307
|
+
}
|
|
308
|
+
return sanitized;
|
|
309
|
+
}
|
|
310
|
+
async function capturePostHog(params) {
|
|
311
|
+
try {
|
|
312
|
+
const host = params.host ?? POSTHOG_HOST;
|
|
313
|
+
const apiKey = params.apiKey ?? POSTHOG_API_KEY;
|
|
314
|
+
const body = JSON.stringify({
|
|
276
315
|
api_key: apiKey,
|
|
277
316
|
event: params.event,
|
|
278
317
|
distinct_id: params.distinctId,
|
|
279
|
-
properties: params.properties,
|
|
318
|
+
properties: sanitizeProperties(params.properties),
|
|
280
319
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
281
|
-
})
|
|
282
|
-
|
|
320
|
+
});
|
|
321
|
+
await telFetch(`${host}/i/v0/e/`, {
|
|
322
|
+
method: "POST",
|
|
323
|
+
headers: { "Content-Type": "application/json" },
|
|
324
|
+
keepalive: true,
|
|
325
|
+
body
|
|
326
|
+
});
|
|
327
|
+
} catch {
|
|
328
|
+
}
|
|
283
329
|
}
|
|
284
330
|
|
|
285
331
|
// src/telemetry/telemetry.ts
|
|
@@ -1052,7 +1098,7 @@ var OAuthSessionStore = class _OAuthSessionStore {
|
|
|
1052
1098
|
*/
|
|
1053
1099
|
async storeAuthorizationState(authorizationUrl, opts = {}) {
|
|
1054
1100
|
const state = globalThis.crypto.randomUUID();
|
|
1055
|
-
const stateKey = `${this.storageKeyPrefix}
|
|
1101
|
+
const stateKey = `${this.storageKeyPrefix}_${this.serverUrlHash}_state_${state}`;
|
|
1056
1102
|
const stateData = {
|
|
1057
1103
|
serverUrlHash: this.serverUrlHash,
|
|
1058
1104
|
expiry: Date.now() + 1e3 * 60 * 10,
|
|
@@ -1124,6 +1170,7 @@ var BrowserOAuthClientProvider = class {
|
|
|
1124
1170
|
connectionUrl;
|
|
1125
1171
|
proxyOAuthRequests;
|
|
1126
1172
|
lastAttemptedAuthUrl = null;
|
|
1173
|
+
authorizationPending = false;
|
|
1127
1174
|
onPopupWindow;
|
|
1128
1175
|
constructor(serverUrl, options = {}) {
|
|
1129
1176
|
if (options.staticClientInfo?.client_secret) {
|
|
@@ -1174,6 +1221,12 @@ var BrowserOAuthClientProvider = class {
|
|
|
1174
1221
|
getKey(keySuffix) {
|
|
1175
1222
|
return this.session.getKey(keySuffix);
|
|
1176
1223
|
}
|
|
1224
|
+
get hasPendingFlow() {
|
|
1225
|
+
return this.authorizationPending;
|
|
1226
|
+
}
|
|
1227
|
+
markFlowComplete() {
|
|
1228
|
+
this.authorizationPending = false;
|
|
1229
|
+
}
|
|
1177
1230
|
/**
|
|
1178
1231
|
* Re-anchor an SDK-derived OAuth discovery URL from the MCP connection
|
|
1179
1232
|
* (proxy) origin onto the actual MCP server.
|
|
@@ -1354,6 +1407,7 @@ var BrowserOAuthClientProvider = class {
|
|
|
1354
1407
|
}
|
|
1355
1408
|
saveTokens(tokens, ctx) {
|
|
1356
1409
|
this.lastAttemptedAuthUrl = null;
|
|
1410
|
+
this.authorizationPending = false;
|
|
1357
1411
|
return this.session.saveTokens(tokens, ctx);
|
|
1358
1412
|
}
|
|
1359
1413
|
async clientInformation(ctx) {
|
|
@@ -1434,6 +1488,7 @@ var BrowserOAuthClientProvider = class {
|
|
|
1434
1488
|
}
|
|
1435
1489
|
);
|
|
1436
1490
|
this.lastAttemptedAuthUrl = prepared;
|
|
1491
|
+
this.authorizationPending = true;
|
|
1437
1492
|
return prepared;
|
|
1438
1493
|
}
|
|
1439
1494
|
/**
|
|
@@ -1490,15 +1545,13 @@ var BrowserOAuthClientProvider = class {
|
|
|
1490
1545
|
}
|
|
1491
1546
|
clearStorage() {
|
|
1492
1547
|
this.lastAttemptedAuthUrl = null;
|
|
1548
|
+
this.authorizationPending = false;
|
|
1493
1549
|
const prefixPattern = `${this.storageKeyPrefix}_${this.serverUrlHash}_`;
|
|
1494
|
-
const statePattern = `${this.storageKeyPrefix}:state_`;
|
|
1495
1550
|
const keysToRemove = [];
|
|
1496
1551
|
let count = 0;
|
|
1497
1552
|
for (const key of this.storage.keys()) {
|
|
1498
1553
|
if (key.startsWith(prefixPattern)) {
|
|
1499
1554
|
keysToRemove.push(key);
|
|
1500
|
-
} else if (key.startsWith(statePattern)) {
|
|
1501
|
-
keysToRemove.push(key);
|
|
1502
1555
|
}
|
|
1503
1556
|
}
|
|
1504
1557
|
const uniqueKeysToRemove = [...new Set(keysToRemove)];
|
|
@@ -1711,20 +1764,14 @@ function renderResult(title, message, error, returnUrl) {
|
|
|
1711
1764
|
}
|
|
1712
1765
|
document.body.appendChild(container);
|
|
1713
1766
|
}
|
|
1714
|
-
function findStoredState(state) {
|
|
1715
|
-
const
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
key = candidate;
|
|
1723
|
-
break;
|
|
1724
|
-
}
|
|
1725
|
-
}
|
|
1726
|
-
}
|
|
1727
|
-
const serialized = key ? localStorage.getItem(key) : null;
|
|
1767
|
+
async function findStoredState(state) {
|
|
1768
|
+
const store = new LocalStorageKVStore();
|
|
1769
|
+
const legacySuffix = `:state_${state}`;
|
|
1770
|
+
const scopedSuffix = `_state_${state}`;
|
|
1771
|
+
const key = (await store.keys()).find(
|
|
1772
|
+
(candidate) => candidate.endsWith(legacySuffix) || candidate.endsWith(scopedSuffix)
|
|
1773
|
+
);
|
|
1774
|
+
const serialized = key ? await store.get(key) : null;
|
|
1728
1775
|
if (!key || !serialized) {
|
|
1729
1776
|
throw new Error(`Invalid or expired OAuth state "${state}".`);
|
|
1730
1777
|
}
|
|
@@ -1732,10 +1779,10 @@ function findStoredState(state) {
|
|
|
1732
1779
|
try {
|
|
1733
1780
|
value = JSON.parse(serialized);
|
|
1734
1781
|
} catch {
|
|
1735
|
-
|
|
1782
|
+
await store.remove(key);
|
|
1736
1783
|
throw new Error("Failed to parse stored OAuth state.");
|
|
1737
1784
|
}
|
|
1738
|
-
return { key, value };
|
|
1785
|
+
return { key, value, store };
|
|
1739
1786
|
}
|
|
1740
1787
|
function redirectWithError(returnUrl, message) {
|
|
1741
1788
|
const url = new URL(returnUrl);
|
|
@@ -1794,17 +1841,19 @@ async function completeAuthorization() {
|
|
|
1794
1841
|
const callbackParams = new URLSearchParams(window.location.search);
|
|
1795
1842
|
const state = callbackParams.get("state");
|
|
1796
1843
|
let stateKey = null;
|
|
1844
|
+
let stateStore = null;
|
|
1797
1845
|
let storedState = null;
|
|
1798
1846
|
let provider = null;
|
|
1799
1847
|
try {
|
|
1800
1848
|
if (!state) {
|
|
1801
1849
|
throw new Error("OAuth callback is missing the state parameter.");
|
|
1802
1850
|
}
|
|
1803
|
-
const stored = findStoredState(state);
|
|
1851
|
+
const stored = await findStoredState(state);
|
|
1804
1852
|
stateKey = stored.key;
|
|
1853
|
+
stateStore = stored.store;
|
|
1805
1854
|
storedState = stored.value;
|
|
1806
1855
|
if (!storedState.expiry || storedState.expiry < Date.now()) {
|
|
1807
|
-
|
|
1856
|
+
await stateStore.remove(stateKey);
|
|
1808
1857
|
throw new Error(
|
|
1809
1858
|
"OAuth state has expired. Please start authentication again."
|
|
1810
1859
|
);
|
|
@@ -1819,7 +1868,7 @@ async function completeAuthorization() {
|
|
|
1819
1868
|
fetch: provider.getProxyFetch()
|
|
1820
1869
|
});
|
|
1821
1870
|
await transport.finishAuth(callbackParams);
|
|
1822
|
-
|
|
1871
|
+
await stateStore.remove(stateKey);
|
|
1823
1872
|
signalResult(true, void 0, storedState, {
|
|
1824
1873
|
state,
|
|
1825
1874
|
serverUrlHash: storedState.serverUrlHash
|
|
@@ -1827,8 +1876,12 @@ async function completeAuthorization() {
|
|
|
1827
1876
|
} catch (error) {
|
|
1828
1877
|
const message = error instanceof Error ? error.message : String(error);
|
|
1829
1878
|
console.error("[mcp-callback] OAuth callback failed:", error);
|
|
1830
|
-
if (stateKey)
|
|
1831
|
-
if (provider)
|
|
1879
|
+
if (stateKey && stateStore) await stateStore.remove(stateKey);
|
|
1880
|
+
if (provider) {
|
|
1881
|
+
await (stateStore ?? new LocalStorageKVStore()).remove(
|
|
1882
|
+
provider.getKey("last_auth_url")
|
|
1883
|
+
);
|
|
1884
|
+
}
|
|
1832
1885
|
signalResult(false, message, storedState, {
|
|
1833
1886
|
state,
|
|
1834
1887
|
serverUrlHash: storedState?.serverUrlHash
|
|
@@ -1870,11 +1923,12 @@ async function completeOAuthFlow(provider, serverUrl, options = {}) {
|
|
|
1870
1923
|
throw new Error(`Unexpected OAuth auth() result: ${result}`);
|
|
1871
1924
|
}
|
|
1872
1925
|
}
|
|
1873
|
-
if (typeof flowProvider.getAuthorizationCode === "function") {
|
|
1874
|
-
const
|
|
1926
|
+
if (typeof flowProvider.getAuthorizationResponse === "function" || typeof flowProvider.getAuthorizationCode === "function") {
|
|
1927
|
+
const response = typeof flowProvider.getAuthorizationResponse === "function" ? await flowProvider.getAuthorizationResponse() : { code: await flowProvider.getAuthorizationCode() };
|
|
1875
1928
|
await auth(provider, {
|
|
1876
1929
|
serverUrl,
|
|
1877
|
-
authorizationCode: code,
|
|
1930
|
+
authorizationCode: response.code,
|
|
1931
|
+
...response.iss !== void 0 ? { iss: response.iss } : {},
|
|
1878
1932
|
fetchFn
|
|
1879
1933
|
});
|
|
1880
1934
|
return;
|
|
@@ -1888,6 +1942,8 @@ async function waitForBrowserAuthComplete(provider, timeoutMs) {
|
|
|
1888
1942
|
);
|
|
1889
1943
|
}
|
|
1890
1944
|
if (provider.useRedirectFlow) {
|
|
1945
|
+
await new Promise(() => {
|
|
1946
|
+
});
|
|
1891
1947
|
return;
|
|
1892
1948
|
}
|
|
1893
1949
|
const tokensKey = provider.getKey?.("tokens");
|
|
@@ -1904,25 +1960,29 @@ async function waitForBrowserAuthComplete(provider, timeoutMs) {
|
|
|
1904
1960
|
} catch {
|
|
1905
1961
|
}
|
|
1906
1962
|
}
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1963
|
+
try {
|
|
1964
|
+
const result = await runAuthPopup({
|
|
1965
|
+
popup: null,
|
|
1966
|
+
state,
|
|
1967
|
+
tokensKey,
|
|
1968
|
+
timeoutMs
|
|
1969
|
+
});
|
|
1970
|
+
switch (result.kind) {
|
|
1971
|
+
case "success":
|
|
1972
|
+
return;
|
|
1973
|
+
case "cancelled":
|
|
1974
|
+
throw new Error("OAuth authentication was cancelled.");
|
|
1975
|
+
case "timeout":
|
|
1976
|
+
throw new Error(
|
|
1977
|
+
`OAuth callback not received within ${timeoutMs}ms. Ensure /oauth/callback calls onMcpAuthorization().`
|
|
1978
|
+
);
|
|
1979
|
+
case "error":
|
|
1980
|
+
throw new Error(result.error);
|
|
1981
|
+
default:
|
|
1982
|
+
throw new Error("Unexpected OAuth popup result");
|
|
1983
|
+
}
|
|
1984
|
+
} finally {
|
|
1985
|
+
provider.markFlowComplete?.();
|
|
1926
1986
|
}
|
|
1927
1987
|
}
|
|
1928
1988
|
|