@ai-sdk/mcp 1.0.32 → 1.0.34

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/mcp",
3
- "version": "1.0.32",
3
+ "version": "1.0.34",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -33,8 +33,8 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "pkce-challenge": "^5.0.0",
36
- "@ai-sdk/provider-utils": "4.0.22",
37
- "@ai-sdk/provider": "3.0.8"
36
+ "@ai-sdk/provider": "3.0.8",
37
+ "@ai-sdk/provider-utils": "4.0.23"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "20.17.24",
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  EventSourceParserStream,
3
+ FetchFunction,
3
4
  withUserAgentSuffix,
4
5
  getRuntimeEnvironmentUserAgent,
5
6
  } from '@ai-sdk/provider-utils';
@@ -31,6 +32,7 @@ export class HttpMCPTransport implements MCPTransport {
31
32
  private sessionId?: string;
32
33
  private inboundSseConnection?: { close: () => void };
33
34
  private redirectMode: RequestRedirect;
35
+ private fetchFn: FetchFunction;
34
36
 
35
37
  // Inbound SSE resumption and reconnection state
36
38
  private lastInboundEventId?: string;
@@ -51,16 +53,19 @@ export class HttpMCPTransport implements MCPTransport {
51
53
  headers,
52
54
  authProvider,
53
55
  redirect = 'follow',
56
+ fetch: fetchFn,
54
57
  }: {
55
58
  url: string;
56
59
  headers?: Record<string, string>;
57
60
  authProvider?: OAuthClientProvider;
58
61
  redirect?: 'follow' | 'error';
62
+ fetch?: FetchFunction;
59
63
  }) {
60
64
  this.url = new URL(url);
61
65
  this.headers = headers;
62
66
  this.authProvider = authProvider;
63
67
  this.redirectMode = redirect;
68
+ this.fetchFn = fetchFn ?? globalThis.fetch;
64
69
  }
65
70
 
