agentic_memory_mcp/resources/
node.rs1use std::sync::Arc;
4use tokio::sync::Mutex;
5
6use serde_json::json;
7
8use crate::session::SessionManager;
9use crate::types::{McpError, McpResult, ReadResourceResult, ResourceContent};
10
11pub async fn read_node(
13 id: u64,
14 session: &Arc<Mutex<SessionManager>>,
15) -> McpResult<ReadResourceResult> {
16 let session = session.lock().await;
17 let graph = session.graph();
18
19 let node = graph.get_node(id).ok_or(McpError::NodeNotFound(id))?;
20
21 let outgoing: Vec<serde_json::Value> = graph
22 .edges_from(id)
23 .iter()
24 .map(|e| {
25 json!({
26 "target_id": e.target_id,
27 "edge_type": e.edge_type.name(),
28 "weight": e.weight,
29 })
30 })
31 .collect();
32
33 let incoming: Vec<serde_json::Value> = graph
34 .edges_to(id)
35 .iter()
36 .map(|e| {
37 json!({
38 "source_id": e.source_id,
39 "edge_type": e.edge_type.name(),
40 "weight": e.weight,
41 })
42 })
43 .collect();
44
45 let content = json!({
46 "id": node.id,
47 "event_type": node.event_type.name(),
48 "content": node.content,
49 "confidence": node.confidence,
50 "session_id": node.session_id,
51 "created_at": node.created_at,
52 "access_count": node.access_count,
53 "last_accessed": node.last_accessed,
54 "decay_score": node.decay_score,
55 "outgoing_edges": outgoing,
56 "incoming_edges": incoming,
57 });
58
59 Ok(ReadResourceResult {
60 contents: vec![ResourceContent {
61 uri: format!("amem://node/{id}"),
62 mime_type: Some("application/json".to_string()),
63 text: Some(serde_json::to_string_pretty(&content).unwrap_or_else(|_| "{}".to_string())),
64 blob: None,
65 }],
66 })
67}