Skip to main content

agentic_memory_mcp/resources/
node.rs

1//! Resource handler for `amem://node/{id}` — single node with edges.
2
3use 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
11/// Read a single node resource by ID.
12pub 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}