do_memory_mcp/server/
mod.rs1pub mod audit;
36pub mod cache_warming;
37pub mod rate_limiter;
38#[cfg(test)]
39mod tests;
40pub mod tool_definitions;
41pub mod tool_definitions_extended;
42pub mod tools;
43
44use crate::cache::QueryCache;
45use crate::monitoring::{MonitoringConfig, MonitoringEndpoints, MonitoringSystem};
46use crate::server::audit::{AuditConfig, AuditLogger};
47use crate::server::rate_limiter::{ClientId, OperationType, RateLimiter};
48use crate::server::tools::registry::ToolRegistry;
49use crate::types::{ExecutionStats, SandboxConfig};
50use anyhow::Result;
51use do_memory_core::SelfLearningMemory;
52use parking_lot::RwLock;
53use serde_json::Value;
54use std::collections::HashMap;
55use std::sync::Arc;
56use tracing::info;
57
58pub struct MemoryMCPServer {
60 tool_registry: Arc<ToolRegistry>,
62 stats: Arc<RwLock<ExecutionStats>>,
64 tool_usage: Arc<RwLock<HashMap<String, usize>>>,
66 memory: Arc<SelfLearningMemory>,
68 monitoring: Arc<MonitoringSystem>,
70 monitoring_endpoints: Arc<MonitoringEndpoints>,
72 #[allow(dead_code)]
74 cache: Arc<QueryCache>,
75 audit_logger: Arc<AuditLogger>,
77 rate_limiter: RateLimiter,
79}
80
81impl MemoryMCPServer {
82 pub async fn new(_config: SandboxConfig, memory: Arc<SelfLearningMemory>) -> Result<Self> {
93 let tool_registry = Arc::new(tools::registry::create_default_registry());
95
96 let monitoring = Self::initialize_monitoring();
97 let monitoring_endpoints = Arc::new(MonitoringEndpoints::new(Arc::clone(&monitoring)));
98
99 let audit_config = AuditConfig::from_env();
101 let audit_logger = Arc::new(AuditLogger::new(audit_config).await?);
102
103 let core_count = tool_registry.get_core_tools().len();
104 let total_count = tool_registry.total_tool_count();
105
106 let server = Self {
107 tool_registry,
108 stats: Arc::new(RwLock::new(ExecutionStats::default())),
109 tool_usage: Arc::new(RwLock::new(HashMap::new())),
110 memory,
111 monitoring,
112 monitoring_endpoints,
113 cache: Arc::new(QueryCache::new()),
114 audit_logger,
115 rate_limiter: RateLimiter::from_env(),
116 };
117
118 info!(
119 "MCP server initialized with {} core tools ({} total tools available)",
120 core_count, total_count
121 );
122 info!("Tools loaded on-demand to reduce token usage (lazy loading enabled)");
123 info!(
124 "Monitoring system initialized (enabled: {})",
125 server.monitoring.config().enabled
126 );
127 info!("Audit logging system initialized");
128 info!(
129 "Rate limiter initialized (enabled: {})",
130 server.rate_limiter.is_enabled()
131 );
132
133 if cache_warming::is_cache_warming_enabled() {
135 info!("Starting cache warming process...");
136 if let Err(e) = cache_warming::warm_cache(
137 &server.memory,
138 &cache_warming::CacheWarmingConfig::from_env(),
139 )
140 .await
141 {
142 tracing::warn!(
143 "Cache warming failed, but continuing with server startup: {}",
144 e
145 );
146 } else {
147 info!("Cache warming completed successfully");
148 }
149 } else {
150 info!("Cache warming disabled, skipping");
151 }
152
153 Ok(server)
154 }
155
156 fn initialize_monitoring() -> Arc<MonitoringSystem> {
157 let monitoring_config = MonitoringConfig::default();
158 Arc::new(MonitoringSystem::new(monitoring_config))
159 }
160
161 pub fn memory(&self) -> Arc<SelfLearningMemory> {
167 Arc::clone(&self.memory)
168 }
169
170 pub fn audit_logger(&self) -> Arc<AuditLogger> {
176 Arc::clone(&self.audit_logger)
177 }
178
179 pub fn rate_limiter(&self) -> &RateLimiter {
185 &self.rate_limiter
186 }
187
188 pub fn client_id_from_args(&self, args: &Value) -> ClientId {
198 args.get("client_id")
199 .and_then(|v| v.as_str())
200 .filter(|s| !s.is_empty())
201 .map(ClientId::from_string)
202 .unwrap_or(ClientId::Unknown)
203 }
204
205 pub fn check_rate_limit(
216 &self,
217 client_id: &ClientId,
218 operation: OperationType,
219 ) -> crate::server::rate_limiter::RateLimitResult {
220 self.rate_limiter.check_rate_limit(client_id, operation)
221 }
222
223 pub fn rate_limit_headers(
233 &self,
234 result: &crate::server::rate_limiter::RateLimitResult,
235 ) -> Vec<(String, String)> {
236 self.rate_limiter.get_headers(result)
237 }
238
239 pub fn rate_limited_headers(
249 &self,
250 result: &crate::server::rate_limiter::RateLimitResult,
251 ) -> Vec<(String, String)> {
252 self.rate_limiter.get_rate_limited_headers(result)
253 }
254}