Skip to main content

mcp_memory/
protocol.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct JsonRpcRequest {
6    pub jsonrpc: String,
7    pub method: String,
8    pub params: Option<Value>,
9    pub id: Option<Value>,
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct JsonRpcResponse {
14    pub jsonrpc: String,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub result: Option<Value>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub error: Option<JsonRpcError>,
19    pub id: Option<Value>,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct JsonRpcError {
24    pub code: i64,
25    pub message: String,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub data: Option<Value>,
28}
29
30impl JsonRpcResponse {
31    pub fn success(id: Option<Value>, result: Value) -> Self {
32        Self {
33            jsonrpc: "2.0".into(),
34            result: Some(result),
35            error: None,
36            id,
37        }
38    }
39
40    pub fn error(id: Option<Value>, code: i64, message: String) -> Self {
41        Self {
42            jsonrpc: "2.0".into(),
43            result: None,
44            error: Some(JsonRpcError { code, message, data: None }),
45            id,
46        }
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53    use serde_json::json;
54
55    #[test]
56    fn test_request_serde() {
57        let req = JsonRpcRequest {
58            jsonrpc: "2.0".to_string(),
59            method: "create_entities".to_string(),
60            params: Some(json!({"entities": []})),
61            id: Some(Value::Number(1.into())),
62        };
63        let json = serde_json::to_string(&req).unwrap();
64        let deserialized: JsonRpcRequest = serde_json::from_str(&json).unwrap();
65        assert_eq!(deserialized.method, "create_entities");
66    }
67
68    #[test]
69    fn test_response_success() {
70        let resp = JsonRpcResponse::success(Some(Value::Number(1.into())), json!({"content": "hello"}));
71        assert_eq!(resp.jsonrpc, "2.0");
72        assert!(resp.result.is_some());
73        assert!(resp.error.is_none());
74    }
75
76    #[test]
77    fn test_response_error() {
78        let resp = JsonRpcResponse::error(Some(Value::Number(1.into())), -32602, "Invalid params".into());
79        assert!(resp.result.is_none());
80        let err = resp.error.unwrap();
81        assert_eq!(err.code, -32602);
82    }
83}