Skip to content

MCP integration using WebMVC SSE #3287

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
bhautik-sakhiya opened this issue May 22, 2025 · 3 comments
Open

MCP integration using WebMVC SSE #3287

bhautik-sakhiya opened this issue May 22, 2025 · 3 comments

Comments

@bhautik-sakhiya
Copy link

bhautik-sakhiya commented May 22, 2025

Bug description
I have implemented both the client and server components for the Model Context Protocol (MCP). Both communicate using Server-Sent Events (SSE), allowing real-time, streaming responses. This setup works as expected in most cases, and the client receives responses from the server as a continuous stream of data.

However, in certain scenarios - depending on the question asked, I encounter an error related to the parsing or serialization while returning the response in streaming.

The error that I face:

2025-05-22T11:03:41.070+05:30 ERROR 117009 --- [spring-boot-ai-mcp-client] [oundedElastic-2] o.s.ai.chat.model.MessageAggregator      : Aggregation Error

io.modelcontextprotocol.spec.McpError: Failed to wait for the message endpoint
	at io.modelcontextprotocol.client.transport.HttpClientSseClientTransport.sendMessage(HttpClientSseClientTransport.java:405) ~[mcp-0.9.0.jar:0.9.0]
	at io.modelcontextprotocol.spec.McpClientSession.lambda$sendRequest$11(McpClientSession.java:232) ~[mcp-0.9.0.jar:0.9.0]
	at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:61) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onNext(FluxTimeout.java:181) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Operators$MonoInnerProducerBase.complete(Operators.java:2834) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SinkOneMulticast.subscribe(SinkOneMulticast.java:101) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.block(Mono.java:1778) ~[reactor-core-3.7.5.jar:3.7.5]
	at io.modelcontextprotocol.client.McpSyncClient.callTool(McpSyncClient.java:200) ~[mcp-0.9.0.jar:0.9.0]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:115) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:125) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCall(DefaultToolCallingManager.java:205) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCalls(DefaultToolCallingManager.java:128) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.anthropic.AnthropicChatModel.lambda$internalStream$4(AnthropicChatModel.java:265) ~[spring-ai-anthropic-1.0.0-M8.jar:1.0.0-M8]
	at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37) ~[reactor-core-3.7.5.jar:3.7.5]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
	Suppressed: java.lang.Exception: #block terminated with an error
		at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:104) ~[reactor-core-3.7.5.jar:3.7.5]
		at reactor.core.publisher.Mono.block(Mono.java:1779) ~[reactor-core-3.7.5.jar:3.7.5]
		... 15 common frames omitted

2025-05-22T11:03:41.080+05:30 ERROR 117009 --- [spring-boot-ai-mcp-client] [nio-8081-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] threw exception

io.modelcontextprotocol.spec.McpError: Failed to wait for the message endpoint
	at io.modelcontextprotocol.client.transport.HttpClientSseClientTransport.sendMessage(HttpClientSseClientTransport.java:405) ~[mcp-0.9.0.jar:0.9.0]
	at io.modelcontextprotocol.spec.McpClientSession.lambda$sendRequest$11(McpClientSession.java:232) ~[mcp-0.9.0.jar:0.9.0]
	at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:61) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onNext(FluxTimeout.java:181) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Operators$MonoInnerProducerBase.complete(Operators.java:2834) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SinkOneMulticast.subscribe(SinkOneMulticast.java:101) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.block(Mono.java:1778) ~[reactor-core-3.7.5.jar:3.7.5]
	at io.modelcontextprotocol.client.McpSyncClient.callTool(McpSyncClient.java:200) ~[mcp-0.9.0.jar:0.9.0]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:115) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:125) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCall(DefaultToolCallingManager.java:205) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCalls(DefaultToolCallingManager.java:128) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.anthropic.AnthropicChatModel.lambda$internalStream$4(AnthropicChatModel.java:265) ~[spring-ai-anthropic-1.0.0-M8.jar:1.0.0-M8]
	at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37) ~[reactor-core-3.7.5.jar:3.7.5]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
	Suppressed: java.lang.Exception: #block terminated with an error
		at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:104) ~[reactor-core-3.7.5.jar:3.7.5]
		at reactor.core.publisher.Mono.block(Mono.java:1779) ~[reactor-core-3.7.5.jar:3.7.5]
		... 15 common frames omitted

2025-05-22T11:03:41.081+05:30 ERROR 117009 --- [spring-boot-ai-mcp-client] [nio-8081-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: io.modelcontextprotocol.spec.McpError: Failed to wait for the message endpoint] with root cause

