mcp_protocol_sdk/server/
http_server.rs1use 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
13pub struct HttpMcpServer {
15 server: Arc<Mutex<McpServer>>,
16 transport: Option<HttpServerTransport>,
17}
18
19impl HttpMcpServer {
20 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 pub async fn server(&self) -> Arc<Mutex<McpServer>> {
30 self.server.clone()
31 }
32
33 pub async fn start(&mut self, mut transport: HttpServerTransport) -> McpResult<()> {
35 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 transport.start().await?;
70
71 self.transport = Some(transport);
72 Ok(())
73 }
74
75 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 pub fn is_running(&self) -> bool {
86 self.transport.as_ref().is_some_and(|t| t.is_running())
87 }
88}