Skip to main content

converge_knowledge/mcp/
server.rs

1//! MCP server implementation — delegates to converge-mcp transport.
2
3use super::handlers::KnowledgeHandler;
4use crate::core::KnowledgeBase;
5use crate::error::Result;
6
7use converge_mcp::server::McpServer as GenericMcpServer;
8use std::sync::Arc;
9use tokio::sync::RwLock;
10use tracing::info;
11
12/// MCP server for Claude Desktop integration.
13///
14/// Wraps the generic `converge_mcp::McpServer` with a knowledge-specific handler.
15pub struct McpServer {
16    inner: GenericMcpServer<KnowledgeHandler>,
17}
18
19impl McpServer {
20    /// Create a new MCP server backed by the given knowledge base.
21    pub fn new(kb: Arc<RwLock<KnowledgeBase>>) -> Self {
22        let handler = KnowledgeHandler::new(kb);
23        Self {
24            inner: GenericMcpServer::new(handler),
25        }
26    }
27
28    /// Run the MCP server over stdio (for Claude Desktop).
29    pub async fn run_stdio(&self) -> Result<()> {
30        info!("Starting Knowledge MCP server on stdio");
31        self.inner
32            .run_stdio()
33            .await
34            .map_err(|e| crate::error::Error::storage(e.to_string()))
35    }
36
37    /// Run the MCP server over HTTP (for SSE transport).
38    pub async fn run_http(&self, addr: &str) -> Result<()> {
39        info!("Starting Knowledge MCP HTTP server on {addr}");
40        self.inner
41            .run_http(addr)
42            .await
43            .map_err(|e| crate::error::Error::storage(e.to_string()))
44    }
45}