@ai-sdk/mcp 1.0.69 → 1.0.71

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
@@ -631,26 +631,41 @@ function assertAuthorizationServerInformationMatches({
631
631
  });
632
632
  }
633
633
  }
634
- function extractResourceMetadataUrl(response) {
635
- var _a3;
634
+ function extractWWWAuthenticateParams(response) {
635
+ var _a3, _b3;
636
636
  const header = (_a3 = response.headers.get("www-authenticate")) != null ? _a3 : response.headers.get("WWW-Authenticate");
637
637
  if (!header) {
638
- return void 0;
638
+ return {};
639
639
  }
640
640
  const [type, scheme] = header.split(" ");
641
- if (type.toLowerCase() !== "bearer" || !scheme) {
642
- return void 0;
643
- }
644
- const regex = /resource_metadata="([^"]*)"/;
645
- const match = header.match(regex);
646
- if (!match) {
647
- return void 0;
641
+ if (type.replace(/,$/, "").toLowerCase() !== "bearer" || !scheme) {
642
+ return {};
648
643
  }
644
+ const resourceMetadataMatch = header.match(
645
+ /(?:^|[,\s])resource_metadata="([^"]*)"/i
646
+ );
647
+ const scope = (_b3 = header.match(/(?:^|[,\s])scope="([^"]*)"/i)) == null ? void 0 : _b3[1];
648
+ let resourceMetadataUrl;
649
649
  try {
650
- return new URL(match[1]);
650
+ resourceMetadataUrl = resourceMetadataMatch ? new URL(resourceMetadataMatch[1]) : void 0;
651
651
  } catch (e) {
652
- return void 0;
653
652
  }
653
+ return { resourceMetadataUrl, scope };
654
+ }
655
+ function selectScope({
656
+ scope,
657
+ resourceMetadata,
658
+ clientMetadata
659
+ }) {
660
+ var _a3;
661
+ if (scope) {
662
+ return scope;
663
+ }
664
+ const resourceScopes = (_a3 = resourceMetadata == null ? void 0 : resourceMetadata.scopes_supported) == null ? void 0 : _a3.join(" ");
665
+ if (resourceScopes) {
666
+ return resourceScopes;
667
+ }
668
+ return clientMetadata.scope;
654
669
  }
655
670
  function buildWellKnownPath(wellKnownPrefix, pathname = "", options = {}) {
656
671
  if (pathname.endsWith("/")) {
@@ -1279,7 +1294,11 @@ async function authInternal(provider, {
1279
1294
  clientInformation,
1280
1295
  state,
1281
1296
  redirectUrl: provider.redirectUrl,
1282
- scope: scope || provider.clientMetadata.scope,
1297
+ scope: selectScope({
1298
+ scope,
1299
+ resourceMetadata,
1300
+ clientMetadata: provider.clientMetadata
1301
+ }),
1283
1302
  resource
1284
1303
  }
1285
1304
  );
@@ -1357,11 +1376,13 @@ var SseMCPTransport = class {
1357
1376
  redirect: this.redirectMode
1358
1377
  });
1359
1378
  if (response.status === 401 && this.authProvider && !triedAuth) {
1360
- this.resourceMetadataUrl = extractResourceMetadataUrl(response);
1379
+ const { resourceMetadataUrl, scope } = extractWWWAuthenticateParams(response);
1380
+ this.resourceMetadataUrl = resourceMetadataUrl;
1361
1381
  try {
1362
1382
  const result = await auth(this.authProvider, {
1363
1383
  serverUrl: this.url,
1364
1384
  resourceMetadataUrl: this.resourceMetadataUrl,
1385
+ scope,
1365
1386
  fetchFn: this.fetchFn
1366
1387
  });
1367
1388
  if (result !== "AUTHORIZED") {
@@ -1490,11 +1511,13 @@ var SseMCPTransport = class {
1490
1511
  };
1491
1512
  const response = await this.fetchFn(endpoint.href, init);
1492
1513
  if (response.status === 401 && this.authProvider && !triedAuth) {
1493
- this.resourceMetadataUrl = extractResourceMetadataUrl(response);
1514
+ const { resourceMetadataUrl, scope } = extractWWWAuthenticateParams(response);
1515
+ this.resourceMetadataUrl = resourceMetadataUrl;
1494
1516
  try {
1495
1517
  const result = await auth(this.authProvider, {
1496
1518
  serverUrl: this.url,
1497
1519
  resourceMetadataUrl: this.resourceMetadataUrl,
1520
+ scope,
1498
1521
  fetchFn: this.fetchFn
1499
1522
  });
1500
1523
  if (result !== "AUTHORIZED") {
@@ -1586,7 +1609,7 @@ var HttpMCPTransport = class {
1586
1609
  /**
1587
1610
  * Runs a single OAuth recovery flow for concurrent 401 responses.
1588
1611
  */
1589
- authorizeOnce(resourceMetadataUrl) {
1612
+ authorizeOnce(resourceMetadataUrl, scope) {
1590
1613
  if (!this.authProvider) {
1591
1614
  return Promise.resolve("REDIRECT");
1592
1615
  }
@@ -1594,6 +1617,7 @@ var HttpMCPTransport = class {
1594
1617
  this.authPromise = auth(this.authProvider, {
1595
1618
  serverUrl: this.url,
1596
1619
  resourceMetadataUrl,
1620
+ scope,
1597
1621
  fetchFn: this.fetchFn
1598
1622
  }).finally(() => {
1599
1623
  this.authPromise = void 0;
@@ -1655,9 +1679,13 @@ var HttpMCPTransport = class {
1655
1679
  this.sessionId = sessionId;
1656
1680
  }
1657
1681
  if (response.status === 401 && this.authProvider && !triedAuth) {
1658
- this.resourceMetadataUrl = extractResourceMetadataUrl(response);
1682
+ const { resourceMetadataUrl, scope } = extractWWWAuthenticateParams(response);
1683
+ this.resourceMetadataUrl = resourceMetadataUrl;
1659
1684
  try {
1660
- const result = await this.authorizeOnce(this.resourceMetadataUrl);
1685
+ const result = await this.authorizeOnce(
1686
+ this.resourceMetadataUrl,
1687
+ scope
1688
+ );
1661
1689
  if (result !== "AUTHORIZED") {
1662
1690
  const error2 = new UnauthorizedError();
1663
1691
  throw error2;
@@ -1828,9 +1856,13 @@ var HttpMCPTransport = class {
1828
1856
  this.sessionId = sessionId;
1829
1857
  }
1830
1858
  if (response.status === 401 && this.authProvider && !triedAuth) {
1831
- this.resourceMetadataUrl = extractResourceMetadataUrl(response);
1859
+ const { resourceMetadataUrl, scope } = extractWWWAuthenticateParams(response);
1860
+ this.resourceMetadataUrl = resourceMetadataUrl;
1832
1861
  try {
1833
- const result = await this.authorizeOnce(this.resourceMetadataUrl);
1862
+ const result = await this.authorizeOnce(
1863
+ this.resourceMetadataUrl,
1864
+ scope
1865
+ );
1834
1866
  if (result !== "AUTHORIZED") {
1835
1867
  const error = new UnauthorizedError();
1836
1868
  (_b3 = this.onerror) == null ? void 0 : _b3.call(this, error);