Rust MCP SDK について
Rust MCP SDKは、MCPサーバーとクライアントを開発するための非同期Rustツールキットです。複数のトランスポート、HTTPフレームワーク連携、型安全なスキーマ、手続き型マクロを備えています。
主な機能
- 01MCPサーバーとクライアントの構築
- 02stdio、Streamable HTTP、SSEに対応
- 03AxumとActixとの連携
- 04型安全なスキーマと手続き型マクロ
- 05OAuth認証に対応
活用シーン
- 01RustでのMCPサーバー実装
- 02アプリケーションへのMCPクライアント追加
- 03既存のHTTPアプリへのMCPエンドポイント追加
- 04MCPサーバーへのOAuth設定
MCP 対応
MCPサーバーとクライアントの開発に使え、プロトコルやトランスポートの処理を担い、双方の認証機能も提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP サーバーとクライアントを構築するための、高性能な非同期 Rust ツールキットです。
📖 ドキュメント · チュートリアル · サンプル · アップグレードガイド · 変更履歴
貢献する · バグを報告 · 機能をリクエスト
🥇 Tier 1 SDK: 評価対象の適合性シナリオを100%通過し、公式MCP適合性ツールのtier-checkでSEP-1730に基づくTier 1と判定されています。Tier-checkの実行 · リリースレポート
✅ このSDKは2026-07-28 MCPのステートレスプロトコルを完全に実装し、公式MCP適合性テストの100%に合格しています。
rust-mcp-sdkは、MCPエコシステムにおけるサーバーとクライアントの両方の開発に必要なコンポーネントを提供します。rust-mcp-schemaクレートを活用して型安全なスキーマオブジェクトを提供し、強力な手続き型マクロも備えています。
アプリケーションロジックに集中してください。プロトコル、トランスポートなどはrust-mcp-sdkが処理します。
バージョンに関するお知らせ: これは新しい2026-07-28 MCP(ステートレス)仕様を実装するrust-mcp-sdk 2.xです。
以前の2025-11-25 MCP仕様には、rust-mcp-sdk 1.xを使用してください。
1.xから2.0に移行するには、アップグレードガイドを参照してください。
バージョン対応表:
| SDKバージョン | プロトコル | ブランチ |
|---|---|---|
| 2.0 | 2026-07-28 MCP(ステートレス) | main |
| 1.x(LTS) | 2025-11-25 MCP | release-1.x |
アップグレードする場合: アップグレードガイドを参照してください。
主な機能
- ✅ 最新の MCP プロトコル仕様に対応:2026-07-28
- 🥇 Tier 1 SDK - 公式 MCP 適合性ツールの
tier-checkは、SEP-1730 に基づいて Tier 1 と報告します。tier-check の実行結果を確認· - ✅ 100% MCP 適合 - 公式のクライアント(254/254)およびサーバー(40/40)適合性テストにすべて合格
- ✅ トランスポート:Stdio、Streamable HTTP、後方互換性のある SSE に対応
- ✅ フレームワークに依存しません:Axum、Actix、BYO サーバーとの統合
- ✅ サーバー→クライアントの入力リクエスト向け MRTR(Mid-Request Turn-Around)
- ✅ プリンシパル単位のプライバシーと自動ページネーションを備えたレスポンスキャッシュ(SEP-2549)
- ✅
RequestContextによるリクエストごとの_meta - ✅ 複数クライアントの同時実行
- ✅ DNS リバインディング保護
- ✅ メッセージオブザーバー(テレメトリーとモニタリング)
- ✅ HTTP ヘルスチェック(ロードバランサーとコンテナーオーケストレーション向け)
- ✅ MCP サーバー向け OAuth 認証
- ✅ リモート OAuth プロバイダー
- Keycloak プロバイダー(rust-mcp-extra経由)
- WorkOS Authkit プロバイダー(rust-mcp-extra経由)
- Scalekit Authkit プロバイダー(rust-mcp-extra経由)
- ✅ リモート OAuth プロバイダー
- ✅ MCP クライアント向け OAuth 認証(メタデータの検出、CIMD、PKCE、トークンの更新、プラグ可能なストレージ)
- ✅ 発行者にバインドされた認証情報(SEP-2352)、厳密な
iss検証(SEP-2468)
目次
- クイックスタート
- 最小構成の MCP サーバー(Stdio)
- 最小構成の MCP サーバー(Streamable HTTP)
- 最小構成の MCP クライアント(Stdio)
- 使用例
- マクロ
- 認証
- HTTP サーバーバックエンド(Axum と Actix)
- Cargo の機能
- ハンドラートレイト
- メッセージオブザーバー(テレメトリーとモニタリング)
- ヘルスチェックエンドポイント
- コントリビューション
- 開発
- ライセンス
クイックスタート
Cargo.toml に追加します:
[dependencies]
rust-mcp-sdk = "2.0.0" # Check crates.io for the latest version
最小構成の MCP サーバー(Stdio)
use async_trait::async_trait;
use rust_mcp_sdk::{
error::SdkResult, macros, mcp_icon,
mcp_server::{server_runtime, McpServerOptions, ServerHandler},
schema::*,
McpServer, RequestContext, ServerDetails, StdioTransport, ToMcpServerHandler,
TransportOptions,
};
// Define an MCP tool
#[macros::mcp_tool(name = "say_hello", description = "returns \"Hello from Rust MCP SDK!\" message")]
#[derive(Debug, ::serde::Deserialize, ::serde::Serialize, macros::JsonSchema)]
pub struct SayHelloTool {}
// Define a custom handler
#[derive(Default)]
struct HelloHandler;
#[async_trait]
impl ServerHandler for HelloHandler {
async fn handle_list_tools_request(
&self,
_request: Option<PaginatedRequestParams>,
_context: &RequestContext,
_runtime: std::sync::Arc<dyn McpServer>,
) -> std::result::Result<ListToolsResult, RpcError> {
Ok(ListToolsResult {
tools: vec![SayHelloTool::tool()],
meta: None,
next_cursor: None,
cache_scope: Default::default(),
result_type: "complete".to_string(),
ttl_ms: 0,
})
}
async fn handle_call_tool_request(
&self,
params: CallToolRequestParams,
_context: &RequestContext,
_runtime: std::sync::Arc<dyn McpServer>,
) -> std::result::Result<ServerResult, CallToolError> {
if params.name == "say_hello" {
Ok(ServerResult::CallToolResult(CallToolResult {
content: vec![ContentBlock::TextContent(TextContent::new(
"Hello from Rust MCP SDK!".to_string(),
None,
None,
))],
is_error: None,
meta: None,
result_type: "complete".to_string(),
}))
} else {
Err(CallToolError::unknown_tool(params.name))
}
}
}
#[tokio::main]
async fn main() -> SdkResult<()> {
let server_details = ServerDetails {
server_info: Implementation {
name: "hello-rust-mcp".into(),
version: "0.1.0".into(),
title: Some("Hello World MCP Server".into()),
description: Some("A minimal Rust MCP server".into()),
icons: vec![mcp_icon!(
src = "https://raw.githubusercontent.com/rust-mcp-stack/rust-mcp-sdk/main/assets/rust-mcp-icon.png",
mime_type = "image/png",
sizes = ["128x128"],
theme = "light"
)],
website_url: Some("https://github.com/rust-mcp-stack/rust-mcp-sdk".into()),
},
capabilities: ServerCapabilities {
tools: Some(ServerCapabilitiesTools { list_changed: None }),
..Default::default()
},
instructions: None,
meta: None,
};
let transport = StdioTransport::new(TransportOptions::default())?;
let handler = HelloHandler::default().to_mcp_server_handler();
let server = server_runtime::create_server(McpServerOptions {
server_details,
transport,
handler,
message_observer: None,
});
server.start().await
}
HTTP サーバーバックエンド(Axum と Actix)
rust-mcp-sdk で Streamable HTTP MCP サーバーを作成すると、追加の設定なしで複数のクライアントが同時に接続できます。セットアップは stdio の例とほぼ同じで、違いはインストールする HTTP バックエンドのクレートと、サーバーの作成に使用する関数だけです。
POST のみをサポートします。2026-07-28 プロトコルはステートレスです。GET および DELETE エンドポイントは 405 Method Not Allowed を返します。
Axum バックエンド(rust-mcp-axum)
依存関係に rust-mcp-axum を追加し、AxumServerOptions とともに create_axum_server() を使用します。
use async_trait::async_trait;
use rust_mcp_axum::{create_axum_server, AxumServerOptions};
use rust_mcp_sdk::{
error::SdkResult, macros,
mcp_server::ServerHandler, schema::*,
};
// ... (define SayHelloTool and HelloHandler as shown above)
#[tokio::main]
async fn main() -> SdkResult<()> {
let server_details = ServerDetails { /* ... */ };
let handler = HelloHandler::default().to_mcp_server_handler();
let server = create_axum_server(
server_details,
handler,
AxumServerOptions {
host: "127.0.0.1".to_string(),
..Default::default()
},
);
server.start().await?;
Ok(())
}
Actix-web バックエンド(rust-mcp-actix)
依存関係に rust-mcp-actix を追加し、ActixServerOptions とともに create_actix_server() を使用します。
use rust_mcp_actix::{create_actix_server, ActixServerOptions};
use rust_mcp_sdk::{
error::SdkResult,
mcp_server::ServerHandler, schema::*,
};
// ... (define SayHelloTool and HelloHandler as shown above)
#[tokio::main]
async fn main() -> SdkResult<()> {
let server_details = ServerDetails { /* ... */ };
let handler = HelloHandler::default().to_mcp_server_handler();
let server = create_actix_server(
server_details,
handler,
ActixServerOptions {
host: "127.0.0.1".to_string(),
..Default::default()
},
);
server.start().await?;
Ok(())
}
BYO サーバー:既存のアプリに MCP を組み込む
両方のバックエンドは BYO サーバー(独自サーバーの持ち込み)モードに対応しており、サーバーのライフサイクルを管理せずに、既存のルーターやアプリに MCP エンドポイントをマウントできます。
| バックエンド | 関数 | ドキュメント |
|---|---|---|
| Axum | mcp_routes(state, &mount_opts, http_handler) | rust-mcp-axum README |
| Actix-web | mcp_scope(state, http_handler, &mount_opts) | rust-mcp-actix README |
カスタム HTTP フレームワークとの統合
SDK は完全にフレームワークに依存しません。異なる HTTP フレームワーク(Rocket、Salvo、Warp など)を使用している場合は、そのフレームワーク固有の Request/Response 型を SDK のコア HTTP 処理ロジックに適合させることで、カスタム統合を構築できます。
アーキテクチャの詳細については、カスタム HTTP フレームワーク統合ガイドを参照してください。
AxumServerOptions
Axum サーバーは AxumServerOptions を使って細かくカスタマイズできます。
let server = create_axum_server(
server_details,
handler.to_mcp_server_handler(),
AxumServerOptions {
host: "127.0.0.1".to_string(),
port: 8080,
auth: Some(Arc::new(auth_provider)), // enable authentication
health_endpoint: Some("/health".into()), // health check
sse_support: true, // backward-compat SSE
..Default::default()
},
);
server.start().await?;
セキュリティに関する考慮事項
- DNS リバインディング保護はデフォルトで有効です。
allowed_hostsが設定されていない場合は、host:portから自動的に設定されます。 - ローカルで実行する場合は、すべてのネットワークインターフェース(0.0.0.0)ではなく、localhost(127.0.0.1 / localhost)のみにバインドしてください。
- 本番環境へのデプロイでは TLS/HTTPS を使用してください。
以下は、@modelcontextprotocol/server-everything サーバーを起動し、サーバーの機能を確認して、利用可能なツールを一覧表示し、ツールを呼び出す MCP クライアントの実装です。
use async_trait::async_trait;
use rust_mcp_sdk::{
error::SdkResult,
mcp_client::{client_runtime, ClientHandler, McpClientOptions},
schema::*,
ClientDetails, McpClient, StdioTransport, ToMcpClientHandler, TransportOptions,
};
pub struct MyClientHandler;
#[async_trait]
impl ClientHandler for MyClientHandler {
// Override handler methods as needed.
// See: crates/rust-mcp-sdk/src/mcp_handlers/mcp_client_handler.rs
}
#[tokio::main]
async fn main() -> SdkResult<()> {
let client_details = ClientDetails {
client_info: Implementation {
name: "simple-rust-mcp-client".into(),
version: "0.1.0".into(),
description: None,
icons: vec![],
title: None,
website_url: None,
},
capabilities: ClientCapabilities::default(),
};
let transport = StdioTransport::create_with_server_launch(
"npx",
vec!["-y".to_string(), "@modelcontextprotocol/server-everything@latest".to_string()],
None,
TransportOptions::default(),
)?;
let handler = MyClientHandler {};
let client = client_runtime::create_client(McpClientOptions::new(
client_details,
transport,
handler.to_mcp_client_handler(),
));
client.clone().start().await?;
// Discover the server
let discover = client.request_discover(Default::default()).await?;
println!("Supported protocol versions: {:?}", discover.supported_versions);
// List tools
let tools = client.request_tool_list(None).await?.tools;
tools.iter().enumerate().for_each(|(i, tool)| {
println!(" {}. {} : {}", i + 1, tool.name, tool.description.unwrap_or_default());
});
// Call a tool (supports MRTR auto-retry)
let result = client.call_tool(CallToolRequestParams {
name: "say_hello".to_string(),
arguments: None,
input_responses: None,
request_state: None,
meta: RequestMetaObject::default(),
}).await?;
client.shut_down().await?;
Ok(())
}
使用例
その他の例(stdio、Streamable HTTP、クライアント、認証など)については、examples/ ディレクトリを参照してください。
👉 手順に沿ったチュートリアル(サーバー、クライアント、HTTP デプロイ、OAuth など)については、ドキュメントサイトを参照してください。
MCP Inspector で動作する hello-world-mcp-server-stdio の例をご覧ください。
マクロ
macros 機能を有効にしてください。
mcp_tool
構造体からメタデータ(アイコン、ヒントなど)付きの Tool を生成します。
#[mcp_tool(
name = "write_file",
title = "Write File Tool",
description = "Create or overwrite a file with new content.",
destructive_hint = false, idempotent_hint = false, open_world_hint = false, read_only_hint = false,
meta = r#"{ "key": "value" }"#,
icons = [(src = "https://website.com/write.png", mime_type = "image/png", sizes = ["128x128"], theme = "light")]
)]
#[derive(rust_mcp_macros::JsonSchema)]
pub struct WriteFileTool {
/// The target file's path for writing content.
pub path: String,
/// The string content to be written to the file
pub content: String,
}
tool_box!()
指定されたツールのリストに基づいて、列挙型を自動生成します。
tool_box!(GreetingTools, [SayHelloTool, SayGoodbyeTool]);
let tools: Vec<Tool> = GreetingTools::tools();
mcp_elicit()
ユーザー入力用の型安全なエリシテーション(Form または URL モード)を生成します。
#[mcp_elicit(message = "Please enter your info", mode = form)]
#[derive(JsonSchema)]
pub struct UserInfo {
#[json_schema(title = "Name", min_length = 5, max_length = 100)]
pub name: String,
#[json_schema(title = "Email", format = "email")]
pub email: Option<String>,
#[json_schema(title = "Age", minimum = 15, maximum = 125)]
pub age: i32,
#[json_schema(title = "Tags")]
pub tags: Vec<String>,
}
◾ mcp_resource()
コンパイル時メタデータから、完全に設定されたリソースインスタンスを作成するユーティリティメソッドを生成する手続き型マクロ属性です。通常、ファイル、画像、ドキュメントなどの静的アセットを公開するために使用します。また、matchパターンで使用できるRESOURCE_URI関連定数と、resource_mime_type()アクセサーも生成します。
📝 完全なドキュメント、使用例、利用可能なすべての属性の一覧については、https://crates.io/crates/rust-mcp-macros をご覧ください。
◾ mcp_resource_template()
コンパイル時メタデータから、パラメーター化されたサーバーリソースを公開するための、完全に設定されたResourceTemplateインスタンスを作成するユーティリティメソッドを生成する手続き型マクロ属性です。また、matchパターンで使用できるRESOURCE_URI_TEMPLATE関連定数と、resource_template_mime_type()アクセサーも生成します。
📝 完全なドキュメント、使用例、利用可能なすべての属性の一覧については、https://crates.io/crates/rust-mcp-macros をご覧ください。
◾ mcp_prompt()
コンパイル時メタデータから、完全に設定されたPromptインスタンスを作成するユーティリティメソッドを生成する手続き型マクロ属性です。また、オプションのmessages属性が指定されている場合は、リクエスト引数を解析し(from_arguments)、それらをGetPromptResultにレンダリングする(render)メソッドも生成します。構造体フィールドは型付きのプロンプト引数になります(String=必須、Option<String>=任意、String+default=フォールバック)。prompts/getハンドラー自体はユーザーが実装します。
📝 完全なドキュメント、使用例、利用可能なすべての属性の一覧については、https://crates.io/crates/rust-mcp-macros をご覧ください。
◾ mcp_icon!()
実装やツール向けの便利なアイコンビルダーです。テーマ、サイズ、MIMEなど、すべての属性をサポートします。
使用例:
let icon: crate::schema::Icon = mcp_icon!(
src = "http://website.com/icon.png",
mime_type = "image/png",
sizes = ["64x64"],
theme = "dark"
);
認証
MCP サーバーは、他のシステムが発行したトークンを検証したり、外部の ID プロバイダーと連携したり、認証プロセス全体を管理したりできます。
RemoteAuthProvider
RemoteAuthProviderは、動的クライアント登録(DCR)に対応した ID プロバイダーでの認証を可能にし、MCP クライアントが自動登録して認証情報を取得できるようにします。
OAuthProxy
OAuthProxyは、DCRに対応していないOAuthプロバイダーでの認証を可能にします。
Cargo機能
利用可能な機能
server:MCP サーバー機能を有効にしますclient:MCP クライアント機能を有効にしますmacros:Tool、Elicit、Resource構造体向けの手続き型マクロsse:Server-Sent Events(SSE)トランスポートstreamable-http:ストリーミング可能なHTTPトランスポートstdio:標準入力/出力(stdio)トランスポートauth:MCP サーバー向けのOAuth認証サポートtls-no-provider:暗号プロバイダーを使用しないTLS
デフォルト機能
デフォルトですべての機能が有効になります。
[dependencies]
rust-mcp-sdk = "2.0.0"
サーバー機能のみを使用する場合
[dependencies]
rust-mcp-sdk = { version = "2.0.0", default-features = false, features = ["server", "macros", "stdio"] }
クライアント機能のみを使用する場合
[dependencies]
rust-mcp-sdk = { version = "2.0.0", default-features = false, features = ["client", "stdio"] }
ハンドラートレイト
ServerHandlerとServerHandlerCoreの選択
- ServerHandler:推奨です。すべてのMCPメッセージにデフォルト実装が用意されています。必要なものだけをオーバーライドしてください。
- ServerHandlerCore:リクエスト/通知/エラーのディスパッチを完全に制御できます。
**注:**実装するハンドラーに応じて、server_runtime::create_server()またはserver_runtime_core::create_server()を使用してください。
ClientHandler と ClientHandlerCore の選択
クライアント側にも同じ原則が当てはまります。ClientHandler を使う場合は client_runtime::create_client() を、ClientHandlerCore を使う場合は client_runtime_core::create_client() を使用してください。
メッセージオブザーバー(テレメトリーとモニタリング)
McpObserver を実装すると、テレメトリー、ログ記録、デバッグ、モニタリングのために、すべての受信 MCP メッセージと送信 MCP メッセージを傍受できます。
let server = server_runtime::create_server(McpServerOptions {
server_details,
transport,
handler: handler.to_mcp_server_handler(),
message_observer: Some(SimpleServerObserver::new()),
});
ヘルスチェックエンドポイント
ロードバランサーとコンテナーオーケストレーション向けの、オプションの HTTP ヘルスチェックエンドポイントです。
let server = create_axum_server(
server_details,
handler.to_mcp_server_handler(),
AxumServerOptions {
host: "127.0.0.1".into(),
health_endpoint: Some("/health".into()),
..Default::default()
},
);
貢献
貢献したい皆さまを歓迎します。詳細については、貢献ガイドラインをご覧ください。
プロジェクトのセットアップ、ビルド、テスト、フォーマット、サンプルプロジェクトの実行方法については、開発ガイドをご覧ください。
イシューやプルリクエストを含むすべての貢献は、Rust の行動規範に従う必要があります。
別途明示されていない限り、rust-mcp-sdk への収録を目的として提出された貢献は、追加の条件や制限なしに MIT ライセンスの条件に基づいて提供されます。
開発
プロジェクトのセットアップ、ビルド、テスト、フォーマット、サンプルプロジェクトの実行方法については、開発ガイドをご覧ください。
ライセンス
このプロジェクトは MIT ライセンスの下でライセンスされています。詳細については、LICENSE ファイルをご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。