@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/CHANGELOG.md +15 -0
- package/dist/index.js +52 -20
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +52 -20
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/tool/mcp-http-transport.ts +20 -6
- package/src/tool/mcp-sse-transport.ts +9 -3
- package/src/tool/oauth.ts +52 -20
package/dist/index.mjs
CHANGED
|
@@ -631,26 +631,41 @@ function assertAuthorizationServerInformationMatches({
|
|
|
631
631
|
});
|
|
632
632
|
}
|
|
633
633
|
}
|
|
634
|
-
function
|
|
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
|
|
638
|
+
return {};
|
|
639
639
|
}
|
|
640
640
|
const [type, scheme] = header.split(" ");
|
|
641
|
-
if (type.toLowerCase() !== "bearer" || !scheme) {
|
|
642
|
-
return
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1682
|
+
const { resourceMetadataUrl, scope } = extractWWWAuthenticateParams(response);
|
|
1683
|
+
this.resourceMetadataUrl = resourceMetadataUrl;
|
|
1659
1684
|
try {
|
|
1660
|
-
const result = await this.authorizeOnce(
|
|
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
|
-
|
|
1859
|
+
const { resourceMetadataUrl, scope } = extractWWWAuthenticateParams(response);
|
|
1860
|
+
this.resourceMetadataUrl = resourceMetadataUrl;
|
|
1832
1861
|
try {
|
|
1833
|
-
const result = await this.authorizeOnce(
|
|
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);
|