Skip to content

oidc-client-mcp-auth-provider with streamable-http transport type: getAuthorization() tries to block the event-loop thread #1730

@btison

Description

@btison

I am trying to use the oidc-client-mcp-auth-provider in combination with streamable-http transport type.
When the Mcp client is initializing, the getAuthorization() method in OidcClientMcpAuthProvider tries to block the event-loop thread by calling Uni.await().indefinitely().

This happens when the mcp client is trying to send an 'initialized' request to the mcp server, even if the mcp client is called in an worker pool thread

2025-08-28 22:08:55,935 INFO  [io.qua.lan.mcp.run.htt.QuarkusStreamableHttpMcpTransport] (executor-thread-1) Request: {"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{"roots":{"listChanged":false}},"clientInfo":{"name":"langchai
n4j","version":"1.0"}}}                                                                                                                                                                                                                                                                   
2025-08-28 22:08:56,012 INFO  [io.qua.lan.mcp.run.htt.QuarkusStreamableHttpMcpTransport] (vert.x-eventloop-thread-3) Response: {"jsonrpc":"2.0","id":0,"result":{"capabilities":{"logging":{},"tools":{}},"serverInfo":{"version":"1.0","name":"Mail MCP"},"protocolVersion":"2024-11-05"}
}                                                                                                                                                                                                                                                                                         
2025-08-28 22:08:56,014 INFO  [io.qua.lan.mcp.run.htt.QuarkusStreamableHttpMcpTransport] (vert.x-eventloop-thread-3) Request: {"jsonrpc":"2.0","method":"notifications/initialized"}

Stack trace:

: jakarta.enterprise.inject.CreationException: Error creating synthetic bean [hsVtFY5C2fd5CgqaJqo8cfZe1YE]: java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: The current thread cannot be blocked: vert.x-eventloop-thread-3
        at dev.langchain4j.mcp.client.McpClient_hsVtFY5C2fd5CgqaJqo8cfZe1YE_Synthetic_Bean.doCreate(Unknown Source)
        at dev.langchain4j.mcp.client.McpClient_hsVtFY5C2fd5CgqaJqo8cfZe1YE_Synthetic_Bean.create(Unknown Source)
        at dev.langchain4j.mcp.client.McpClient_hsVtFY5C2fd5CgqaJqo8cfZe1YE_Synthetic_Bean.create(Unknown Source)
        at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:119)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:38)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35)
        at io.quarkus.arc.generator.Default_jakarta_enterprise_context_ApplicationScoped_ContextInstances.c20(Unknown Source)
        at io.quarkus.arc.generator.Default_jakarta_enterprise_context_ApplicationScoped_ContextInstances.computeIfAbsent(Unknown Source)
        at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:35)
        at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:23)
        at dev.langchain4j.mcp.client.McpClient_hsVtFY5C2fd5CgqaJqo8cfZe1YE_Synthetic_ClientProxy.arc$delegate(Unknown Source)
        at dev.langchain4j.mcp.client.McpClient_hsVtFY5C2fd5CgqaJqo8cfZe1YE_Synthetic_ClientProxy.listTools(Unknown Source)
        at dev.langchain4j.mcp.McpToolProvider.provideTools(McpToolProvider.java:112)
        at io.quarkiverse.langchain4j.mcp.runtime.QuarkusMcpToolProvider.provideTools(QuarkusMcpToolProvider.java:38)
        at dev.langchain4j.service.tool.ToolProvider_sL_YcZTZI2rxkspvkYJxQT2XtaU_Synthetic_ClientProxy.provideTools(Unknown Source)
        at io.quarkiverse.langchain4j.runtime.aiservice.AiServiceMethodImplementationSupport.doImplement(AiServiceMethodImplementationSupport.java:207)
        at io.quarkiverse.langchain4j.runtime.aiservice.AiServiceMethodImplementationSupport.implement(AiServiceMethodImplementationSupport.java:154)
        at org.globex.ai.WriteEmailAgent$$QuarkusImpl.writeEmail(Unknown Source)
        at org.globex.ai.MailResource.lambda$sendEmail$0(MailResource.java:22)
        at io.smallrye.context.impl.wrappers.SlowContextualConsumer.accept(SlowContextualConsumer.java:21)
        at io.smallrye.mutiny.operators.uni.UniOnItemConsume$UniOnItemComsumeProcessor.invokeEventHandler(UniOnItemConsume.java:77)
        at io.smallrye.mutiny.operators.uni.UniOnItemConsume$UniOnItemComsumeProcessor.onItem(UniOnItemConsume.java:42)
        at io.smallrye.mutiny.operators.uni.UniEmitOn$UniEmitOnProcessor.lambda$onItem$0(UniEmitOn.java:34)
        at io.quarkus.vertx.core.runtime.VertxCoreRecorder$15.runWith(VertxCoreRecorder.java:645)
        at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2651)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2630)
        at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1622)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1589)
        at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11)
        at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: The current thread cannot be blocked: vert.x-eventloop-thread-3
        at dev.langchain4j.mcp.client.DefaultMcpClient.initialize(DefaultMcpClient.java:123)
        at dev.langchain4j.mcp.client.DefaultMcpClient.<init>(DefaultMcpClient.java:109)
        at dev.langchain4j.mcp.client.DefaultMcpClient$Builder.build(DefaultMcpClient.java:507)
        at io.quarkiverse.langchain4j.mcp.runtime.McpRecorder$2.get(McpRecorder.java:98)
        at io.quarkiverse.langchain4j.mcp.runtime.McpRecorder$2.get(McpRecorder.java:57)
        at io.quarkus.arc.runtime.ArcRecorder$4.apply(ArcRecorder.java:137)
        at io.quarkus.arc.runtime.ArcRecorder$4.apply(ArcRecorder.java:134)
        at dev.langchain4j.mcp.client.McpClient_hsVtFY5C2fd5CgqaJqo8cfZe1YE_Synthetic_Bean.createSynthetic(Unknown Source)
        ... 32 more
