Skip to main content

mcp_sql/
error.rs

1use rmcp::model::ErrorData;
2
3#[derive(Debug, thiserror::Error)]
4pub enum McpSqlError {
5    #[error("Database error: {0}")]
6    Database(#[from] sqlx::Error),
7
8    #[error("Write operation rejected: {0}")]
9    ReadOnly(String),
10
11    #[error("Database not found: {0}")]
12    DatabaseNotFound(String),
13
14    #[error("Ambiguous database: multiple databases connected, specify the 'database' parameter")]
15    AmbiguousDatabase,
16
17    #[error("Invalid SQL: {0}")]
18    InvalidSql(String),
19
20    #[error("Query timed out after {0} seconds")]
21    QueryTimeout(u64),
22
23    #[error("{0}")]
24    Other(String),
25}
26
27impl McpSqlError {
28    pub fn to_mcp_error(&self) -> ErrorData {
29        match self {
30            McpSqlError::ReadOnly(_) | McpSqlError::InvalidSql(_) => {
31                ErrorData::invalid_params(self.to_string(), None)
32            }
33            McpSqlError::DatabaseNotFound(_) | McpSqlError::AmbiguousDatabase => {
34                ErrorData::invalid_params(self.to_string(), None)
35            }
36            McpSqlError::QueryTimeout(_) => {
37                ErrorData::internal_error(self.to_string(), None)
38            }
39            McpSqlError::Database(_) | McpSqlError::Other(_) => {
40                ErrorData::internal_error(self.to_string(), None)
41            }
42        }
43    }
44}