Skip to main content

oxios_kernel/kernel_handle/
mcp_api.rs

1//! MCP API — external tool server bridge.
2
3use crate::mcp::{McpBridge, McpServer, McpToolCallResult};
4use crate::program::ToolDef;
5use std::sync::Arc;
6
7/// MCP system calls.
8pub struct McpApi {
9    pub(crate) mcp_bridge: Arc<McpBridge>,
10}
11
12impl McpApi {
13    /// Create a new McpApi.
14    pub fn new(mcp_bridge: Arc<McpBridge>) -> Self {
15        Self { mcp_bridge }
16    }
17    /// List registered MCP servers.
18    pub fn list_servers(&self) -> Vec<String> {
19        self.mcp_bridge.servers()
20    }
21
22    /// Get MCP server info.
23    pub fn get_server(&self, name: &str) -> Option<McpServer> {
24        self.mcp_bridge.get_server(name)
25    }
26
27    /// Register an MCP server.
28    pub fn register_server(&self, server: McpServer) {
29        self.mcp_bridge.register_server(server);
30    }
31
32    /// Initialize a specific MCP server.
33    pub async fn init_server(&self, name: &str) -> anyhow::Result<()> {
34        self.mcp_bridge.initialize_server(name).await
35    }
36
37    /// Get MCP client status.
38    pub async fn client_status(&self, name: &str) -> Option<bool> {
39        if let Some(client) = self.mcp_bridge.client(name).await {
40            Some(client.is_initialized().await)
41        } else {
42            None
43        }
44    }
45
46    /// List all MCP tools.
47    pub async fn list_tools(&self) -> anyhow::Result<Vec<ToolDef>> {
48        self.mcp_bridge.list_tools().await
49    }
50
51    /// Get cached tools for a server.
52    pub async fn cached_tools(&self, server_name: &str) -> Option<Vec<ToolDef>> {
53        self.mcp_bridge.cached_tools(server_name).await
54    }
55
56    /// Call an MCP tool.
57    pub async fn call_tool(
58        &self,
59        server: &str,
60        tool: &str,
61        arguments: serde_json::Value,
62    ) -> anyhow::Result<McpToolCallResult> {
63        self.mcp_bridge.call_tool(server, tool, arguments).await
64    }
65
66    /// MCP bridge reference.
67    pub fn bridge(&self) -> &Arc<McpBridge> {
68        &self.mcp_bridge
69    }
70
71    /// Number of configured MCP servers.
72    pub fn server_count(&self) -> usize {
73        self.mcp_bridge.servers().len()
74    }
75
76    /// Shutdown all MCP servers.
77    pub async fn shutdown_all(&self) -> anyhow::Result<()> {
78        self.mcp_bridge.shutdown_all().await
79    }
80}