use serde::{Deserialize, Serialize};
use std::collections::HashMap;
pub const MCP_VERSION: &str = "2024-11-05";
pub const SERVER_NAME: &str = "agentic-vision-mcp";
pub const SERVER_VERSION: &str = env!("CARGO_PKG_VERSION");
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Implementation {
pub name: String,
pub version: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ClientCapabilities {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub experimental: Option<HashMap<String, serde_json::Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sampling: Option<SamplingCapability>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub roots: Option<RootsCapability>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ServerCapabilities {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub experimental: Option<HashMap<String, serde_json::Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub logging: Option<LoggingCapability>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompts: Option<PromptsCapability>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resources: Option<ResourcesCapability>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tools: Option<ToolsCapability>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SamplingCapability {}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RootsCapability {
#[serde(default)]
pub list_changed: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct LoggingCapability {}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct PromptsCapability {
#[serde(default)]
pub list_changed: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ResourcesCapability {
#[serde(default)]
pub subscribe: bool,
#[serde(default)]
pub list_changed: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ToolsCapability {
#[serde(default)]
pub list_changed: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InitializeParams {
pub protocol_version: String,
pub capabilities: ClientCapabilities,
pub client_info: Implementation,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InitializeResult {
pub protocol_version: String,
pub capabilities: ServerCapabilities,
pub server_info: Implementation,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
}
impl ServerCapabilities {
pub fn default_capabilities() -> Self {
Self {
experimental: None,
logging: Some(LoggingCapability {}),
prompts: Some(PromptsCapability {
list_changed: false,
}),
resources: Some(ResourcesCapability {
subscribe: true,
list_changed: false,
}),
tools: Some(ToolsCapability {
list_changed: false,
}),
}
}
}
impl InitializeResult {
pub fn default_result() -> Self {
Self {
protocol_version: MCP_VERSION.to_string(),
capabilities: ServerCapabilities::default_capabilities(),
server_info: Implementation {
name: SERVER_NAME.to_string(),
version: SERVER_VERSION.to_string(),
},
instructions: Some(
"AgenticVision MCP server provides persistent visual memory. \
Use tools to capture, compare, query, and search visual observations. \
Use resources to browse visual memory. \
Use prompts for guided visual workflows."
.to_string(),
),
}
}
}