openmcpgdb 0.1.6

Interactive MCP server to control gdb. Fully featured and written in rust
Documentation
use crate::error::{OpenMcpGdbError, Result};
use serde::{Deserialize, Serialize};
use std::path::{Path, PathBuf};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerConfig {
    pub gdb_path: PathBuf,
    #[serde(default)]
    pub gdb_options: String,
    pub codebase_dir: PathBuf,
    pub executable_path: PathBuf,
    #[serde(default = "default_server_name")]
    pub mcp_server_name: String,
    #[serde(default = "default_server_url")]
    pub mcp_server_url: String,
    #[serde(default = "default_lines_before")]
    pub display_lines_before_current: usize,
    #[serde(default = "default_lines_after")]
    pub display_lines_after_current: usize,
    #[serde(default = "default_backtrace")]
    pub display_backtrace: usize,
    #[serde(default = "default_variable_list")]
    pub display_variable_list: usize,
    #[serde(default)]
    pub display_join_current_code: bool,
}

fn default_server_name() -> String {
    "MCP GDB Server".to_string()
}

fn default_server_url() -> String {
    "https://localhost:9443".to_string()
}

fn default_lines_before() -> usize {
    7
}

fn default_lines_after() -> usize {
    8
}

fn default_backtrace() -> usize {
    6
}

fn default_variable_list() -> usize {
    9
}

impl ServerConfig {
    pub fn from_file(path: &Path) -> Result<Self> {
        let data = std::fs::read_to_string(path).map_err(OpenMcpGdbError::Io)?;
        let config: Self = serde_json::from_str(&data).map_err(OpenMcpGdbError::Json)?;
        config.validate()?;
        Ok(config)
    }

    pub fn validate(&self) -> Result<()> {
        if !self.gdb_path.is_absolute() {
            return Err(OpenMcpGdbError::InvalidConfig(
                "gdb_path must be absolute".to_string(),
            ));
        }
        if !self.codebase_dir.is_absolute() {
            return Err(OpenMcpGdbError::InvalidConfig(
                "codebase_dir must be absolute".to_string(),
            ));
        }
        if !self.executable_path.is_absolute() {
            return Err(OpenMcpGdbError::InvalidConfig(
                "executable_path must be absolute".to_string(),
            ));
        }
        if self.display_backtrace == 0 {
            return Err(OpenMcpGdbError::InvalidConfig(
                "display_backtrace must be > 0".to_string(),
            ));
        }
        if self.display_variable_list == 0 {
            return Err(OpenMcpGdbError::InvalidConfig(
                "display_variable_list must be > 0".to_string(),
            ));
        }
        Ok(())
    }
}