When creating NamedClientMcpTransport, support ability to customize WebClient per connection name.

Current code creates the WebClient like webClientBuilderProvider.getIfAvailable(WebClient::builder):

public List<NamedClientMcpTransport> streamableHttpWebFluxClientTransports(
        McpStreamableHttpClientProperties streamableProperties,
        ObjectProvider<WebClient.Builder> webClientBuilderProvider,
        ObjectProvider<ObjectMapper> objectMapperProvider) {

    var webClientBuilderTemplate = webClientBuilderProvider.getIfAvailable(WebClient::builder);

    return streamableProperties.map(streamableProperty -> {
            var transport = newTransport(webClientBuilderTemplate, streamableProperty)
            streamableHttpTransports.add(new NamedClientMcpTransport(transport))
           }).toList();
}

Please make the code read something like webClientFactory.create(connectionName, WebClient::builder):

public List<NamedClientMcpTransport> streamableHttpWebFluxClientTransports(
        McpStreamableHttpClientProperties streamableProperties,
        WebClientFactory webClientFactory,
        ObjectProvider<ObjectMapper> objectMapperProvider) {

    return streamableProperties.map(streamableProperty -> {
            var connectionName = streamableProperty.connectionName()
            var webClientBuilder = webClientFactory.create(connectionName, WebClient::builder);
            var transport = newTransport(webClientBuilderTemplate, streamableProperty)
            streamableHttpTransports.add(new NamedClientMcpTransport(transport))
           }).toList();
}

Context This will allow WebClient and underlying http client to be much more easily customized on a per connectionName basis.

Comment From: limch02

Hi 👋 I'd like to take this issue.

I reviewed the current implementation and understand that all NamedClientMcpTransport instances share the same WebClient.Builder template. To support per-connection customization (e.g., timeouts, base URLs, and SSL configs), I'll update the factory method to use WebClientFactory.create(connectionName, WebClient::builder) as suggested.

Plan: 1. Replace ObjectProvider<WebClient.Builder> with WebClientFactory injection. 2. Use streamableProperty.connectionName() to create a per-connection WebClient.Builder. 3. Pass the customized builder into newTransport(...) while keeping the existing structure intact. 4. Add/adjust tests to verify that each connection uses a distinct WebClient instance.

If that approach sounds good, I can start working on a PR for this.

Comment From: maxxedev

@limch02 sounds good.

One consideration to make is that the factory method could be just WebClientFactory.create(connectionName) ... and the default implementation of WebClientFactory could always return WebClient.builder()