Return void from McpStatelessSyncServer#closeGracefully instead of Mono (#1019)

Co-authored-by: Dariusz Jędrzejczyk <2554306+chemicL@users.noreply.github.com>
Signed-off-by: Christian Tzolov <christian.tzolov@broadcom.com>
This commit is contained in:
Christian Tzolov 2026-06-11 12:02:44 +02:00 • committed by GitHub
commit c42d313975
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 18 additions and 7 deletions

View file

@ -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<Void>`. 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.

View file

@ -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<Void> closeGracefully() {
return this.asyncServer.closeGracefully();
public void closeGracefully() {
this.asyncServer.closeGracefully().block();
}
/**

View file

@ -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();
}
}