sand-mcp-fs 0.1.0

MCP filesystem server with sandbox security based on cap-std
Documentation
use thiserror::Error;

#[derive(Debug, Error)]
pub enum FsError {
    #[error("Path not allowed: {0}")]
    PathNotAllowed(String),

    #[error("Not found: {0}")]
    NotFound(String),

    #[error("Not a directory: {0}")]
    NotDirectory(String),

    #[error("Not a file: {0}")]
    NotFile(String),

    #[error("Permission denied: {0}")]
    PermissionDenied(String),

    #[error("IO error: {0}")]
    Io(#[from] std::io::Error),

    #[error("Invalid path: {0}")]
    InvalidPath(String),

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

    #[error("File too large")]
    FileTooLarge,

    #[error("Operation not supported: {0}")]
    NotSupported(String),
}

impl From<FsError> for rmcp::ErrorData {
    fn from(err: FsError) -> Self {
        match err {
            FsError::PathNotAllowed(path) => {
                rmcp::ErrorData::invalid_params(format!("Path not allowed: {}", path), None)
            }
            FsError::PermissionDenied(msg) => {
                rmcp::ErrorData::invalid_params(format!("Permission denied: {}", msg), None)
            }
            FsError::NotFound(path) => {
                rmcp::ErrorData::invalid_params(format!("Not found: {}", path), None)
            }
            FsError::NotDirectory(path) => {
                rmcp::ErrorData::invalid_params(format!("Not a directory: {}", path), None)
            }
            FsError::NotFile(path) => {
                rmcp::ErrorData::invalid_params(format!("Not a file: {}", path), None)
            }
            _ => rmcp::ErrorData::internal_error(err.to_string(), None),
        }
    }
}

#[allow(dead_code)]
pub type Result<T> = std::result::Result<T, FsError>;