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}