这是一个用Rust实现的MCP服务器(模型上下文协议)。这是对原始TypeScript实现的Rust移植。
这个Rust实现提供了原始MCP的所有功能:
在你的Cargo.toml中添加以下内容:
[dependencies]
mcp-rs = "0.1.0"
这里是一个如何使用该库的基本示例:
use mcp_rs::{Emcp, SimpleToolBuilder};
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建一个新的服务器实例
let server = Emcp::new("my-mcp-server", "1.0.0", None);
// 添加一个工具
let add_tool = SimpleToolBuilder::new("add", |args| async move {
let a = args["a"].as_f64().unwrap_or(0.0);
let b = args["b"].as_f64().unwrap_or(0.0);
Ok(json!(a + b))
})
.description("加两个数")
.input_schema(json!({
"type": "object",
"properties": {
"a": { "type": "number" },
"b": { "type": "number" }
},
"required": ["a", "b"]
}))
.build();
server.add_tool(add_tool);
// 启动服务器
server.start(None).await?;
Ok(())
}
use mcp_rs::{Emcp, EmcpOptions, SimpleToolBuilder};
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建身份验证处理器
let auth_handler = Box::new(|request| {
// 检查认证头、令牌等
Box::pin(async {
// 对于授权请求返回true
true
})
});
// 使用身份验证处理器创建新的服务器
let server = Emcp::new(
"mcp-server-with-auth",
"1.0.0",
Some(EmcpOptions {
authentication_handler: Some(auth_handler),
}),
);
// 添加工具、资源或提示...
// 启动服务器
server.start(None).await?;
Ok(())
}
use mcp_rs::{Emcp, SimpleToolBuilder};
use std::time::Instant;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建一个新的服务器
let mut server = Emcp::new("mcp-server-with-middleware", "1.0.0", None);
// 添加计时中间件
server.use_middleware(|request, next| {
let start_time = Instant::now();
let method = request.method.clone();
Box::pin(async move {
// 调用链中的下一个中间件
let response = next().await;
// 后处理
let duration = start_time.elapsed();
println!(
"请求完成:方法={}, 持续时间={}毫秒",
method,
duration.as_millis()
);
response
})
});
// 添加工具、资源或提示...
// 启动服务器
server.start(None).await?;
Ok(())
}
mcp-rs中的中间件运行方式与原始TypeScript实现相同:
next()之前进行预处理next()调用后的代码)按相反顺序运行这创建了一个类似于Axum、Tower或其他基于中间件系统的“洋葱状”处理流程。
该库支持直接使用StdioServerTransport,类似于Node.js MCP SDK:
use mcp_rs::{Emcp, StdioServerTransport, SimpleToolBuilder};
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建一个新的服务器
let server = Emcp::new("my-mcp-server", "1.0.0", None);
// 添加你的工具、资源和提示
// ...
// 创建一个StdioServerTransport
let transport = StdioServerTransport::new();
// 将服务器连接到传输
server.connect(transport).await?;
Ok(())
}
仓库中包括几个演示库特性的示例:
# 运行基本示例
cargo run --example basic
# 运行身份验证示例
cargo run --example auth
# 运行中间件示例
cargo run --example middleware
# 运行标准输入输出传输示例
cargo run --example stdio_transport
MIT