use std::io::{self, BufRead, Write};
use anyhow::Result;
use crate::repo;
pub(crate) type McpServer = mnem_mcp::Server;
#[derive(clap::Parser)]
pub(crate) struct ServeArgs {
#[arg(long, short = 'R')]
repo: Option<std::path::PathBuf>,
}
pub(crate) fn run(args: ServeArgs) -> Result<()> {
let repo_path = repo::locate_data_dir(args.repo.as_deref())?;
let mut server = McpServer::new(repo_path);
if !server.allow_labels {
eprintln!(
"mnem: labels DISABLED (MNEM_LABELS=0 or MNEM_BENCH=0); \
caller-supplied `label`/`ntype` will be coerced to Node::DEFAULT_NTYPE."
);
}
let stdin = io::stdin();
let stdout = io::stdout();
let mut stdout = stdout.lock();
for line in stdin.lock().lines() {
let line = line?;
if line.trim().is_empty() {
continue;
}
if let Some(response) = server.handle_line(&line) {
writeln!(stdout, "{response}")?;
stdout.flush()?;
}
}
Ok(())
}