Skip to content

Commit 784a8e4

Browse files
authored
Merge pull request #4 from tidewave-ai/sd-streamable
support streamable http transport
2 parents bfa2551 + 33f443c commit 784a8e4

File tree

10 files changed

+693
-309
lines changed

10 files changed

+693
-309
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,7 @@ jobs:
1818
- uses: actions/checkout@v4
1919
- name: Build
2020
run: cargo build --verbose
21+
- name: Build examples
22+
run: cargo build --examples
2123
- name: Run tests
2224
run: cargo test --verbose

Cargo.lock

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

Cargo.toml

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,16 @@ version = "0.1.1"
44
edition = "2024"
55

66
[dependencies]
7-
rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk.git", rev = "afb8a905e54b87c69e880f9377cfe8424aa6f13b", features = ["server", "client", "transport-sse", "transport-child-process"] }
7+
rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk.git", rev = "076dc2c2cd8910bee56bae13f29bbcff8c279666", features = [
8+
"server",
9+
"client",
10+
"reqwest",
11+
"client-side-sse",
12+
"transport-sse-client",
13+
"transport-streamable-http-client",
14+
"transport-worker",
15+
"transport-child-process"
16+
] }
817
clap = { version = "4.5.37", features = ["derive"] }
918
tokio = { version = "1", features = ["full"] }
1019
tracing = "0.1.41"
@@ -20,7 +29,17 @@ version = "0.9"
2029
features = ["vendored"]
2130

2231
[dev-dependencies]
23-
rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk.git", rev = "afb8a905e54b87c69e880f9377cfe8424aa6f13b", features = ["server", "client", "transport-sse", "transport-sse-server", "transport-child-process", "macros"] }
32+
rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk.git", rev = "076dc2c2cd8910bee56bae13f29bbcff8c279666", features = [
33+
"server",
34+
"client",
35+
"reqwest",
36+
"client-side-sse",
37+
"transport-sse-client",
38+
"transport-sse-server",
39+
"transport-child-process",
40+
"transport-streamable-http-server",
41+
"macros"
42+
] }
2443
axum = { version = "0.8", features = ["macros"] }
2544
serde = { version = "1.0", features = ["derive"] }
2645
serde_json = "1.0"

examples/echo.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
use anyhow::Context;
2+
use clap::Parser;
3+
use rmcp::transport::SseServer;
4+
use tracing_subscriber::FmtSubscriber;
5+
6+
use rmcp::{
7+
ServerHandler,
8+
model::{ServerCapabilities, ServerInfo},
9+
schemars, tool,
10+
};
11+
#[derive(Debug, Clone, Default)]
12+
pub struct Echo;
13+
#[tool(tool_box)]
14+
impl Echo {
15+
#[tool(description = "Echo a message")]
16+
fn echo(&self, #[tool(param)] message: String) -> String {
17+
message
18+
}
19+
}
20+
21+
#[tool(tool_box)]
22+
impl ServerHandler for Echo {
23+
fn get_info(&self) -> ServerInfo {
24+
ServerInfo {
25+
instructions: Some("A simple echo server".into()),
26+
capabilities: ServerCapabilities::builder().enable_tools().build(),
27+
..Default::default()
28+
}
29+
}
30+
}
31+
32+
#[derive(Parser)]
33+
#[command(author, version, about, long_about = None)]
34+
struct Args {
35+
/// Address to bind the server to
36+
#[arg(short, long, default_value = "127.0.0.1:8080")]
37+
address: std::net::SocketAddr,
38+
}
39+
40+
#[tokio::main]
41+
async fn main() -> anyhow::Result<()> {
42+
let subscriber = FmtSubscriber::builder()
43+
.with_max_level(tracing::Level::DEBUG)
44+
.with_writer(std::io::stderr)
45+
.finish();
46+
47+
// Parse command line arguments
48+
let args = Args::parse();
49+
50+
tracing::subscriber::set_global_default(subscriber).context("Failed to set up logging")?;
51+
52+
let ct = SseServer::serve(args.address)
53+
.await?
54+
.with_service(Echo::default);
55+
56+
tokio::signal::ctrl_c().await?;
57+
ct.cancel();
58+
Ok(())
59+
}

examples/echo_streamable.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
use anyhow::Context;
2+
use clap::Parser;
3+
use rmcp::transport::StreamableHttpServer;
4+
use tracing_subscriber::FmtSubscriber;
5+
6+
use rmcp::{
7+
ServerHandler,
8+
model::{ServerCapabilities, ServerInfo},
9+
schemars, tool,
10+
};
11+
#[derive(Debug, Clone, Default)]
12+
pub struct Echo;
13+
#[tool(tool_box)]
14+
impl Echo {
15+
#[tool(description = "Echo a message")]
16+
fn echo(&self, #[tool(param)] message: String) -> String {
17+
message
18+
}
19+
}
20+
21+
#[tool(tool_box)]
22+
impl ServerHandler for Echo {
23+
fn get_info(&self) -> ServerInfo {
24+
ServerInfo {
25+
instructions: Some("A simple echo server".into()),
26+
capabilities: ServerCapabilities::builder().enable_tools().build(),
27+
..Default::default()
28+
}
29+
}
30+
}
31+
32+
#[derive(Parser)]
33+
#[command(author, version, about, long_about = None)]
34+
struct Args {
35+
/// Address to bind the server to
36+
#[arg(short, long, default_value = "127.0.0.1:8080")]
37+
address: std::net::SocketAddr,
38+
}
39+
40+
#[tokio::main]
41+
async fn main() -> anyhow::Result<()> {
42+
let subscriber = FmtSubscriber::builder()
43+
.with_max_level(tracing::Level::DEBUG)
44+
.with_writer(std::io::stderr)
45+
.finish();
46+
47+
// Parse command line arguments
48+
let args = Args::parse();
49+
50+
tracing::subscriber::set_global_default(subscriber).context("Failed to set up logging")?;
51+
52+
let ct = StreamableHttpServer::serve(args.address)
53+
.await?
54+
.with_service(Echo::default);
55+
56+
tokio::signal::ctrl_c().await?;
57+
ct.cancel();
58+
Ok(())
59+
}

0 commit comments

Comments
 (0)