@ai-sdk/mcp 1.0.42 → 1.0.44

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/index.mjs CHANGED
@@ -20,12 +20,18 @@ var MCPClientError = class extends (_b = AISDKError, _a = symbol, _b) {
20
20
  message,
21
21
  cause,
22
22
  data,
23
- code
23
+ code,
24
+ statusCode,
25
+ url,
26
+ responseBody
24
27
  }) {
25
28
  super({ name: name3, message, cause });
26
29
  this[_a] = true;
27
30
  this.data = data;
28
31
  this.code = code;
32
+ this.statusCode = statusCode;
33
+ this.url = url;
34
+ this.responseBody = responseBody;
29
35
  }
30
36
  static isInstance(error) {
31
37
  return AISDKError.hasMarker(error, marker);
@@ -1325,6 +1331,24 @@ var HttpMCPTransport = class {
1325
1331
  getRuntimeEnvironmentUserAgent2()
1326
1332
  );
1327
1333
  }
1334
+ /**
1335
+ * Runs a single OAuth recovery flow for concurrent 401 responses.
1336
+ */
1337
+ authorizeOnce(resourceMetadataUrl) {
1338
+ if (!this.authProvider) {
1339
+ return Promise.resolve("REDIRECT");
1340
+ }
1341
+ if (!this.authPromise) {
1342
+ this.authPromise = auth(this.authProvider, {
1343
+ serverUrl: this.url,
1344
+ resourceMetadataUrl,
1345
+ fetchFn: this.fetchFn
1346
+ }).finally(() => {
1347
+ this.authPromise = void 0;
1348
+ });
1349
+ }
1350
+ return this.authPromise;
1351
+ }
1328
1352
  async start() {
1329
1353
  if (this.abortController) {
1330
1354
  throw new MCPClientError({
@@ -1375,11 +1399,7 @@ var HttpMCPTransport = class {
1375
1399
  if (response.status === 401 && this.authProvider && !triedAuth) {
1376
1400
  this.resourceMetadataUrl = extractResourceMetadataUrl(response);
1377
1401
  try {
1378
- const result = await auth(this.authProvider, {
1379
- serverUrl: this.url,
1380
- resourceMetadataUrl: this.resourceMetadataUrl,
1381
- fetchFn: this.fetchFn
1382
- });
1402
+ const result = await this.authorizeOnce(this.resourceMetadataUrl);
1383
1403
  if (result !== "AUTHORIZED") {
1384
1404
  const error2 = new UnauthorizedError();
1385
1405
  throw error2;
@@ -1403,7 +1423,10 @@ var HttpMCPTransport = class {
1403
1423
  errorMessage += ". This server does not support HTTP transport. Try using `sse` transport instead";
1404
1424
  }
1405
1425
  const error2 = new MCPClientError({
1406
- message: errorMessage
1426
+ message: errorMessage,
1427
+ statusCode: response.status,
1428
+ url: this.url.href,
1429
+ responseBody: text != null ? text : void 0
1407
1430
  });
1408
1431
  (_c = this.onerror) == null ? void 0 : _c.call(this, error2);
1409
1432
  throw error2;
@@ -1422,7 +1445,9 @@ var HttpMCPTransport = class {
1422
1445
  if (contentType.includes("text/event-stream")) {
1423
1446
  if (!response.body) {
1424
1447
  const error2 = new MCPClientError({
1425
- message: "MCP HTTP Transport Error: text/event-stream response without body"
1448
+ message: "MCP HTTP Transport Error: text/event-stream response without body",
1449
+ statusCode: response.status,
1450
+ url: this.url.href
1426
1451
  });
1427
1452
  (_e = this.onerror) == null ? void 0 : _e.call(this, error2);
1428
1453
  throw error2;
@@ -1460,7 +1485,9 @@ var HttpMCPTransport = class {
1460
1485
  return;
1461
1486
  }
1462
1487
  const error = new MCPClientError({
1463
- message: `MCP HTTP Transport Error: Unexpected content type: ${contentType}`
1488
+ message: `MCP HTTP Transport Error: Unexpected content type: ${contentType}`,
1489
+ statusCode: response.status,
1490
+ url: this.url.href
1464
1491
  });
1465
1492
  (_f = this.onerror) == null ? void 0 : _f.call(this, error);
1466
1493
  throw error;
@@ -1525,11 +1552,7 @@ var HttpMCPTransport = class {
1525
1552
  if (response.status === 401 && this.authProvider && !triedAuth) {
1526
1553
  this.resourceMetadataUrl = extractResourceMetadataUrl(response);
1527
1554
  try {
1528
- const result = await auth(this.authProvider, {
1529
- serverUrl: this.url,
1530
- resourceMetadataUrl: this.resourceMetadataUrl,
1531
- fetchFn: this.fetchFn
1532
- });
1555
+ const result = await this.authorizeOnce(this.resourceMetadataUrl);
1533
1556
  if (result !== "AUTHORIZED") {
1534
1557
  const error = new UnauthorizedError();
1535
1558
  (_b3 = this.onerror) == null ? void 0 : _b3.call(this, error);
@@ -1546,7 +1569,9 @@ var HttpMCPTransport = class {
1546
1569
  }
1547
1570
  if (!response.ok || !response.body) {
1548
1571
  const error = new MCPClientError({
1549
- message: `MCP HTTP Transport Error: GET SSE failed: ${response.status} ${response.statusText}`
1572
+ message: `MCP HTTP Transport Error: GET SSE failed: ${response.status} ${response.statusText}`,
1573
+ statusCode: response.status,
1574
+ url: this.url.href
1550
1575
  });
1551
1576
  (_d = this.onerror) == null ? void 0 : _d.call(this, error);
1552
1577
  return;