use anyhow::Result;
use tracing::info;
use crate::mcp::handler::McpHandler;
#[derive(Debug, Clone, Copy, Default, clap::ValueEnum)]
pub enum Transport {
#[default]
Stdio,
}
#[derive(Debug, Clone)]
pub struct McpConfig {
pub transport: Transport,
pub bind: Option<String>,
pub database: Option<std::path::PathBuf>,
}
impl Default for McpConfig {
fn default() -> Self {
Self {
transport: Transport::Stdio,
bind: None,
database: None,
}
}
}
pub async fn serve(config: McpConfig) -> Result<()> {
info!("Starting MCP server with {:?} transport", config.transport);
let handler = McpHandler::new(config.database);
match config.transport {
Transport::Stdio => {
let (stdin, stdout) = rmcp::transport::io::stdio();
let server = rmcp::serve_server(handler, (stdin, stdout)).await?;
server
.waiting()
.await
.map_err(|e| anyhow::anyhow!("Server join error: {e}"))?;
}
}
Ok(())
}