rust-mcp-sdk 0.10.0

An asynchronous SDK and framework for building MCP-Servers and MCP-Clients, leveraging the rust-mcp-schema for type safe MCP Schema Objects.
Documentation
use thiserror::Error;

pub type McpHttpResult<T> = core::result::Result<T, McpHttpError>;

#[derive(Debug, Clone, Error)]
pub enum McpHttpError {
    #[error("'sessionId' query string is missing!")]
    SessionIdMissing,

    #[error("No session found for the given ID: {0}.")]
    SessionIdInvalid(String),

    #[error("Stream IO Error: {0}.")]
    StreamIoError(String),

    #[error("{0}")]
    HttpError(String),

    #[error("{0}")]
    TransportError(String),
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn display_session_id_missing() {
        let err = McpHttpError::SessionIdMissing;
        assert_eq!(format!("{}", err), "'sessionId' query string is missing!");
    }

    #[test]
    fn display_session_id_invalid() {
        let err = McpHttpError::SessionIdInvalid("abc-123".into());
        assert_eq!(
            format!("{}", err),
            "No session found for the given ID: abc-123."
        );
    }

    #[test]
    fn display_stream_io_error() {
        let err = McpHttpError::StreamIoError("broken pipe".into());
        assert_eq!(format!("{}", err), "Stream IO Error: broken pipe.");
    }

    #[test]
    fn display_http_error() {
        let err = McpHttpError::HttpError("bad request".into());
        assert_eq!(format!("{}", err), "bad request");
    }

    #[test]
    fn display_transport_error() {
        let err = McpHttpError::TransportError("timeout".into());
        assert_eq!(format!("{}", err), "timeout");
    }

    #[test]
    fn clone_preserves_value() {
        let err = McpHttpError::SessionIdInvalid("xyz".into());
        let cloned = err.clone();
        assert_eq!(format!("{}", err), format!("{}", cloned));
    }

    #[test]
    fn debug_format_includes_variant() {
        let err = McpHttpError::SessionIdMissing;
        let debug = format!("{:?}", err);
        assert!(debug.contains("SessionIdMissing"));
    }

    #[test]
    fn clone_unit_variant() {
        let err = McpHttpError::SessionIdMissing;
        let cloned = err.clone();
        assert_eq!(format!("{:?}", err), format!("{:?}", cloned));
    }

    #[test]
    fn http_result_ok() {
        let result: McpHttpResult<i32> = Ok(42);
        assert_eq!(result.unwrap(), 42);
    }

    #[test]
    fn http_result_err() {
        let result: McpHttpResult<i32> = Err(McpHttpError::HttpError("fail".into()));
        assert!(result.is_err());
        assert_eq!(format!("{}", result.unwrap_err()), "fail");
    }
}