use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub roots: Option<RootsCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling: Option<SamplingCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub elicitation: Option<ElicitationCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tasks: Option<ClientTasksCapability>,
}
impl ClientCapabilities {
pub fn with_experimental_capability(mut self, key: impl Into<String>, value: Value) -> Self {
self.experimental
.get_or_insert_with(HashMap::new)
.insert(key.into(), value);
self
}
pub fn with_roots_capability(mut self, list_changed: bool) -> Self {
self.roots = Some(RootsCapability {
list_changed: Some(list_changed),
});
self
}
pub fn with_sampling(mut self) -> Self {
self.sampling = Some(SamplingCapability::default());
self
}
pub fn with_elicitation(mut self) -> Self {
self.elicitation = Some(ElicitationCapability::default());
self
}
pub fn with_elicitation_form(mut self) -> Self {
self.elicitation
.get_or_insert_with(ElicitationCapability::default)
.form = Some(HashMap::new());
self
}
pub fn with_elicitation_url(mut self) -> Self {
self.elicitation
.get_or_insert_with(ElicitationCapability::default)
.url = Some(HashMap::new());
self
}
pub fn with_tasks_list(mut self) -> Self {
self.tasks
.get_or_insert_with(ClientTasksCapability::default)
.list = Some(HashMap::new());
self
}
pub fn with_tasks_cancel(mut self) -> Self {
self.tasks
.get_or_insert_with(ClientTasksCapability::default)
.cancel = Some(HashMap::new());
self
}
pub fn with_task_sampling_create_message(mut self) -> Self {
self.tasks
.get_or_insert_with(ClientTasksCapability::default)
.requests
.get_or_insert_with(ClientTaskRequestsCapability::default)
.sampling
.get_or_insert_with(ClientTaskSamplingCapability::default)
.create_message = Some(HashMap::new());
self
}
pub fn with_task_elicitation_create(mut self) -> Self {
self.tasks
.get_or_insert_with(ClientTasksCapability::default)
.requests
.get_or_insert_with(ClientTaskRequestsCapability::default)
.elicitation
.get_or_insert_with(ClientTaskElicitationCapability::default)
.create = Some(HashMap::new());
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RootsCapability {
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ServerCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logging: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completions: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompts: Option<PromptsCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resources: Option<ResourcesCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<ToolsCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tasks: Option<ServerTasksCapability>,
}
impl ServerCapabilities {
pub fn with_experimental(mut self, experimental: HashMap<String, Value>) -> Self {
self.experimental = Some(experimental);
self
}
pub fn with_logging(mut self) -> Self {
self.logging = Some(Value::Object(serde_json::Map::new()));
self
}
pub fn with_completions(mut self) -> Self {
self.completions = Some(Value::Object(serde_json::Map::new()));
self
}
pub fn with_prompts(mut self, list_changed: Option<bool>) -> Self {
self.prompts = Some(PromptsCapability { list_changed });
self
}
pub fn with_resources(mut self, subscribe: Option<bool>, list_changed: Option<bool>) -> Self {
self.resources = Some(ResourcesCapability {
subscribe,
list_changed,
});
self
}
pub fn with_tools(mut self, list_changed: Option<bool>) -> Self {
self.tools = Some(ToolsCapability { list_changed });
self
}
pub fn with_tasks_list(mut self) -> Self {
self.tasks
.get_or_insert_with(ServerTasksCapability::default)
.list = Some(HashMap::new());
self
}
pub fn with_tasks_cancel(mut self) -> Self {
self.tasks
.get_or_insert_with(ServerTasksCapability::default)
.cancel = Some(HashMap::new());
self
}
pub fn with_task_tools_call(mut self) -> Self {
self.tasks
.get_or_insert_with(ServerTasksCapability::default)
.requests
.get_or_insert_with(ServerTaskRequestsCapability::default)
.tools
.get_or_insert_with(ServerTaskToolsCapability::default)
.call = Some(HashMap::new());
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SamplingCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub context: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ElicitationCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub form: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ClientTasksCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub list: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cancel: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub requests: Option<ClientTaskRequestsCapability>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ClientTaskRequestsCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling: Option<ClientTaskSamplingCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub elicitation: Option<ClientTaskElicitationCapability>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ClientTaskSamplingCapability {
#[serde(rename = "createMessage", skip_serializing_if = "Option::is_none")]
pub create_message: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ClientTaskElicitationCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub create: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ServerTasksCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub list: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cancel: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub requests: Option<ServerTaskRequestsCapability>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ServerTaskRequestsCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<ServerTaskToolsCapability>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ServerTaskToolsCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub call: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromptsCapability {
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourcesCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub subscribe: Option<bool>,
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolsCapability {
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}