11import {
22 EventSourceParserStream ,
3+ FetchFunction ,
34 withUserAgentSuffix ,
45 getRuntimeEnvironmentUserAgent ,
56} from '@ai-sdk/provider-utils' ;
@@ -31,6 +32,7 @@ export class HttpMCPTransport implements MCPTransport {
3132 private sessionId ?: string ;
3233 private inboundSseConnection ?: { close : ( ) => void } ;
3334 private redirectMode : RequestRedirect ;
35+ private fetchFn : FetchFunction ;
3436
3537 // Inbound SSE resumption and reconnection state
3638 private lastInboundEventId ?: string ;
@@ -50,17 +52,24 @@ export class HttpMCPTransport implements MCPTransport {
5052 url,
5153 headers,
5254 authProvider,
55+ < << << << HEAD
5356 redirect = 'follow' ,
57+ = === ===
58+ redirect = 'error' ,
59+ fetch : fetchFn ,
60+ > >>> >>> a00d1d3f9 ( feat ( mcp ) : allow custom fetch for HTTP and SSE transports ( #14134 ) )
5461 } : {
5562 url : string ;
5663 headers ?: Record < string , string > ;
5764 authProvider ?: OAuthClientProvider ;
5865 redirect ?: 'follow' | 'error' ;
66+ fetch ?: FetchFunction ;
5967 } ) {
6068 this . url = new URL ( url ) ;
6169 this . headers = headers ;
6270 this . authProvider = authProvider ;
6371 this . redirectMode = redirect ;
72+ this . fetchFn = fetchFn ?? globalThis . fetch ;
6473 }
6574
6675 private async commonHeaders (
@@ -111,7 +120,7 @@ export class HttpMCPTransport implements MCPTransport {
111120 ! this . abortController . signal . aborted
112121 ) {
113122 const headers = await this . commonHeaders ( { } ) ;
114- await fetch ( this . url , {
123+ await this . fetchFn ( this . url . href , {
115124 method : 'DELETE' ,
116125 headers,
117126 signal : this . abortController . signal ,
@@ -140,7 +149,7 @@ export class HttpMCPTransport implements MCPTransport {
140149 redirect : this . redirectMode ,
141150 } satisfies RequestInit ;
142151
143- const response = await fetch ( this . url , init ) ;
152+ const response = await this . fetchFn ( this . url . href , init ) ;
144153
145154 const sessionId = response . headers . get ( 'mcp-session-id' ) ;
146155 if ( sessionId ) {
@@ -153,6 +162,7 @@ export class HttpMCPTransport implements MCPTransport {
153162 const result = await auth ( this . authProvider , {
154163 serverUrl : this . url ,
155164 resourceMetadataUrl : this . resourceMetadataUrl ,
165+ fetchFn : this . fetchFn ,
156166 } ) ;
157167 if ( result !== 'AUTHORIZED' ) {
158168 const error = new UnauthorizedError ( ) ;
@@ -314,7 +324,7 @@ export class HttpMCPTransport implements MCPTransport {
314324 headers [ 'last-event-id' ] = resumeToken ;
315325 }
316326
317- const response = await fetch ( this . url . href , {
327+ const response = await this . fetchFn ( this . url . href , {
318328 method : 'GET' ,
319329 headers,
320330 signal : this . abortController ?. signal ,
@@ -332,6 +342,7 @@ export class HttpMCPTransport implements MCPTransport {
332342 const result = await auth ( this . authProvider , {
333343 serverUrl : this . url ,
334344 resourceMetadataUrl : this . resourceMetadataUrl ,
345+ fetchFn : this . fetchFn ,
335346 } ) ;
336347 if ( result !== 'AUTHORIZED' ) {
337348 const error = new UnauthorizedError ( ) ;
0 commit comments