@@ -82,6 +82,9 @@ public class HttpClientSseClientTransport implements McpClientTransport {
82
82
*/
83
83
private final HttpClient httpClient ;
84
84
85
+ /** HTTP request builder for building requests to send messages to the server */
86
+ private final HttpRequest .Builder requestBuilder ;
87
+
85
88
/** JSON object mapper for message serialization/deserialization */
86
89
protected ObjectMapper objectMapper ;
87
90
@@ -126,15 +129,33 @@ public HttpClientSseClientTransport(HttpClient.Builder clientBuilder, String bas
126
129
*/
127
130
public HttpClientSseClientTransport (HttpClient .Builder clientBuilder , String baseUri , String sseEndpoint ,
128
131
ObjectMapper objectMapper ) {
132
+ this (clientBuilder , HttpRequest .newBuilder (), baseUri , sseEndpoint , objectMapper );
133
+ }
134
+
135
+ /**
136
+ * Creates a new transport instance with custom HTTP client builder, object mapper,
137
+ * and headers.
138
+ * @param clientBuilder the HTTP client builder to use
139
+ * @param requestBuilder the HTTP request builder to use
140
+ * @param baseUri the base URI of the MCP server
141
+ * @param sseEndpoint the SSE endpoint path
142
+ * @param objectMapper the object mapper for JSON serialization/deserialization
143
+ * @throws IllegalArgumentException if objectMapper, clientBuilder, or headers is null
144
+ */
145
+ public HttpClientSseClientTransport (HttpClient .Builder clientBuilder , HttpRequest .Builder requestBuilder ,
146
+ String baseUri , String sseEndpoint , ObjectMapper objectMapper ) {
129
147
Assert .notNull (objectMapper , "ObjectMapper must not be null" );
130
148
Assert .hasText (baseUri , "baseUri must not be empty" );
131
149
Assert .hasText (sseEndpoint , "sseEndpoint must not be empty" );
132
150
Assert .notNull (clientBuilder , "clientBuilder must not be null" );
151
+ Assert .notNull (requestBuilder , "requestBuilder must not be null" );
133
152
this .baseUri = baseUri ;
134
153
this .sseEndpoint = sseEndpoint ;
135
154
this .objectMapper = objectMapper ;
136
155
this .httpClient = clientBuilder .connectTimeout (Duration .ofSeconds (10 )).build ();
137
- this .sseClient = new FlowSseClient (this .httpClient );
156
+ this .requestBuilder = requestBuilder ;
157
+
158
+ this .sseClient = new FlowSseClient (this .httpClient , requestBuilder );
138
159
}
139
160
140
161
/**
@@ -159,6 +180,8 @@ public static class Builder {
159
180
160
181
private ObjectMapper objectMapper = new ObjectMapper ();
161
182
183
+ private HttpRequest .Builder requestBuilder = HttpRequest .newBuilder ();
184
+
162
185
/**
163
186
* Creates a new builder with the specified base URI.
164
187
* @param baseUri the base URI of the MCP server
@@ -190,6 +213,17 @@ public Builder clientBuilder(HttpClient.Builder clientBuilder) {
190
213
return this ;
191
214
}
192
215
216
+ /**
217
+ * Sets the HTTP request builder.
218
+ * @param requestBuilder the HTTP request builder
219
+ * @return this builder
220
+ */
221
+ public Builder requestBuilder (HttpRequest .Builder requestBuilder ) {
222
+ Assert .notNull (requestBuilder , "requestBuilder must not be null" );
223
+ this .requestBuilder = requestBuilder ;
224
+ return this ;
225
+ }
226
+
193
227
/**
194
228
* Sets the object mapper for JSON serialization/deserialization.
195
229
* @param objectMapper the object mapper
@@ -206,7 +240,7 @@ public Builder objectMapper(ObjectMapper objectMapper) {
206
240
* @return a new transport instance
207
241
*/
208
242
public HttpClientSseClientTransport build () {
209
- return new HttpClientSseClientTransport (clientBuilder , baseUri , sseEndpoint , objectMapper );
243
+ return new HttpClientSseClientTransport (clientBuilder , requestBuilder , baseUri , sseEndpoint , objectMapper );
210
244
}
211
245
212
246
}
@@ -301,8 +335,7 @@ public Mono<Void> sendMessage(JSONRPCMessage message) {
301
335
302
336
try {
303
337
String jsonText = this .objectMapper .writeValueAsString (message );
304
- HttpRequest request = HttpRequest .newBuilder ()
305
- .uri (URI .create (this .baseUri + endpoint ))
338
+ HttpRequest request = this .requestBuilder .uri (URI .create (this .baseUri + endpoint ))
306
339
.header ("Content-Type" , "application/json" )
307
340
.POST (HttpRequest .BodyPublishers .ofString (jsonText ))
308
341
.build ();
0 commit comments