Skip to content

Commit ff874f0

Browse files
Merge branch 'main' into cleanup-zombie-processes-for-child-process-client
2 parents 9edc6c8 + 01eedb7 commit ff874f0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+4727
-154
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,13 +192,15 @@ See [examples](examples/README.md)
192192
- `client`: use client side sdk
193193
- `server`: use server side sdk
194194
- `macros`: macros default
195+
- `schemars`: implement `JsonSchema` for all model structs
195196

196197
### Transports
197198

198199
- `transport-io`: Server stdio transport
199200
- `transport-sse-server`: Server SSE transport
200201
- `transport-child-process`: Client stdio transport
201202
- `transport-sse`: Client sse transport
203+
- `transport-streamable-http-server` streamable http server transport
202204

203205
## Related Resources
204206

clippy.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
msrv = "1.85"
2+
too-many-arguments-threshold = 10
3+
check-private-items = false

crates/rmcp/Cargo.toml

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ paste = { version = "1", optional = true }
2828
oauth2 = { version = "5.0", optional = true }
2929

3030
# for auto generate schema
31-
schemars = { version = "0.8", optional = true }
31+
schemars = { version = "0.8", optional = true, features = ["chrono"] }
3232

3333
# for image encoding
3434
base64 = { version = "0.21", optional = true }
@@ -37,7 +37,6 @@ base64 = { version = "0.21", optional = true }
3737
reqwest = { version = "0.12", default-features = false, features = [
3838
"json",
3939
"stream",
40-
"rustls-tls",
4140
], optional = true }
4241
sse-stream = { version = "0.1.3", optional = true }
4342
url = { version = "2.4", optional = true }
@@ -51,10 +50,11 @@ process-wrap = { version = "8.2", features = ["tokio1"], optional = true}
5150
# for ws transport
5251
# tokio-tungstenite ={ version = "0.26", optional = true }
5352

54-
# for sse-server transport
53+
# for http-server transport
5554
axum = { version = "0.8", features = [], optional = true }
5655
rand = { version = "0.9", optional = true }
5756
tokio-stream = { version = "0.1", optional = true }
57+
uuid = { version = "1", features = ["v4"], optional = true }
5858

5959
# macro
6060
rmcp-macros = { version = "0.1", workspace = true, optional = true }
@@ -64,7 +64,9 @@ default = ["base64", "macros", "server"]
6464
client = []
6565
server = ["transport-async-rw", "dep:schemars"]
6666
macros = ["dep:rmcp-macros", "dep:paste"]
67-
transport-sse = ["dep:reqwest", "dep:sse-stream", "dep:url"]
67+
__transport-sse = ["dep:reqwest", "dep:sse-stream", "dep:url"]
68+
transport-sse = ["__transport-sse", "reqwest?/rustls-tls"]
69+
transport-sse-tls-no-provider = ["__transport-sse", "reqwest?/rustls-tls-no-provider"]
6870
transport-async-rw = ["tokio/io-util", "tokio-util/codec"]
6971
transport-io = ["transport-async-rw", "tokio/io-std"]
7072
transport-child-process = [
@@ -77,10 +79,23 @@ transport-sse-server = [
7779
"dep:axum",
7880
"dep:rand",
7981
"dep:tokio-stream",
82+
"uuid",
83+
]
84+
transport-streamable-http-server = [
85+
"transport-streamable-http-server-session",
86+
"dep:axum",
87+
"uuid",
88+
]
89+
transport-streamable-http-server-session = [
90+
"transport-async-rw",
91+
"dep:tokio-stream",
8092
]
8193
# transport-ws = ["transport-io", "dep:tokio-tungstenite"]
8294
tower = ["dep:tower-service"]
83-
auth = ["dep:oauth2", "dep:reqwest", "dep:url"]
95+
__auth = ["dep:oauth2", "dep:reqwest", "dep:url"]
96+
auth = ["__auth", "reqwest?/rustls-tls"]
97+
auth-tls-no-provider = ["auth", "reqwest?/rustls-tls-no-provider"]
98+
schemars = ["dep:schemars"]
8499

85100
[dev-dependencies]
86101
tokio = { version = "1", features = ["full"] }
@@ -105,7 +120,7 @@ path = "tests/test_with_python.rs"
105120

106121
[[test]]
107122
name = "test_with_js"
108-
required-features = ["server", "client", "transport-sse-server", "transport-child-process"]
123+
required-features = ["server", "client", "transport-sse-server", "transport-child-process", "transport-streamable-http-server"]
109124
path = "tests/test_with_js.rs"
110125

111126
[[test]]
@@ -123,3 +138,8 @@ name = "test_message_protocol"
123138
required-features = ["client"]
124139
path = "tests/test_message_protocol.rs"
125140

141+
[[test]]
142+
name = "test_message_schema"
143+
required-features = ["server", "client", "schemars"]
144+
path = "tests/test_message_schema.rs"
145+

crates/rmcp/src/handler/server/tool.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,15 @@ use crate::{
1414
};
1515
/// A shortcut for generating a JSON schema for a type.
1616
pub fn schema_for_type<T: JsonSchema>() -> JsonObject {
17-
let schema = schemars::r#gen::SchemaGenerator::default().into_root_schema_for::<T>();
17+
let mut settings = schemars::r#gen::SchemaSettings::default();
18+
settings.option_nullable = true;
19+
settings.option_add_null_type = false;
20+
settings.definitions_path = "#/components/schemas/".to_owned();
21+
settings.meta_schema = None;
22+
settings.visitors = Vec::default();
23+
settings.inline_subschemas = false;
24+
let generator = settings.into_generator();
25+
let schema = generator.into_root_schema_for::<T>();
1826
let object = serde_json::to_value(schema).expect("failed to serialize schema");
1927
match object {
2028
serde_json::Value::Object(object) => object,

0 commit comments

Comments
 (0)