Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,7 @@ jobs:
- uses: actions/checkout@v4
- name: Build
run: cargo build --verbose
- name: Build examples
run: cargo build --examples
- name: Run tests
run: cargo test --verbose
112 changes: 100 additions & 12 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 21 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,16 @@ version = "0.1.1"
edition = "2024"

[dependencies]
rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk.git", rev = "afb8a905e54b87c69e880f9377cfe8424aa6f13b", features = ["server", "client", "transport-sse", "transport-child-process"] }
rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk.git", rev = "c1c4c9a0c9afbfbbf9eb42d6f8b00d8546fbdc2c", features = [
"server",
"client",
"reqwest",
"client-side-sse",
"transport-sse-client",
"transport-streamable-http-client",
"transport-worker",
"transport-child-process"
] }
clap = { version = "4.5.37", features = ["derive"] }
tokio = { version = "1", features = ["full"] }
tracing = "0.1.41"
Expand All @@ -20,7 +29,17 @@ version = "0.9"
features = ["vendored"]

[dev-dependencies]
rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk.git", rev = "afb8a905e54b87c69e880f9377cfe8424aa6f13b", features = ["server", "client", "transport-sse", "transport-sse-server", "transport-child-process", "macros"] }
rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk.git", rev = "c1c4c9a0c9afbfbbf9eb42d6f8b00d8546fbdc2c", features = [
"server",
"client",
"reqwest",
"client-side-sse",
"transport-sse-client",
"transport-sse-server",
"transport-child-process",
"transport-streamable-http-server",
"macros"
] }
axum = { version = "0.8", features = ["macros"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
Expand Down
59 changes: 59 additions & 0 deletions examples/echo.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
use anyhow::Context;
use clap::Parser;
use rmcp::transport::SseServer;
use tracing_subscriber::FmtSubscriber;

use rmcp::{
ServerHandler,
model::{ServerCapabilities, ServerInfo},
schemars, tool,
};
#[derive(Debug, Clone, Default)]
pub struct Echo;
#[tool(tool_box)]
impl Echo {
#[tool(description = "Echo a message")]
fn echo(&self, #[tool(param)] message: String) -> String {
message
}
}

#[tool(tool_box)]
impl ServerHandler for Echo {
fn get_info(&self) -> ServerInfo {
ServerInfo {
instructions: Some("A simple echo server".into()),
capabilities: ServerCapabilities::builder().enable_tools().build(),
..Default::default()
}
}
}

#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Args {
/// Address to bind the server to
#[arg(short, long, default_value = "127.0.0.1:8080")]
address: std::net::SocketAddr,
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
let subscriber = FmtSubscriber::builder()
.with_max_level(tracing::Level::DEBUG)
.with_writer(std::io::stderr)
.finish();

// Parse command line arguments
let args = Args::parse();

tracing::subscriber::set_global_default(subscriber).context("Failed to set up logging")?;

let ct = SseServer::serve(args.address)
.await?
.with_service(Echo::default);

tokio::signal::ctrl_c().await?;
ct.cancel();
Ok(())
}
59 changes: 59 additions & 0 deletions examples/echo_streamable.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
use anyhow::Context;
use clap::Parser;
use rmcp::transport::StreamableHttpServer;
use tracing_subscriber::FmtSubscriber;

use rmcp::{
ServerHandler,
model::{ServerCapabilities, ServerInfo},
schemars, tool,
};
#[derive(Debug, Clone, Default)]
pub struct Echo;
#[tool(tool_box)]
impl Echo {
#[tool(description = "Echo a message")]
fn echo(&self, #[tool(param)] message: String) -> String {
message
}
}

#[tool(tool_box)]
impl ServerHandler for Echo {
fn get_info(&self) -> ServerInfo {
ServerInfo {
instructions: Some("A simple echo server".into()),
capabilities: ServerCapabilities::builder().enable_tools().build(),
..Default::default()
}
}
}

#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Args {
/// Address to bind the server to
#[arg(short, long, default_value = "127.0.0.1:8080")]
address: std::net::SocketAddr,
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
let subscriber = FmtSubscriber::builder()
.with_max_level(tracing::Level::DEBUG)
.with_writer(std::io::stderr)
.finish();

// Parse command line arguments
let args = Args::parse();

tracing::subscriber::set_global_default(subscriber).context("Failed to set up logging")?;

let ct = StreamableHttpServer::serve(args.address)
.await?
.with_service(Echo::default);

tokio::signal::ctrl_c().await?;
ct.cancel();
Ok(())
}
Loading