io.modelcontextprotocol.spec.McpError: Failed to wait for the message endpoint
	at io.modelcontextprotocol.client.transport.HttpClientSseClientTransport.sendMessage(HttpClientSseClientTransport.java:405) ~[mcp-0.9.0.jar:0.9.0]
	at io.modelcontextprotocol.spec.McpClientSession.lambda$sendRequest$11(McpClientSession.java:232) ~[mcp-0.9.0.jar:0.9.0]
	at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:61) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onNext(FluxTimeout.java:181) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Operators$MonoInnerProducerBase.complete(Operators.java:2834) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SinkOneMulticast.subscribe(SinkOneMulticast.java:101) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.block(Mono.java:1778) ~[reactor-core-3.7.5.jar:3.7.5]
	at io.modelcontextprotocol.client.McpSyncClient.callTool(McpSyncClient.java:200) ~[mcp-0.9.0.jar:0.9.0]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:115) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:125) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCall(DefaultToolCallingManager.java:205) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCalls(DefaultToolCallingManager.java:128) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.anthropic.AnthropicChatModel.lambda$internalStream$4(AnthropicChatModel.java:265) ~[spring-ai-anthropic-1.0.0-M8.jar:1.0.0-M8]
	at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37) ~[reactor-core-3.7.5.jar:3.7.5]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
	Suppressed: java.lang.Exception: #block terminated with an error
		at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:104) ~[reactor-core-3.7.5.jar:3.7.5]
		at reactor.core.publisher.Mono.block(Mono.java:1779) ~[reactor-core-3.7.5.jar:3.7.5]
		... 15 common frames omitted

2025-05-22T11:03:41.086+05:30  WARN 117009 --- [spring-boot-ai-mcp-client] [nio-8081-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Ignoring exception, response committed already: org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type 'text/event-stream'
2025-05-22T11:03:41.086+05:30  WARN 117009 --- [spring-boot-ai-mcp-client] [nio-8081-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type 'text/event-stream']

Environment
Java: 21
Spring-AI: 1.0.0-M8

Steps to reproduce
I have a very simple tool:

@Tool(description = "Get weather information by city name")
    public String getWeather(String cityName) {
        return "The weather in " + cityName + " is sunny with a temperature of 25°C.";
    }

When I give a prompt like What is the weather in ABC city?
I get above mentioned error.

Expected behavior
Not getting this error. And return the response

Minimal Complete Reproducible example

The client exposes the following endpoint, which sends a prompt to the server and returns the streamed content as a Flux:

@GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> ask(@RequestParam String question) {
        return chatClient
                .prompt(question)
                .stream()
                .content();
}
@checkHup
Copy link

You need to configure

@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setSupportedMediaTypes(Arrays.asList( MediaType.TEXT_EVENT_STREAM, MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN )); converters.add(converter); } }

@bhautik-sakhiya
Copy link
Author

bhautik-sakhiya commented May 22, 2025

@checkHup Still getting this error

2025-05-22T16:44:08.685+05:30 ERROR 221528 --- [spring-boot-ai-mcp-client] [oundedElastic-2] o.s.ai.chat.model.MessageAggregator      : Aggregation Error

io.modelcontextprotocol.spec.McpError: Failed to wait for the message endpoint
	at io.modelcontextprotocol.client.transport.HttpClientSseClientTransport.sendMessage(HttpClientSseClientTransport.java:405) ~[mcp-0.9.0.jar:0.9.0]
	at io.modelcontextprotocol.spec.McpClientSession.lambda$sendRequest$11(McpClientSession.java:232) ~[mcp-0.9.0.jar:0.9.0]
	at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:61) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onNext(FluxTimeout.java:181) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Operators$MonoInnerProducerBase.complete(Operators.java:2834) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SinkOneMulticast.subscribe(SinkOneMulticast.java:101) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.block(Mono.java:1778) ~[reactor-core-3.7.5.jar:3.7.5]
	at io.modelcontextprotocol.client.McpSyncClient.callTool(McpSyncClient.java:200) ~[mcp-0.9.0.jar:0.9.0]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:115) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:125) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCall(DefaultToolCallingManager.java:205) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCalls(DefaultToolCallingManager.java:128) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.anthropic.AnthropicChatModel.lambda$internalStream$4(AnthropicChatModel.java:265) ~[spring-ai-anthropic-1.0.0-M8.jar:1.0.0-M8]
	at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37) ~[reactor-core-3.7.5.jar:3.7.5]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
	Suppressed: java.lang.Exception: #block terminated with an error
		at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:104) ~[reactor-core-3.7.5.jar:3.7.5]
		at reactor.core.publisher.Mono.block(Mono.java:1779) ~[reactor-core-3.7.5.jar:3.7.5]
		... 15 common frames omitted

