use anyhow::{Context, Result};
use std::io::{self, BufRead, Write};
use crate::mcp::protocol::handle_request;
use crate::types::{JsonRpcError, JsonRpcRequest, JsonRpcResponse};
pub fn run_mcp_server() -> Result<()> {
eprintln!("🚀 启动 cleanpy-mcp 服务器");
eprintln!("📚 可用主题: {} (全部已嵌入二进制)", crate::TOPICS.len());
let stdin = io::stdin();
let mut stdout = io::stdout();
for line in stdin.lock().lines() {
let line = line.context("Failed to read line from stdin")?;
let line = line.trim();
if line.is_empty() {
continue;
}
let request: JsonRpcRequest = match serde_json::from_str(line) {
Ok(req) => req,
Err(e) => {
eprintln!("Invalid JSON: {}", e);
let error_response = JsonRpcResponse {
jsonrpc: "2.0",
id: None,
result: None,
error: Some(JsonRpcError {
code: -32700,
message: "Parse error".to_string(),
}),
};
let response_json = serde_json::to_string(&error_response)?;
writeln!(stdout, "{}", response_json)?;
stdout.flush()?;
continue;
}
};
let response = handle_request(request);
if response.id.is_some() || response.error.is_some() {
let response_json = serde_json::to_string(&response)?;
writeln!(stdout, "{}", response_json)?;
stdout.flush()?;
}
}
Ok(())
}