pub mod embeddings;
pub mod handlers;
pub mod rag;
pub mod storage;
pub mod tui;
use anyhow::Result;
use tracing::Level;
pub use embeddings::{FastEmbedder, MLXBridge};
pub use handlers::{MCPServer, create_server};
pub use rag::{RAGPipeline, SearchResult};
pub use storage::{ChromaDocument, StorageManager};
pub use tui::{HostDetection, HostKind, WizardConfig, detect_hosts, run_wizard};
#[derive(Debug, Clone)]
pub struct ServerConfig {
pub features: Vec<String>,
pub cache_mb: usize,
pub db_path: String,
pub max_request_bytes: usize,
pub log_level: Level,
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
features: vec![
"filesystem".to_string(),
"memory".to_string(),
"search".to_string(),
],
cache_mb: 4096,
db_path: "~/.rmcp_servers/rmcp_memex/lancedb".to_string(),
max_request_bytes: 5 * 1024 * 1024,
log_level: Level::INFO,
}
}
}
impl ServerConfig {
pub fn for_memory_only() -> Self {
Self {
features: vec!["memory".to_string(), "search".to_string()],
..Self::default()
}
}
pub fn for_full_rag() -> Self {
Self::default()
}
pub fn with_db_path(mut self, db_path: impl Into<String>) -> Self {
self.db_path = db_path.into();
self
}
pub fn with_features(mut self, features: Vec<String>) -> Self {
self.features = features;
self
}
}
pub async fn run_stdio_server(config: ServerConfig) -> Result<()> {
let server = create_server(config).await?;
server.run_stdio().await
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_config_has_expected_values() {
let cfg = ServerConfig::default();
assert!(cfg.features.contains(&"filesystem".to_string()));
assert_eq!(cfg.cache_mb, 4096);
assert_eq!(cfg.db_path, "~/.rmcp_servers/rmcp_memex/lancedb");
assert_eq!(cfg.max_request_bytes, 5 * 1024 * 1024);
}
}