use mcp_runner::McpRunner;
use mcp_runner::error::Result;
use serde_json::json;
use tracing::{error, info, warn};
use tracing_subscriber::{EnvFilter, fmt};
#[tokio::main]
async fn main() -> Result<()> {
fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(true) .init();
info!("Starting simple_client example");
let config_path = "examples/config.json";
let mut runner = McpRunner::from_config_file(config_path)?;
info!("Starting all servers and proxy if configured...");
let (server_ids_result, proxy_started) = runner.start_all_with_proxy().await;
let server_ids = server_ids_result?;
info!("Started {} servers", server_ids.len());
if proxy_started {
info!("SSE proxy started successfully");
}
let fetch_server_id = runner.get_server_id("fetch")?;
let fs_server_id = runner.get_server_id("filesystem")?;
info!("=== Fetch Server ===");
let fetch_client = runner.get_client(fetch_server_id)?;
fetch_client.initialize().await?;
let fetch_tools = fetch_client.list_tools().await?;
info!("Available tools in fetch server:");
for tool in &fetch_tools {
info!("- {}: {}", tool.name, tool.description);
}
if let Some(tool) = fetch_tools.iter().find(|t| t.name == "fetch") {
let args = json!({
"url": "https://modelcontextprotocol.io",
});
info!("Calling fetch tool...");
let result: serde_json::Value = fetch_client.call_tool(&tool.name, &args).await?;
info!("fetch result: {}", result);
} else {
warn!("fetch tool not available");
}
info!("\n=== Filesystem Server ===");
let fs_client = runner.get_client(fs_server_id)?;
fs_client.initialize().await?;
let fs_tools = fs_client.list_tools().await?;
info!("Available tools in filesystem server:");
for tool in &fs_tools {
info!("- {}: {}", tool.name, tool.description);
}
if let Some(tool) = fs_tools.iter().find(|t| t.name == "list_directory") {
let args = json!({
"path": "/tmp"
});
info!("Calling list_directory tool...");
let result: serde_json::Value = fs_client.call_tool(&tool.name, &args).await?;
info!("list_directory result: {}", result);
} else {
warn!("list_directory tool not available");
}
info!("Stopping servers...");
if let Err(e) = runner.stop_server(fetch_server_id).await {
error!("Failed to stop fetch server: {}", e);
}
if let Err(e) = runner.stop_server(fs_server_id).await {
error!("Failed to stop filesystem server: {}", e);
}
info!("simple_client example finished");
Ok(())
}