use std::collections::HashMap; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Deserialize, Serialize)] pub struct McpConfig { pub servers: Vec, } #[derive(Debug, Clone, Deserialize, Serialize)] pub struct McpServerConfig { pub name: String, #[serde(flatten)] pub transport: McpTransport, } #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(tag = "protocol", rename_all = "lowercase")] pub enum McpTransport { Stdio { command: String, #[serde(default)] args: Vec, #[serde(default)] envs: HashMap, }, Sse { url: String, #[serde(skip_serializing_if = "Option::is_none")] token: Option, }, Streamable { url: String, #[serde(skip_serializing_if = "Option::is_none")] token: Option, }, } impl McpConfig { /// Load configuration from a YAML file pub async fn from_file(path: &str) -> Result> { let content = tokio::fs::read_to_string(path).await?; let config: Self = serde_yaml::from_str(&content)?; Ok(config) } /// Load configuration from environment variables (optional) pub fn from_env() -> Option { // This could be expanded to read from env vars // For now, return None to indicate env config not implemented None } }