Skip to content

Commit 0121dcc

Browse files
matttTimWangING
andauthored
Add requestModifier property to HTTPClientTransport (#152)
* Add requestModifier property to HTTPClientTransport Co-authored-by: Tim Wang <[email protected]> * Add test coverage --------- Co-authored-by: Tim Wang <[email protected]>
1 parent 8a50d89 commit 0121dcc

File tree

2 files changed

+218
-147
lines changed

2 files changed

+218
-147
lines changed

Sources/MCP/Base/Transports/HTTPClientTransport.swift

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)