turbomcp_protocol/types/
capabilities.rs1use serde::{Deserialize, Serialize};
14use std::collections::HashMap;
15
16#[derive(Debug, Clone, Serialize, Deserialize, Default)]
18pub struct ClientCapabilities {
19    #[serde(skip_serializing_if = "Option::is_none")]
21    pub experimental: Option<HashMap<String, serde_json::Value>>,
22
23    #[serde(skip_serializing_if = "Option::is_none")]
25    pub roots: Option<RootsCapabilities>,
26
27    #[serde(skip_serializing_if = "Option::is_none")]
29    pub sampling: Option<SamplingCapabilities>,
30
31    #[serde(skip_serializing_if = "Option::is_none")]
33    pub elicitation: Option<ElicitationCapabilities>,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize, Default)]
38pub struct ServerCapabilities {
39    #[serde(skip_serializing_if = "Option::is_none")]
41    pub experimental: Option<HashMap<String, serde_json::Value>>,
42
43    #[serde(skip_serializing_if = "Option::is_none")]
45    pub logging: Option<LoggingCapabilities>,
46
47    #[serde(skip_serializing_if = "Option::is_none")]
49    pub completions: Option<CompletionCapabilities>,
50
51    #[serde(skip_serializing_if = "Option::is_none")]
53    pub prompts: Option<PromptsCapabilities>,
54
55    #[serde(skip_serializing_if = "Option::is_none")]
57    pub resources: Option<ResourcesCapabilities>,
58
59    #[serde(skip_serializing_if = "Option::is_none")]
61    pub tools: Option<ToolsCapabilities>,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize, Default)]
66pub struct SamplingCapabilities;
67
68#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
70pub struct ElicitationCapabilities {
71    #[serde(rename = "schemaValidation", skip_serializing_if = "Option::is_none")]
74    pub schema_validation: Option<bool>,
75}
76
77impl ElicitationCapabilities {
78    pub fn with_schema_validation(mut self) -> Self {
80        self.schema_validation = Some(true);
81        self
82    }
83
84    pub fn without_schema_validation(mut self) -> Self {
86        self.schema_validation = Some(false);
87        self
88    }
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize, Default)]
93pub struct CompletionCapabilities;
94
95#[derive(Debug, Clone, Serialize, Deserialize, Default)]
97pub struct RootsCapabilities {
98    #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
100    pub list_changed: Option<bool>,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize, Default)]
105pub struct LoggingCapabilities;
106
107#[derive(Debug, Clone, Serialize, Deserialize, Default)]
109pub struct PromptsCapabilities {
110    #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
112    pub list_changed: Option<bool>,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize, Default)]
117pub struct ResourcesCapabilities {
118    #[serde(skip_serializing_if = "Option::is_none")]
120    pub subscribe: Option<bool>,
121
122    #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
124    pub list_changed: Option<bool>,
125}
126
127#[derive(Debug, Clone, Serialize, Deserialize, Default)]
129pub struct ToolsCapabilities {
130    #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
132    pub list_changed: Option<bool>,
133}