use pmcp::{Client, ClientCapabilities, StdioTransport};
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt()
.with_env_filter("pmcp=info")
.init();
println!("=== MCP Client Tools Example ===\n");
let transport = StdioTransport::new();
let mut client = Client::new(transport);
let capabilities = ClientCapabilities::minimal();
println!("Connecting to server...");
let _server_info = client.initialize(capabilities).await?;
println!("✅ Connected!\n");
println!("📋 Listing available tools:");
let tools_result = client.list_tools(None).await?;
for tool in &tools_result.tools {
println!("\n🔧 Tool: {}", tool.name);
if let Some(desc) = &tool.description {
println!(" Description: {}", desc);
}
if !tool.input_schema.is_null() {
println!(
" Input schema: {}",
serde_json::to_string_pretty(&tool.input_schema)?
);
}
}
println!("\n\n📐 Calling calculator tool:");
let calc_args = json!({
"operation": "multiply",
"a": 42,
"b": std::f64::consts::PI
});
println!(
" Arguments: {}",
serde_json::to_string_pretty(&calc_args)?
);
match client.call_tool("calculator".to_string(), calc_args).await {
Ok(result) => {
println!(
" ✅ Result: {}",
serde_json::to_string_pretty(&result.content)?
);
},
Err(e) => {
println!(" ❌ Error: {}", e);
},
}
println!("\n\n📝 Calling string manipulation tool:");
let string_args = json!({
"text": "Hello, MCP!",
"operation": "reverse"
});
println!(
" Arguments: {}",
serde_json::to_string_pretty(&string_args)?
);
match client
.call_tool("string_manipulator".to_string(), string_args)
.await
{
Ok(result) => {
println!(
" ✅ Result: {}",
serde_json::to_string_pretty(&result.content)?
);
},
Err(e) => {
println!(" ❌ Error: {}", e);
},
}
println!("\n\n⚠️ Testing error handling:");
let bad_args = json!({
"operation": "divide",
"a": 10,
"b": 0 });
println!(" Arguments: {}", serde_json::to_string_pretty(&bad_args)?);
match client.call_tool("calculator".to_string(), bad_args).await {
Ok(result) => {
println!(
" Result: {}",
serde_json::to_string_pretty(&result.content)?
);
},
Err(e) => {
println!(" ✅ Error caught: {}", e);
if let Some(code) = e.error_code() {
println!(" Error code: {:?}", code);
}
},
}
Ok(())
}