use std::{collections::BTreeMap, path::PathBuf};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "transport", rename_all = "snake_case")]
pub enum ServerConfig {
Stdio {
command: String,
args: Vec<String>,
#[serde(default)]
env: BTreeMap<String, String>,
#[serde(default)]
cwd: Option<PathBuf>,
},
StreamableHttp {
url: String,
#[serde(default)]
oauth: Option<OAuthConfig>,
},
HttpSse {
url: String,
#[serde(default)]
oauth: Option<OAuthConfig>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OAuthConfig {
pub resource: String,
#[serde(default)]
pub client_id: Option<String>,
#[serde(default)]
pub authorization_server: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerInfo {
pub name: String,
pub version: String,
pub protocol_version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolDescriptor {
pub server: String,
pub name: String,
#[serde(default)]
pub description: Option<String>,
pub input_schema: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CallOutcome {
pub server: String,
pub tool: String,
pub is_error: bool,
pub content: serde_json::Value,
pub elapsed_ms: u64,
}
#[derive(Debug, Clone)]
pub struct MountedServer {
pub name: String,
pub config: ServerConfig,
pub mounted_at: DateTime<Utc>,
pub info: Option<ServerInfo>,
pub tools: Vec<ToolDescriptor>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerStatus {
pub name: String,
pub mounted_at: DateTime<Utc>,
pub tool_count: usize,
pub info: Option<ServerInfo>,
}