Skip to content

Commit cdf5247

Browse files
committed
Add ClientMcpAsyncHandlersRegistry
Signed-off-by: Daniel Garnier-Moiroux <git@garnier.wf>
1 parent 3cb0e6c commit cdf5247

File tree

13 files changed

+849
-311
lines changed

13 files changed

+849
-311
lines changed

auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpClientAutoConfiguration.java

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,9 @@
2323
import io.modelcontextprotocol.client.McpClient;
2424
import io.modelcontextprotocol.client.McpSyncClient;
2525
import io.modelcontextprotocol.spec.McpSchema;
26-
import org.springaicommunity.mcp.method.changed.prompt.AsyncPromptListChangedSpecification;
27-
import org.springaicommunity.mcp.method.changed.resource.AsyncResourceListChangedSpecification;
28-
import org.springaicommunity.mcp.method.changed.tool.AsyncToolListChangedSpecification;
29-
import org.springaicommunity.mcp.method.elicitation.AsyncElicitationSpecification;
30-
import org.springaicommunity.mcp.method.logging.AsyncLoggingSpecification;
31-
import org.springaicommunity.mcp.method.progress.AsyncProgressSpecification;
32-
import org.springaicommunity.mcp.method.sampling.AsyncSamplingSpecification;
3326

27+
import org.springframework.ai.mcp.annotation.spring.ClientMcpAsyncHandlersRegistry;
3428
import org.springframework.ai.mcp.annotation.spring.ClientMcpSyncHandlersRegistry;
35-
import org.springframework.ai.mcp.client.common.autoconfigure.annotations.McpAsyncAnnotationCustomizer;
3629
import org.springframework.ai.mcp.client.common.autoconfigure.configurer.McpAsyncClientConfigurer;
3730
import org.springframework.ai.mcp.client.common.autoconfigure.configurer.McpSyncClientConfigurer;
3831
import org.springframework.ai.mcp.client.common.autoconfigure.properties.McpClientCommonProperties;
@@ -237,7 +230,8 @@ McpSyncClientConfigurer mcpSyncClientConfigurer(ObjectProvider<McpSyncClientCust
237230
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "ASYNC")
238231
public List<McpAsyncClient> mcpAsyncClients(McpAsyncClientConfigurer mcpAsyncClientConfigurer,
239232
McpClientCommonProperties commonProperties,
240-
ObjectProvider<List<NamedClientMcpTransport>> transportsProvider) {
233+
ObjectProvider<List<NamedClientMcpTransport>> transportsProvider,
234+
ClientMcpAsyncHandlersRegistry clientMcpAsyncHandlersRegistry) {
241235

242236
List<McpAsyncClient> mcpAsyncClients = new ArrayList<>();
243237

@@ -252,7 +246,22 @@ public List<McpAsyncClient> mcpAsyncClients(McpAsyncClientConfigurer mcpAsyncCli
252246

253247
McpClient.AsyncSpec spec = McpClient.async(namedTransport.transport())
254248
.clientInfo(clientInfo)
255-
.requestTimeout(commonProperties.getRequestTimeout());
249+
.requestTimeout(commonProperties.getRequestTimeout())
250+
.sampling(samplingRequest -> clientMcpAsyncHandlersRegistry.handleSampling(namedTransport.name(),
251+
samplingRequest))
252+
.elicitation(elicitationRequest -> clientMcpAsyncHandlersRegistry
253+
.handleElicitation(namedTransport.name(), elicitationRequest))
254+
.loggingConsumer(loggingMessageNotification -> clientMcpAsyncHandlersRegistry
255+
.handleLogging(namedTransport.name(), loggingMessageNotification))
256+
.progressConsumer(progressNotification -> clientMcpAsyncHandlersRegistry
257+
.handleProgress(namedTransport.name(), progressNotification))
258+
.toolsChangeConsumer(newTools -> clientMcpAsyncHandlersRegistry
259+
.handleToolListChanged(namedTransport.name(), newTools))
260+
.promptsChangeConsumer(newPrompts -> clientMcpAsyncHandlersRegistry
261+
.handlePromptListChanged(namedTransport.name(), newPrompts))
262+
.resourcesChangeConsumer(newResources -> clientMcpAsyncHandlersRegistry
263+
.handleResourceListChanged(namedTransport.name(), newResources))
264+
.capabilities(clientMcpAsyncHandlersRegistry.getCapabilities(namedTransport.name()));
256265

257266
spec = mcpAsyncClientConfigurer.configure(namedTransport.name(), spec);
258267

@@ -282,18 +291,6 @@ McpAsyncClientConfigurer mcpAsyncClientConfigurer(ObjectProvider<McpAsyncClientC
282291
return new McpAsyncClientConfigurer(customizerProvider.orderedStream().toList());
283292
}
284293

285-
@Bean
286-
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "ASYNC")
287-
public McpAsyncClientCustomizer mcpAnnotationMcpAsyncClientCustomizer(List<AsyncLoggingSpecification> loggingSpecs,
288-
List<AsyncSamplingSpecification> samplingSpecs, List<AsyncElicitationSpecification> elicitationSpecs,
289-
List<AsyncProgressSpecification> progressSpecs,
290-
List<AsyncToolListChangedSpecification> toolListChangedSpecs,
291-
List<AsyncResourceListChangedSpecification> resourceListChangedSpecs,
292-
List<AsyncPromptListChangedSpecification> promptListChangedSpecs) {
293-
return new McpAsyncAnnotationCustomizer(samplingSpecs, loggingSpecs, elicitationSpecs, progressSpecs,
294-
toolListChangedSpecs, resourceListChangedSpecs, promptListChangedSpecs);
295-
}
296-
297294
/**
298295
* Record class that implements {@link AutoCloseable} to ensure proper cleanup of MCP
299296
* clients.

auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpAsyncAnnotationCustomizer.java

Lines changed: 0 additions & 181 deletions
This file was deleted.

auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpClientAnnotationScannerAutoConfiguration.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springaicommunity.mcp.annotation.McpSampling;
2828
import org.springaicommunity.mcp.annotation.McpToolListChanged;
2929

30+
import org.springframework.ai.mcp.annotation.spring.ClientMcpAsyncHandlersRegistry;
3031
import org.springframework.ai.mcp.annotation.spring.ClientMcpSyncHandlersRegistry;
3132
import org.springframework.ai.mcp.annotation.spring.scan.AbstractAnnotatedMethodBeanFactoryInitializationAotProcessor;
3233
import org.springframework.ai.mcp.annotation.spring.scan.AbstractAnnotatedMethodBeanPostProcessor;
@@ -64,10 +65,17 @@ public class McpClientAnnotationScannerAutoConfiguration {
6465
@ConditionalOnMissingBean
6566
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "SYNC",
6667
matchIfMissing = true)
67-
public ClientMcpSyncHandlersRegistry mcpHandlersRegistry() {
68+
public ClientMcpSyncHandlersRegistry clientMcpSyncHandlersRegistry() {
6869
return new ClientMcpSyncHandlersRegistry();
6970
}
7071

72+
@Bean
73+
@ConditionalOnMissingBean
74+
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "ASYNC")
75+
public ClientMcpAsyncHandlersRegistry clientMcpAsyncHandlersRegistry() {
76+
return new ClientMcpAsyncHandlersRegistry();
77+
}
78+
7179
@Bean
7280
@ConditionalOnMissingBean
7381
public ClientMcpAnnotatedBeans clientAnnotatedBeans() {

auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpClientSpecificationFactoryAutoConfiguration.java

Lines changed: 0 additions & 91 deletions
This file was deleted.

auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,4 @@
1717
org.springframework.ai.mcp.client.common.autoconfigure.StdioTransportAutoConfiguration
1818
org.springframework.ai.mcp.client.common.autoconfigure.McpClientAutoConfiguration
1919
org.springframework.ai.mcp.client.common.autoconfigure.McpToolCallbackAutoConfiguration
20-
org.springframework.ai.mcp.client.common.autoconfigure.annotations.McpClientSpecificationFactoryAutoConfiguration
2120
org.springframework.ai.mcp.client.common.autoconfigure.annotations.McpClientAnnotationScannerAutoConfiguration

auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpClientListChangedAnnotationsScanningIT.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@
4545
public class McpClientListChangedAnnotationsScanningIT {
4646

4747
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
48-
.withConfiguration(AutoConfigurations.of(McpClientAnnotationScannerAutoConfiguration.class,
49-
McpClientSpecificationFactoryAutoConfiguration.class));
48+
.withConfiguration(AutoConfigurations.of(McpClientAnnotationScannerAutoConfiguration.class));
5049

5150
@ParameterizedTest
5251
@ValueSource(strings = { "SYNC", "ASYNC" })

0 commit comments

Comments
 (0)