1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use std::collections::HashMap;
4
5pub type ProgressToken = String;
7
8pub type Cursor = String;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct RequestMeta {
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub progress_token: Option<ProgressToken>,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct NotificationMeta {
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub custom: Option<HashMap<String, Value>>,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct Progress {
28 pub progress: u64,
30 #[serde(skip_serializing_if = "Option::is_none")]
32 pub total: Option<u64>,
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub message: Option<String>,
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct ResourceContents {
41 uri: String,
42 #[serde(rename = "mimeType")]
43 mime_type: Option<String>,
44 #[serde(skip_serializing_if = "Option::is_none")]
45 text: Option<String>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 blob: Option<String>,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct Resource {
53 pub uri: String,
55 pub name: String,
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub description: Option<String>,
60 #[serde(skip_serializing_if = "Option::is_none")]
62 #[serde(rename = "mimeType")]
63 pub mime_type: Option<String>,
64 #[serde(skip_serializing_if = "Option::is_none")]
66 pub size: Option<String>,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct ResourceTemplate {
72 #[serde(rename = "uriTemplate")]
74 pub uri_template: String,
75 pub name: String,
77 #[serde(skip_serializing_if = "Option::is_none")]
79 pub description: Option<String>,
80 #[serde(skip_serializing_if = "Option::is_none")]
82 #[serde(rename = "mimeType")]
83 pub mime_type: Option<String>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct ModelPreferences {
89 #[serde(skip_serializing_if = "Option::is_none")]
91 pub model: Option<String>,
92 #[serde(skip_serializing_if = "Option::is_none")]
94 pub temperature: Option<f32>,
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub max_tokens: Option<u32>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
102pub struct Completion {
103 pub text: String,
105 #[serde(skip_serializing_if = "Option::is_none")]
107 pub score: Option<f32>,
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct Implementation {
113 pub name: String,
115 pub version: String,
117}
118
119#[derive(Debug, Clone, Default, Serialize, Deserialize)]
121pub struct ClientCapabilities {
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub experimental: Option<Value>,
125 #[serde(skip_serializing_if = "Option::is_none")]
127 pub roots: Option<Value>,
128 #[serde(skip_serializing_if = "Option::is_none")]
130 pub sampling: Option<Value>,
131}
132
133#[derive(Debug, Clone, Default, Serialize, Deserialize)]
135pub struct ServerCapabilities {
136 #[serde(skip_serializing_if = "Option::is_none")]
138 pub experimental: Option<Value>,
139 #[serde(skip_serializing_if = "Option::is_none")]
141 pub logging: Option<Value>,
142 #[serde(skip_serializing_if = "Option::is_none")]
144 pub prompts: Option<Value>,
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub resources: Option<Value>,
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub tools: Option<Value>,
151}
152
153#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
155#[serde(rename_all = "lowercase")]
156pub enum LoggingLevel {
157 Debug,
158 Info,
159 Notice,
160 Warning,
161 Error,
162 Critical,
163 Alert,
164 Emergency,
165}
166impl From<LoggingLevel> for log::Level {
167 fn from(level: LoggingLevel) -> log::Level {
168 match level {
169 LoggingLevel::Debug => log::Level::Debug,
170 LoggingLevel::Info | LoggingLevel::Notice => log::Level::Info,
171 LoggingLevel::Warning => log::Level::Warn,
172 LoggingLevel::Error
173 | LoggingLevel::Critical
174 | LoggingLevel::Alert
175 | LoggingLevel::Emergency => log::Level::Error,
176 }
177 }
178}
179
180#[derive(Debug, Clone, Serialize, Deserialize)]
182pub struct LoggingMessage {
183 pub level: LoggingLevel,
184 #[serde(skip_serializing_if = "Option::is_none")]
185 pub logger: Option<String>,
186 pub data: Value,
187}
188
189#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct PromptArgument {
192 pub name: String,
193 pub description: String,
194 #[serde(skip_serializing_if = "Option::is_none")]
195 pub default_value: Option<String>,
196}
197
198#[derive(Debug, Clone, Serialize, Deserialize)]
200pub struct Prompt {
201 pub name: String,
202 #[serde(skip_serializing_if = "Option::is_none")]
203 pub description: Option<String>,
204 #[serde(skip_serializing_if = "Option::is_none")]
205 pub arguments: Option<Vec<PromptArgument>>,
206}
207
208#[derive(Debug, Clone, Serialize, Deserialize)]
210#[serde(tag = "type")]
211pub enum MessageContent {
212 #[serde(rename = "text")]
213 Text { text: String },
214 #[serde(rename = "image")]
215 Image {
216 data: String,
217 #[serde(rename = "mimeType")]
218 mime_type: Option<String>,
219 },
220 Audio {
221 data: String,
222 #[serde(rename = "mimeType")]
223 mime_type: Option<String>,
224 },
225}
226
227#[derive(Debug, Clone, Serialize, Deserialize)]
229pub struct PromptMessage {
230 pub role: String,
231 pub content: MessageContent,
232}
233
234#[derive(Debug, Clone, Serialize, Deserialize)]
236pub struct Tool {
237 pub name: String,
238 pub description: String,
239 #[serde(rename = "inputSchema", skip_serializing_if = "Option::is_none")]
240 pub input_schema: Option<ToolSchema>,
241 #[serde(skip_serializing_if = "Option::is_none")]
242 pub annotations: Option<ToolAnnotations>,
243}
244
245#[derive(Debug, Clone, Serialize, Deserialize)]
247pub struct ToolSchema {
248 #[serde(skip_serializing_if = "Option::is_none")]
249 pub properties: Option<Value>,
250 #[serde(skip_serializing_if = "Option::is_none")]
251 pub required: Option<Vec<String>>,
252}
253
254#[derive(Debug, Clone, Serialize, Deserialize)]
256#[serde(rename_all = "camelCase")]
257pub struct ToolAnnotations {
258 #[serde(skip_serializing_if = "Option::is_none")]
259 pub title: Option<String>,
260 #[serde(skip_serializing_if = "Option::is_none")]
261 pub read_only_hint: Option<bool>,
262 #[serde(skip_serializing_if = "Option::is_none")]
263 pub destructive_hint: Option<bool>,
264 #[serde(skip_serializing_if = "Option::is_none")]
265 pub idempotent_hint: Option<bool>,
266 #[serde(skip_serializing_if = "Option::is_none")]
267 pub open_world_hint: Option<bool>,
268}
269
270#[derive(Debug, Clone, Serialize, Deserialize)]
272pub struct Root {
273 pub id: String,
274 pub name: String,
275 pub description: String,
276}
277
278#[derive(Debug, Clone, Serialize, Deserialize)]
280pub struct InitializeRequest {
281 pub client_info: Implementation,
282 pub capabilities: ClientCapabilities,
283 #[serde(skip_serializing_if = "Option::is_none")]
284 pub protocol_version: Option<String>,
285}
286
287#[derive(Debug, Clone, Serialize, Deserialize)]
289pub struct InitializeResult {
290 pub server_info: Implementation,
291 pub capabilities: ServerCapabilities,
292}
293
294#[derive(Debug, Clone, Serialize, Deserialize)]
296pub struct ListResourcesRequest {
297 #[serde(skip_serializing_if = "Option::is_none")]
298 pub root_id: Option<String>,
299 #[serde(skip_serializing_if = "Option::is_none")]
300 pub cursor: Option<Cursor>,
301}
302
303#[derive(Debug, Clone, Serialize, Deserialize)]
305pub struct ListResourcesResult {
306 pub resources: Vec<Resource>,
307 #[serde(skip_serializing_if = "Option::is_none")]
308 pub next_cursor: Option<Cursor>,
309}
310
311#[derive(Debug, Clone, Serialize, Deserialize)]
313pub struct ListPromptsRequest {
314 #[serde(skip_serializing_if = "Option::is_none")]
315 pub cursor: Option<Cursor>,
316}
317
318#[derive(Debug, Clone, Serialize, Deserialize)]
320pub struct ListPromptsResult {
321 pub prompts: Vec<Prompt>,
322 #[serde(skip_serializing_if = "Option::is_none")]
323 pub next_cursor: Option<Cursor>,
324}
325
326#[derive(Debug, Clone, Serialize, Deserialize)]
328pub struct GetPromptRequest {
329 pub name: String,
330 pub arguments: Option<Value>,
331}
332
333#[derive(Debug, Clone, Serialize, Deserialize)]
335pub struct GetPromptResult {
336 pub description: Option<String>,
337 pub messages: Vec<PromptMessage>,
338}
339
340#[derive(Debug, Clone, Serialize, Deserialize)]
342pub struct ListToolsRequest {
343 #[serde(skip_serializing_if = "Option::is_none")]
344 pub cursor: Option<Cursor>,
345}
346
347#[derive(Debug, Clone, Serialize, Deserialize)]
349pub struct ListToolsResult {
350 pub tools: Vec<Tool>,
351 #[serde(skip_serializing_if = "Option::is_none")]
352 pub next_cursor: Option<Cursor>,
353}
354
355#[derive(Debug, Clone, Serialize, Deserialize)]
357pub struct CompleteRequest {
358 pub prompt_id: String,
359 #[serde(skip_serializing_if = "Option::is_none")]
360 pub arguments: Option<HashMap<String, String>>,
361 #[serde(skip_serializing_if = "Option::is_none")]
362 pub model_preferences: Option<ModelPreferences>,
363}
364
365#[derive(Debug, Clone, Serialize, Deserialize)]
367pub struct CompleteResult {
368 pub completion: Completion,
369}