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#[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 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}