Skip to content

MCP not working if context path not root #898

@lpena-dvelop

Description

@lpena-dvelop

When using MCP tool like search-fhir-resources with a docker instance not in root (for example SERVER_SERVLET_CONTEXT_PATH: "/testhapi" in docker compose) the execution of the tools retruns error.

Image

2025-12-01 08:46:09.387 | 2025-12-01T11:46:09.372Z ERROR 1 --- [nio-8080-exec-3] c.u.f.r.s.i.ExceptionHandlingInterceptor : Failure during REST processing: java.lang.StringIndexOutOfBoundsException: begin 9, end 8, length 8 2025-12-01 08:46:09.387 | 2025-12-01 08:46:09.387 | java.lang.StringIndexOutOfBoundsException: begin 9, end 8, length 8 2025-12-01 08:46:09.387 | at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4606) 2025-12-01 08:46:09.387 | at java.base/java.lang.String.substring(String.java:2709) 2025-12-01 08:46:09.387 | at java.base/java.lang.String.substring(String.java:2682) 2025-12-01 08:46:09.387 | at ca.uhn.fhir.rest.server.RestfulServer.getRequestPath(RestfulServer.java:848) 2025-12-01 08:46:09.387 | at ca.uhn.fhir.rest.server.RestfulServer.handleRequest(RestfulServer.java:1124) 2025-12-01 08:46:09.387 | at ca.uhn.fhir.rest.server.McpFhirBridge.getToolResult(McpFhirBridge.java:82) 2025-12-01 08:46:09.387 | at ca.uhn.fhir.rest.server.McpFhirBridge.lambda$generateTools$5(McpFhirBridge.java:57) 2025-12-01 08:46:09.387 | at io.modelcontextprotocol.server.McpServerFeatures$AsyncToolSpecification.lambda$fromSync$3(McpServerFeatures.java:255) 2025-12-01 08:46:09.387 | at reactor.core.publisher.MonoCallable$MonoCallableSubscription.request(MonoCallable.java:137) 2025-12-01 08:46:09.387 | at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171) 2025-12-01 08:46:09.387 | at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2366) 2025-12-01 08:46:09.387 | at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onSubscribe(FluxOnErrorResume.java:74) 2025-12-01 08:46:09.387 | at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:96) 2025-12-01 08:46:09.387 | at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:48) 2025-12-01 08:46:09.387 | at reactor.core.publisher.Mono.subscribe(Mono.java:4576) 2025-12-01 08:46:09.387 | at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:265) 2025-12-01 08:46:09.387 | at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51) 2025-12-01 08:46:09.387 | at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55) 2025-12-01 08:46:09.387 | at reactor.core.publisher.Mono.subscribe(Mono.java:4576) 2025-12-01 08:46:09.387 | at reactor.core.publisher.Mono.block(Mono.java:1778) 2025-12-01 08:46:09.387 | at io.modelcontextprotocol.server.transport.HttpServletStreamableServerTransportProvider.doPost(HttpServletStreamableServerTransportProvider.java:487) 2025-12-01 08:46:09.387 | at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) 2025-12-01 08:46:09.387 | at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) 2025-12-01 08:46:09.387 | at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) 2025-12-01 08:46:09.387 | at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) 2025-12-01 08:46:09.387 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) 2025-12-01 08:46:09.387 | at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) 2025-12-01 08:46:09.387 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) 2025-12-01 08:46:09.387 | at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116) 2025-12-01 08:46:09.387 | at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) 2025-12-01 08:46:09.387 | at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 2025-12-01 08:46:09.387 | at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) 2025-12-01 08:46:09.387 | at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398) 2025-12-01 08:46:09.387 | at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) 2025-12-01 08:46:09.387 | at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) 2025-12-01 08:46:09.387 | at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) 2025-12-01 08:46:09.387 | at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) 2025-12-01 08:46:09.387 | at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189) 2025-12-01 08:46:09.387 | at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) 2025-12-01 08:46:09.387 | at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) 2025-12-01 08:46:09.387 | at java.base/java.lang.Thread.run(Thread.java:840) 2025-12-01 08:46:09.387 | 2025-12-01 08:46:09.399 | 2025-12-01T11:46:09.399Z INFO 1 --- [nio-8080-exec-3] fhirtest.access : ERROR - GET http://localhost/Patient

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