mcpField
R
Rust MCP SDK

Rust MCP SDK

ローカル
github.com/rust-mcp-stack開発ツール1982 日前に更新

Rust MCP SDK について

Rust MCP SDKは、MCPサーバーとクライアントを開発するための非同期Rustツールキットです。複数のトランスポート、HTTPフレームワーク連携、型安全なスキーマ、手続き型マクロを備えています。

主な機能

  1. 01MCPサーバーとクライアントの構築
  2. 02stdio、Streamable HTTP、SSEに対応
  3. 03AxumとActixとの連携
  4. 04型安全なスキーマと手続き型マクロ
  5. 05OAuth認証に対応

活用シーン

  1. 01RustでのMCPサーバー実装
  2. 02アプリケーションへのMCPクライアント追加
  3. 03既存のHTTPアプリへのMCPエンドポイント追加
  4. 04MCPサーバーへのOAuth設定

MCP 対応

MCPサーバーとクライアントの開発に使え、プロトコルやトランスポートの処理を担い、双方の認証機能も提供します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Rust MCP SDK

crates.io docs.rs build status conformance tier-check

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.02026-07-28 MCP(ステートレス)main
1.x(LTS)2025-11-25 MCPrelease-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 認証
  • ✅ MCP クライアント向け OAuth 認証(メタデータの検出、CIMD、PKCE、トークンの更新、プラグ可能なストレージ)
  • ✅ 発行者にバインドされた認証情報(SEP-2352)、厳密な iss 検証(SEP-2468)

目次

クイックスタート

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 エンドポイントをマウントできます。

バックエンド関数ドキュメント
Axummcp_routes(state, &mount_opts, http_handler)rust-mcp-axum README
Actix-webmcp_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 の例をご覧ください。

Rust の hello world MCP サーバー

マクロ

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 ファイルをご覧ください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。