关于 Neva
Neva 是用于构建 MCP 客户端和服务端的 Rust SDK,面向开发异步 MCP 系统的开发者。它整合核心 MCP 实体、本地或远程传输,并支持身份验证、结构化数据和多轮请求。
主要功能
- 01构建 MCP 客户端和服务端
- 02支持 stdio 与 Streamable HTTP 传输
- 03定义和使用工具、资源及提示词
- 04支持异步与同步处理器
- 05支持 bearer 身份验证和基于角色的访问控制
- 06结构化输出与多轮请求处理
适用场景
- 01构建 Rust MCP 服务端
- 02通过 stdio 连接 MCP 客户端
- 03实现远程双向 MCP 通信
- 04处理多轮工具请求
MCP 相关
Neva 提供用于实现 MCP 客户端和服务端的 SDK。服务端可公开工具、资源和提示词;客户端可通过 stdio 或 Streamable HTTP 连接。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
暂未收录安装方式
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
还没有获取到工具列表
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Neva
为 Rust 提供闪电般快速且易于配置的 Model Context Protocol (MCP) 服务和客户端 SDK。 通过简单的配置和易用的 API,它提供了快速构建 MCP 客户端和服务所需的一切, 并与最新的 MCP 规范完全对齐。
💡 注意:此项目目前处于预览阶段。可能会在不提前通知的情况下引入破坏性变更。
主要功能
- 客户端和服务端 SDK - 一个库即可借助 Rust 的强大功能构建 MCP 客户端和服务。
- 性能 - 异步运行,由 Tokio 驱动。
- 传输方式 - stdio 用于本地集成,Streamable HTTP 用于远程双向通信。
- 工具、资源和提示词 - 全面支持定义和使用主要 MCP 实体。
- 异步或同步处理器 - 需要等待时编写
async fn,否则使用普通的fn。如果函数体会阻塞,则添加blocking,它会在 Tokio 的阻塞线程池而不是运行时工作线程上运行。 - 身份验证和授权 - 支持 bearer token 身份验证、基于角色的访问控制等,满足高安全性要求。
- 结构化数据 - 开箱即用地支持输出验证、嵌入式资源和资源链接。
- 安全的多轮往返请求 - 在调用过程中向客户端请求输入的处理器会在每一轮从头重新运行,因此幂等性由 neva 管理:
ctx.memo只计算一次,ctx.once只执行一次副作用,ctx.on_commit会将其延迟到最终结果时执行;如果响应丢失,则会重放已提交的答案,而不会重复扣款。 - 机密请求状态 - 在多轮之间传递进度的
requestState数据块使用 ChaCha20-Poly1305 加密,而非仅进行签名,因此客户端回传该数据块时,ctx.memo缓存的内容仍不可读。 - 将工具交给模型 - 启用
svir功能后,MCP 服务的工具会成为一个 svirToolbox:可以通过RemoteTools使用远程服务的工具,也可以在同一进程中通过服务自身的管道调用使用#[tool]编写一次的函数。提示词和资源会成为 svir 消息,而服务的采样请求则由模型作答。 - Registry 发布 - 用于 MCP Registry 的
server.json会根据服务已知的信息生成:其版本、传输方式以及 Cargo 正在构建的 crate。上传前会检查 Registry 的限制,而不是等上传时才检查。 - 规范对齐 - 旨在跟进最新的 MCP 规范并涵盖其核心功能。
快速开始
MCP 客户端
依赖项
[dependencies]
neva = { version = "0.9.0", features = ["client-full"] }
tokio = { version = "1", features = ["full"] }
代码
use neva::prelude::*;
#[tokio::main]
async fn main() -> Result<(), Error> {
let mut client = Client::new()
.with_options(|opt| opt
.with_stdio("npx", ["-y", "@modelcontextprotocol/server-everything"])
.with_timeout(Duration::from_secs(5)));
client.connect().await?;
// List tools
for tool in client.tools().list_all().await? {
println!("- {}", tool.name);
}
// Call a tool
let args = [
("message", "Hello MCP!")
];
let result = client.tools().call("echo", args).await?;
println!("{:?}", result.content);
client.disconnect().await
}
MCP 服务端
依赖项
[dependencies]
neva = { version = "0.9.0", features = ["server-full"] }
tokio = { version = "1", features = ["full"] }
代码
use neva::prelude::*;
#[tool(descr = "A say hello tool")]
async fn hello(name: String) -> String {
format!("Hello, {name}!")
}
#[resource(uri = "res://{name}", descr = "Some details about resource")]
async fn get_res(name: String) -> ResourceContents {
ResourceContents::new(format!("res://{name}"))
.with_mime("plain/text")
.with_text(format!("Some details about resource: {name}"))
}
// Nothing to await here, so a plain `fn` will do.
#[prompt(descr = "Analyze code for potential improvements")]
fn analyze_code(lang: String) -> PromptMessage {
PromptMessage::user()
.with(format!("Language: {lang}"))
}
#[tokio::main]
async fn main() {
App::new()
.with_options(|opt| opt
.with_stdio()
.with_name("Sample MCP server")
.with_version("1.0.0"))
.run()
.await;
}
评论
支持 Markdown
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。