diff --git a/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxSseServerTransportProvider.java b/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxSseServerTransportProvider.java index 62264d9a..0f025bcc 100644 --- a/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxSseServerTransportProvider.java +++ b/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxSseServerTransportProvider.java @@ -370,11 +370,6 @@ public Mono closeGracefully() { return Mono.fromRunnable(sink::complete); } - @Override - public void close() { - sink.complete(); - } - } public static Builder builder() { diff --git a/mcp-spring/mcp-spring-webflux/src/test/java/io/modelcontextprotocol/WebFluxSseIntegrationTests.java b/mcp-spring/mcp-spring-webflux/src/test/java/io/modelcontextprotocol/WebFluxSseIntegrationTests.java index 660f814d..cb3fb9ea 100644 --- a/mcp-spring/mcp-spring-webflux/src/test/java/io/modelcontextprotocol/WebFluxSseIntegrationTests.java +++ b/mcp-spring/mcp-spring-webflux/src/test/java/io/modelcontextprotocol/WebFluxSseIntegrationTests.java @@ -121,7 +121,7 @@ void testCreateMessageWithoutSamplingCapabilities(String clientType) { .hasMessage("Client must be configured with sampling capabilities"); } } - server.close(); + server.closeGracefully().block(); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -189,7 +189,7 @@ void testCreateMessageSuccess(String clientType) { assertThat(result.stopReason()).isEqualTo(CreateMessageResult.StopReason.STOP_SEQUENCE); }); } - mcpServer.closeGracefully().block(); + mcpServer.closeGracefully(); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -267,7 +267,7 @@ void testCreateMessageWithRequestTimeoutSuccess(String clientType) throws Interr }); } - mcpServer.closeGracefully().block(); + mcpServer.closeGracefully(); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -326,7 +326,7 @@ void testCreateMessageWithRequestTimeoutFail(String clientType) throws Interrupt } - mcpServer.closeGracefully().block(); + mcpServer.closeGracefully(); } // --------------------------------------- @@ -376,7 +376,7 @@ void testRootsSuccess(String clientType) { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -410,7 +410,7 @@ void testRootsWithoutCapability(String clientType) { } } - mcpServer.close(); + mcpServer.closeGracefully(); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -437,7 +437,7 @@ void testRootsNotificationWithEmptyRootsList(String clientType) { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -471,7 +471,7 @@ void testRootsWithMultipleHandlers(String clientType) { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -502,7 +502,7 @@ void testRootsServerCloseWithActiveSubscription(String clientType) { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } // --------------------------------------- @@ -554,7 +554,7 @@ void testToolCallSuccess(String clientType) { assertThat(response).isEqualTo(callResponse); } - mcpServer.close(); + mcpServer.closeGracefully(); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -626,7 +626,7 @@ void testToolListChangeHandlingSuccess(String clientType) { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -642,7 +642,7 @@ void testInitialize(String clientType) { assertThat(initResult).isNotNull(); } - mcpServer.close(); + mcpServer.closeGracefully(); } // --------------------------------------- @@ -750,7 +750,7 @@ void testLoggingNotification(String clientType) { assertThat(notificationMap.get("Another error message").data()).isEqualTo("Another error message"); }); } - mcpServer.close(); + mcpServer.closeGracefully(); } // --------------------------------------- @@ -799,7 +799,7 @@ void testCompletionShouldReturnExpectedSuggestions(String clientType) { assertThat(samplingRequest.get().ref().type()).isEqualTo("ref/prompt"); } - mcpServer.close(); + mcpServer.closeGracefully(); } } \ No newline at end of file diff --git a/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java b/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java index fc86cfaa..d908d9d8 100644 --- a/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java +++ b/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java @@ -401,20 +401,6 @@ public Mono closeGracefully() { }); } - /** - * Closes the transport immediately. - */ - @Override - public void close() { - try { - sseBuilder.complete(); - logger.debug("Successfully completed SSE builder for session {}", sessionId); - } - catch (Exception e) { - logger.warn("Failed to complete SSE builder for session {}: {}", sessionId, e.getMessage()); - } - } - } } diff --git a/mcp-spring/mcp-spring-webmvc/src/test/java/io/modelcontextprotocol/server/WebMvcSseIntegrationTests.java b/mcp-spring/mcp-spring-webmvc/src/test/java/io/modelcontextprotocol/server/WebMvcSseIntegrationTests.java index b12d6843..2b9c941b 100644 --- a/mcp-spring/mcp-spring-webmvc/src/test/java/io/modelcontextprotocol/server/WebMvcSseIntegrationTests.java +++ b/mcp-spring/mcp-spring-webmvc/src/test/java/io/modelcontextprotocol/server/WebMvcSseIntegrationTests.java @@ -149,7 +149,7 @@ void testCreateMessageWithoutSamplingCapabilities() { .hasMessage("Client must be configured with sampling capabilities"); } } - server.close(); + server.closeGracefully().block(); } @Test @@ -211,7 +211,7 @@ void testCreateMessageSuccess() { assertThat(response).isNotNull().isEqualTo(callResponse); } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -283,7 +283,7 @@ void testCreateMessageWithRequestTimeoutSuccess() throws InterruptedException { assertThat(response).isEqualTo(callResponse); mcpClient.close(); - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -354,7 +354,7 @@ void testCreateMessageWithRequestTimeoutFail() throws InterruptedException { }).withMessageContaining("Timeout"); mcpClient.close(); - mcpServer.close(); + mcpServer.closeGracefully(); } // --------------------------------------- @@ -401,7 +401,7 @@ void testRootsSuccess() { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -434,7 +434,7 @@ void testRootsWithoutCapability() { } } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -459,7 +459,7 @@ void testRootsNotificationWithEmptyRootsList() { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -488,7 +488,7 @@ void testRootsWithMultipleHandlers() { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -515,7 +515,7 @@ void testRootsServerCloseWithActiveSubscription() { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } // --------------------------------------- @@ -563,7 +563,7 @@ void testToolCallSuccess() { assertThat(response).isNotNull().isEqualTo(callResponse); } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -632,7 +632,7 @@ void testToolListChangeHandlingSuccess() { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -646,7 +646,7 @@ void testInitialize() { assertThat(initResult).isNotNull(); } - mcpServer.close(); + mcpServer.closeGracefully(); } } diff --git a/mcp-test/src/main/java/io/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java b/mcp-test/src/main/java/io/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java index cdd43e7e..0bfb5fa7 100644 --- a/mcp-test/src/main/java/io/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java +++ b/mcp-test/src/main/java/io/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java @@ -87,7 +87,7 @@ void testGracefulShutdown() { void testImmediateClose() { var mcpAsyncServer = McpServer.async(createMcpTransportProvider()).serverInfo("test-server", "1.0.0").build(); - assertThatCode(() -> mcpAsyncServer.close()).doesNotThrowAnyException(); + assertThatCode(() -> mcpAsyncServer.closeGracefully().block()).doesNotThrowAnyException(); } // --------------------------------------- diff --git a/mcp-test/src/main/java/io/modelcontextprotocol/server/AbstractMcpSyncServerTests.java b/mcp-test/src/main/java/io/modelcontextprotocol/server/AbstractMcpSyncServerTests.java index c81e638c..68b71804 100644 --- a/mcp-test/src/main/java/io/modelcontextprotocol/server/AbstractMcpSyncServerTests.java +++ b/mcp-test/src/main/java/io/modelcontextprotocol/server/AbstractMcpSyncServerTests.java @@ -84,7 +84,7 @@ void testGracefulShutdown() { void testImmediateClose() { var mcpSyncServer = McpServer.sync(createMcpTransportProvider()).serverInfo("test-server", "1.0.0").build(); - assertThatCode(() -> mcpSyncServer.close()).doesNotThrowAnyException(); + assertThatCode(() -> mcpSyncServer.closeGracefully()).doesNotThrowAnyException(); } @Test diff --git a/mcp/src/main/java/io/modelcontextprotocol/client/McpAsyncClient.java b/mcp/src/main/java/io/modelcontextprotocol/client/McpAsyncClient.java index 2bc74f25..fc8dc83c 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/client/McpAsyncClient.java +++ b/mcp/src/main/java/io/modelcontextprotocol/client/McpAsyncClient.java @@ -287,13 +287,6 @@ public McpSchema.Implementation getClientInfo() { return this.clientInfo; } - /** - * Closes the client connection immediately. - */ - public void close() { - this.mcpSession.close(); - } - /** * Gracefully closes the client connection. * @return A Mono that completes when the connection is closed diff --git a/mcp/src/main/java/io/modelcontextprotocol/client/McpSyncClient.java b/mcp/src/main/java/io/modelcontextprotocol/client/McpSyncClient.java index c91638a7..53074e21 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/client/McpSyncClient.java +++ b/mcp/src/main/java/io/modelcontextprotocol/client/McpSyncClient.java @@ -115,7 +115,7 @@ public McpSchema.Implementation getClientInfo() { @Override public void close() { - this.delegate.close(); + this.closeGracefully(); } public boolean closeGracefully() { diff --git a/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java b/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java index 906cb9a0..6326e713 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java +++ b/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java @@ -120,13 +120,6 @@ public Mono closeGracefully() { return this.delegate.closeGracefully(); } - /** - * Close the server immediately. - */ - public void close() { - this.delegate.close(); - } - // --------------------------------------- // Tool Management // --------------------------------------- @@ -390,11 +383,6 @@ public Mono closeGracefully() { return this.mcpTransportProvider.closeGracefully(); } - @Override - public void close() { - this.mcpTransportProvider.close(); - } - private McpServerSession.NotificationHandler asyncRootsListChangedNotificationHandler( List, Mono>> rootsChangeConsumers) { return (exchange, params) -> exchange.listRoots() diff --git a/mcp/src/main/java/io/modelcontextprotocol/server/McpSyncServer.java b/mcp/src/main/java/io/modelcontextprotocol/server/McpSyncServer.java index bf310450..c0fdd126 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/server/McpSyncServer.java +++ b/mcp/src/main/java/io/modelcontextprotocol/server/McpSyncServer.java @@ -170,13 +170,6 @@ public void closeGracefully() { this.asyncServer.closeGracefully().block(); } - /** - * Close the server immediately. - */ - public void close() { - this.asyncServer.close(); - } - /** * Get the underlying async server instance. * @return The wrapped async server diff --git a/mcp/src/main/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProvider.java b/mcp/src/main/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProvider.java index afdbff47..ad95573c 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProvider.java +++ b/mcp/src/main/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProvider.java @@ -433,21 +433,6 @@ public Mono closeGracefully() { }); } - /** - * Closes the transport immediately. - */ - @Override - public void close() { - try { - sessions.remove(sessionId); - asyncContext.complete(); - logger.debug("Successfully completed async context for session {}", sessionId); - } - catch (Exception e) { - logger.warn("Failed to complete async context for session {}: {}", sessionId, e.getMessage()); - } - } - } /** diff --git a/mcp/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java b/mcp/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java index 819da977..a9273594 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java +++ b/mcp/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java @@ -173,12 +173,6 @@ public Mono closeGracefully() { }); } - @Override - public void close() { - isClosing.set(true); - logger.debug("Session transport closed"); - } - private void initProcessing() { handleIncomingMessages(); startInboundProcessing(); @@ -239,7 +233,7 @@ private void startInboundProcessing() { finally { isClosing.set(true); if (session != null) { - session.close(); + session.closeGracefully().block(); } inboundSink.tryEmitComplete(); } diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/AsyncCloseable.java b/mcp/src/main/java/io/modelcontextprotocol/spec/AsyncCloseable.java new file mode 100644 index 00000000..04aa0270 --- /dev/null +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/AsyncCloseable.java @@ -0,0 +1,16 @@ +package io.modelcontextprotocol.spec; + +import reactor.core.publisher.Mono; + +/** + * Interface for close operations that are asynchronous. + */ +public interface AsyncCloseable { + + /** + * Begins the process of closing the resource gracefully. + * @return A {@link Mono} that completes when the resource has been closed. + */ + Mono closeGracefully(); + +} diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/McpClientSession.java b/mcp/src/main/java/io/modelcontextprotocol/spec/McpClientSession.java index c1f42e3f..6feab4a5 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/spec/McpClientSession.java +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/McpClientSession.java @@ -277,13 +277,4 @@ public Mono closeGracefully() { }); } - /** - * Closes the session immediately, potentially interrupting pending operations. - */ - @Override - public void close() { - this.connection.dispose(); - transport.close(); - } - } diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java b/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java index 46c356cd..218dbd5b 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java @@ -272,11 +272,6 @@ public Mono closeGracefully() { return this.transport.closeGracefully(); } - @Override - public void close() { - this.transport.close(); - } - /** * Request handler for the initialization request. */ diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProvider.java b/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProvider.java index 5fdbd7ab..95604f39 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProvider.java +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProvider.java @@ -29,7 +29,7 @@ * * @author Dariusz Jędrzejczyk */ -public interface McpServerTransportProvider { +public interface McpServerTransportProvider extends AsyncCloseable { /** * Sets the session factory that will be used to create sessions for new clients. An @@ -48,19 +48,12 @@ public interface McpServerTransportProvider { */ Mono notifyClients(String method, Object params); - /** - * Immediately closes all the transports with connected clients and releases any - * associated resources. - */ - default void close() { - this.closeGracefully().subscribe(); - } - /** * Gracefully closes all the transports with connected clients and releases any * associated resources asynchronously. * @return a {@link Mono} that completes when the connections have been closed. */ + @Override Mono closeGracefully(); } diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/McpSession.java b/mcp/src/main/java/io/modelcontextprotocol/spec/McpSession.java index 473a860c..89103c96 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/spec/McpSession.java +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/McpSession.java @@ -23,7 +23,7 @@ * @author Christian Tzolov * @author Dariusz Jędrzejczyk */ -public interface McpSession { +public interface McpSession extends AsyncCloseable { /** * Sends a request to the model counterparty and expects a response of type T. @@ -72,11 +72,7 @@ default Mono sendNotification(String method) { * Closes the session and releases any associated resources asynchronously. * @return a {@link Mono} that completes when the session has been closed. */ + @Override Mono closeGracefully(); - /** - * Closes the session and releases any associated resources. - */ - void close(); - } diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/McpTransport.java b/mcp/src/main/java/io/modelcontextprotocol/spec/McpTransport.java index 40d9ba7a..a60dac67 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/spec/McpTransport.java +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/McpTransport.java @@ -35,25 +35,14 @@ * @author Christian Tzolov * @author Dariusz Jędrzejczyk */ -public interface McpTransport { - - /** - * Closes the transport connection and releases any associated resources. - * - *