Caused by: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: The current thread cannot be blocked: vert.x-eventloop-thread-3
        at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396)
        at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2096)
        at io.smallrye.context.CompletableFutureWrapper.get(CompletableFutureWrapper.java:161)
        at dev.langchain4j.mcp.client.DefaultMcpClient.initialize(DefaultMcpClient.java:120)
        ... 39 more
Caused by: java.lang.IllegalStateException: The current thread cannot be blocked: vert.x-eventloop-thread-3
        at io.smallrye.mutiny.operators.uni.UniBlockingAwait.await(UniBlockingAwait.java:30)
        at io.smallrye.mutiny.groups.UniAwait.atMost(UniAwait.java:65)
        at io.smallrye.mutiny.groups.UniAwait.indefinitely(UniAwait.java:46)
        at io.quarkiverse.langchain4j.oidc.client.mcp.runtime.OidcClientMcpAuthProvider.getAuthorization(OidcClientMcpAuthProvider.java:23)
        at io.quarkiverse.langchain4j.mcp.runtime.http.QuarkusStreamableHttpMcpTransport.execute(QuarkusStreamableHttpMcpTransport.java:123)
        at io.quarkiverse.langchain4j.mcp.runtime.http.QuarkusStreamableHttpMcpTransport.lambda$initialize$1(QuarkusStreamableHttpMcpTransport.java:75)
        at io.smallrye.context.impl.wrappers.SlowContextualFunction.apply(SlowContextualFunction.java:21)
        at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.performInnerSubscription(UniOnItemTransformToUni.java:68)
        at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:57)
        at io.smallrye.mutiny.operators.uni.builders.UniCreateFromCompletionStage$CompletionStageUniSubscription.forwardResult(UniCreateFromCompletionStage.java:63)
        at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
        at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
        at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
        at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2179)
        at dev.langchain4j.mcp.client.transport.McpOperation.handle(McpOperationHandler.java:42)
        at io.quarkiverse.langchain4j.mcp.runtime.http.QuarkusStreamableHttpMcpTransport.lambda$execute$4(QuarkusStreamableHttpMcpTransport.java:172)
        at io.vertx.core.impl.future.FutureImpl$1.onSuccess(FutureImpl.java:91)
        at io.vertx.core.impl.future.FutureBase.lambda$emitSuccess$0(FutureBase.java:60)
        at io.vertx.core.impl.ContextImpl.execute(ContextImpl.java:312)
        at io.vertx.core.impl.DuplicatedContext.execute(DuplicatedContext.java:168)
        at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:57)
        at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:259)
        at io.vertx.core.http.impl.HttpEventHandler.handleEnd(HttpEventHandler.java:79)
        at io.vertx.core.http.impl.HttpClientResponseImpl.handleEnd(HttpClientResponseImpl.java:250)
        at io.vertx.core.http.impl.Http1xClientConnection$StreamImpl.lambda$new$0(Http1xClientConnection.java:443)
        at io.vertx.core.streams.impl.InboundBuffer.handleEvent(InboundBuffer.java:279)
        at io.vertx.core.streams.impl.InboundBuffer.write(InboundBuffer.java:157)
        at io.vertx.core.http.impl.Http1xClientConnection$StreamImpl.handleEnd(Http1xClientConnection.java:753)
        at io.vertx.core.impl.ContextImpl.execute(ContextImpl.java:327)
        at io.vertx.core.impl.DuplicatedContext.execute(DuplicatedContext.java:158)
        at io.vertx.core.http.impl.Http1xClientConnection.handleResponseEnd(Http1xClientConnection.java:984)
        at io.vertx.core.http.impl.Http1xClientConnection.handleHttpMessage(Http1xClientConnection.java:856)
        at io.vertx.core.http.impl.Http1xClientConnection.handleMessage(Http1xClientConnection.java:818)
        at io.vertx.core.net.impl.ConnectionBase.read(ConnectionBase.java:159)
        at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:153)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
        at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
        at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
        at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1519)
        at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1377)
        at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1428)
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:530)
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1357)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:868)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:796)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:732)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:658)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998)
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        ... 2 more

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/mcpbugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions