Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
721 changes: 222 additions & 499 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ base64 = "0.22"
axum = "0.8"
rustls = "0.23"
tokio-rustls = "0.26"
axum-server = { version = "0.7" }
axum-server = { version = "0.8" }
reqwest = { version = "0.12", default-features = false, features = [
"stream",
"rustls-tls",
Expand Down
4 changes: 2 additions & 2 deletions crates/rust-mcp-sdk/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ thiserror = { workspace = true }
axum = { workspace = true, optional = true }
uuid = { workspace = true, features = ["v4"] }
tokio-stream = { workspace = true, optional = true }
axum-server = { version = "0.7", features = [], optional = true }
axum-server = { version = "0.8", features = [], optional = true }
tracing.workspace = true
base64.workspace = true
bytes.workspace = true
Expand All @@ -49,7 +49,7 @@ reqwest = { workspace = true, default-features = false, features = [
time = {version="0.3.0", features = ["formatting", "local-offset"]}

[dev-dependencies]
wiremock = "0.5"
wiremock = "0.6"
tempfile = "3.23.0"
colored = "3.0.0"
reqwest = {workspace = true, features = [ "json"]}
Expand Down
3 changes: 2 additions & 1 deletion crates/rust-mcp-sdk/src/hyper_servers/hyper_runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,14 @@ use rust_mcp_schema::{
TaskStatusNotificationParams,
};
use rust_mcp_transport::SessionId;
use std::net::SocketAddr;
use std::{sync::Arc, time::Duration};
use tokio::task::JoinHandle;

pub struct HyperRuntime {
pub(crate) state: Arc<McpAppState>,
pub(crate) server_task: JoinHandle<Result<(), TransportServerError>>,
pub(crate) server_handle: Handle,
pub(crate) server_handle: Handle<SocketAddr>,
}

impl HyperRuntime {
Expand Down
6 changes: 3 additions & 3 deletions crates/rust-mcp-sdk/src/hyper_servers/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ pub struct HyperServer {
app: Router,
state: Arc<McpAppState>,
pub(crate) options: HyperServerOptions,
handle: Handle,
handle: Handle<SocketAddr>,
}

impl HyperServer {
Expand Down Expand Up @@ -489,7 +489,7 @@ impl HyperServer {
}

/// Returns server handle that could be used for graceful shutdown
pub fn server_handle(&self) -> Handle {
pub fn server_handle(&self) -> Handle<SocketAddr> {
self.handle.clone()
}

Expand Down Expand Up @@ -541,7 +541,7 @@ impl HyperServer {
}

// Shutdown signal handler
async fn shutdown_signal(handle: Handle, state: Arc<McpAppState>) {
async fn shutdown_signal(handle: Handle<SocketAddr>, state: Arc<McpAppState>) {
// Wait for a Ctrl+C or SIGTERM signal
let ctrl_c = async {
signal::ctrl_c()
Expand Down
20 changes: 12 additions & 8 deletions crates/rust-mcp-sdk/tests/test_streamable_http_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ use rust_mcp_sdk::{
use serde_json::{json, Map, Value};
use std::{collections::HashMap, str::FromStr, sync::Arc, time::Duration};
use wiremock::{
http::{HeaderName, HeaderValue},
http::HeaderName,
matchers::{body_json_string, header, method, path},
Mock, MockServer, ResponseTemplate,
};
Expand Down Expand Up @@ -70,10 +70,12 @@ async fn should_send_json_rpc_messages_via_post() {
let header_values = received_request
.headers
.get(&HeaderName::from_str("accept").unwrap())
.unwrap()
.to_str()
.unwrap();

assert!(header_values.contains(&HeaderValue::from_str("application/json").unwrap()));
assert!(header_values.contains(&HeaderValue::from_str("text/event-stream").unwrap()));
assert!(header_values.contains("application/json"));
assert!(header_values.contains("text/event-stream"));

wait_for_n_requests(&mock_server, 2, None).await;
}
Expand Down Expand Up @@ -176,10 +178,12 @@ async fn should_store_session_id_received_during_initialization() {
let header_values = received_request
.headers
.get(&HeaderName::from_str("accept").unwrap())
.unwrap()
.to_str()
.unwrap();

assert!(header_values.contains(&HeaderValue::from_str("application/json").unwrap()));
assert!(header_values.contains(&HeaderValue::from_str("text/event-stream").unwrap()));
assert!(header_values.contains("application/json"));
assert!(header_values.contains("text/event-stream"));

wait_for_n_requests(&mock_server, 2, None).await;
}
Expand Down Expand Up @@ -338,7 +342,7 @@ async fn should_handle_successful_initial_get_connection_for_sse() {
let requests = mock_server.received_requests().await.unwrap();
let get_request = requests
.iter()
.find(|r| r.method == wiremock::http::Method::Get);
.find(|r| r.method == wiremock::http::Method::GET);

assert!(get_request.is_some())
}
Expand Down Expand Up @@ -446,7 +450,7 @@ async fn should_attempt_initial_get_connection_and_handle_405_gracefully() {
let requests = mock_server.received_requests().await.unwrap();
let get_request = requests
.iter()
.find(|r| r.method == wiremock::http::Method::Get);
.find(|r| r.method == wiremock::http::Method::GET);

assert!(get_request.is_some());

Expand Down Expand Up @@ -624,7 +628,7 @@ async fn should_always_send_specified_custom_headers() {
assert_eq!(requests.len(), 4);
assert!(requests
.iter()
.all(|r| r.headers.get(&"X-Custom-Header".into()).unwrap().as_str() == "CustomValue"));
.all(|r| r.headers.get("X-Custom-Header").unwrap().to_str().unwrap() == "CustomValue"));

debug_wiremock(&mock_server).await
}
Expand Down
2 changes: 1 addition & 1 deletion crates/rust-mcp-transport/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ reqwest = { workspace = true, default-features = false, features = [
], optional = true }

[dev-dependencies]
wiremock = "0.5"
wiremock = "0.6"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
futures = { workspace = true }
[lints]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ impl EventStore for InMemoryEventStore {
.cloned()
.collect();

subsequent.sort_by(|a, b| a.time_stamp.cmp(&b.time_stamp));
subsequent.sort_by_key(|a| a.time_stamp);
subsequent.iter().map(|e| e.message.clone()).collect()
}
_ => vec![],
Expand Down
10 changes: 5 additions & 5 deletions crates/rust-mcp-transport/src/sse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -274,11 +274,11 @@ impl Transport<ClientMessages, MessageFromServer, ClientMessage, ServerMessages,
if let Some(sender) = sender.as_ref() {
match sender.write_str("\n", true).await {
Ok(_) => {}
Err(TransportError::Io(error)) => {
if error.kind() == std::io::ErrorKind::BrokenPipe {
let _ = disconnect_tx.send(());
break;
}
Err(TransportError::Io(error))
if error.kind() == std::io::ErrorKind::BrokenPipe =>
{
let _ = disconnect_tx.send(());
break;
}
_ => {}
}
Expand Down
Loading