mcp_protocol_sdk/server/
http_server.rs

1//! HTTP-specific MCP server implementation
2//!
3//! This module provides a specialized MCP server that integrates directly with HTTP transport.
4
5use crate::core::error::McpResult;
6use crate::protocol::types::{JsonRpcRequest, JsonRpcResponse};
7use crate::server::mcp_server::McpServer;
8use crate::transport::http::HttpServerTransport;
9use crate::transport::traits::ServerTransport;
10use std::sync::Arc;
11use tokio::sync::Mutex;
12
13/// HTTP-specific MCP server that properly integrates with HTTP transport
14pub struct HttpMcpServer {
15    server: Arc<Mutex<McpServer>>,
16    transport: Option<HttpServerTransport>,
17}
18
19impl HttpMcpServer {
20    /// Create a new HTTP MCP server
21    pub fn new(name: String, version: String) -> Self {
22        Self {
23            server: Arc::new(Mutex::new(McpServer::new(name, version))),
24            transport: None,
25        }
26    }
27
28    /// Get a reference to the underlying MCP server
29    pub async fn server(&self) -> Arc<Mutex<McpServer>> {
30        self.server.clone()
31    }
32
33    /// Start the HTTP server with proper request handling integration
34    pub async fn start(&mut self, mut transport: HttpServerTransport) -> McpResult<()> {
35        // Set up the request handler to use the MCP server
36        let server_clone = self.server.clone();
37
38        transport
39            .set_request_handler(move |request: JsonRpcRequest| {
40                let server = server_clone.clone();
41                let (tx, rx) = tokio::sync::oneshot::channel();
42
43                tokio::spawn(async move {
44                    let server_guard = server.lock().await;
45                    let response = server_guard
46                        .handle_request(request)
47                        .await
48                        .unwrap_or_else(|e| {
49                            tracing::error!("Error handling HTTP request: {}", e);
50                            JsonRpcResponse {
51                                jsonrpc: "2.0".to_string(),
52                                id: serde_json::Value::Null,
53                                result: Some(serde_json::json!({
54                                    "error": {
55                                        "code": -32603,
56                                        "message": e.to_string()
57                                    }
58                                })),
59                            }
60                        });
61                    let _ = tx.send(response);
62                });
63
64                rx
65            })
66            .await;
67
68        // Start the transport
69        transport.start().await?;
70
71        self.transport = Some(transport);
72        Ok(())
73    }
74
75    /// Stop the HTTP server
76    pub async fn stop(&mut self) -> McpResult<()> {
77        if let Some(transport) = &mut self.transport {
78            transport.stop().await?;
79        }
80        self.transport = None;
81        Ok(())
82    }
83
84    /// Check if the server is running
85    pub fn is_running(&self) -> bool {
86        self.transport.as_ref().is_some_and(|t| t.is_running())
87    }
88}