Skip to main content

agentic_evolve_mcp/types/
capabilities.rs

1//! MCP capability and initialization types.
2
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6/// MCP protocol version this server implements.
7pub const MCP_VERSION: &str = "2024-11-05";
8
9/// Server name constant.
10pub const SERVER_NAME: &str = "agentic-evolve-mcp";
11
12/// Server version constant.
13pub const SERVER_VERSION: &str = env!("CARGO_PKG_VERSION");
14
15/// Implementation info for server or client.
16#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct Implementation {
18    /// Name of the implementation.
19    pub name: String,
20    /// Version string.
21    pub version: String,
22}
23
24/// Client capabilities sent during initialization.
25#[derive(Debug, Clone, Default, Serialize, Deserialize)]
26pub struct ClientCapabilities {
27    /// Experimental capabilities.
28    #[serde(default, skip_serializing_if = "Option::is_none")]
29    pub experimental: Option<HashMap<String, serde_json::Value>>,
30    /// Sampling capability.
31    #[serde(default, skip_serializing_if = "Option::is_none")]
32    pub sampling: Option<SamplingCapability>,
33    /// Roots capability.
34    #[serde(default, skip_serializing_if = "Option::is_none")]
35    pub roots: Option<RootsCapability>,
36}
37
38/// Server capabilities advertised during initialization.
39#[derive(Debug, Clone, Default, Serialize, Deserialize)]
40pub struct ServerCapabilities {
41    /// Experimental capabilities.
42    #[serde(default, skip_serializing_if = "Option::is_none")]
43    pub experimental: Option<HashMap<String, serde_json::Value>>,
44    /// Logging capability.
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    pub logging: Option<LoggingCapability>,
47    /// Prompts capability.
48    #[serde(default, skip_serializing_if = "Option::is_none")]
49    pub prompts: Option<PromptsCapability>,
50    /// Resources capability.
51    #[serde(default, skip_serializing_if = "Option::is_none")]
52    pub resources: Option<ResourcesCapability>,
53    /// Tools capability.
54    #[serde(default, skip_serializing_if = "Option::is_none")]
55    pub tools: Option<ToolsCapability>,
56}
57
58/// Sampling capability marker.
59#[derive(Debug, Clone, Default, Serialize, Deserialize)]
60pub struct SamplingCapability {}
61
62/// Roots capability.
63#[derive(Debug, Clone, Default, Serialize, Deserialize)]
64pub struct RootsCapability {
65    /// Whether the client supports roots/list_changed notifications.
66    #[serde(default)]
67    pub list_changed: bool,
68}
69
70/// Logging capability marker.
71#[derive(Debug, Clone, Default, Serialize, Deserialize)]
72pub struct LoggingCapability {}
73
74/// Prompts capability.
75#[derive(Debug, Clone, Default, Serialize, Deserialize)]
76pub struct PromptsCapability {
77    /// Whether the server supports prompts/list_changed notifications.
78    #[serde(default)]
79    pub list_changed: bool,
80}
81
82/// Resources capability.
83#[derive(Debug, Clone, Default, Serialize, Deserialize)]
84pub struct ResourcesCapability {
85    /// Whether the server supports resource subscriptions.
86    #[serde(default)]
87    pub subscribe: bool,
88    /// Whether the server supports resources/list_changed notifications.
89    #[serde(default)]
90    pub list_changed: bool,
91}
92
93/// Tools capability.
94#[derive(Debug, Clone, Default, Serialize, Deserialize)]
95pub struct ToolsCapability {
96    /// Whether the server supports tools/list_changed notifications.
97    #[serde(default)]
98    pub list_changed: bool,
99}
100
101/// Initialize request parameters from client.
102#[derive(Debug, Clone, Serialize, Deserialize)]
103#[serde(rename_all = "camelCase")]
104pub struct InitializeParams {
105    /// Requested protocol version.
106    pub protocol_version: String,
107    /// Client capabilities.
108    pub capabilities: ClientCapabilities,
109    /// Client implementation info.
110    pub client_info: Implementation,
111}
112
113/// Initialize response result from server.
114#[derive(Debug, Clone, Serialize, Deserialize)]
115#[serde(rename_all = "camelCase")]
116pub struct InitializeResult {
117    /// Negotiated protocol version.
118    pub protocol_version: String,
119    /// Server capabilities.
120    pub capabilities: ServerCapabilities,
121    /// Server implementation info.
122    pub server_info: Implementation,
123    /// Optional instructions for the client.
124    #[serde(default, skip_serializing_if = "Option::is_none")]
125    pub instructions: Option<String>,
126}
127
128impl ServerCapabilities {
129    /// Build the default capabilities for this server.
130    pub fn default_capabilities() -> Self {
131        Self {
132            experimental: None,
133            logging: Some(LoggingCapability {}),
134            prompts: None,
135            resources: None,
136            tools: Some(ToolsCapability {
137                list_changed: false,
138            }),
139        }
140    }
141}
142
143impl InitializeResult {
144    /// Build the default initialization result.
145    pub fn default_result() -> Self {
146        Self {
147            protocol_version: MCP_VERSION.to_string(),
148            capabilities: ServerCapabilities::default_capabilities(),
149            server_info: Implementation {
150                name: SERVER_NAME.to_string(),
151                version: SERVER_VERSION.to_string(),
152            },
153            instructions: Some(
154                "You have access to AgenticEvolve, a pattern library engine. \
155                 Use evolve_pattern_store to save new code patterns, \
156                 evolve_match_signature to find matching patterns for function signatures, \
157                 and evolve_crystallize to crystallize successful code into reusable patterns."
158                    .to_string(),
159            ),
160        }
161    }
162}