2025-05-22T16:44:08.693+05:30 ERROR 221528 --- [spring-boot-ai-mcp-client] [nio-8081-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] threw exception

io.modelcontextprotocol.spec.McpError: Failed to wait for the message endpoint
	at io.modelcontextprotocol.client.transport.HttpClientSseClientTransport.sendMessage(HttpClientSseClientTransport.java:405) ~[mcp-0.9.0.jar:0.9.0]
	at io.modelcontextprotocol.spec.McpClientSession.lambda$sendRequest$11(McpClientSession.java:232) ~[mcp-0.9.0.jar:0.9.0]
	at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:61) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onNext(FluxTimeout.java:181) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Operators$MonoInnerProducerBase.complete(Operators.java:2834) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SinkOneMulticast.subscribe(SinkOneMulticast.java:101) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.block(Mono.java:1778) ~[reactor-core-3.7.5.jar:3.7.5]
	at io.modelcontextprotocol.client.McpSyncClient.callTool(McpSyncClient.java:200) ~[mcp-0.9.0.jar:0.9.0]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:115) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:125) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCall(DefaultToolCallingManager.java:205) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCalls(DefaultToolCallingManager.java:128) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.anthropic.AnthropicChatModel.lambda$internalStream$4(AnthropicChatModel.java:265) ~[spring-ai-anthropic-1.0.0-M8.jar:1.0.0-M8]
	at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37) ~[reactor-core-3.7.5.jar:3.7.5]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
	Suppressed: java.lang.Exception: #block terminated with an error
		at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:104) ~[reactor-core-3.7.5.jar:3.7.5]
		at reactor.core.publisher.Mono.block(Mono.java:1779) ~[reactor-core-3.7.5.jar:3.7.5]
		... 15 common frames omitted

2025-05-22T16:44:08.694+05:30 ERROR 221528 --- [spring-boot-ai-mcp-client] [nio-8081-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: io.modelcontextprotocol.spec.McpError: Failed to wait for the message endpoint] with root cause

io.modelcontextprotocol.spec.McpError: Failed to wait for the message endpoint
	at io.modelcontextprotocol.client.transport.HttpClientSseClientTransport.sendMessage(HttpClientSseClientTransport.java:405) ~[mcp-0.9.0.jar:0.9.0]
	at io.modelcontextprotocol.spec.McpClientSession.lambda$sendRequest$11(McpClientSession.java:232) ~[mcp-0.9.0.jar:0.9.0]
	at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:61) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onNext(FluxTimeout.java:181) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Operators$MonoInnerProducerBase.complete(Operators.java:2834) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.SinkOneMulticast.subscribe(SinkOneMulticast.java:101) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.Mono.block(Mono.java:1778) ~[reactor-core-3.7.5.jar:3.7.5]
	at io.modelcontextprotocol.client.McpSyncClient.callTool(McpSyncClient.java:200) ~[mcp-0.9.0.jar:0.9.0]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:115) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.mcp.SyncMcpToolCallback.call(SyncMcpToolCallback.java:125) ~[spring-ai-mcp-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCall(DefaultToolCallingManager.java:205) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCalls(DefaultToolCallingManager.java:128) ~[spring-ai-model-1.0.0-M8.jar:1.0.0-M8]
	at org.springframework.ai.anthropic.AnthropicChatModel.lambda$internalStream$4(AnthropicChatModel.java:265) ~[spring-ai-anthropic-1.0.0-M8.jar:1.0.0-M8]
	at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84) ~[reactor-core-3.7.5.jar:3.7.5]
	at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37) ~[reactor-core-3.7.5.jar:3.7.5]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
	Suppressed: java.lang.Exception: #block terminated with an error
		at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:104) ~[reactor-core-3.7.5.jar:3.7.5]
		at reactor.core.publisher.Mono.block(Mono.java:1779) ~[reactor-core-3.7.5.jar:3.7.5]
		... 15 common frames omitted

Now the parsing issue is solved, but I still get this error.

@JoeBerg8
Copy link

@configuration public class WebConfig implements WebMvcConfigurer { @OverRide public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setSupportedMediaTypes(Arrays.asList( MediaType.TEXT_EVENT_STREAM, MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN )); converters.add(converter); } }

thank you. i was getting an error no static resource sse found when trying to connect to mcp server running inside of my spring boot app and this suggestion fixed it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants