Skip to content

Commit d10488b

Browse files
authored
feat(server): decouple core logic from HTTP server for improved architecture (#106)
* chore: refactor hyperserver * chore: refactor utils * chore: use proper consts for header names * chore: clean up app state * chore: adjust cagro features * chore: rename AppState to McpAppState * feat: initial implementation of mcp_http_handler * feat: de-couple stramable http logic from the server framework * chore: move sse event out to own module * chore: move dns protection out of middlewares * chore: remove session id generator middleware * chore: add new methdo to McpHttpHandler for creatig http::Request * chore: update sse handlers to use mcp_http_handler * chore: update feature flags
1 parent 6268726 commit d10488b

26 files changed

+1355
-1009
lines changed

Cargo.lock

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/rust-mcp-sdk/Cargo.toml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,13 @@ tokio-stream = { workspace = true, optional = true }
2929
axum-server = { version = "0.7", features = [], optional = true }
3030
tracing.workspace = true
3131
base64.workspace = true
32+
bytes.workspace = true
3233

3334
# rustls = { workspace = true, optional = true }
3435
hyper = { version = "1.6.0", optional = true }
36+
http = { version ="1.3", optional = true }
37+
http-body-util = { version ="0.1", optional = true }
38+
http-body = { version ="1.0", optional = true }
3539

3640
[dev-dependencies]
3741
wiremock = "0.5"
@@ -61,13 +65,13 @@ default = [
6165
"2025_06_18",
6266
] # All features enabled by default
6367

64-
sse = ["rust-mcp-transport/sse"]
65-
streamable-http = ["rust-mcp-transport/streamable-http"]
68+
sse = ["rust-mcp-transport/sse","http","http-body","http-body-util"]
69+
streamable-http = ["rust-mcp-transport/streamable-http","http","http-body","http-body-util"]
6670
stdio = ["rust-mcp-transport/stdio"]
6771

6872
server = [] # Server feature
6973
client = [] # Client feature
70-
hyper-server = ["axum", "axum-server", "hyper", "server", "tokio-stream"]
74+
hyper-server = ["axum", "axum-server", "hyper", "server", "tokio-stream","http","http-body","http-body-util"]
7175
ssl = ["axum-server/tls-rustls"]
7276
tls-no-provider = ["axum-server/tls-rustls-no-provider"]
7377
macros = ["rust-mcp-macros/sdk"]
Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
mod app_state;
21
pub mod error;
32
pub mod hyper_runtime;
43
pub mod hyper_server;
54
pub mod hyper_server_core;
6-
mod middlewares;
75
mod routes;
86
mod server;
9-
mod session_store;
107

118
pub use server::*;
12-
pub use session_store::*;

crates/rust-mcp-sdk/src/hyper_servers/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ pub enum TransportServerError {
1515
StreamIoError(String),
1616
#[error("{0}")]
1717
AddrParseError(#[from] AddrParseError),
18+
#[error("{0}")]
19+
HttpError(String),
1820
#[error("Server start error: {0}")]
1921
ServerStartError(String),
2022
#[error("Invalid options: {0}")]

crates/rust-mcp-sdk/src/hyper_servers/hyper_runtime.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::{sync::Arc, time::Duration};
22

33
use crate::{
4+
mcp_http::McpAppState,
45
mcp_server::HyperServer,
56
schema::{
67
schema_utils::{NotificationFromServer, RequestFromServer, ResultFromClient},
@@ -18,15 +19,14 @@ use tokio::{sync::Mutex, task::JoinHandle};
1819

1920
use crate::{
2021
error::SdkResult,
21-
hyper_servers::app_state::AppState,
2222
mcp_server::{
2323
error::{TransportServerError, TransportServerResult},
2424
ServerRuntime,
2525
},
2626
};
2727

2828
pub struct HyperRuntime {
29-
pub(crate) state: Arc<AppState>,
29+
pub(crate) state: Arc<McpAppState>,
3030
pub(crate) server_task: JoinHandle<Result<(), TransportServerError>>,
3131
pub(crate) server_handle: Handle,
3232
}

crates/rust-mcp-sdk/src/hyper_servers/middlewares.rs

Lines changed: 0 additions & 2 deletions
This file was deleted.

crates/rust-mcp-sdk/src/hyper_servers/middlewares/protect_dns_rebinding.rs

Lines changed: 0 additions & 66 deletions
This file was deleted.

crates/rust-mcp-sdk/src/hyper_servers/middlewares/session_id_gen.rs

Lines changed: 0 additions & 23 deletions
This file was deleted.

crates/rust-mcp-sdk/src/hyper_servers/routes.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
pub mod fallback_routes;
2-
mod hyper_utils;
32
pub mod messages_routes;
3+
#[cfg(feature = "sse")]
44
pub mod sse_routes;
55
pub mod streamable_http_routes;
66

7-
use super::{app_state::AppState, HyperServerOptions};
7+
use crate::mcp_http::McpAppState;
8+
9+
use super::HyperServerOptions;
810
use axum::Router;
911
use std::sync::Arc;
1012

@@ -19,21 +21,23 @@ use std::sync::Arc;
1921
///
2022
/// # Returns
2123
/// * `Router` - An Axum router configured with all application routes and state
22-
pub fn app_routes(state: Arc<AppState>, server_options: &HyperServerOptions) -> Router {
24+
pub fn app_routes(state: Arc<McpAppState>, server_options: &HyperServerOptions) -> Router {
2325
let router: Router = Router::new()
2426
.merge(streamable_http_routes::routes(
25-
state.clone(),
2627
server_options.streamable_http_endpoint(),
2728
))
2829
.merge({
2930
let mut r = Router::new();
31+
#[cfg(feature = "sse")]
3032
if server_options.sse_support {
3133
r = r
3234
.merge(sse_routes::routes(
33-
state.clone(),
3435
server_options.sse_endpoint(),
36+
server_options.sse_messages_endpoint(),
37+
))
38+
.merge(messages_routes::routes(
39+
server_options.sse_messages_endpoint(),
3540
))
36-
.merge(messages_routes::routes(state.clone()))
3741
}
3842
r
3943
})

0 commit comments

Comments
 (0)