rust_mcp_sdk/
error.rs

1use crate::schema::{ParseProtocolVersionError, RpcError};
2
3use rust_mcp_transport::error::TransportError;
4use thiserror::Error;
5use tokio::task::JoinError;
6
7#[cfg(feature = "hyper-server")]
8use crate::hyper_servers::error::TransportServerError;
9
10pub type SdkResult<T> = core::result::Result<T, McpSdkError>;
11
12#[derive(Debug, Error)]
13pub enum McpSdkError {
14    #[error("{0}")]
15    RpcError(#[from] RpcError),
16    #[error("{0}")]
17    IoError(#[from] std::io::Error),
18    #[error("{0}")]
19    TransportError(#[from] TransportError),
20    #[error("{0}")]
21    JoinError(#[from] JoinError),
22    #[error("{0}")]
23    AnyError(Box<(dyn std::error::Error + Send + Sync)>),
24    #[error("{0}")]
25    SdkError(#[from] crate::schema::schema_utils::SdkError),
26    #[cfg(feature = "hyper-server")]
27    #[error("{0}")]
28    TransportServerError(#[from] TransportServerError),
29    #[error("Incompatible mcp protocol version: requested:{0} current:{1}")]
30    IncompatibleProtocolVersion(String, String),
31    #[error("{0}")]
32    ParseProtocolVersionError(#[from] ParseProtocolVersionError),
33}
34
35impl McpSdkError {
36    /// Returns the RPC error message if the error is of type `McpSdkError::RpcError`.
37    pub fn rpc_error_message(&self) -> Option<&String> {
38        if let McpSdkError::RpcError(rpc_error) = self {
39            return Some(&rpc_error.message);
40        }
41        None
42    }
43}
44
45#[deprecated(since = "0.2.0", note = "Use `McpSdkError` instead.")]
46pub type MCPSdkError = McpSdkError;