diff --git a/server/src/api/ws.rs b/server/src/api/ws.rs index 39f0d2b..e139cc8 100644 --- a/server/src/api/ws.rs +++ b/server/src/api/ws.rs @@ -86,7 +86,7 @@ pub async fn handle_socket(socket: WebSocket, state: Arc, _client_type if let Ok(payload) = serde_json::from_str::(&text) { // Process MCP request if let Some(response) = handler.handle_request(payload).await { - let res_str = serde_json::to_string(&response).unwrap_or_default(); + let res_str = serde_json::to_string(&response).unwrap_or_else(|e| format!(r#"{{\"jsonrpc\":\"2.0\",\"id\":null,\"error\":{{\"code\":-32603,\"message\":\"{}\"}}}}"#, e)); let tx_opt = state_clone .clients .read() diff --git a/server/src/handlers/env.rs b/server/src/handlers/env.rs index 30d76ae..d42ac9f 100644 --- a/server/src/handlers/env.rs +++ b/server/src/handlers/env.rs @@ -61,7 +61,7 @@ impl McpTool for ReadEnvFingerprintHandler { .env_fingerprints .read_with(|fps| fps.get(&req.namespace).cloned()); if let Some(fp) = data { - let data = serde_json::to_string(&fp).unwrap_or_default(); + let data = serde_json::to_string(&fp).map_err(|e| e.to_string())?; Ok(data) } else { Ok("{}".to_string()) diff --git a/server/src/handlers/graph.rs b/server/src/handlers/graph.rs index 25b2db2..dcaf1a0 100644 --- a/server/src/handlers/graph.rs +++ b/server/src/handlers/graph.rs @@ -353,7 +353,7 @@ impl McpTool for ReadGraphHandler { async fn execute(&self, args: Value, state: Arc) -> Result { let req: ReadGraphTool = serde_json::from_value(args).map_err(|e| e.to_string())?; - let data = state.read_graph(|full| { + let data = state.read_graph(|full| -> Result { if let Some(ns) = req.namespace { let mut filtered = BorrowedGraph::default(); for (k, v) in &full.entities { @@ -366,11 +366,11 @@ impl McpTool for ReadGraphHandler { filtered.relations.push(r); } } - serde_json::to_string(&filtered).unwrap_or_default() + serde_json::to_string(&filtered).map_err(|e| e.to_string()) } else { - serde_json::to_string(full).unwrap_or_default() + serde_json::to_string(full).map_err(|e| e.to_string()) } - }); + })?; Ok(data) } } @@ -396,7 +396,7 @@ impl McpTool for SearchNodesHandler { vec![] }; - let data = state.read_graph(|full| { + let data = state.read_graph(|full| -> Result { let mut result = BorrowedGraph::default(); for (id, doc_type, _, _, _) in &matches { if doc_type == "entity" @@ -425,7 +425,7 @@ impl McpTool for OpenNodesHandler { async fn execute(&self, args: Value, state: Arc) -> Result { let req: OpenNodesTool = serde_json::from_value(args).map_err(|e| e.to_string())?; - let data = state.read_graph(|full| { + let data = state.read_graph(|full| -> Result { let targets: HashSet<&str> = req.names.iter().map(|s| s.as_str()).collect(); let mut result = BorrowedGraph::default(); let mut connected: HashSet<&str> = HashSet::new(); @@ -650,7 +650,7 @@ impl McpTool for FindOrphansHandler { .cloned() .collect::>() }); - let data = serde_json::to_string(&orphans).unwrap_or_default(); + let data = serde_json::to_string(&orphans).map_err(|e| e.to_string())?; Ok(data) } } diff --git a/server/src/handlers/meta.rs b/server/src/handlers/meta.rs index 5b470f2..84ea99d 100644 --- a/server/src/handlers/meta.rs +++ b/server/src/handlers/meta.rs @@ -276,8 +276,8 @@ impl McpTool for ReadPreferencesHandler { async fn execute(&self, _args: Value, state: Arc) -> Result { let data = state .prefs - .read_with(|prefs| serde_json::to_string(prefs).unwrap_or_default()); - Ok(data) + .read_with(|prefs| serde_json::to_string(prefs).map_err(|e| e.to_string())); + data } } diff --git a/server/src/store.rs b/server/src/store.rs index 35f06e2..0869358 100644 --- a/server/src/store.rs +++ b/server/src/store.rs @@ -28,7 +28,7 @@ impl let key_inner = key_clone.clone(); let json_data = { let lock = cache_clone.read().unwrap_or_else(|e| e.into_inner()); - serde_json::to_vec(&*lock).ok() + serde_json::to_vec(&*lock).map_err(|e| tracing::error!("Failed to serialize memory store: {}", e)).ok() }; if let Some(json_data) = json_data {