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("Transport error: {0}")]
15    Transport(#[from] TransportError),
16
17    #[error("I/O error: {0}")]
18    Io(#[from] std::io::Error),
19
20    #[error("{0}")]
21    RpcError(#[from] RpcError),
22
23    #[error("{0}")]
24    Join(#[from] JoinError),
25
26    #[cfg(feature = "hyper-server")]
27    #[error("{0}")]
28    HyperServer(#[from] TransportServerError),
29
30    #[error("{0}")]
31    SdkError(#[from] crate::schema::schema_utils::SdkError),
32
33    #[error("Protocol error: {kind}")]
34    Protocol { kind: ProtocolErrorKind },
35}
36
37// Sub-enum for protocol-related errors
38#[derive(Debug, Error)]
39pub enum ProtocolErrorKind {
40    #[error("Incompatible protocol version: requested {requested}, current {current}")]
41    IncompatibleVersion { requested: String, current: String },
42    #[error("Failed to parse protocol version: {0}")]
43    ParseError(#[from] ParseProtocolVersionError),
44}
45
46impl McpSdkError {
47    /// Returns the RPC error message if the error is of type `McpSdkError::RpcError`.
48    pub fn rpc_error_message(&self) -> Option<&String> {
49        if let McpSdkError::RpcError(rpc_error) = self {
50            return Some(&rpc_error.message);
51        }
52        None
53    }
54}