httpmcp_rust/handlers/
lifecycle.rs

1use crate::error::{McpError, Result};
2use crate::jsonrpc::{JsonRpcRequest, JsonRpcResponse};
3use crate::protocol::{Implementation, InitializeParams, InitializeResult, ServerCapabilities};
4use serde_json::Value;
5
6/// Handle initialize request
7pub fn handle_initialize(
8    req: &JsonRpcRequest,
9    server_info: Implementation,
10    capabilities: ServerCapabilities,
11) -> Result<JsonRpcResponse> {
12    let params: InitializeParams =
13        serde_json::from_value(req.params.clone().unwrap_or(Value::Null))
14            .map_err(|e| McpError::InvalidParams(format!("Invalid initialize params: {}", e)))?;
15
16    // Validate protocol version
17    if !params.protocol_version.starts_with("2024-")
18        && !params.protocol_version.starts_with("2025-")
19    {
20        return Err(McpError::InvalidRequest(format!(
21            "Unsupported protocol version: {}",
22            params.protocol_version
23        )));
24    }
25
26    let result = InitializeResult {
27        protocol_version: params.protocol_version,
28        capabilities,
29        server_info,
30    };
31
32    Ok(JsonRpcResponse::success(
33        serde_json::to_value(result)?,
34        req.id.clone(),
35    ))
36}
37
38/// Handle ping request
39pub fn handle_ping(req: &JsonRpcRequest) -> Result<JsonRpcResponse> {
40    Ok(JsonRpcResponse::success(
41        serde_json::json!({}),
42        req.id.clone(),
43    ))
44}