mcp_protocol/messages/
base.rs

1// mcp-protocol/src/messages/base.rs
2use serde::{Deserialize, Serialize};
3
4/// JSON-RPC 2.0 error structure
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct JsonRpcError {
7    pub code: i32,
8    pub message: String,
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub data: Option<serde_json::Value>,
11}
12
13/// Represents a JSON-RPC 2.0 message (request, response, or notification)
14#[derive(Debug, Clone, Serialize, Deserialize)]
15#[serde(untagged)]
16pub enum JsonRpcMessage {
17    /// A request from client to server or vice versa
18    Request {
19        jsonrpc: String,
20        id: serde_json::Value,
21        method: String,
22        #[serde(skip_serializing_if = "Option::is_none")]
23        params: Option<serde_json::Value>,
24    },
25    
26    /// A response to a request
27    Response {
28        jsonrpc: String,
29        id: serde_json::Value,
30        #[serde(skip_serializing_if = "Option::is_none")]
31        result: Option<serde_json::Value>,
32        #[serde(skip_serializing_if = "Option::is_none")]
33        error: Option<JsonRpcError>,
34    },
35    
36    /// A notification (one-way message with no response)
37    Notification {
38        jsonrpc: String,
39        method: String,
40        #[serde(skip_serializing_if = "Option::is_none")]
41        params: Option<serde_json::Value>,
42    },
43}
44
45impl JsonRpcMessage {
46    /// Create a new request
47    pub fn request(id: serde_json::Value, method: &str, params: Option<serde_json::Value>) -> Self {
48        JsonRpcMessage::Request {
49            jsonrpc: "2.0".to_string(),
50            id,
51            method: method.to_string(),
52            params,
53        }
54    }
55    
56    /// Create a new response with a result
57    pub fn response(id: serde_json::Value, result: serde_json::Value) -> Self {
58        JsonRpcMessage::Response {
59            jsonrpc: "2.0".to_string(),
60            id,
61            result: Some(result),
62            error: None,
63        }
64    }
65    
66    /// Create a new error response
67    pub fn error(id: serde_json::Value, code: i32, message: &str, data: Option<serde_json::Value>) -> Self {
68        JsonRpcMessage::Response {
69            jsonrpc: "2.0".to_string(),
70            id,
71            result: None,
72            error: Some(JsonRpcError {
73                code,
74                message: message.to_string(),
75                data,
76            }),
77        }
78    }
79    
80    /// Create a new notification
81    pub fn notification(method: &str, params: Option<serde_json::Value>) -> Self {
82        JsonRpcMessage::Notification {
83            jsonrpc: "2.0".to_string(),
84            method: method.to_string(),
85            params,
86        }
87    }
88}