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 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;