Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ documentation = "https://docs.rs/rust-mcp-schema"
keywords = ["rust-mcp-stack", "model", "context", "protocol", "schema"]
license = "MIT"
edition = "2021"
rust-version = "1.80.0"


[lib]
path = "src/rust-mcp-schema.rs"
Expand All @@ -24,24 +26,26 @@ json5 = { version = "0.4" }


[package.metadata.docs.rs]
features = ["2025_06_18", "schema_utils"]
features = ["2025_11_25", "schema_utils"]
rustdoc-args = ["--generate-link-to-definition"]

[package.metadata.playground]
features = ["2025_06_18", "schema_utils"]
features = ["2025_11_25", "schema_utils"]

### FEATURES #################################################################

# Features to enable different schema versions and associated schema_utils
[features]

# default features
default = ["2025_06_18", "schema_utils"] # Default features
default = ["2025_11_25", "schema_utils"] # Default features

# activates the latest MCP schema version, this will be updated once a new version of schema is published
latest = ["2025_06_18"]
latest = ["2025_11_25"]
# enabled mcp schema version 2025_11_25
2025_11_25 = ["latest"]
# enabled mcp schema version 2025_06_18
2025_06_18 = ["latest"]
2025_06_18 = []
# enabled mcp schema version 2025_03_26
2025_03_26 = []
# enabled mcp schema version 2024_11_05
Expand Down
25 changes: 16 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@
[<img alt="build status" src="https://img.shields.io/github/actions/workflow/status/rust-mcp-stack/rust-mcp-schema/ci.yml?style=for-the-badge" height="22">
](https://github.com/rust-mcp-stack/rust-mcp-schema/actions/workflows/ci.yml)

A type-safe Rust implementation of the official Model Context Protocol (MCP) schema, supporting all official released versions including `2025_06_18`, `2025_03_26`, `2024_11_05` and `draft` version for early adoption.
A type-safe Rust implementation of the official Model Context Protocol (MCP) schema, supporting all official MCP Protocol versions:

- `2025-11-25`
- `2025-06-18`
- `2025-03-26`
- `2024-11-05`
- `draft`

The MCP schemas in this repository are [automatically generated](#how-are-schemas-generated) from the official Model Context Protocol, ensuring they are always up-to-date and aligned with the latest official specifications.

Expand Down Expand Up @@ -46,7 +52,7 @@ Focus on your app's logic while [rust-mcp-sdk](https://crates.io/crates/rust-mcp

- 🧩 Type-safe implementation of the MCP protocol specification.
- 💎 Auto-generated schemas are always synchronized with the official schema specifications.
- 📜 Includes all official released versions : `2025_06_18`, `2025_03_26`, `2024_11_05` and `draft` version for early adoption.
- 📜 Includes all official released versions : `2025-11-25`, `2025-06-18`, `2025-03-26`, `2024-11-05` and `draft` version for early adoption.
- 🛠 Complimentary schema utility module (schema_utils) to boost productivity and ensure development integrity.

## How can this crate be used?
Expand All @@ -70,9 +76,10 @@ For more information on the MCP architecture, refer to the [official documentati

This repository provides all official released versions the schema , including draft version, enabling you to prepare and adapt your applications ahead of upcoming official schema releases.

- [2025_06_18](src/generated_schema/2025_06_18)
- [2025_03_26](src/generated_schema/2025_03_26)
- [2024_11_05](src/generated_schema/2024_11_05)
- [2025-11-25](src/generated_schema/2025_11_25)
- [2025-06-18](src/generated_schema/2025_06_18)
- [2025-03-26](src/generated_schema/2025_03_26)
- [2024-11-05](src/generated_schema/2024_11_05)
- [draft](src/generated_schema/draft)

### How to switch between different schema versions?
Expand All @@ -83,19 +90,19 @@ Each schema version has a corresponding Cargo feature that can be enabled in you

Multiple schema versions may be enabled concurrently if needed. Non-default versions are available under explicitly named modules, for example:

- rust_mcp_schema::mcp_2024_11_05
- rust_mcp_schema::mcp_2025_06_18
- rust_mcp_schema::mcp_draft"

Example: enable `2024_11_05` version of the schema:
Example: enable `2025-06-18` version of the schema:

<!-- x-release-please-start-version -->

```toml
# Cargo.toml
rust-mcp-schema = { version: 0.7.5 , default-features = false, features=["2024_11_05"] }
rust-mcp-schema = { version: 0.7.5 , default-features = false, features=["2025_06_18"] }
```

Example: enable `draft`` version of the schema (2024_11_05) :
Example: enable `draft`` version of the schema :

```toml
#Cargo.toml
Expand Down
48 changes: 47 additions & 1 deletion examples/mcp_client_handle_message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ mod schema {
pub use rust_mcp_schema::*;
}

#[cfg(feature = "2025_06_18")]
mod schema {
pub use rust_mcp_schema::mcp_2025_06_18::schema_utils::*;
pub use rust_mcp_schema::mcp_2025_06_18::*;
}

#[cfg(feature = "2024_11_05")]
mod schema {
pub use rust_mcp_schema::mcp_2024_11_05::schema_utils::*;
Expand Down Expand Up @@ -77,10 +83,26 @@ fn handle_message(message_payload: &str) -> std::result::Result<(), AppError> {
ServerRequest::ListRootsRequest(list_roots_request) => {
dbg!(list_roots_request);
}
#[cfg(any(feature = "2025_06_18", feature = "draft"))]
#[cfg(any(feature = "2025_06_18", feature = "2025_11_25", feature = "draft"))]
ServerRequest::ElicitRequest(elicit_request) => {
dbg!(elicit_request);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ServerRequest::GetTaskRequest(get_task_request) => {
dbg!(get_task_request);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ServerRequest::GetTaskPayloadRequest(get_task_payload_request) => {
dbg!(get_task_payload_request);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ServerRequest::CancelTaskRequest(cancel_task_request) => {
dbg!(cancel_task_request);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ServerRequest::ListTasksRequest(list_tasks_request) => {
dbg!(list_tasks_request);
}
}
}
// Check if it's a CustomRequest; the value can be deserialized into your own custom types.
Expand Down Expand Up @@ -115,6 +137,14 @@ fn handle_message(message_payload: &str) -> std::result::Result<(), AppError> {
ServerNotification::LoggingMessageNotification(logging_message_notification) => {
dbg!(logging_message_notification);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ServerNotification::TaskStatusNotification(task_status_notification) => {
dbg!(task_status_notification);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ServerNotification::ElicitationCompleteNotification(elicitation_complete_notification) => {
dbg!(elicitation_complete_notification);
}
}
}
// Check if it's a CustomNotification; the value can be deserialized into your custom types.
Expand Down Expand Up @@ -156,6 +186,22 @@ fn handle_message(message_payload: &str) -> std::result::Result<(), AppError> {
ServerResult::CompleteResult(complete_result) => {
dbg!(complete_result);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ServerResult::GetTaskResult(get_task_result) => {
dbg!(get_task_result);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ServerResult::GetTaskPayloadResult(get_task_payload_result) => {
dbg!(get_task_payload_result);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ServerResult::CancelTaskResult(cancel_task_result) => {
dbg!(cancel_task_result);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ServerResult::ListTasksResult(list_tasks_result) => {
dbg!(list_tasks_result);
}
},
// Check if it's a CustomResult; the value can be deserialized into your custom types.
ResultFromServer::CustomResult(value) => {
Expand Down
58 changes: 43 additions & 15 deletions examples/mcp_server_handle_message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ mod schema {
pub use rust_mcp_schema::*;
}

#[cfg(feature = "2025_06_18")]
mod schema {
pub use rust_mcp_schema::mcp_2025_06_18::schema_utils::*;
pub use rust_mcp_schema::mcp_2025_06_18::*;
}

#[cfg(feature = "2024_11_05")]
mod schema {
pub use rust_mcp_schema::mcp_2024_11_05::schema_utils::*;
Expand Down Expand Up @@ -68,53 +74,58 @@ fn handle_message(message_payload: &str) -> std::result::Result<(), AppError> {
ClientRequest::InitializeRequest(initialize_request) => {
dbg!(initialize_request);
}

ClientRequest::PingRequest(ping_request) => {
dbg!(ping_request);
}
ClientRequest::ListResourcesRequest(list_resources_request) => {
dbg!(list_resources_request);
}

ClientRequest::ListResourceTemplatesRequest(list_resource_templates_request) => {
dbg!(list_resource_templates_request);
}

ClientRequest::ReadResourceRequest(read_resource_request) => {
dbg!(read_resource_request);
}

ClientRequest::SubscribeRequest(subscribe_request) => {
dbg!(subscribe_request);
}

ClientRequest::UnsubscribeRequest(unsubscribe_request) => {
dbg!(unsubscribe_request);
}

ClientRequest::ListPromptsRequest(list_prompts_request) => {
dbg!(list_prompts_request);
}

ClientRequest::GetPromptRequest(get_prompt_request) => {
dbg!(get_prompt_request);
}

ClientRequest::ListToolsRequest(list_tools_request) => {
dbg!(list_tools_request);
}

ClientRequest::CallToolRequest(call_tool_request) => {
dbg!(call_tool_request);
}

ClientRequest::SetLevelRequest(set_level_request) => {
dbg!(set_level_request);
}

ClientRequest::CompleteRequest(complete_request) => {
dbg!(complete_request);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ClientRequest::GetTaskRequest(get_task_request) => {
dbg!(get_task_request);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ClientRequest::GetTaskPayloadRequest(get_task_payload_request) => {
dbg!(get_task_payload_request);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ClientRequest::CancelTaskRequest(cancel_task_request) => {
dbg!(cancel_task_request);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ClientRequest::ListTasksRequest(list_tasks_request) => {
dbg!(list_tasks_request);
}
},

// Check if it's a CustomRequest; the value can be deserialized into your own custom types.
Expand All @@ -132,18 +143,19 @@ fn handle_message(message_payload: &str) -> std::result::Result<(), AppError> {
ClientNotification::CancelledNotification(cancelled_notification) => {
dbg!(cancelled_notification);
}

ClientNotification::InitializedNotification(initialized_notification) => {
dbg!(initialized_notification);
}

ClientNotification::ProgressNotification(progress_notification) => {
dbg!(progress_notification);
}

ClientNotification::RootsListChangedNotification(progress_notification) => {
dbg!(progress_notification);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ClientNotification::TaskStatusNotification(task_status_notification) => {
dbg!(task_status_notification);
}
}
}

Expand All @@ -166,10 +178,26 @@ fn handle_message(message_payload: &str) -> std::result::Result<(), AppError> {
ClientResult::ListRootsResult(list_roots_result) => {
dbg!(list_roots_result);
}
#[cfg(any(feature = "2025_06_18", feature = "draft"))]
#[cfg(any(feature = "2025_06_18", feature = "2025_11_25", feature = "draft"))]
ClientResult::ElicitResult(elicit_result) => {
dbg!(elicit_result);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ClientResult::GetTaskResult(get_task_result) => {
dbg!(get_task_result);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ClientResult::GetTaskPayloadResult(get_task_payload_result) => {
dbg!(get_task_payload_result);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ClientResult::CancelTaskResult(cancel_task_result) => {
dbg!(cancel_task_result);
}
#[cfg(any(feature = "2025_11_25", feature = "draft"))]
ClientResult::ListTasksResult(list_tasks_result) => {
dbg!(list_tasks_result);
}
},

// Check if it's a CustomResult; the value can be deserialized into your custom types.
Expand Down
3 changes: 0 additions & 3 deletions rust-toolchain.toml

This file was deleted.

2 changes: 1 addition & 1 deletion scripts/run_clippy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
COMMON_FEATURES=("schema_utils")

# schema versions features (passed to clippy one at a time)
SCHEMA_VERSION_FEATURES=("2025_06_18", "2025_03_26", "2024_11_05", "draft")
SCHEMA_VERSION_FEATURES=("2025_11_25", "2025_06_18", "2025_03_26", "2024_11_05", "draft")

# space-separated string
COMMON_FEATURES_STR="${COMMON_FEATURES[*]}"
Expand Down
2 changes: 1 addition & 1 deletion scripts/run_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
COMMON_FEATURES=("schema_utils")

# schema versions features (tested one at a time)
SCHEMA_VERSION_FEATURES=("2025_06_18", "2025_03_26", "2024_11_05") #// TODO: add the "draft" tests back
SCHEMA_VERSION_FEATURES=("2025_11_25", "2025_06_18", "2025_03_26", "2024_11_05") #// TODO: add the "draft" tests back

# space-separated string
COMMON_FEATURES_STR="${COMMON_FEATURES[*]}"
Expand Down
17 changes: 14 additions & 3 deletions src/generated_schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ macro_rules! define_schema_version {
};
}

/// Latest MCP Protocol 2025_06_18
#[cfg(feature = "2025_06_18")]
pub use mcp_2025_06_18::*;
/// Latest MCP Protocol 2025_11_25
#[cfg(feature = "2025_11_25")]
pub use mcp_2025_11_25::*;

#[cfg(feature = "2025_06_18")]
define_schema_version!(
Expand Down Expand Up @@ -68,6 +68,17 @@ define_schema_version!(
__int_utils_2024_11_05
);

#[cfg(feature = "2025_11_25")]
define_schema_version!(
"2025_11_25",
mcp_2025_11_25,
"generated_schema/2025_11_25/mcp_schema.rs",
"generated_schema/2025_11_25/schema_utils.rs",
"generated_schema/2025_11_25/validators.rs",
__int_2025_11_25,
__int_utils_2025_11_25
);

#[cfg(feature = "draft")]
define_schema_version!(
"draft",
Expand Down
Loading