Skip to content

HttpClientSseClientTransport Connection Timeout #360

@gakkiyomi

Description

@gakkiyomi

Bug description
For the same MCP SSE service endpoint, both the mcp-inspector and Python SDK work properly, but the Java SDK fails.

Environment
JDK17
Java SDK: 0.10.0
Python SDK: mcp[cli]>=1.9.0
MCP Inspector: v0.15.0

Steps to reproduce
MCP Inspector

Image

Python Code

import asyncio

from mcp.client.sse import sse_client
from mcp import ClientSession
from objprint import op


async def main():
    async with sse_client(
        "https://xxxxxxxxx.com/mcp/proxy/testchairstream/init"
    ) as (
        stdio,
        write,
    ):
        async with ClientSession(stdio, write) as session:
            # init ClientSession
            await session.initialize()

            # list all tools
            response = await session.list_tools()
            print(response.tools)


if __name__ == "__main__":
    asyncio.run(main())

Image

However, when I use the Java SDK to run this demo, it fails to work.
A timeout exception occurs during client initialization, specifically when executing client.initialize()

    @Override
    public List<? extends MCPTool> generateTools() {
        UrlParser.SseEndpointInfo info;
        try {
            //https://xxxxxxxxx.com/mcp/proxy/testchairstream/init
            //info = parseUrl("http://localhost:8000/sse");
            info = new UrlParser.SseEndpointInfo("https://xxxxxxxxx.com", "/mcp/proxy/testchairstream/init");
        } catch (Exception e) {
            throw new BizException(ErrorCode.SERVICE_ONLINE_FAIL, e.getMessage());
        }
        var transport = HttpClientSseClientTransport.builder(info.baseUri())
                .sseEndpoint(info.sseEndpoint())
                .objectMapper(new ObjectMapper())
                .requestBuilder(HttpRequest.newBuilder())
                .clientBuilder(HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS))
                .build();
        McpSyncClient client = McpClient.sync(transport)
                .clientInfo(new McpSchema.Implementation("gov-ai-service-platform-proxy", "1.0.0"))
                .build();
        try {
            client.initialize();  //Will throw an error on this line
            List<McpSchema.Tool> tools1 = client.listTools().tools();
            return tools1.stream().map(x -> new MCPBridgeTool(x, client)).toList();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

Below is the stack trace:

2025-07-01 15:57:15.437 [main][] [] ERROR c.a.g.d.mcp.metadata.MCPMetaData - java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 20000ms in 'Mono.deferContextual ⇢ at io.modelcontextprotocol.spec.McpClientSession.sendRequest(McpClientSession.java:233)' (and no fallback has been configured)
reactor.core.Exceptions$ReactiveException: java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 20000ms in 'Mono.deferContextual ⇢ at io.modelcontextprotocol.spec.McpClientSession.sendRequest(McpClientSession.java:233)' (and no fallback has been configured)
	at reactor.core.Exceptions.propagate(Exceptions.java:410)
	at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:102)
	at reactor.core.publisher.Mono.block(Mono.java:1779)
	at io.modelcontextprotocol.client.McpSyncClient.initialize(McpSyncClient.java:171)
	at com.alipay.govaiserviceplatform.domain.mcp.metadata.MCPMetaData.generateTools(MCPMetaData.java:75)
	at com.alipay.govaiserviceplatform.core.mcp.server.BuiltInMCPServer.getTools(BuiltInMCPServer.java:47)
	at com.alipay.govaiserviceplatform.core.mcp.server.BaseMCPServer.start(BaseMCPServer.java:49)
	at com.alipay.govaiserviceplatform.core.config.BuiltInMCPServerRegistry.createServerRegistration(BuiltInMCPServerRegistry.java:85)
	at com.alipay.govaiserviceplatform.core.config.BuiltInMCPServerRegistry.lambda$postProcessBeanFactory$1(BuiltInMCPServerRegistry.java:70)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainInstanceFromSupplier(AbstractAutowireCapableBeanFactory.java:1297)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.obtainInstanceFromSupplier(DefaultListableBeanFactory.java:1033)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1257)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1200)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:230)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:221)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:106)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.<init>(ServletContextInitializerBeans.java:95)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:271)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:245)
	at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:52)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4464)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193)
	at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:772)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193)
	at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:203)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:412)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:870)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.startup.Tomcat.start(Tomcat.java:438)
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:128)
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:107)
	at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:517)
	at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:219)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:193)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:167)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:621)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1362)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1351)
	at com.alipay.govaiserviceplatform.GovAIServicePlatformApplication.main(GovAIServicePlatformApplication.java:25)
	Suppressed: java.lang.Exception: #block terminated with an error
		at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:104)
		... 63 common frames omitted
Caused by: java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 20000ms in 'Mono.deferContextual ⇢ at io.modelcontextprotocol.spec.McpClientSession.sendRequest(McpClientSession.java:233)' (and no fallback has been configured)
	at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.handleTimeout(FluxTimeout.java:296)
	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Assembly trace from producer [reactor.core.publisher.MonoTimeout] :
	reactor.core.publisher.Mono.timeout(Mono.java:5007)
	io.modelcontextprotocol.spec.McpClientSession.sendRequest(McpClientSession.java:245)
Error has been observed at the following site(s):
	*__Mono.timeout ⇢ at io.modelcontextprotocol.spec.McpClientSession.sendRequest(McpClientSession.java:245)
	|_  Mono.handle ⇢ at io.modelcontextprotocol.spec.McpClientSession.sendRequest(McpClientSession.java:245)
	|_ Mono.flatMap ⇢ at io.modelcontextprotocol.client.McpAsyncClient.initialize(McpAsyncClient.java:343)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions