use ast_grep_mcp::config::{Config, TransportType};
use ast_grep_mcp::server::AstGrepServer;
use rmcp::transport::stdio;
use rmcp::ServiceExt;
use anyhow::Result;
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
.with_writer(std::io::stderr)
.with_ansi(false)
.init();
#[cfg(unix)]
{
use tokio::signal::unix::{signal, SignalKind};
tokio::spawn(async move {
let mut sigint = signal(SignalKind::interrupt()).unwrap();
loop {
sigint.recv().await;
eprintln!("Received SIGINT - ignoring for multi-session stability");
}
});
tokio::spawn(async move {
let mut sigterm = signal(SignalKind::terminate()).unwrap();
sigterm.recv().await;
eprintln!("Received SIGTERM - shutting down gracefully");
std::process::exit(0);
});
}
#[cfg(not(unix))]
{
tokio::spawn(async move {
loop {
if let Ok(_) = tokio::signal::ctrl_c().await {
eprintln!("Received SIGINT - ignoring for multi-session stability");
}
}
});
}
let config = Config::from_cli()?;
let server = AstGrepServer::new(config.clone());
match config.transport {
TransportType::Stdio => {
let service = server.serve(stdio()).await.map_err(|e| anyhow::anyhow!("Error starting server: {}", e))?;
eprintln!("Server started on stdio");
service.waiting().await.map_err(|e| anyhow::anyhow!("Error waiting for service: {}", e))?;
}
TransportType::Sse => {
anyhow::bail!("SSE transport is not yet implemented in this Rust port. Please use --transport stdio (default).");
}
}
Ok(())
}