use super::types::{Implementation, ServerCapabilities, ServerInfo};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClientInfo {
pub name: String,
pub version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitializeParams {
#[serde(rename = "protocolVersion")]
pub protocol_version: String,
pub capabilities: ClientCapabilities,
#[serde(rename = "clientInfo")]
pub client_info: ClientInfo,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling: Option<SamplingCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub roots: Option<RootsCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SamplingCapability {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RootsCapability {
#[serde(default, rename = "listChanged")]
pub list_changed: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitializeResult {
#[serde(rename = "protocolVersion")]
pub protocol_version: String,
pub capabilities: ServerCapabilities,
#[serde(rename = "serverInfo")]
pub server_info: ServerInfo,
#[serde(skip_serializing_if = "Option::is_none")]
pub implementation: Option<Implementation>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShutdownRequest {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PingRequest {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PingResponse {}
impl InitializeParams {
pub fn reasonkit() -> Self {
Self {
protocol_version: crate::mcp::MCP_VERSION.to_string(),
capabilities: ClientCapabilities::default(),
client_info: ClientInfo {
name: "reasonkit-core".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
},
}
}
pub fn with_client_info(name: impl Into<String>, version: impl Into<String>) -> Self {
Self {
protocol_version: crate::mcp::MCP_VERSION.to_string(),
capabilities: ClientCapabilities::default(),
client_info: ClientInfo {
name: name.into(),
version: version.into(),
},
}
}
}
impl InitializeResult {
pub fn new(server_info: ServerInfo, capabilities: ServerCapabilities) -> Self {
Self {
protocol_version: crate::mcp::MCP_VERSION.to_string(),
capabilities,
server_info,
implementation: Some(Implementation {
name: "reasonkit-core".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
}),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_initialize_params() {
let params = InitializeParams::reasonkit();
assert_eq!(params.client_info.name, "reasonkit-core");
assert_eq!(params.protocol_version, crate::mcp::MCP_VERSION);
}
#[test]
fn test_initialize_serialization() {
let params = InitializeParams::reasonkit();
let json = serde_json::to_string(¶ms).unwrap();
assert!(json.contains("protocolVersion"));
assert!(json.contains("clientInfo"));
}
}