navi-cli 0.1.0

Local agentic engine and terminal-first coding agent.
use anyhow::Result;
use navi_core::LoadedConfig;

use crate::McpAction;

pub async fn handle_mcp_command(action: McpAction, config: &LoadedConfig) -> Result<()> {
    match action {
        McpAction::List => list_mcp_servers(config).await,
    }
}

async fn list_mcp_servers(config: &LoadedConfig) -> Result<()> {
    let mcp_config = &config.config.mcp;

    if !mcp_config.enabled {
        println!("MCP integration is disabled.");
        return Ok(());
    }

    if mcp_config.servers.is_empty() {
        println!("No MCP servers configured.");
        return Ok(());
    }

    println!("Connecting to {} server(s)...\n", mcp_config.servers.len());

    let loaded = navi_mcp::load_configured_mcp_servers(
        mcp_config,
        &config.config.security.allowed_mcp_servers,
    )
    .await;

    let connected_ids: std::collections::HashSet<String> =
        loaded.servers.iter().map(|s| s.id.clone()).collect();

    for server in &mcp_config.servers {
        let status = if !server.enabled {
            "disabled"
        } else if connected_ids.contains(&server.id) {
            "connected"
        } else {
            "failed"
        };

        let tag = match status {
            "disabled" => "  ",
            "connected" => "OK",
            _ => "!!",
        };

        println!("[{}] {} ({})", tag, server.id, status);

        if let Some(url) = &server.url {
            println!("      url: {url}");
        }
        if let Some(cmd) = &server.command {
            if server.args.is_empty() {
                println!("      cmd: {cmd}");
            } else {
                println!("      cmd: {} {}", cmd, server.args.join(" "));
            }
        }

        if let Some(info) = loaded.servers.iter().find(|s| s.id == server.id) {
            if info.tools.is_empty() {
                println!("      tools: (none)");
            } else {
                println!("      tools: {}", info.tools.join(", "));
            }
        }

        println!();
    }

    loaded.shutdown();
    Ok(())
}