systemprompt-cli 0.14.4

Unified CLI for systemprompt.io AI governance: agent orchestration, MCP governance, analytics, profiles, cloud deploy, and self-hosted operations.
Documentation
//! List MCP package names for build scripts

use anyhow::{Context, Result};
use clap::Args;

use super::types::McpPackagesOutput;
use crate::CliConfig;
use crate::shared::CommandOutput;
use systemprompt_models::artifacts::ListItem;
use systemprompt_runtime::AppContext;

#[derive(Debug, Clone, Copy, Args)]
pub struct ListPackagesArgs {
    #[arg(long, help = "Output as space-separated string")]
    pub raw: bool,
}

pub(super) async fn execute(args: ListPackagesArgs, _config: &CliConfig) -> Result<CommandOutput> {
    let ctx = AppContext::new()
        .await
        .context("Failed to bootstrap AppContext")?;
    let servers = ctx
        .mcp_registry()
        .get_enabled_servers()
        .context("Failed to get enabled MCP servers")?;

    let packages: Vec<String> = servers.iter().map(|s| s.name.clone()).collect();

    let output = if args.raw {
        McpPackagesOutput {
            raw_packages: Some(packages.join(" ")),
            packages,
        }
    } else {
        McpPackagesOutput {
            packages,
            raw_packages: None,
        }
    };

    if args.raw {
        Ok(CommandOutput::copy_paste_titled(
            "MCP Packages (raw)",
            output.raw_packages.unwrap_or_default(),
        ))
    } else {
        let items: Vec<ListItem> = output
            .packages
            .iter()
            .map(|name| ListItem::new(name.clone(), String::new(), name.clone()))
            .collect();
        Ok(CommandOutput::list(items).with_title("MCP Packages"))
    }
}