66
71
  private async commonHeaders(
@@ -111,7 +116,7 @@ export class HttpMCPTransport implements MCPTransport {
111
116
  !this.abortController.signal.aborted
112
117
  ) {
113
118
  const headers = await this.commonHeaders({});
114
- await fetch(this.url, {
119
+ await this.fetchFn(this.url.href, {
115
120
  method: 'DELETE',
116
121
  headers,
117
122
  signal: this.abortController.signal,
@@ -140,7 +145,7 @@ export class HttpMCPTransport implements MCPTransport {
140
145
  redirect: this.redirectMode,
141
146
  } satisfies RequestInit;
142
147
 
143
- const response = await fetch(this.url, init);
148
+ const response = await this.fetchFn(this.url.href, init);
144
149
 
145
150
  const sessionId = response.headers.get('mcp-session-id');
146
151
  if (sessionId) {
@@ -153,6 +158,7 @@ export class HttpMCPTransport implements MCPTransport {
153
158
  const result = await auth(this.authProvider, {
154
159
  serverUrl: this.url,
155
160
  resourceMetadataUrl: this.resourceMetadataUrl,
161
+ fetchFn: this.fetchFn,
156
162
  });
157
163
  if (result !== 'AUTHORIZED') {
158
164
  const error = new UnauthorizedError();
@@ -314,7 +320,7 @@ export class HttpMCPTransport implements MCPTransport {
314
320
  headers['last-event-id'] = resumeToken;
315
321
  }
316
322
 
317
- const response = await fetch(this.url.href, {
323
+ const response = await this.fetchFn(this.url.href, {
318
324
  method: 'GET',
319
325
  headers,
320
326
  signal: this.abortController?.signal,
@@ -332,6 +338,7 @@ export class HttpMCPTransport implements MCPTransport {
332
338
  const result = await auth(this.authProvider, {
333
339
  serverUrl: this.url,
334
340
  resourceMetadataUrl: this.resourceMetadataUrl,
341
+ fetchFn: this.fetchFn,
335
342
  });
336
343
  if (result !== 'AUTHORIZED') {
337
344
  const error = new UnauthorizedError();
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  EventSourceParserStream,
3
+ FetchFunction,
3
4
  withUserAgentSuffix,
4
5
  getRuntimeEnvironmentUserAgent,
5
6
  } from '@ai-sdk/provider-utils';
@@ -27,6 +28,7 @@ export class SseMCPTransport implements MCPTransport {
27
28
  private authProvider?: OAuthClientProvider;
28
29
  private resourceMetadataUrl?: URL;
29
30
  private redirectMode: RequestRedirect;
31
+ private fetchFn: FetchFunction;
30
32
 
31
33
  onclose?: () => void;
32
34
  onerror?: (error: unknown) => void;
@@ -37,16 +39,19 @@ export class SseMCPTransport implements MCPTransport {
37
39
  headers,
38
40
  authProvider,
39
41
  redirect = 'follow',
42
+ fetch: fetchFn,
40
43
  }: {
41
44
  url: string;
42
45
  headers?: Record<string, string>;
43
46
  authProvider?: OAuthClientProvider;
44
47
  redirect?: 'follow' | 'error';
48
+ fetch?: FetchFunction;
45
49
  }) {
46
50
  this.url = new URL(url);
47
51
  this.headers = headers;
48
52
  this.authProvider = authProvider;
49
53
  this.redirectMode = redirect;
54
+ this.fetchFn = fetchFn ?? globalThis.fetch;
50
55
  }
51
56
 
52
57
  private async commonHeaders(
@@ -85,7 +90,7 @@ export class SseMCPTransport implements MCPTransport {
85
90
  const headers = await this.commonHeaders({
86
91
  Accept: 'text/event-stream',
87
92
  });
88
- const response = await fetch(this.url.href, {
93
+ const response = await this.fetchFn(this.url.href, {
89
94
  headers,
90
95
  signal: this.abortController?.signal,
91
96
  redirect: this.redirectMode,
@@ -97,6 +102,7 @@ export class SseMCPTransport implements MCPTransport {
97
102
  const result = await auth(this.authProvider, {
98
103
  serverUrl: this.url,
99
104
  resourceMetadataUrl: this.resourceMetadataUrl,
105
+ fetchFn: this.fetchFn,
100
106
  });
101
107
  if (result !== 'AUTHORIZED') {
102
108
  const error = new UnauthorizedError();
@@ -235,7 +241,7 @@ export class SseMCPTransport implements MCPTransport {
235
241
  redirect: this.redirectMode,
236
242
  };
237
243
 
238
- const response = await fetch(endpoint, init);
244
+ const response = await this.fetchFn(endpoint.href, init);
239
245
 
240
246
  if (response.status === 401 && this.authProvider && !triedAuth) {
241
247
  this.resourceMetadataUrl = extractResourceMetadataUrl(response);
@@ -243,6 +249,7 @@ export class SseMCPTransport implements MCPTransport {
243
249
  const result = await auth(this.authProvider, {
244
250
  serverUrl: this.url,
245
251
  resourceMetadataUrl: this.resourceMetadataUrl,
252
+ fetchFn: this.fetchFn,
246
253
  });
247
254
  if (result !== 'AUTHORIZED') {
248
255
  const error = new UnauthorizedError();
@@ -1,3 +1,4 @@
1
+ import { FetchFunction } from '@ai-sdk/provider-utils';
1
2
  import { MCPClientError } from '../error/mcp-client-error';
2
3
  import { JSONRPCMessage } from './json-rpc-message';
3
4
  import { SseMCPTransport } from './mcp-sse-transport';
@@ -66,6 +67,13 @@ export type MCPTransportConfig = {
66
67
  * @default 'follow'
67
68
  */
68
69
  redirect?: 'follow' | 'error';
70
+
71
+ /**
72
+ * Optional custom fetch implementation to use for HTTP requests.
73
+ * Useful for runtimes that need a request-local fetch.
74
+ * @default globalThis.fetch
75
+ */
76
+ fetch?: FetchFunction;
69
77
  };
70
78
 
71
79
  export function createMcpTransport(config: MCPTransportConfig): MCPTransport {