use anyhow::{Result, anyhow};
use super::stdio_server::run_mcp_stdio;
use super::streamable_http::run_mcp_http;
use super::transport::TransportType;
#[derive(Clone, Debug)]
pub struct McpConfig {
pub transport: TransportType,
pub bind_address: Option<String>,
pub port: Option<u16>,
pub route_path: Option<String>,
pub allowed_networks: Option<Vec<String>>,
}
impl Default for McpConfig {
fn default() -> Self {
Self {
transport: TransportType::Stdio,
bind_address: None,
port: None,
route_path: None,
allowed_networks: None,
}
}
}
#[tokio::main]
pub async fn run_mcp(config: McpConfig) -> Result<()> {
run_mcp_async(config).await
}
fn validate_http_config(config: &McpConfig) -> Result<(&str, u16, &str)> {
let bind = config
.bind_address
.as_deref()
.ok_or_else(|| anyhow!("bind_address is required when using StreamableHTTP transport"))?;
let port = config
.port
.ok_or_else(|| anyhow!("port is required when using StreamableHTTP transport"))?;
let route = config
.route_path
.as_deref()
.ok_or_else(|| anyhow!("route_path is required when using StreamableHTTP transport"))?;
Ok((bind, port, route))
}
pub async fn run_mcp_async(config: McpConfig) -> Result<()> {
match config.transport {
TransportType::Stdio => run_mcp_stdio().await,
TransportType::StreamableHTTP => {
let (bind, port, route) = validate_http_config(&config)?;
run_mcp_http(bind, port, route, config.allowed_networks.clone()).await
},
}
}