Model Context Protocol (MCP) Schema for Rust について
MCP Schema for Rust は、公式の Model Context Protocol スキーマを型安全に実装した Rust ライブラリで、複数のプロトコルバージョンを自動生成により提供します。Rust で MCP サーバーやクライアントを開発する開発者を対象とし、スキーマの型定義とシリアライズのみを提供します。
主な機能
- 01型安全な MCP プロトコル構造体
- 02公式仕様から自動生成されるスキーマ
- 032024-11-05 以降の複数プロトコルバージョンへの対応
- 04オプションの schema_utils ヘルパーモジュール
- 05serde_json によるシリアライズとデシリアライズ
活用シーン
- 01Rust の MCP サーバーで tools/call リクエストを解析する
- 02Rust の MCP クライアントで CallToolResult レスポンスを判別する
MCP 対応
本クレートは MCP プロトコルの Rust 型定義を提供し、サーバーやクライアントがメッセージを符号化・復号する際に利用されます。それ自体は実行可能なサーバーやクライアントではありません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Rust 向け Model Context Protocol (MCP) スキーマ
公式の Model Context Protocol (MCP) スキーマを型安全な Rust で実装しており、公式 MCP プロトコルのすべてのバージョンをサポートしています。
2026-07-28(デフォルト)2025-11-252025-06-182025-03-262024-11-05draft
このリポジトリの MCP スキーマは、公式の Model Context Protocol から自動生成されるため、常に最新の状態に保たれ、最新の公式仕様に準拠しています。
注意: このクレートは、MCP スキーマの実装のみを提供します。
MCP サーバーとクライアントを構築するための高性能な非同期ツールキットをお探しの場合は、rust-mcp-sdkをご覧ください。
rust-mcp-sdkに残りの処理を任せて、アプリのロジックに集中できます。
目次:
機能
- 🧩 MCP プロトコル仕様の型安全な実装です。
- 💎 自動生成されるスキーマは、公式のスキーマ仕様と常に同期されています。
- 📜
2026-07-28、2025-11-25、2025-06-18、2025-03-26、2024-11-05のすべての公式リリース版に加え、早期導入向けのdraft版も含まれています。 - 🛠 生産性を高め、開発の健全性を確保するための、スキーマユーティリティモジュール(schema_utils)も付属しています。
このクレートはどのように使用できますか?
このクレートは、公式の Model Context Protocol(MCP)スキーマを Rust で実装したものです。
Model Context Protocol(MCP)は、LLM アプリケーションと外部のデータソースやツールとのシームレスな統合を可能にするオープンプロトコルです。AI 対応 IDE の構築、チャットインターフェースの強化、カスタム AI ワークフローの作成など、MCP は LLM を必要なコンテキストに接続する標準化された方法を提供します。
このクレートには、serde_json による serialization / deserialization のサポートを備えたスキーマと、構造体および列挙型に必要なトレイトの最小限の実装が含まれています。これにより、リクエスト、レスポンス、通知、エラーなど、さまざまな MCP メッセージの作成と使用が容易になります。
このクレートは、Rust で MCP サーバーまたはMCP クライアントを開発する際に使用できます。 MCP アーキテクチャの詳細については、公式ドキュメントを参照してください。
rust-mcp-schema をベースにした、高性能で非同期の MCP サーバーおよびクライアント構築用ツールキット、rust-mcp-sdk もぜひご覧ください。rust-mcp-sdk が残りの処理を担うので、アプリのロジックに集中できます!
スキーマのバージョン
このリポジトリでは、ドラフト版を含む、公式にリリースされたすべてのバージョンのスキーマを提供しています。これにより、今後の公式スキーマのリリースに先立って、アプリケーションの準備や調整を進められます。
異なるスキーマのバージョンを切り替えるには?
デフォルトでは、MCP プロトコルスキーマの最新バージョンが有効になっています。
各スキーマバージョンには対応する Cargo 機能があり、プロジェクトの Cargo.toml で有効にできます。
必要に応じて、複数のスキーマバージョンを同時に有効にできます。デフォルト以外のバージョンは、次の例のように明示的な名前が付いたモジュールで利用できます。
- rust_mcp_schema::mcp_2025_06_18
- rust_mcp_schema::mcp_2025_11_25
📌 注:直近の 3 つのスキーマ(
2026_07_28、2025_11_25、draft)はクレートのルートでも再エクスポートされるため、相互排他的です。一度に有効にできるのはそのうち 1 つだけです。古いバージョン(2025_06_18、2025_03_26、2024_11_05)はモジュールとしてのみ利用でき、これらのうち任意の 1 つと組み合わせられます。
例:スキーマの 2025-06-18 バージョンを有効にする:
# Cargo.toml
rust-mcp-schema = { version: 2.0.0 , default-features = false, features=["2025_06_18"] }
例:スキーマの draft バージョンを有効にする:
#Cargo.toml
rust-mcp-schema = { version: 2.0.0 , default-features = false, features=["draft"] }
スキーマはどのように生成されますか?
スキーマは、元の Model Context Protocol(MCP)リポジトリで公開されている公式の schema.ts ファイルと schema.json ファイルから生成されます。
カスタマイズした typify に加え、追加の前処理および後処理を行い、スキーマ仕様を Rust コードに変換します。
📌 注
schema.tsおよびschema.jsonからスキーマを生成するコードは、このリポジトリには含まれていません。ただし、将来的に CLI ツールとして公開することを検討しています。これにより、開発者はプロジェクトに直接組み込める Rust コードとして MCP スキーマを生成できます。
schema_utils とは?
このクレートの MCP スキーマの Rust 実装は、公式 MCP GitHub リポジトリから自動生成されています。
mcp_schema.rs には、シリアライズ/デシリアライズに対応したすべてのコア構造体と列挙型が用意されており、必要に応じて使用したり、機能を拡張したりできます。
開発を効率化し、コンパイル時の型チェックを強化して、エラーの発生を抑えるために、元の自動生成スキーマを変更せずに、より強い型付けを備えたオブジェクトと実装を提供するユーティリティ型および関数を実装しています。
詳細については、schema_utils.rs を参照してください。
📌 注意
schema_utils の使用は任意です。schema_utils Cargo feature によってデフォルトで有効になっており、
rust_mcp_schema::schema_utilsから使用できます。
schema_utils を使用しない場合は、mcp_schema.rs で提供されている列挙型と構造体を直接扱い、必要に応じて調整したり、それらを使って独自のユーティリティ型や関数を作成したりできます。
別の方法については、使用例(schema_utils を使用しない場合) をご覧ください。
schema_utils では何ができますか?
公式スキーマでは、MCP プロトコル内のすべてのメッセージと通知を包含する統一型 JsonrpcMessage が定義されています。
型安全性と使いやすさを高めるため、schema_utils では JsonrpcMessage を ClientMessage と ServerMessage の 2 つのカテゴリに分けています。各カテゴリには、標準メッセージとカスタムメッセージの両方に対応する型が含まれています。
詳細については、schema_utils.rs と使用例のセクションを参照してください。
使用例
:point_right: 以下の例では、アプリケーションが JSON-RPC メッセージを文字列としてすでに受信していることを前提に、スキーマメッセージのシリアライズとデシリアライズのみを扱います。
MCP サーバーで CallToolRequest メッセージを検出する
次のコード例では、JSON 文字列で表された MCP メッセージを ClientMessage にデシリアライズし、CallToolRequest メッセージとして識別する方法を示します。
注意:ClientMessage は、MCP クライアントから送信された MCP メッセージを表します。次のコードでは、MCP サーバーが MCP クライアントから受信したメッセージをデシリアライズする方法を示します。
pub fn handle_message(message_payload: &str) -> std::result::Result<(), RpcError> {
// Deserialize message into ClientMessage.
let message = ClientMessage::from_str(message_payload)?;
// Check if the message is a Request
if let ClientMessage::Request(client_request) = message {
// Requests delegate to the schema-generated `ClientRequest` enum via `ClientJsonrpcRequest::Known`
if let ClientJsonrpcRequest::Known(ClientRequest::CallToolRequest(call_tool_request)) = client_request {
// Process the CallToolRequest (and eventually send a CallToolResult back to the client)
handle_call_tool_request(call_tool_request);
}
}
Ok(())
}
すべての ClientMessage バリアントを処理する完全な match 実装については、examples/mcp_server_handle_message.rs を参照してください。
MCP サーバーで CallToolResult レスポンスを作成する
CallToolRequest に応答して、MCP サーバーは CallToolResult メッセージを返すことが期待されます。
次のコード例では、CallToolResult を作成して文字列にシリアライズし、トランスポート層を介してクライアントに送り返す方法を示します。
// create a CallToolResult object (the builder sets `resultType: "complete"`)
let tool_result = CallToolResult::text_content(vec![TextContent::new(
"Sunny, 22°C in Paris.".to_string(),
None,
None,
)]);
// wrap it in a JSON-RPC response envelope addressed to the request's `id`
let message = ServerJsonrpcResponse::new(RequestId::Integer(0), tool_result.into());
// Serialize the MCP message into a valid JSON string for sending to the client
let json_payload = serde_json::to_string(&message).unwrap();
println!("{}", json_payload);
出力:
{
"id": 0,
"jsonrpc": "2.0",
"result": {
"content": [{ "type": "text", "text": "Sunny, 22°C in Paris." }],
"resultType": "complete"
}
}
MCP クライアントで CallToolResult レスポンスメッセージを検出する:
fn handle_message(message_payload: &str) -> std::result::Result<(), AppError> {
// Deserialize message into ServerMessage.
// ServerMessage represents a message sent by an MCP Server and received by an MCP Client.
let mcp_message = ServerMessage::from_str(message_payload)?;
// Check if the message is a Response type of message
if let ServerMessage::Response(server_response) = mcp_message {
// Check if it's a CallToolResult response
if let ServerResult::CallToolResult(call_tool_result) = &server_response.result {
// Process the CallToolResult
handle_call_tool_result(call_tool_result);
}
}
Ok(())
}
すべての ServerMessage バリアントを処理する完全な match 実装については、mcp_client_handle_message.rs を参照してください。
使用例(schema_utils を使用しない場合)
schema_utils を使用しない場合は、アプリケーションで生成済みの型を直接扱うか、それらを使って独自のユーティリティを構築できます。
MCP サーバーで CallToolRequest メッセージを検出する(schema_utils を使用しない場合)
次のコード例では、MCP サーバーで CallToolRequest メッセージを検出する方法を示します:
fn handle_message(message_payload: &str) -> std::result::Result<(), AppError> {
// Deserialize the JSON-RPC payload directly into ClientRequest.
// Its `Deserialize` impl dispatches on the `method` field.
let client_request: ClientRequest = serde_json::from_str(message_payload).unwrap();
// Check it's a "tools/call" request
if let ClientRequest::CallToolRequest(call_tool_request) = client_request {
// Now that we can handle the message, we simply print out the details.
println!("CallTool request received!");
println!("Tool name : {:?} ", call_tool_request.params.name);
println!("Arguments : {:?} ", call_tool_request.params.arguments);
}
Ok(())
}
コントリビューション
貢献を希望される方は、どなたでも歓迎します!詳細については、コントリビューションガイドラインをご覧ください。
イシューやプルリクエストを含むすべての貢献は、 Rust の行動規範に従う必要があります。
明示的に別途記載されていない限り、rust-mcp-schemaへの掲載のために提出された貢献は、追加の条件や制限なしに、MIT ライセンスの条件に基づいて提供されます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。