cleanpy 0.1.3

Python 3.12+ 最佳实践知识库 - MCP 服务器
Documentation
// MCP server stdio loop implementation

use anyhow::{Context, Result};
use std::io::{self, BufRead, Write};

use crate::mcp::protocol::handle_request;
use crate::types::{JsonRpcError, JsonRpcRequest, JsonRpcResponse};

/// Run the stdio-based MCP server
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;
        }

        // Parse JSON-RPC request
        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;
            }
        };

        // Handle request
        let response = handle_request(request);

        // Only send response if there's an ID (not a notification)
        if response.id.is_some() || response.error.is_some() {
            let response_json = serde_json::to_string(&response)?;
            writeln!(stdout, "{}", response_json)?;
            stdout.flush()?;
        }
    }

    Ok(())
}