use anyhow::Result;
use clap::Parser;
use context_creator::{cli::Config, run};
fn main() {
if let Err(err) = run_main() {
eprintln!("Error: {err:#}");
std::process::exit(1);
}
}
fn run_main() -> Result<()> {
let mut config = Config::parse();
if !config.mcp {
config.load_from_file()?;
}
config.validate()?;
if config.mcp || config.rmcp {
context_creator::logging::init_logging(&config)?;
run_mcp_server(config)?;
return Ok(());
}
context_creator::logging::init_logging(&config)?;
if config.should_read_stdin() {
use std::io::Read;
let mut buffer = String::new();
std::io::stdin().read_to_string(&mut buffer)?;
if config.prompt.is_none() {
config.prompt = Some(buffer.trim().to_string());
}
}
run(config)?;
Ok(())
}
#[tokio::main]
async fn run_mcp_server(config: Config) -> Result<()> {
use context_creator::mcp_server;
let rayon_threads = std::cmp::max(1, num_cpus::get() / 2);
rayon::ThreadPoolBuilder::new()
.num_threads(rayon_threads)
.thread_name(|i| format!("rayon-worker-{i}"))
.build_global()
.ok();
eprintln!("Configured Rayon thread pool with {rayon_threads} threads");
if config.rmcp {
match config.rmcp_transport.as_str() {
"stdio" => {
eprintln!("Starting RMCP MCP server (stdio transport)");
mcp_server::rmcp_server::transport::start_stdio().await?;
}
"http" => {
let addr = format!("127.0.0.1:{}", config.mcp_port);
eprintln!("Starting RMCP MCP server (HTTP/SSE transport) on {addr}");
mcp_server::rmcp_server::transport::start_http(&addr).await?;
}
_ => {
anyhow::bail!("Invalid RMCP transport mode: {}", config.rmcp_transport);
}
}
} else {
let addr = format!("127.0.0.1:{}", config.mcp_port);
eprintln!("MCP server listening on {addr}");
let handle = mcp_server::start_server(&addr).await?;
tokio::signal::ctrl_c().await?;
eprintln!("Shutting down MCP server...");
handle.stop()?;
}
Ok(())
}