use rust_mcp_sdk::schema::schema_utils::CallToolError;
use serde_json;
#[derive(Debug, thiserror::Error)]
pub enum FoundryMcpError {
#[error("Parameter validation failed: {message}")]
InvalidParams { message: String },
#[error("CLI command execution failed: {source}")]
CliCommand {
#[from]
source: anyhow::Error,
},
#[error("JSON serialization failed: {source}")]
Serialization {
#[from]
source: serde_json::Error,
},
#[error("File system operation failed: {source}")]
Filesystem {
#[from]
source: std::io::Error,
},
#[error("Transport error: {message}")]
Transport { message: String },
#[error("Internal server error: {message}")]
Internal { message: String },
}
#[derive(Debug)]
pub struct InvalidParamsError(pub String);
impl std::fmt::Display for InvalidParamsError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Parameter validation failed: {}", self.0)
}
}
impl std::error::Error for InvalidParamsError {}
#[derive(Debug)]
pub struct InternalMcpError(pub String);
impl std::fmt::Display for InternalMcpError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Internal server error: {}", self.0)
}
}
impl std::error::Error for InternalMcpError {}
impl From<FoundryMcpError> for CallToolError {
fn from(err: FoundryMcpError) -> Self {
match err {
FoundryMcpError::InvalidParams { message } => {
CallToolError::new(InvalidParamsError(message))
}
FoundryMcpError::CliCommand { source } => {
CallToolError::new(InternalMcpError(format!("CLI command failed: {}", source)))
}
FoundryMcpError::Serialization { source } => CallToolError::new(InternalMcpError(
format!("JSON serialization failed: {}", source),
)),
FoundryMcpError::Filesystem { source } => {
CallToolError::new(InternalMcpError(format!("File system error: {}", source)))
}
FoundryMcpError::Transport { message } => {
CallToolError::new(InternalMcpError(format!("Transport error: {}", message)))
}
FoundryMcpError::Internal { message } => CallToolError::new(InternalMcpError(message)),
}
}
}
impl FoundryMcpError {
pub fn invalid_params<S: Into<String>>(message: S) -> Self {
FoundryMcpError::InvalidParams {
message: message.into(),
}
}
pub fn transport_error<S: Into<String>>(message: S) -> Self {
FoundryMcpError::Transport {
message: message.into(),
}
}
pub fn internal_error<S: Into<String>>(message: S) -> Self {
FoundryMcpError::Internal {
message: message.into(),
}
}
}