mcp_protocol/messages/
base.rs1use serde::{Deserialize, Serialize};
3
4#[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#[derive(Debug, Clone, Serialize, Deserialize)]
15#[serde(untagged)]
16pub enum JsonRpcMessage {
17 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 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 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 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 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 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 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}