- * This method ensures proper cleanup of resources when the transport is no longer - * needed. It should handle the graceful shutdown of any active connections. - *

- */ - default void close() { - this.closeGracefully().subscribe(); - } +public interface McpTransport extends AsyncCloseable { /** * Closes the transport connection and releases any associated resources * asynchronously. * @return a {@link Mono} that completes when the connection has been closed. */ + @Override Mono closeGracefully(); /** diff --git a/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java b/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java index df0b0c72..b80121d0 100644 --- a/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java +++ b/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java @@ -86,7 +86,7 @@ void testGracefulShutdown() { void testImmediateClose() { var mcpAsyncServer = McpServer.async(createMcpTransportProvider()).serverInfo("test-server", "1.0.0").build(); - assertThatCode(() -> mcpAsyncServer.close()).doesNotThrowAnyException(); + assertThatCode(() -> mcpAsyncServer.closeGracefully().block()).doesNotThrowAnyException(); } // --------------------------------------- diff --git a/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpSyncServerTests.java b/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpSyncServerTests.java index 0b38da85..c00753c5 100644 --- a/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpSyncServerTests.java +++ b/mcp/src/test/java/io/modelcontextprotocol/server/AbstractMcpSyncServerTests.java @@ -83,7 +83,7 @@ void testGracefulShutdown() { void testImmediateClose() { var mcpSyncServer = McpServer.sync(createMcpTransportProvider()).serverInfo("test-server", "1.0.0").build(); - assertThatCode(() -> mcpSyncServer.close()).doesNotThrowAnyException(); + assertThatCode(() -> mcpSyncServer.closeGracefully()).doesNotThrowAnyException(); } @Test diff --git a/mcp/src/test/java/io/modelcontextprotocol/server/transport/HttpServletSseServerCustomContextPathTests.java b/mcp/src/test/java/io/modelcontextprotocol/server/transport/HttpServletSseServerCustomContextPathTests.java index 2cd62889..3cfc078b 100644 --- a/mcp/src/test/java/io/modelcontextprotocol/server/transport/HttpServletSseServerCustomContextPathTests.java +++ b/mcp/src/test/java/io/modelcontextprotocol/server/transport/HttpServletSseServerCustomContextPathTests.java @@ -84,7 +84,7 @@ void testCustomContextPath() { assertThat(client.initialize()).isNotNull(); } - server.close(); + server.closeGracefully().block(); } } diff --git a/mcp/src/test/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProviderIntegrationTests.java b/mcp/src/test/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProviderIntegrationTests.java index 2ff6325a..0a6dec17 100644 --- a/mcp/src/test/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProviderIntegrationTests.java +++ b/mcp/src/test/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProviderIntegrationTests.java @@ -132,7 +132,7 @@ void testCreateMessageWithoutSamplingCapabilities() { .hasMessage("Client must be configured with sampling capabilities"); } } - server.close(); + server.closeGracefully().block(); } @Test @@ -193,7 +193,7 @@ void testCreateMessageSuccess() { assertThat(response).isNotNull(); assertThat(response).isEqualTo(callResponse); } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -265,7 +265,7 @@ void testCreateMessageWithRequestTimeoutSuccess() throws InterruptedException { assertThat(response).isEqualTo(callResponse); mcpClient.close(); - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -336,7 +336,7 @@ void testCreateMessageWithRequestTimeoutFail() throws InterruptedException { }).withMessageContaining("Timeout"); mcpClient.close(); - mcpServer.close(); + mcpServer.closeGracefully(); } // --------------------------------------- @@ -382,7 +382,7 @@ void testRootsSuccess() { assertThat(rootsRef.get()).containsAll(List.of(roots.get(1), root3)); }); - mcpServer.close(); + mcpServer.closeGracefully(); } } @@ -413,7 +413,7 @@ void testRootsWithoutCapability() { } } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -438,7 +438,7 @@ void testRootsNotificationWithEmptyRootsList() { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -467,7 +467,7 @@ void testRootsWithMultipleHandlers() { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -494,7 +494,7 @@ void testRootsServerCloseWithActiveSubscription() { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } // --------------------------------------- @@ -542,7 +542,7 @@ void testToolCallSuccess() { assertThat(response).isEqualTo(callResponse); } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -611,7 +611,7 @@ void testToolListChangeHandlingSuccess() { }); } - mcpServer.close(); + mcpServer.closeGracefully(); } @Test @@ -624,7 +624,7 @@ void testInitialize() { assertThat(initResult).isNotNull(); } - mcpServer.close(); + mcpServer.closeGracefully(); } // --------------------------------------- @@ -742,7 +742,7 @@ void testLoggingNotification() { assertThat(notificationMap.get("Another error message").data()).isEqualTo("Another error message"); }); } - mcpServer.close(); + mcpServer.closeGracefully(); } } diff --git a/mcp/src/test/java/io/modelcontextprotocol/server/transport/StdioServerTransportProviderTests.java b/mcp/src/test/java/io/modelcontextprotocol/server/transport/StdioServerTransportProviderTests.java index 14987b5a..50c1a26b 100644 --- a/mcp/src/test/java/io/modelcontextprotocol/server/transport/StdioServerTransportProviderTests.java +++ b/mcp/src/test/java/io/modelcontextprotocol/server/transport/StdioServerTransportProviderTests.java @@ -218,7 +218,7 @@ void shouldHandleSessionClose() throws Exception { transportProvider.setSessionFactory(sessionFactory); // Close the transport provider - transportProvider.close(); + transportProvider.closeGracefully().block(); // Verify session was closed verify(mockSession).closeGracefully(); diff --git a/mcp/src/test/java/io/modelcontextprotocol/spec/McpClientSessionTests.java b/mcp/src/test/java/io/modelcontextprotocol/spec/McpClientSessionTests.java index f72be43e..dcf7b397 100644 --- a/mcp/src/test/java/io/modelcontextprotocol/spec/McpClientSessionTests.java +++ b/mcp/src/test/java/io/modelcontextprotocol/spec/McpClientSessionTests.java @@ -53,7 +53,7 @@ void setUp() { @AfterEach void tearDown() { if (session != null) { - session.close(); + session.closeGracefully().block(); } }