use clap::Parser;
use std::path::PathBuf;
use context_mcp::{
rag::RagConfig,
server::{McpServer, ServerConfig, StdioTransport},
storage::StorageConfig,
};
#[derive(Parser, Debug)]
#[command(name = "context-mcp")]
#[command(about = "Context management MCP server with temporal reasoning")]
#[command(version)]
struct Args {
#[arg(long)]
stdio: bool,
#[arg(long, default_value = "127.0.0.1")]
host: String,
#[arg(long, default_value = "3000")]
port: u16,
#[arg(long)]
storage_path: Option<PathBuf>,
#[arg(long, default_value = "1000")]
cache_size: usize,
#[arg(long)]
persist: bool,
#[arg(long, default_value = "0")]
threads: usize,
#[arg(long)]
no_decay: bool,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::from_default_env()
.add_directive(tracing::Level::INFO.into()),
)
.init();
let args = Args::parse();
let storage_config = StorageConfig {
memory_cache_size: args.cache_size,
persist_path: args.storage_path,
enable_persistence: args.persist,
auto_cleanup: true,
cleanup_interval_secs: 300,
};
let rag_config = RagConfig {
num_threads: args.threads,
temporal_decay: !args.no_decay,
..Default::default()
};
let server_config = ServerConfig {
host: args.host,
port: args.port,
storage: storage_config,
rag: rag_config,
};
if args.stdio {
tracing::info!("Starting MCP Context Server in stdio mode");
let transport = StdioTransport::new(server_config)?;
transport.run().await?;
} else {
tracing::info!(
"Starting MCP Context Server on {}:{}",
server_config.host,
server_config.port
);
let server = McpServer::new(server_config)?;
server.run().await?;
}
Ok(())
}