use crate::mcp::{self, McpBridge, McpServer, McpToolCallResult};
use crate::tools::tool_types::ToolDef;
use std::sync::Arc;
pub struct McpApi {
pub(crate) mcp_bridge: Arc<McpBridge>,
}
impl McpApi {
pub fn new(mcp_bridge: Arc<McpBridge>) -> Self {
Self { mcp_bridge }
}
pub fn list_servers(&self) -> Vec<String> {
self.mcp_bridge.servers()
}
pub fn get_server(&self, name: &str) -> Option<McpServer> {
self.mcp_bridge.get_server(name)
}
pub fn register_server(&self, server: McpServer) {
self.mcp_bridge.register_server(server);
}
pub async fn init_server(&self, name: &str) -> anyhow::Result<()> {
self.mcp_bridge.initialize_server(name).await
}
pub async fn client_status(&self, name: &str) -> Option<bool> {
if let Some(client) = self.mcp_bridge.client(name).await {
Some(client.is_initialized().await)
} else {
None
}
}
pub async fn list_tools(&self) -> anyhow::Result<Vec<ToolDef>> {
mcp::list_tool_defs(&self.mcp_bridge).await
}
pub async fn cached_tools(&self, server_name: &str) -> Option<Vec<ToolDef>> {
mcp::cached_tool_defs(&self.mcp_bridge, server_name).await
}
pub async fn call_tool(
&self,
server: &str,
tool: &str,
arguments: serde_json::Value,
) -> anyhow::Result<McpToolCallResult> {
self.mcp_bridge.call_tool(server, tool, arguments).await
}
pub fn bridge(&self) -> &Arc<McpBridge> {
&self.mcp_bridge
}
pub fn server_count(&self) -> usize {
self.mcp_bridge.servers().len()
}
pub async fn remove_server(&self, name: &str) -> anyhow::Result<()> {
self.mcp_bridge.remove_server(name).await
}
pub async fn toggle_server(&self, name: &str) -> anyhow::Result<bool> {
self.mcp_bridge.toggle_server(name).await
}
pub async fn shutdown_all(&self) -> anyhow::Result<()> {
self.mcp_bridge.shutdown_all().await
}
}