1use std::collections::HashMap;
2
3use anyhow::Result;
4use mcp_client::{
5 ClientCapabilities, ClientInfo, Error as ClientError, McpClient, McpClientTrait, McpService,
6 StdioTransport, Transport,
7};
8use std::time::Duration;
9use tracing_subscriber::EnvFilter;
10
11#[tokio::main]
12async fn main() -> Result<(), ClientError> {
13 tracing_subscriber::fmt()
15 .with_env_filter(
16 EnvFilter::from_default_env()
17 .add_directive("mcp_client=debug".parse().unwrap())
18 .add_directive("eventsource_client=debug".parse().unwrap()),
19 )
20 .init();
21
22 let transport = StdioTransport::new("uvx", vec!["mcp-server-git".to_string()], HashMap::new());
24
25 let transport_handle = transport.start().await?;
27
28 let service = McpService::with_timeout(transport_handle, Duration::from_secs(10));
30
31 let mut client = McpClient::new(service);
33
34 let server_info = client
36 .initialize(
37 ClientInfo {
38 name: "test-client".into(),
39 version: "1.0.0".into(),
40 },
41 ClientCapabilities::default(),
42 )
43 .await?;
44 println!("Connected to server: {server_info:?}\n");
45
46 let tools = client.list_tools(None).await?;
48 println!("Available tools: {tools:?}\n");
49
50 let tool_result = client
52 .call_tool("git_status", serde_json::json!({ "repo_path": "." }))
53 .await?;
54 println!("Tool result: {tool_result:?}\n");
55
56 let resources = client.list_resources(None).await?;
58 println!("Available resources: {resources:?}\n");
59
60 Ok(())
61}