diff --git a/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/SseHttpClientTransportAutoConfiguration.java b/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/SseHttpClientTransportAutoConfiguration.java index 6d695a468d7..a821cc494c6 100644 --- a/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/SseHttpClientTransportAutoConfiguration.java +++ b/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/SseHttpClientTransportAutoConfiguration.java @@ -23,9 +23,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.modelcontextprotocol.client.McpSyncClient; -import io.modelcontextprotocol.client.transport.AsyncHttpRequestCustomizer; import io.modelcontextprotocol.client.transport.HttpClientSseClientTransport; -import io.modelcontextprotocol.client.transport.SyncHttpRequestCustomizer; +import io.modelcontextprotocol.client.transport.customizer.McpAsyncHttpClientRequestCustomizer; +import io.modelcontextprotocol.client.transport.customizer.McpSyncHttpClientRequestCustomizer; import io.modelcontextprotocol.spec.McpSchema; import org.springframework.ai.mcp.client.common.autoconfigure.NamedClientMcpTransport; @@ -87,17 +87,17 @@ public class SseHttpClientTransportAutoConfiguration { * @param sseProperties the SSE client properties containing server configurations * @param objectMapperProvider the provider for ObjectMapper or a new instance if not * available - * @param syncHttpRequestCustomizer provider for {@link SyncHttpRequestCustomizer} if - * available - * @param asyncHttpRequestCustomizer provider fo {@link AsyncHttpRequestCustomizer} if - * available + * @param syncHttpRequestCustomizer provider for + * {@link McpSyncHttpClientRequestCustomizer} if available + * @param asyncHttpRequestCustomizer provider fo + * {@link McpAsyncHttpClientRequestCustomizer} if available * @return list of named MCP transports */ @Bean public List sseHttpClientTransports(McpSseClientProperties sseProperties, ObjectProvider objectMapperProvider, - ObjectProvider syncHttpRequestCustomizer, - ObjectProvider asyncHttpRequestCustomizer) { + ObjectProvider syncHttpRequestCustomizer, + ObjectProvider asyncHttpRequestCustomizer) { ObjectMapper objectMapper = objectMapperProvider.getIfAvailable(ObjectMapper::new); @@ -117,9 +117,9 @@ public List sseHttpClientTransports(McpSseClientPropert syncHttpRequestCustomizer.ifUnique(transportBuilder::httpRequestCustomizer); if (asyncHttpRequestCustomizer.getIfUnique() != null && syncHttpRequestCustomizer.getIfUnique() != null) { logger.warn("Found beans of type %s and %s. Using %s.".formatted( - AsyncHttpRequestCustomizer.class.getSimpleName(), - SyncHttpRequestCustomizer.class.getSimpleName(), - SyncHttpRequestCustomizer.class.getSimpleName())); + McpAsyncHttpClientRequestCustomizer.class.getSimpleName(), + McpSyncHttpClientRequestCustomizer.class.getSimpleName(), + McpSyncHttpClientRequestCustomizer.class.getSimpleName())); } HttpClientSseClientTransport transport = transportBuilder.build(); diff --git a/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/StreamableHttpHttpClientTransportAutoConfiguration.java b/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/StreamableHttpHttpClientTransportAutoConfiguration.java index 0acfa02c56c..911ab9e6370 100644 --- a/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/StreamableHttpHttpClientTransportAutoConfiguration.java +++ b/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/StreamableHttpHttpClientTransportAutoConfiguration.java @@ -23,9 +23,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.modelcontextprotocol.client.McpSyncClient; -import io.modelcontextprotocol.client.transport.AsyncHttpRequestCustomizer; import io.modelcontextprotocol.client.transport.HttpClientStreamableHttpTransport; -import io.modelcontextprotocol.client.transport.SyncHttpRequestCustomizer; +import io.modelcontextprotocol.client.transport.customizer.McpAsyncHttpClientRequestCustomizer; +import io.modelcontextprotocol.client.transport.customizer.McpSyncHttpClientRequestCustomizer; import io.modelcontextprotocol.spec.McpSchema; import org.springframework.ai.mcp.client.common.autoconfigure.NamedClientMcpTransport; @@ -90,17 +90,17 @@ public class StreamableHttpHttpClientTransportAutoConfiguration { * configurations * @param objectMapperProvider the provider for ObjectMapper or a new instance if not * available - * @param syncHttpRequestCustomizer provider for {@link SyncHttpRequestCustomizer} if - * available - * @param asyncHttpRequestCustomizer provider fo {@link AsyncHttpRequestCustomizer} if - * available + * @param syncHttpRequestCustomizer provider for + * {@link McpSyncHttpClientRequestCustomizer} if available + * @param asyncHttpRequestCustomizer provider fo + * {@link McpAsyncHttpClientRequestCustomizer} if available * @return list of named MCP transports */ @Bean public List streamableHttpHttpClientTransports( McpStreamableHttpClientProperties streamableProperties, ObjectProvider objectMapperProvider, - ObjectProvider syncHttpRequestCustomizer, - ObjectProvider asyncHttpRequestCustomizer) { + ObjectProvider syncHttpRequestCustomizer, + ObjectProvider asyncHttpRequestCustomizer) { ObjectMapper objectMapper = objectMapperProvider.getIfAvailable(ObjectMapper::new); @@ -123,9 +123,9 @@ public List streamableHttpHttpClientTransports( syncHttpRequestCustomizer.ifUnique(transportBuilder::httpRequestCustomizer); if (asyncHttpRequestCustomizer.getIfUnique() != null && syncHttpRequestCustomizer.getIfUnique() != null) { logger.warn("Found beans of type %s and %s. Using %s.".formatted( - AsyncHttpRequestCustomizer.class.getSimpleName(), - SyncHttpRequestCustomizer.class.getSimpleName(), - SyncHttpRequestCustomizer.class.getSimpleName())); + McpAsyncHttpClientRequestCustomizer.class.getSimpleName(), + McpSyncHttpClientRequestCustomizer.class.getSimpleName(), + McpSyncHttpClientRequestCustomizer.class.getSimpleName())); } HttpClientStreamableHttpTransport transport = transportBuilder.build(); diff --git a/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/SseHttpClientTransportAutoConfigurationIT.java b/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/SseHttpClientTransportAutoConfigurationIT.java index 7fa60ab319f..6d58a163d62 100644 --- a/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/SseHttpClientTransportAutoConfigurationIT.java +++ b/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/SseHttpClientTransportAutoConfigurationIT.java @@ -19,8 +19,8 @@ import java.util.List; import io.modelcontextprotocol.client.McpSyncClient; -import io.modelcontextprotocol.client.transport.AsyncHttpRequestCustomizer; -import io.modelcontextprotocol.client.transport.SyncHttpRequestCustomizer; +import io.modelcontextprotocol.client.transport.customizer.McpAsyncHttpClientRequestCustomizer; +import io.modelcontextprotocol.client.transport.customizer.McpSyncHttpClientRequestCustomizer; import io.modelcontextprotocol.spec.McpSchema.ListToolsResult; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -121,9 +121,9 @@ void usesSyncRequestCustomizer() { mcpClient.ping(); - verify(context.getBean(SyncHttpRequestCustomizer.class), atLeastOnce()).customize(any(), any(), any(), - any()); - verifyNoInteractions(context.getBean(AsyncHttpRequestCustomizer.class)); + verify(context.getBean(McpSyncHttpClientRequestCustomizer.class), atLeastOnce()).customize(any(), any(), + any(), any(), any()); + verifyNoInteractions(context.getBean(McpAsyncHttpClientRequestCustomizer.class)); }); } @@ -140,8 +140,8 @@ void usesAsyncRequestCustomizer() { mcpClient.ping(); - verify(context.getBean(AsyncHttpRequestCustomizer.class), atLeastOnce()).customize(any(), any(), any(), - any()); + verify(context.getBean(McpAsyncHttpClientRequestCustomizer.class), atLeastOnce()).customize(any(), + any(), any(), any(), any()); }); } @@ -149,8 +149,8 @@ void usesAsyncRequestCustomizer() { static class SyncRequestCustomizerConfiguration { @Bean - SyncHttpRequestCustomizer syncHttpRequestCustomizer() { - return mock(SyncHttpRequestCustomizer.class); + McpSyncHttpClientRequestCustomizer syncHttpRequestCustomizer() { + return mock(McpSyncHttpClientRequestCustomizer.class); } } @@ -159,9 +159,9 @@ SyncHttpRequestCustomizer syncHttpRequestCustomizer() { static class AsyncRequestCustomizerConfiguration { @Bean - AsyncHttpRequestCustomizer asyncHttpRequestCustomizer() { - AsyncHttpRequestCustomizer requestCustomizerMock = mock(AsyncHttpRequestCustomizer.class); - when(requestCustomizerMock.customize(any(), any(), any(), any())) + McpAsyncHttpClientRequestCustomizer asyncHttpRequestCustomizer() { + McpAsyncHttpClientRequestCustomizer requestCustomizerMock = mock(McpAsyncHttpClientRequestCustomizer.class); + when(requestCustomizerMock.customize(any(), any(), any(), any(), any())) .thenAnswer(invocation -> Mono.just(invocation.getArguments()[0])); return requestCustomizerMock; } diff --git a/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/StreamableHttpHttpClientTransportAutoConfigurationIT.java b/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/StreamableHttpHttpClientTransportAutoConfigurationIT.java index 17a4abf97bf..491e7302e77 100644 --- a/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/StreamableHttpHttpClientTransportAutoConfigurationIT.java +++ b/auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/StreamableHttpHttpClientTransportAutoConfigurationIT.java @@ -19,8 +19,8 @@ import java.util.List; import io.modelcontextprotocol.client.McpSyncClient; -import io.modelcontextprotocol.client.transport.AsyncHttpRequestCustomizer; -import io.modelcontextprotocol.client.transport.SyncHttpRequestCustomizer; +import io.modelcontextprotocol.client.transport.customizer.McpAsyncHttpClientRequestCustomizer; +import io.modelcontextprotocol.client.transport.customizer.McpSyncHttpClientRequestCustomizer; import io.modelcontextprotocol.spec.McpSchema.ListToolsResult; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -122,9 +122,9 @@ void usesSyncRequestCustomizer() { mcpClient.ping(); - verify(context.getBean(SyncHttpRequestCustomizer.class), atLeastOnce()).customize(any(), any(), any(), - any()); - verifyNoInteractions(context.getBean(AsyncHttpRequestCustomizer.class)); + verify(context.getBean(McpSyncHttpClientRequestCustomizer.class), atLeastOnce()).customize(any(), any(), + any(), any(), any()); + verifyNoInteractions(context.getBean(McpAsyncHttpClientRequestCustomizer.class)); }); } @@ -141,8 +141,8 @@ void usesAsyncRequestCustomizer() { mcpClient.ping(); - verify(context.getBean(AsyncHttpRequestCustomizer.class), atLeastOnce()).customize(any(), any(), any(), - any()); + verify(context.getBean(McpAsyncHttpClientRequestCustomizer.class), atLeastOnce()).customize(any(), + any(), any(), any(), any()); }); } @@ -150,8 +150,8 @@ void usesAsyncRequestCustomizer() { static class SyncRequestCustomizerConfiguration { @Bean - SyncHttpRequestCustomizer syncHttpRequestCustomizer() { - return mock(SyncHttpRequestCustomizer.class); + McpSyncHttpClientRequestCustomizer syncHttpRequestCustomizer() { + return mock(McpSyncHttpClientRequestCustomizer.class); } } @@ -160,9 +160,9 @@ SyncHttpRequestCustomizer syncHttpRequestCustomizer() { static class AsyncRequestCustomizerConfiguration { @Bean - AsyncHttpRequestCustomizer asyncHttpRequestCustomizer() { - AsyncHttpRequestCustomizer requestCustomizerMock = mock(AsyncHttpRequestCustomizer.class); - when(requestCustomizerMock.customize(any(), any(), any(), any())) + McpAsyncHttpClientRequestCustomizer asyncHttpRequestCustomizer() { + McpAsyncHttpClientRequestCustomizer requestCustomizerMock = mock(McpAsyncHttpClientRequestCustomizer.class); + when(requestCustomizerMock.customize(any(), any(), any(), any(), any())) .thenAnswer(invocation -> Mono.just(invocation.getArguments()[0])); return requestCustomizerMock; } diff --git a/auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpStatelessServerAutoConfigurationIT.java b/auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpStatelessServerAutoConfigurationIT.java index 4b489d74917..539ec502e10 100644 --- a/auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpStatelessServerAutoConfigurationIT.java +++ b/auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpStatelessServerAutoConfigurationIT.java @@ -21,6 +21,7 @@ import java.util.function.BiFunction; import io.modelcontextprotocol.client.McpSyncClient; +import io.modelcontextprotocol.common.McpTransportContext; import io.modelcontextprotocol.server.McpStatelessAsyncServer; import io.modelcontextprotocol.server.McpStatelessServerFeatures; import io.modelcontextprotocol.server.McpStatelessServerFeatures.AsyncCompletionSpecification; @@ -31,7 +32,6 @@ import io.modelcontextprotocol.server.McpStatelessServerFeatures.SyncToolSpecification; import io.modelcontextprotocol.server.McpStatelessSyncServer; import io.modelcontextprotocol.server.McpSyncServerExchange; -import io.modelcontextprotocol.server.McpTransportContext; import io.modelcontextprotocol.spec.McpSchema; import io.modelcontextprotocol.spec.McpStatelessServerTransport; import org.junit.jupiter.api.Test; diff --git a/mcp/common/src/main/java/org/springframework/ai/mcp/McpToolUtils.java b/mcp/common/src/main/java/org/springframework/ai/mcp/McpToolUtils.java index 9fd6b9e4a54..80902a671dd 100644 --- a/mcp/common/src/main/java/org/springframework/ai/mcp/McpToolUtils.java +++ b/mcp/common/src/main/java/org/springframework/ai/mcp/McpToolUtils.java @@ -331,7 +331,7 @@ public static McpStatelessServerFeatures.AsyncToolSpecification toStatelessAsync return new McpStatelessServerFeatures.AsyncToolSpecification(statelessSyncToolSpecification.tool(), (context, request) -> Mono - .fromCallable(() -> statelessSyncToolSpecification.callHandler().apply(context.copy(), request)) + .fromCallable(() -> statelessSyncToolSpecification.callHandler().apply(context, request)) .subscribeOn(Schedulers.boundedElastic())); } diff --git a/pom.xml b/pom.xml index 5031dc90eed..b168606369c 100644 --- a/pom.xml +++ b/pom.xml @@ -330,7 +330,7 @@ 4.1.0 - 0.11.3 + 0.12.0-SNAPSHOT 0.3.0-SNAPSHOT