reasonkit-mem 0.1.7

High-performance vector database & RAG memory layer - hybrid search, embeddings, RAPTOR trees, BM25 fusion, and semantic retrieval for AI systems
//! ReasonKit Mem Docset MCP Server Binary
//!
//! Runs the docset MCP server over stdio so coding agents can query
//! Cursor-like `@Docs` indexes.
//!
//! Build:
//! - `cargo install --path reasonkit-mem --features docset`
//!
//! MCP (Claude Desktop) example:
//! ```json
//! {
//!   "mcpServers": {
//!     "rkmem_docs": {
//!       "command": "rk-mem-docs-mcp",
//!       "args": [],
//!       "env": {
//!         "RKMEM_DATA_DIR": "/home/user/.local/share/reasonkit/mem",
//!         "RKMEM_MCP_ALLOW_WRITE": "0"
//!       }
//!     }
//!   }
//! }
//! ```

use std::env;
use std::path::PathBuf;

#[cfg(feature = "docset")]
use reasonkit_mem::docset::DocsetMcpServer;

#[cfg(feature = "docset")]
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let data_dir = env::var("RKMEM_DATA_DIR")
        .map(PathBuf::from)
        .unwrap_or_else(|_| {
            dirs::data_local_dir()
                .unwrap_or_else(|| PathBuf::from("."))
                .join("reasonkit")
                .join("mem")
        });

    let allow_write = env::var("RKMEM_MCP_ALLOW_WRITE")
        .map(|v| v == "1" || v.eq_ignore_ascii_case("true"))
        .unwrap_or(false);

    let allow_private_urls = env::var("RKMEM_ALLOW_PRIVATE_URLS")
        .map(|v| v == "1" || v.eq_ignore_ascii_case("true"))
        .unwrap_or(false);

    eprintln!(
        "ReasonKit Mem Docset MCP Server starting (data_dir={}, allow_write={}, allow_private_urls={})",
        data_dir.display(),
        allow_write,
        allow_private_urls
    );

    let mut server = DocsetMcpServer::new(data_dir, allow_write, allow_private_urls);
    server.run_stdio().await?;

    Ok(())
}

#[cfg(not(feature = "docset"))]
fn main() {
    eprintln!("Error: docset feature is not enabled.");
    eprintln!("Run with: cargo run --bin rk-mem-docs-mcp --features docset");
    std::process::exit(1);
}