@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/CHANGELOG.md +21 -0
- package/README.md +134 -0
- package/dist/index.js +40 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +40 -15
- package/dist/index.mjs.map +1 -1
- package/dist/mcp-stdio/index.js +7 -1
- package/dist/mcp-stdio/index.js.map +1 -1
- package/dist/mcp-stdio/index.mjs +7 -1
- package/dist/mcp-stdio/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/error/mcp-client-error.ts +40 -0
- package/src/tool/mcp-http-transport.ts +34 -10
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
|
|
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
|
|
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;
|