use clap::Parser;
use mcp_tools::{clients::CliClient, common::ClientConfig, Result};
#[derive(Parser)]
#[command(name = "mcp-cli")]
#[command(about = "MCP Tools CLI Client")]
#[command(version = "1.0")]
pub struct CliArgs {
#[arg(short, long, default_value = "http://localhost:8080")]
pub server: String,
#[arg(short, long, default_value = "30")]
pub timeout: u64,
#[arg(short, long)]
pub verbose: bool,
#[arg(short, long, default_value = "table")]
pub format: String,
#[command(subcommand)]
pub command: Option<CliCommand>,
}
#[derive(clap::Subcommand, Clone)]
pub enum CliCommand {
Connect,
ListTools,
Execute {
tool: String,
#[arg(short, long)]
args: Option<String>,
#[arg(short = 'p', long = "param")]
params: Vec<String>,
},
Interactive,
Status,
Disconnect,
}
#[tokio::main]
async fn main() -> Result<()> {
let args = CliArgs::parse();
let config = ClientConfig {
name: "MCP-Tools-CLI".to_string(),
version: "1.0.0".to_string(),
server_url: args.server.clone(),
connect_timeout_secs: 30,
request_timeout_secs: args.timeout,
log_requests: args.verbose,
client_config: std::collections::HashMap::new(),
};
let cli_args = mcp_tools::clients::cli::CliArgs {
server: args.server,
timeout: args.timeout,
verbose: args.verbose,
format: args.format,
command: args.command.map(|cmd| match cmd {
CliCommand::Connect => mcp_tools::clients::cli::CliCommand::Connect,
CliCommand::ListTools => mcp_tools::clients::cli::CliCommand::ListTools,
CliCommand::Execute { tool, args, params } => {
mcp_tools::clients::cli::CliCommand::Execute { tool, args, params }
}
CliCommand::Interactive => mcp_tools::clients::cli::CliCommand::Interactive,
CliCommand::Status => mcp_tools::clients::cli::CliCommand::Status,
CliCommand::Disconnect => mcp_tools::clients::cli::CliCommand::Disconnect,
}),
};
let mut client = CliClient::new(config, cli_args);
client.run().await
}