@@ -32,9 +32,14 @@ import Logging
3232/// ```swift
3333/// import MCP
3434///
35- /// // Create a streaming HTTP transport
35+ /// // Create a streaming HTTP transport with bearer token authentication
3636/// let transport = HTTPClientTransport(
37- /// endpoint: URL(string: "http://localhost:8080")!,
37+ /// endpoint: URL(string: "https://api.example.com/mcp")!,
38+ /// requestModifier: { request in
39+ /// var modifiedRequest = request
40+ /// modifiedRequest.addValue("Bearer your-token-here", forHTTPHeaderField: "Authorization")
41+ /// return modifiedRequest
42+ /// }
3843/// )
3944///
4045/// // Initialize the client with streaming transport
@@ -60,6 +65,9 @@ public actor HTTPClientTransport: Transport {
6065 /// Maximum time to wait for a session ID before proceeding with SSE connection
6166 public let sseInitializationTimeout : TimeInterval
6267
68+ /// Closure to modify requests before they are sent
69+ private let requestModifier : ( URLRequest ) -> URLRequest
70+
6371 private var isConnected = false
6472 private let messageStream : AsyncThrowingStream < Data , Swift . Error >
6573 private let messageContinuation : AsyncThrowingStream < Data , Swift . Error > . Continuation
@@ -74,19 +82,22 @@ public actor HTTPClientTransport: Transport {
7482 /// - configuration: URLSession configuration to use for HTTP requests
7583 /// - streaming: Whether to enable SSE streaming mode (default: true)
7684 /// - sseInitializationTimeout: Maximum time to wait for session ID before proceeding with SSE (default: 10 seconds)
85+ /// - requestModifier: Optional closure to customize requests before they are sent (default: no modification)
7786 /// - logger: Optional logger instance for transport events
7887 public init (
7988 endpoint: URL ,
8089 configuration: URLSessionConfiguration = . default,
8190 streaming: Bool = true ,
8291 sseInitializationTimeout: TimeInterval = 10 ,
92+ requestModifier: @escaping ( URLRequest ) -> URLRequest = { $0 } ,
8393 logger: Logger ? = nil
8494 ) {
8595 self . init (
8696 endpoint: endpoint,
8797 session: URLSession ( configuration: configuration) ,
8898 streaming: streaming,
8999 sseInitializationTimeout: sseInitializationTimeout,
100+ requestModifier: requestModifier,
90101 logger: logger
91102 )
92103 }
@@ -96,12 +107,14 @@ public actor HTTPClientTransport: Transport {
96107 session: URLSession ,
97108 streaming: Bool = false ,
98109 sseInitializationTimeout: TimeInterval = 10 ,
110+ requestModifier: @escaping ( URLRequest ) -> URLRequest = { $0 } ,
99111 logger: Logger ? = nil
100112 ) {
101113 self . endpoint = endpoint
102114 self . session = session
103115 self . streaming = streaming
104116 self . sseInitializationTimeout = sseInitializationTimeout
117+ self . requestModifier = requestModifier
105118
106119 // Create message stream
107120 var continuation : AsyncThrowingStream < Data , Swift . Error > . Continuation !
@@ -211,6 +224,9 @@ public actor HTTPClientTransport: Transport {
211224 request. addValue ( sessionID, forHTTPHeaderField: " Mcp-Session-Id " )
212225 }
213226
227+ // Apply request modifier
228+ request = requestModifier ( request)
229+
214230 #if os(Linux)
215231 // Linux implementation using data(for:) instead of bytes(for:)
216232 let ( responseData, response) = try await session. data ( for: request)
@@ -480,6 +496,9 @@ public actor HTTPClientTransport: Transport {
480496 request. addValue ( sessionID, forHTTPHeaderField: " Mcp-Session-Id " )
481497 }
482498
499+ // Apply request modifier
500+ request = requestModifier ( request)
501+
483502 logger. debug ( " Starting SSE connection " )
484503
485504 // Create URLSession task for SSE
0 commit comments