1pub mod content;
2pub mod messages;
3pub mod prompt;
4pub mod resource;
5pub mod sampling;
6pub mod tool;
7
8use serde::{Deserialize, Serialize};
9
10#[derive(Debug, Clone, Default, Serialize, Deserialize)]
13pub struct Implementation {
14 pub name: String,
15 pub version: String,
16}
17
18impl Implementation {
19 pub fn new(name: impl Into<String>, version: impl Into<String>) -> Self {
20 Self {
21 name: name.into(),
22 version: version.into(),
23 }
24 }
25}
26
27pub type ClientInfo = Implementation;
28pub type ServerInfo = Implementation;
29
30#[derive(Debug, Clone, Default, Serialize, Deserialize)]
33#[serde(rename_all = "camelCase")]
34pub struct ServerCapabilities {
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub tools: Option<ToolsCapability>,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub resources: Option<ResourcesCapability>,
39 #[serde(skip_serializing_if = "Option::is_none")]
40 pub prompts: Option<PromptsCapability>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub logging: Option<LoggingCapability>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub experimental: Option<serde_json::Value>,
45}
46
47#[derive(Debug, Clone, Default, Serialize, Deserialize)]
48#[serde(rename_all = "camelCase")]
49pub struct ToolsCapability {
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub list_changed: Option<bool>,
52}
53
54#[derive(Debug, Clone, Default, Serialize, Deserialize)]
55#[serde(rename_all = "camelCase")]
56pub struct ResourcesCapability {
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub subscribe: Option<bool>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub list_changed: Option<bool>,
61}
62
63#[derive(Debug, Clone, Default, Serialize, Deserialize)]
64#[serde(rename_all = "camelCase")]
65pub struct PromptsCapability {
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub list_changed: Option<bool>,
68}
69
70#[derive(Debug, Clone, Default, Serialize, Deserialize)]
71pub struct LoggingCapability {}
72
73#[derive(Debug, Clone, Default, Serialize, Deserialize)]
76#[serde(rename_all = "camelCase")]
77pub struct ClientCapabilities {
78 #[serde(skip_serializing_if = "Option::is_none")]
79 pub roots: Option<RootsCapability>,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub sampling: Option<SamplingCapability>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub experimental: Option<serde_json::Value>,
84}
85
86#[derive(Debug, Clone, Default, Serialize, Deserialize)]
87#[serde(rename_all = "camelCase")]
88pub struct RootsCapability {
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub list_changed: Option<bool>,
91}
92
93#[derive(Debug, Clone, Default, Serialize, Deserialize)]
94pub struct SamplingCapability {}
95
96#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
99#[serde(rename_all = "lowercase")]
100pub enum LoggingLevel {
101 Debug,
102 Info,
103 Notice,
104 Warning,
105 Error,
106 Critical,
107 Alert,
108 Emergency,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct Root {
115 pub uri: String,
116 #[serde(skip_serializing_if = "Option::is_none")]
117 pub name: Option<String>,
118}
119
120pub type Cursor = String;
124
125#[derive(Debug, Clone, Default, Serialize, Deserialize)]
126pub struct PaginationParams {
127 #[serde(skip_serializing_if = "Option::is_none")]
128 pub cursor: Option<Cursor>,
129}