1use serde::{Deserialize, Serialize};
14use std::collections::HashMap;
15
16#[derive(Debug, Clone, Serialize, Deserialize, Default)]
22pub struct ClientCapabilities {
23 #[serde(skip_serializing_if = "Option::is_none")]
25 pub extensions: Option<HashMap<String, serde_json::Value>>,
26
27 #[serde(skip_serializing_if = "Option::is_none")]
29 pub experimental: Option<HashMap<String, serde_json::Value>>,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub roots: Option<RootsCapabilities>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub sampling: Option<SamplingCapabilities>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub elicitation: Option<ElicitationCapabilities>,
42
43 #[cfg(feature = "experimental-tasks")]
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub tasks: Option<ClientTasksCapabilities>,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize, Default)]
58pub struct ServerCapabilities {
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub extensions: Option<HashMap<String, serde_json::Value>>,
62
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub experimental: Option<HashMap<String, serde_json::Value>>,
66
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub logging: Option<LoggingCapabilities>,
70
71 #[serde(skip_serializing_if = "Option::is_none")]
73 pub completions: Option<CompletionCapabilities>,
74
75 #[serde(skip_serializing_if = "Option::is_none")]
77 pub prompts: Option<PromptsCapabilities>,
78
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub resources: Option<ResourcesCapabilities>,
82
83 #[serde(skip_serializing_if = "Option::is_none")]
85 pub tools: Option<ToolsCapabilities>,
86
87 #[cfg(feature = "experimental-tasks")]
92 #[serde(skip_serializing_if = "Option::is_none")]
93 pub tasks: Option<ServerTasksCapabilities>,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize, Default)]
98pub struct SamplingCapabilities {}
99
100#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
102pub struct ElicitationFormCapabilities {}
103
104#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
106pub struct ElicitationUrlCapabilities {}
107
108#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
117pub struct ElicitationCapabilities {
118 #[serde(skip_serializing_if = "Option::is_none")]
121 pub form: Option<ElicitationFormCapabilities>,
122
123 #[serde(skip_serializing_if = "Option::is_none")]
126 pub url: Option<ElicitationUrlCapabilities>,
127
128 #[serde(rename = "schemaValidation", skip_serializing_if = "Option::is_none")]
132 pub schema_validation: Option<bool>,
133}
134
135impl ElicitationCapabilities {
136 pub fn full() -> Self {
138 Self {
139 form: Some(ElicitationFormCapabilities {}),
140 url: Some(ElicitationUrlCapabilities {}),
141 schema_validation: None,
142 }
143 }
144
145 pub fn form_only() -> Self {
147 Self {
148 form: Some(ElicitationFormCapabilities {}),
149 url: None,
150 schema_validation: None,
151 }
152 }
153
154 pub fn supports_form(&self) -> bool {
157 self.form.is_some() || (self.form.is_none() && self.url.is_none())
158 }
159
160 pub fn supports_url(&self) -> bool {
162 self.url.is_some()
163 }
164
165 pub fn with_schema_validation(mut self) -> Self {
167 self.schema_validation = Some(true);
168 self
169 }
170
171 pub fn without_schema_validation(mut self) -> Self {
173 self.schema_validation = Some(false);
174 self
175 }
176}
177
178#[derive(Debug, Clone, Serialize, Deserialize, Default)]
180pub struct CompletionCapabilities {}
181
182#[derive(Debug, Clone, Serialize, Deserialize, Default)]
184pub struct RootsCapabilities {
185 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
187 pub list_changed: Option<bool>,
188}
189
190#[derive(Debug, Clone, Serialize, Deserialize, Default)]
192pub struct LoggingCapabilities {}
193
194#[derive(Debug, Clone, Serialize, Deserialize, Default)]
196pub struct PromptsCapabilities {
197 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
199 pub list_changed: Option<bool>,
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize, Default)]
204pub struct ResourcesCapabilities {
205 #[serde(skip_serializing_if = "Option::is_none")]
207 pub subscribe: Option<bool>,
208
209 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
211 pub list_changed: Option<bool>,
212}
213
214#[derive(Debug, Clone, Serialize, Deserialize, Default)]
216pub struct ToolsCapabilities {
217 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
219 pub list_changed: Option<bool>,
220}
221
222#[derive(Debug, Clone, Serialize, Deserialize, Default)]
247#[cfg(feature = "experimental-tasks")]
248pub struct ServerTasksCapabilities {
249 #[serde(skip_serializing_if = "Option::is_none")]
251 pub list: Option<TasksListCapabilities>,
252
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub cancel: Option<TasksCancelCapabilities>,
256
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub requests: Option<ServerTasksRequestsCapabilities>,
260}
261
262#[derive(Debug, Clone, Serialize, Deserialize, Default)]
288#[cfg(feature = "experimental-tasks")]
289pub struct ClientTasksCapabilities {
290 #[serde(skip_serializing_if = "Option::is_none")]
292 pub list: Option<TasksListCapabilities>,
293
294 #[serde(skip_serializing_if = "Option::is_none")]
296 pub cancel: Option<TasksCancelCapabilities>,
297
298 #[serde(skip_serializing_if = "Option::is_none")]
300 pub requests: Option<ClientTasksRequestsCapabilities>,
301}
302
303#[derive(Debug, Clone, Serialize, Deserialize, Default)]
305#[cfg(feature = "experimental-tasks")]
306pub struct TasksListCapabilities {}
307
308#[derive(Debug, Clone, Serialize, Deserialize, Default)]
310#[cfg(feature = "experimental-tasks")]
311pub struct TasksCancelCapabilities {}
312
313#[derive(Debug, Clone, Serialize, Deserialize, Default)]
315#[cfg(feature = "experimental-tasks")]
316pub struct ServerTasksRequestsCapabilities {
317 #[serde(skip_serializing_if = "Option::is_none")]
319 pub tools: Option<TasksToolsCapabilities>,
320}
321
322#[derive(Debug, Clone, Serialize, Deserialize, Default)]
324#[cfg(feature = "experimental-tasks")]
325pub struct ClientTasksRequestsCapabilities {
326 #[serde(skip_serializing_if = "Option::is_none")]
328 pub sampling: Option<TasksSamplingCapabilities>,
329
330 #[serde(skip_serializing_if = "Option::is_none")]
332 pub elicitation: Option<TasksElicitationCapabilities>,
333}
334
335#[derive(Debug, Clone, Serialize, Deserialize, Default)]
337#[cfg(feature = "experimental-tasks")]
338pub struct TasksToolsCapabilities {
339 #[serde(skip_serializing_if = "Option::is_none")]
341 pub call: Option<TasksToolsCallCapabilities>,
342}
343
344#[derive(Debug, Clone, Serialize, Deserialize, Default)]
346#[cfg(feature = "experimental-tasks")]
347pub struct TasksToolsCallCapabilities {}
348
349#[derive(Debug, Clone, Serialize, Deserialize, Default)]
351#[cfg(feature = "experimental-tasks")]
352pub struct TasksSamplingCapabilities {
353 #[serde(rename = "createMessage", skip_serializing_if = "Option::is_none")]
355 pub create_message: Option<TasksSamplingCreateMessageCapabilities>,
356}
357
358#[derive(Debug, Clone, Serialize, Deserialize, Default)]
360#[cfg(feature = "experimental-tasks")]
361pub struct TasksSamplingCreateMessageCapabilities {}
362
363#[derive(Debug, Clone, Serialize, Deserialize, Default)]
365#[cfg(feature = "experimental-tasks")]
366pub struct TasksElicitationCapabilities {
367 #[serde(skip_serializing_if = "Option::is_none")]
369 pub create: Option<TasksElicitationCreateCapabilities>,
370}
371
372#[derive(Debug, Clone, Serialize, Deserialize, Default)]
374#[cfg(feature = "experimental-tasks")]
375pub struct TasksElicitationCreateCapabilities {}