1use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6#[derive(Debug, Deserialize)]
12pub struct JsonRpcRequest {
13 pub jsonrpc: String,
15 pub method: String,
17 #[serde(default)]
19 pub params: Option<Value>,
20 pub id: Option<Value>,
22}
23
24#[derive(Debug, Serialize)]
26pub struct JsonRpcResponse {
27 pub jsonrpc: String,
29 #[serde(skip_serializing_if = "Option::is_none")]
31 pub result: Option<Value>,
32 #[serde(skip_serializing_if = "Option::is_none")]
34 pub error: Option<JsonRpcError>,
35 pub id: Value,
37}
38
39#[derive(Debug, Serialize)]
41pub struct JsonRpcError {
42 pub code: i64,
44 pub message: String,
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub data: Option<Value>,
49}
50
51pub const PARSE_ERROR: i64 = -32700;
53pub const INVALID_REQUEST: i64 = -32600;
54pub const METHOD_NOT_FOUND: i64 = -32601;
55pub const INVALID_PARAMS: i64 = -32602;
56pub const INTERNAL_ERROR: i64 = -32603;
57
58impl JsonRpcResponse {
59 pub fn success(id: Value, result: Value) -> Self {
61 Self {
62 jsonrpc: "2.0".to_string(),
63 result: Some(result),
64 error: None,
65 id,
66 }
67 }
68
69 pub fn error(id: Value, code: i64, message: impl Into<String>) -> Self {
71 Self {
72 jsonrpc: "2.0".to_string(),
73 result: None,
74 error: Some(JsonRpcError {
75 code,
76 message: message.into(),
77 data: None,
78 }),
79 id,
80 }
81 }
82}
83
84#[derive(Debug, Deserialize)]
90#[serde(rename_all = "camelCase")]
91pub struct InitializeParams {
92 pub protocol_version: String,
94 #[serde(default)]
96 pub capabilities: Value,
97 #[serde(default)]
99 pub client_info: Option<ClientInfo>,
100}
101
102#[derive(Debug, Deserialize)]
104pub struct ClientInfo {
105 pub name: String,
106 #[serde(default)]
107 pub version: Option<String>,
108}
109
110#[derive(Debug, Serialize)]
112pub struct ServerInfo {
113 pub name: String,
114 pub version: String,
115}
116
117#[derive(Debug, Serialize)]
119#[serde(rename_all = "camelCase")]
120pub struct ToolDefinition {
121 pub name: String,
122 pub description: String,
123 pub input_schema: Value,
124}
125
126#[derive(Debug, Serialize)]
128pub struct ToolContent {
129 #[serde(rename = "type")]
130 pub content_type: String,
131 pub text: String,
132}
133
134#[derive(Debug, Serialize)]
136#[serde(rename_all = "camelCase")]
137pub struct ResourceDefinition {
138 pub uri: String,
139 pub name: String,
140 #[serde(skip_serializing_if = "Option::is_none")]
141 pub description: Option<String>,
142 #[serde(skip_serializing_if = "Option::is_none")]
143 pub mime_type: Option<String>,
144}
145
146#[derive(Debug, Serialize)]
148#[serde(rename_all = "camelCase")]
149pub struct ResourceContent {
150 pub uri: String,
151 #[serde(skip_serializing_if = "Option::is_none")]
152 pub mime_type: Option<String>,
153 pub text: String,
154}