rmcp_openapi/
error.rs

1use rmcp::model::{ErrorCode, ErrorData};
2use thiserror::Error;
3
4#[derive(Debug, Error)]
5pub enum OpenApiError {
6    #[error("Environment variable error: {0}")]
7    EnvVar(#[from] std::env::VarError),
8    #[error("IO error: {0}")]
9    Io(#[from] std::io::Error),
10    #[error("HTTP request error: {0}")]
11    HttpRequest(#[from] reqwest::Error),
12    #[error("HTTP error: {0}")]
13    Http(String),
14    #[error("JSON parsing error: {0}")]
15    Json(#[from] serde_json::Error),
16    #[error("OpenAPI spec error: {0}")]
17    Spec(String),
18    #[error("Tool generation error: {0}")]
19    ToolGeneration(String),
20    #[error("Parameter validation error: {0}")]
21    Validation(String),
22    #[error("Tool not found: {0}")]
23    ToolNotFound(String),
24    #[error("Invalid parameter: {parameter} - {reason}")]
25    InvalidParameter { parameter: String, reason: String },
26    #[error("Invalid parameter location: {0}")]
27    InvalidParameterLocation(String),
28    #[error("Invalid URL: {0}")]
29    InvalidUrl(String),
30    #[error("File not found: {0}")]
31    FileNotFound(String),
32    #[error("MCP error: {0}")]
33    McpError(String),
34    #[error("Invalid path: {0}")]
35    InvalidPath(String),
36}
37
38impl From<OpenApiError> for ErrorData {
39    fn from(err: OpenApiError) -> Self {
40        match err {
41            OpenApiError::ToolNotFound(tool_name) => ErrorData::new(
42                ErrorCode(-32601),
43                format!("Tool '{tool_name}' not found"),
44                None,
45            ),
46            OpenApiError::InvalidParameter { parameter, reason } => ErrorData::new(
47                ErrorCode(-32602),
48                format!("Invalid parameter '{parameter}': {reason}"),
49                None,
50            ),
51            OpenApiError::Validation(msg) => {
52                ErrorData::new(ErrorCode(-32602), format!("Validation error: {msg}"), None)
53            }
54            OpenApiError::HttpRequest(e) => {
55                ErrorData::new(ErrorCode(-32000), format!("HTTP request failed: {e}"), None)
56            }
57            OpenApiError::Http(msg) => {
58                ErrorData::new(ErrorCode(-32000), format!("HTTP error: {msg}"), None)
59            }
60            OpenApiError::Spec(msg) => ErrorData::new(
61                ErrorCode(-32700),
62                format!("OpenAPI spec error: {msg}"),
63                None,
64            ),
65            OpenApiError::Json(e) => {
66                ErrorData::new(ErrorCode(-32700), format!("JSON parsing error: {e}"), None)
67            }
68            _ => ErrorData::new(ErrorCode(-32000), err.to_string(), None),
69        }
70    }
71}