oxios-kernel 0.2.0

Oxios kernel: supervisor, event bus, state store
Documentation
//! MCP API — external tool server bridge.

use crate::mcp::{McpBridge, McpServer, McpToolCallResult};
use crate::program::ToolDef;
use std::sync::Arc;

/// MCP system calls.
pub struct McpApi {
    pub(crate) mcp_bridge: Arc<McpBridge>,
}

impl McpApi {
    /// Create a new McpApi.
    pub fn new(mcp_bridge: Arc<McpBridge>) -> Self {
        Self { mcp_bridge }
    }
    /// List registered MCP servers.
    pub fn list_servers(&self) -> Vec<String> {
        self.mcp_bridge.servers()
    }

    /// Get MCP server info.
    pub fn get_server(&self, name: &str) -> Option<McpServer> {
        self.mcp_bridge.get_server(name)
    }

    /// Register an MCP server.
    pub fn register_server(&self, server: McpServer) {
        self.mcp_bridge.register_server(server);
    }

    /// Initialize a specific MCP server.
    pub async fn init_server(&self, name: &str) -> anyhow::Result<()> {
        self.mcp_bridge.initialize_server(name).await
    }

    /// Get MCP client status.
    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
        }
    }

    /// List all MCP tools.
    pub async fn list_tools(&self) -> anyhow::Result<Vec<ToolDef>> {
        self.mcp_bridge.list_tools().await
    }

    /// Get cached tools for a server.
    pub async fn cached_tools(&self, server_name: &str) -> Option<Vec<ToolDef>> {
        self.mcp_bridge.cached_tools(server_name).await
    }

    /// Call an MCP tool.
    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
    }

    /// MCP bridge reference.
    pub fn bridge(&self) -> &Arc<McpBridge> {
        &self.mcp_bridge
    }

    /// Number of configured MCP servers.
    pub fn server_count(&self) -> usize {
        self.mcp_bridge.servers().len()
    }

    /// Shutdown all MCP servers.
    pub async fn shutdown_all(&self) -> anyhow::Result<()> {
        self.mcp_bridge.shutdown_all().await
    }
}