Skip to content

Commit be98a64

Browse files
committed
refactor: drop modern naming and dead cleanup
1 parent 9edf2b1 commit be98a64

13 files changed

Lines changed: 67 additions & 82 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ let client = ClientInfo::default()
9494
)
9595
.await?;
9696
97-
// Or probe the modern lifecycle and fall back when a legacy server reports
97+
// Or probe the discover lifecycle and fall back when a legacy server reports
9898
// that server/discover is not implemented.
9999
let client = ClientInfo::default()
100100
.serve_with_lifecycle(
@@ -108,7 +108,7 @@ let client = ClientInfo::default()
108108
```
109109

110110
`ClientLifecycleMode::Initialize` is equivalent to the existing `serve()` behavior.
111-
Modern startup does not send `notifications/initialized`; discovery completes
111+
Discover startup does not send `notifications/initialized`; discovery completes
112112
startup, and each subsequent request carries its protocol version, client
113113
information, and capabilities in `_meta`.
114114

conformance/src/bin/client.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -853,9 +853,9 @@ fn conformance_protocol_version() -> ProtocolVersion {
853853
.unwrap_or(ProtocolVersion::V_2026_07_28)
854854
}
855855

856-
/// Runs draft stateless scenarios through the public modern lifecycle and
856+
/// Runs draft stateless scenarios through the public discover lifecycle and
857857
/// Streamable HTTP transport.
858-
async fn run_modern_client(server_url: &str) -> anyhow::Result<()> {
858+
async fn run_discover_client(server_url: &str) -> anyhow::Result<()> {
859859
let mut preferred_versions = vec![conformance_protocol_version()];
860860
for version in ProtocolVersion::KNOWN_VERSIONS.iter().rev() {
861861
if !preferred_versions.contains(version) {
@@ -922,14 +922,14 @@ async fn main() -> anyhow::Result<()> {
922922
match scenario.as_str() {
923923
// Non-auth scenarios
924924
"initialize" => run_basic_client(&server_url).await?,
925-
"json-schema-ref-no-deref" => run_modern_client(&server_url).await?,
925+
"json-schema-ref-no-deref" => run_discover_client(&server_url).await?,
926926
"tools_call" => run_tools_call_client(&server_url, &ctx).await?,
927927
"elicitation-sep1034-client-defaults" => {
928928
run_elicitation_defaults_client(&server_url).await?
929929
}
930930
"sse-retry" => run_sse_retry_client(&server_url).await?,
931931
"request-metadata" | "sep-2322-client-request-state" => {
932-
run_modern_client(&server_url).await?
932+
run_discover_client(&server_url).await?
933933
}
934934
"http-standard-headers" | "http-custom-headers" | "http-invalid-tool-headers" => {
935935
run_tools_call_client(&server_url, &ctx).await?

crates/rmcp/Cargo.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -303,24 +303,24 @@ required-features = ["server", "client"]
303303
path = "tests/test_protocol_version_negotiation.rs"
304304

305305
[[test]]
306-
name = "test_client_startup_modes"
306+
name = "test_client_lifecycle_modes"
307307
required-features = ["client", "server"]
308-
path = "tests/test_client_startup_modes.rs"
308+
path = "tests/test_client_lifecycle_modes.rs"
309309

310310
[[test]]
311-
name = "test_modern_server_requests"
311+
name = "test_stateless_server_requests"
312312
required-features = ["client", "server"]
313-
path = "tests/test_modern_server_requests.rs"
313+
path = "tests/test_stateless_server_requests.rs"
314314

315315
[[test]]
316-
name = "test_modern_http_client_startup"
316+
name = "test_discover_http_client_startup"
317317
required-features = [
318318
"client",
319319
"reqwest",
320320
"transport-streamable-http-client-reqwest",
321321
"transport-streamable-http-server",
322322
]
323-
path = "tests/test_modern_http_client_startup.rs"
323+
path = "tests/test_discover_http_client_startup.rs"
324324

325325
[[test]]
326326
name = "test_streamable_http_standard_headers"

crates/rmcp/src/model/meta.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ impl RequestMetaObject {
439439
meta
440440
}
441441

442-
/// Create request metadata with the client context required by the modern lifecycle.
442+
/// Create request metadata with the client context SEP-2575 requires on every request.
443443
pub fn with_client_context(
444444
protocol_version: ProtocolVersion,
445445
client_info: Implementation,

crates/rmcp/src/service.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ impl PeerRequestOptions {
577577

578578
/// Adds request metadata while preserving any other configured options.
579579
///
580-
/// Explicit values take precedence over modern-lifecycle metadata defaults.
580+
/// Explicit values take precedence over discover-lifecycle metadata defaults.
581581
pub fn with_meta(mut self, meta: RequestMetaObject) -> Self {
582582
self.meta = Some(meta);
583583
self

crates/rmcp/src/service/client.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ pub enum ClientInitializeError {
6262
server_supported: Vec<ProtocolVersion>,
6363
},
6464

65-
#[error("modern startup requires at least one preferred protocol version")]
65+
#[error("discover startup requires at least one preferred protocol version")]
6666
NoPreferredProtocolVersion,
6767

6868
#[error("Cancelled")]
@@ -325,7 +325,7 @@ where
325325
legacy_startup(&service, &mut transport, &id_provider, &peer, client_info).await?;
326326
}
327327
ClientLifecycleMode::Discover { preferred_versions } => {
328-
modern_startup(
328+
discover_startup(
329329
&service,
330330
&mut transport,
331331
&id_provider,
@@ -339,7 +339,7 @@ where
339339
preferred_versions,
340340
legacy_version,
341341
} => {
342-
let modern_result = modern_startup(
342+
let discover_result = discover_startup(
343343
&service,
344344
&mut transport,
345345
&id_provider,
@@ -348,7 +348,7 @@ where
348348
preferred_versions,
349349
)
350350
.await;
351-
match modern_result {
351+
match discover_result {
352352
Ok(()) => {}
353353
Err(ClientInitializeError::JsonRpcError(error))
354354
if error.code == crate::model::ErrorCode::METHOD_NOT_FOUND =>
@@ -423,7 +423,7 @@ where
423423
Ok(())
424424
}
425425

426-
async fn modern_startup<S, T>(
426+
async fn discover_startup<S, T>(
427427
service: &S,
428428
transport: &mut T,
429429
id_provider: &Arc<AtomicU32RequestIdProvider>,

crates/rmcp/src/service/server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ where
243243
Err(error) => ServerJsonRpcMessage::error(error, Some(id)),
244244
};
245245
transport.send(response).await.map_err(|error| {
246-
ServerInitializeError::transport::<T>(error, "sending modern request response")
246+
ServerInitializeError::transport::<T>(error, "sending negotiated request response")
247247
})?;
248248
return Ok(serve_inner(service, transport, peer, peer_rx, ct));
249249
}

crates/rmcp/src/transport/streamable_http_client.rs

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,30 +1007,15 @@ impl<C: StreamableHttpClient> Worker for StreamableHttpClientWorker<C> {
10071007
);
10081008
if is_fallback_initialize {
10091009
saved_init_request = Some(message.clone());
1010-
streams.abort_all();
1011-
while streams.join_next().await.is_some() {}
1012-
if let Some(cleanup) = session_cleanup_info.take() {
1013-
match tokio::time::timeout(
1014-
SESSION_CLEANUP_TIMEOUT,
1015-
cleanup.client.delete_session(
1016-
cleanup.uri,
1017-
cleanup.session_id,
1018-
cleanup.auth_header,
1019-
cleanup.protocol_headers,
1020-
),
1021-
)
1022-
.await
1023-
{
1024-
Ok(Ok(())) => {}
1025-
Ok(Err(error)) => tracing::debug!(
1026-
"failed to clean up discovery session before legacy fallback: {error}"
1027-
),
1028-
Err(_) => tracing::warn!(
1029-
"discovery session cleanup timed out before legacy fallback"
1030-
),
1031-
}
1032-
}
1033-
session_id = None;
1010+
// Servers do not assign sessions to `server/discover`, so a
1011+
// fallback initialize starts from a clean slate: no session
1012+
// ID, no cleanup state, and no streams to tear down.
1013+
debug_assert!(
1014+
session_id.is_none()
1015+
&& session_cleanup_info.is_none()
1016+
&& streams.is_empty(),
1017+
"discover bootstrap must not create session state"
1018+
);
10341019

10351020
let response = self
10361021
.client

crates/rmcp/tests/test_client_startup_modes.rs renamed to crates/rmcp/tests/test_client_lifecycle_modes.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,42 +12,42 @@ use rmcp::{
1212
};
1313

1414
#[derive(Clone, Default)]
15-
struct ModernClient;
15+
struct DiscoverClient;
1616

17-
impl ClientHandler for ModernClient {}
17+
impl ClientHandler for DiscoverClient {}
1818

1919
#[derive(Clone, Default)]
20-
struct ModernServer;
20+
struct StatelessServer;
2121

22-
impl ServerHandler for ModernServer {}
22+
impl ServerHandler for StatelessServer {}
2323

2424
#[tokio::test]
25-
async fn high_level_server_accepts_modern_startup_without_initialize() {
25+
async fn high_level_server_accepts_discover_startup_without_initialize() {
2626
let (server_transport, client_transport) = tokio::io::duplex(4096);
2727
let server_task = tokio::spawn(async move {
28-
ModernServer
28+
StatelessServer
2929
.serve(server_transport)
3030
.await
3131
.expect("server should accept discover")
3232
});
3333

34-
let client = ModernClient
34+
let client = DiscoverClient
3535
.serve_with_lifecycle(
3636
client_transport,
3737
ClientLifecycleMode::Discover {
3838
preferred_versions: vec![ProtocolVersion::V_2026_07_28],
3939
},
4040
)
4141
.await
42-
.expect("modern client should start");
42+
.expect("discover client should start");
4343
client.list_tools(None).await.expect("list tools");
4444
client.cancel().await.expect("cancel client");
4545
let server = server_task.await.expect("server task");
4646
server.cancel().await.expect("cancel server");
4747
}
4848

4949
#[tokio::test]
50-
async fn modern_startup_discovers_without_initialize() {
50+
async fn discover_startup_omits_initialize() {
5151
let (server_transport, client_transport) = tokio::io::duplex(4096);
5252
let mut server = IntoTransport::<rmcp::RoleServer, _, _>::into_transport(server_transport);
5353
let server_task = tokio::spawn(async move {
@@ -67,7 +67,7 @@ async fn modern_startup_discovers_without_initialize() {
6767
ServerResult::DiscoverResult(DiscoverResult::new(
6868
vec![ProtocolVersion::V_2026_07_28],
6969
ServerCapabilities::default(),
70-
Implementation::new("modern-server", "1.0.0"),
70+
Implementation::new("discover-server", "1.0.0"),
7171
)),
7272
request.id,
7373
))
@@ -100,15 +100,15 @@ async fn modern_startup_discovers_without_initialize() {
100100
.expect("send tools response");
101101
});
102102

103-
let client = ModernClient
103+
let client = DiscoverClient
104104
.serve_with_lifecycle(
105105
client_transport,
106106
ClientLifecycleMode::Discover {
107107
preferred_versions: vec![ProtocolVersion::V_2026_07_28],
108108
},
109109
)
110110
.await
111-
.expect("modern client should start");
111+
.expect("discover client should start");
112112
let mut caller_meta = rmcp::model::RequestMetaObject::new();
113113
caller_meta.insert("example.test/extension".into(), serde_json::json!(7));
114114
caller_meta.set_protocol_version(ProtocolVersion::V_2025_11_25);
@@ -176,7 +176,7 @@ async fn auto_startup_falls_back_after_discover_method_not_found() {
176176
));
177177
});
178178

179-
let client = ModernClient
179+
let client = DiscoverClient
180180
.serve_with_lifecycle(
181181
client_transport,
182182
ClientLifecycleMode::Auto {
@@ -191,7 +191,7 @@ async fn auto_startup_falls_back_after_discover_method_not_found() {
191191
}
192192

193193
#[tokio::test]
194-
async fn modern_startup_retries_a_mutually_supported_version() {
194+
async fn discover_startup_retries_a_mutually_supported_version() {
195195
let unsupported: ProtocolVersion =
196196
serde_json::from_value(serde_json::json!("2099-01-01")).unwrap();
197197
let (server_transport, client_transport) = tokio::io::duplex(4096);
@@ -231,15 +231,15 @@ async fn modern_startup_retries_a_mutually_supported_version() {
231231
ServerResult::DiscoverResult(DiscoverResult::new(
232232
vec![ProtocolVersion::V_2026_07_28],
233233
ServerCapabilities::default(),
234-
Implementation::new("modern-server", "1.0.0"),
234+
Implementation::new("discover-server", "1.0.0"),
235235
)),
236236
second.id,
237237
))
238238
.await
239239
.expect("send discover response");
240240
});
241241

242-
let client = ModernClient
242+
let client = DiscoverClient
243243
.serve_with_lifecycle(
244244
client_transport,
245245
ClientLifecycleMode::Discover {
@@ -250,13 +250,13 @@ async fn modern_startup_retries_a_mutually_supported_version() {
250250
},
251251
)
252252
.await
253-
.expect("modern client should retry");
253+
.expect("discover client should retry");
254254
client.cancel().await.expect("cancel client");
255255
server_task.await.expect("server task");
256256
}
257257

258258
#[tokio::test]
259-
async fn modern_startup_retries_current_version_once_when_server_reports_it_supported() {
259+
async fn discover_startup_retries_current_version_once_when_server_reports_it_supported() {
260260
let (server_transport, client_transport) = tokio::io::duplex(4096);
261261
let mut server = IntoTransport::<rmcp::RoleServer, _, _>::into_transport(server_transport);
262262
let server_task = tokio::spawn(async move {
@@ -290,23 +290,23 @@ async fn modern_startup_retries_current_version_once_when_server_reports_it_supp
290290
ServerResult::DiscoverResult(DiscoverResult::new(
291291
vec![ProtocolVersion::V_2026_07_28],
292292
ServerCapabilities::default(),
293-
Implementation::new("modern-server", "1.0.0"),
293+
Implementation::new("discover-server", "1.0.0"),
294294
)),
295295
second.id,
296296
))
297297
.await
298298
.expect("send discover response");
299299
});
300300

301-
let client = ModernClient
301+
let client = DiscoverClient
302302
.serve_with_lifecycle(
303303
client_transport,
304304
ClientLifecycleMode::Discover {
305305
preferred_versions: vec![ProtocolVersion::V_2026_07_28],
306306
},
307307
)
308308
.await
309-
.expect("modern client should retry once");
309+
.expect("discover client should retry once");
310310
client.cancel().await.expect("cancel client");
311311
server_task.await.expect("server task");
312312
}

crates/rmcp/tests/test_modern_http_client_startup.rs renamed to crates/rmcp/tests/test_discover_http_client_startup.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ use rmcp::{
2222
use tokio_util::sync::CancellationToken;
2323

2424
#[derive(Clone, Default)]
25-
struct ModernHttpServer;
25+
struct DiscoverHttpServer;
2626

27-
impl ServerHandler for ModernHttpServer {
27+
impl ServerHandler for DiscoverHttpServer {
2828
fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]> {
2929
Cow::Borrowed(&[ProtocolVersion::V_2026_07_28])
3030
}
@@ -47,11 +47,11 @@ impl ServerHandler for LegacyHttpServer {
4747
}
4848

4949
#[tokio::test]
50-
async fn modern_http_client_bootstraps_headers_without_initialize() {
50+
async fn discover_http_client_bootstraps_headers_without_initialize() {
5151
let ct = CancellationToken::new();
52-
let service: StreamableHttpService<ModernHttpServer, LocalSessionManager> =
52+
let service: StreamableHttpService<DiscoverHttpServer, LocalSessionManager> =
5353
StreamableHttpService::new(
54-
|| Ok(ModernHttpServer),
54+
|| Ok(DiscoverHttpServer),
5555
Default::default(),
5656
StreamableHttpServerConfig::default()
5757
.with_stateful_mode(false)
@@ -83,7 +83,7 @@ async fn modern_http_client_bootstraps_headers_without_initialize() {
8383
},
8484
)
8585
.await
86-
.expect("modern HTTP client should start");
86+
.expect("discover HTTP client should start");
8787
client.list_tools(None).await.expect("list tools");
8888
client.cancel().await.expect("cancel client");
8989

0 commit comments

Comments
 (0)