Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ See [examples](examples/README.md)
- `transport-sse-server`: Server SSE transport
- `transport-child-process`: Client stdio transport
- `transport-sse`: Client sse transport
- `transport-streamable-http-server` streamable http server transport

## Related Resources

Expand Down
15 changes: 13 additions & 2 deletions crates/rmcp/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,11 @@ tower-service = { version = "0.3", optional = true }
# for ws transport
# tokio-tungstenite ={ version = "0.26", optional = true }

# for sse-server transport
# for http-server transport
axum = { version = "0.8", features = [], optional = true }
rand = { version = "0.9", optional = true }
tokio-stream = { version = "0.1", optional = true }
uuid = { version = "1", features = ["v4"], optional = true }

# macro
rmcp-macros = { version = "0.1", workspace = true, optional = true }
Expand All @@ -71,6 +72,16 @@ transport-sse-server = [
"dep:axum",
"dep:rand",
"dep:tokio-stream",
"uuid",
]
transport-streamable-http-server = [
"transport-streamable-http-server-session",
"dep:axum",
"uuid",
]
transport-streamable-http-server-session = [
"transport-async-rw",
"dep:tokio-stream",
]
# transport-ws = ["transport-io", "dep:tokio-tungstenite"]
tower = ["dep:tower-service"]
Expand Down Expand Up @@ -99,7 +110,7 @@ path = "tests/test_with_python.rs"

[[test]]
name = "test_with_js"
required-features = ["server", "client", "transport-sse-server", "transport-child-process"]
required-features = ["server", "client", "transport-sse-server", "transport-child-process", "transport-streamable-http-server"]
path = "tests/test_with_js.rs"

[[test]]
Expand Down
2 changes: 1 addition & 1 deletion crates/rmcp/src/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ impl<'de> Deserialize<'de> for NumberOrString {

pub type RequestId = NumberOrString;

#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Hash, Eq)]
#[serde(transparent)]
pub struct ProgressToken(pub NumberOrString);
#[derive(Debug, Clone)]
Expand Down
1 change: 1 addition & 0 deletions crates/rmcp/src/model/tool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ pub struct Tool {
pub description: Option<Cow<'static, str>>,
/// A JSON Schema object defining the expected parameters for the tool
pub input_schema: Arc<JsonObject>,
#[serde(skip_serializing_if = "Option::is_none")]
/// Optional additional tool information.
pub annotations: Option<ToolAnnotations>,
}
Expand Down
6 changes: 3 additions & 3 deletions crates/rmcp/src/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -591,7 +591,7 @@ where
}
};

tracing::debug!(?evt, "new event");
tracing::trace!(?evt, "new event");
match evt {
// response and error
Event::ToSink(m) => {
Expand Down Expand Up @@ -657,7 +657,7 @@ where
Event::PeerMessage(JsonRpcMessage::Request(JsonRpcRequest {
id, request, ..
})) => {
tracing::info!(%id, ?request, "received request");
tracing::debug!(%id, ?request, "received request");
{
let service = shared_service.clone();
let sink = sink_proxy_tx.clone();
Expand All @@ -675,7 +675,7 @@ where
let result = service.handle_request(request, context).await;
let response = match result {
Ok(result) => {
tracing::info!(%id, ?result, "response message");
tracing::debug!(%id, ?result, "response message");
JsonRpcMessage::response(result, id)
}
Err(error) => {
Expand Down
5 changes: 4 additions & 1 deletion crates/rmcp/src/transport.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,10 @@ pub use auth::{AuthError, AuthorizationManager, AuthorizationSession, Authorized

// #[cfg(feature = "transport-ws")]
// pub mod ws;

#[cfg(feature = "transport-streamable-http-server-session")]
pub mod streamable_http_server;
#[cfg(feature = "transport-streamable-http-server")]
pub use streamable_http_server::axum::StreamableHttpServer;
pub trait IntoTransport<R, E, A>: Send + 'static
where
R: ServiceRole,
Expand Down
3 changes: 1 addition & 2 deletions crates/rmcp/src/transport/sse_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@ impl App {
}

fn session_id() -> SessionId {
let id = format!("{:016x}", rand::random::<u128>());
Arc::from(id)
uuid::Uuid::new_v4().to_string().into()
}

#[derive(Debug, serde::Deserialize)]
Expand Down
3 changes: 3 additions & 0 deletions crates/rmcp/src/transport/streamable_http_server.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#[cfg(feature = "transport-streamable-http-server")]
pub mod axum;
pub mod session;
Loading
Loading