From c42d313975d4ef689038d950a68b23ec47746dc8 Mon Sep 17 00:00:00 2001 From: Christian Tzolov <1351573+tzolov@users.noreply.github.com> Date: Thu, 11 Jun 2026 12:02:44 +0200 Subject: [PATCH] Return void from McpStatelessSyncServer#closeGracefully instead of Mono (#1019) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Dariusz Jędrzejczyk <2554306+chemicL@users.noreply.github.com> Signed-off-by: Christian Tzolov --- MIGRATION-2.0.md | 13 +++++++++++++ .../server/McpStatelessSyncServer.java | 6 +++--- .../AbstractStatelessIntegrationTests.java | 6 ++---- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/MIGRATION-2.0.md b/MIGRATION-2.0.md index 70768f2..b67605b 100644 --- a/MIGRATION-2.0.md +++ b/MIGRATION-2.0.md @@ -9,6 +9,7 @@ The changes fall into these areas: - [JSON serialization behaviour](#json-serialization-behaviour) — wire-format changes. - [Server-side validation](#server-side-validation) — runtime validation of tool arguments and embedded schemas. - [Transport changes](#transport-changes) — removed methods and the SSE deprecation. +- [Server API changes](#server-api-changes) — sync server method signature corrections. - [New features](#new-features) — additive, backward-compatible capabilities. --- @@ -220,6 +221,18 @@ The HTTP+SSE client and server transports (and their supporting validator/except --- +## Server API changes + +### `McpStatelessSyncServer#closeGracefully` returns `void` + +In 1.x, `McpStatelessSyncServer.closeGracefully()` accidentally leaked the reactive signature from the underlying async server and returned `Mono`. The sync API is intentionally blocking, so returning a `Mono` was an oversight — callers had to call `.block()` themselves to get any actual shutdown behaviour. + +In 2.0 the return type is corrected to `void`; the blocking call is performed internally. + +**Action:** Remove any `.block()` (or `.subscribe()`) call you had appended to `closeGracefully()`. The method now blocks until the server has shut down and returns normally. + +--- + ## New features These are additive and backward-compatible. diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/server/McpStatelessSyncServer.java b/mcp-core/src/main/java/io/modelcontextprotocol/server/McpStatelessSyncServer.java index 6849eb8..475f88d 100644 --- a/mcp-core/src/main/java/io/modelcontextprotocol/server/McpStatelessSyncServer.java +++ b/mcp-core/src/main/java/io/modelcontextprotocol/server/McpStatelessSyncServer.java @@ -50,10 +50,10 @@ public class McpStatelessSyncServer { /** * Gracefully closes the server, allowing any in-progress operations to complete. - * @return A Mono that completes when the server has been closed + * */ - public Mono closeGracefully() { - return this.asyncServer.closeGracefully(); + public void closeGracefully() { + this.asyncServer.closeGracefully().block(); } /** diff --git a/mcp-test/src/main/java/io/modelcontextprotocol/AbstractStatelessIntegrationTests.java b/mcp-test/src/main/java/io/modelcontextprotocol/AbstractStatelessIntegrationTests.java index 16e3e91..04387bd 100644 --- a/mcp-test/src/main/java/io/modelcontextprotocol/AbstractStatelessIntegrationTests.java +++ b/mcp-test/src/main/java/io/modelcontextprotocol/AbstractStatelessIntegrationTests.java @@ -4,8 +4,6 @@ package io.modelcontextprotocol; -import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA; - import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; @@ -31,9 +29,9 @@ import io.modelcontextprotocol.spec.McpSchema.Tool; import net.javacrumbs.jsonunit.core.Option; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.ValueSource; import reactor.core.publisher.Mono; +import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA; import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; import static net.javacrumbs.jsonunit.assertj.JsonAssertions.json; import static org.assertj.core.api.Assertions.assertThat; @@ -128,7 +126,7 @@ public abstract class AbstractStatelessIntegrationTests { assertThat(response).isNotNull().isEqualTo(callResponse); } finally { - mcpServer.closeGracefully().block(); + mcpServer.closeGracefully(); } }