use matrixcode_core::mcp::{McpClient, McpServerConfig, Content};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
println!("=== MCP Client Test ===\n");
let config = McpServerConfig::stdio("cmd", vec![
"/C".into(),
"npx".into(),
"-y".into(),
"@playwright/mcp@latest".into()
]);
println!("Config: npx -y @playwright/mcp@latest");
let transport = config.to_transport_config()?;
println!("\nConnecting to Playwright MCP Server...");
let client = McpClient::connect("playwright", transport).await?;
println!("✓ Connected!");
if let Some(info) = client.server_info().await {
println!(" Server: {} v{}", info.name, info.version);
}
if client.supports_tools().await {
println!(" Supports tools: Yes");
println!("\nFetching tools...");
let tools = client.list_tools().await?;
println!("✓ Found {} tools:\n", tools.len());
for tool in &tools {
println!(" - {}:", tool.name);
if let Some(desc) = &tool.description {
println!(" {}", desc.lines().next().unwrap_or(""));
}
}
println!("\n=== Testing Tool Call ===");
println!("Calling browser_navigate with URL: https://example.com");
let result = client.call_tool("browser_navigate", Some(serde_json::json!({
"url": "https://example.com"
}))).await?;
println!("✓ Tool call result:");
for content in &result.content {
match content {
Content::Text { text } => {
println!(" {}", text);
}
_ => {
println!(" [Non-text content]");
}
}
}
println!("\nCalling browser_screenshot...");
let result = client.call_tool("browser_screenshot", None).await?;
println!("✓ Screenshot result:");
for content in &result.content {
match content {
Content::Image { mime_type, .. } => {
println!(" Image captured: {}", mime_type);
}
Content::Text { text } => {
println!(" {}", text);
}
_ => {}
}
}
println!("\nClosing browser...");
client.call_tool("browser_close", None).await?;
println!("✓ Browser closed");
}
println!("\nShutting down...");
client.shutdown().await?;
println!("✓ Done!");
Ok(())
}