Neva について
Nevaは、MCPクライアントとサーバーを構築するRust SDKで、非同期MCPシステムを開発する人向けです。MCPの主要要素とローカル・リモートのトランスポートに加え、認証、構造化データ、複数回の往復を伴うリクエストに対応します。
主な機能
- 01MCPクライアントとサーバーを構築
- 02stdioとStreamable HTTPのトランスポート
- 03ツール、リソース、プロンプトを定義・利用
- 04非同期・同期ハンドラーに対応
- 05Bearer認証とロールベースアクセス制御
- 06構造化出力と複数回の往復に対応
活用シーン
- 01RustでMCPサーバーを構築
- 02stdio経由でMCPクライアントを接続
- 03リモートの双方向MCP通信を実現
- 04複数回の往復を伴うツールリクエストを処理
MCP 対応
NevaはMCPクライアントとサーバーを実装するためのSDKです。サーバーはツール、リソース、プロンプトを公開でき、クライアントはstdioまたはStreamable HTTPで接続できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Neva
驚異的に高速で、簡単に設定できる Model Context Protocol (MCP) の Rust 向けサーバーおよびクライアント SDK です。 シンプルな設定と使いやすい API により、最新の MCP 仕様に完全に準拠した MCP クライアントとサーバーをすばやく構築するために必要なものをすべて提供します。
💡 注:このプロジェクトは現在プレビュー段階です。事前の通知なく破壊的変更が導入される場合があります。
チュートリアル | API ドキュメント | サンプル
主な機能
- クライアントとサーバーの SDK - Rust の強力な機能を活用し、MCP クライアントとサーバーの両方を構築できる単一のライブラリです。
- パフォーマンス - 非同期処理に対応し、Tokio を活用します。
- トランスポート - ローカル統合向けの stdio と、リモートで双方向通信を行う Streamable HTTP に対応します。
- ツール、リソース、プロンプト - MCP の主要なエンティティを定義して利用するための完全なサポートを提供します。
- 非同期または同期のハンドラー - 何かを待機する場合は
async fn、待機しない場合は通常のfnを記述します。本文がブロッキング処理を行う場合はblockingを追加すると、ランタイムのワーカースレッドではなく Tokio のブロッキングプールで実行されます。 - 認証と認可 - ベアラートークン認証、ロールベースのアクセス制御など、高いセキュリティ基準に対応する機能を備えています。
- 構造化データ - 出力の検証、埋め込みリソース、リソースリンクを標準で利用できます。
- 安全な複数ラウンドトリップ要求 - 呼び出し中にクライアントへ入力を求めるハンドラーは、各ラウンドで最初から再実行されます。そのため、冪等性は neva が担います。
ctx.memoは一度だけ計算し、ctx.onceは副作用を一度だけ実行し、ctx.on_commitは最終結果まで実行を保留します。また、応答が失われた場合は、カードに二重請求する代わりに、確定済みの回答を再送します。 - 機密性の高い要求状態 - ラウンド間で進捗を伝える
requestStateの blob は、単に署名されるのではなく ChaCha20-Poly1305 で暗号化されます。そのため、クライアントが送り返すctx.memoのキャッシュ内容を読み取ることはできません。 - モデルへのツールの引き渡し -
svir機能を使うと、MCP サーバーのツールが svir のToolboxになります。RemoteToolsを通じてリモートサーバーのツールを利用する方法と、#[tool]で一度だけ記述した関数をサーバー自身のパイプライン経由で同じプロセス内から呼び出す方法があります。プロンプトとリソースは svir メッセージになり、サーバーのサンプリング要求にはモデルが応答します。 - レジストリへの公開 - MCP Registry 用の
server.jsonは、サーバーがすでに把握しているバージョン、トランスポート、Cargo がビルドするクレートの情報から生成されます。レジストリの制限はアップロード時ではなく、その前に確認されます。 - 仕様への準拠 - 最新の 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;
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。