stdio/
stdio.rs

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    // Initialize logging
14    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    // 1) Create the transport
23    let transport = StdioTransport::new("uvx", vec!["mcp-server-git".to_string()], HashMap::new());
24
25    // 2) Start the transport to get a handle
26    let transport_handle = transport.start().await?;
27
28    // 3) Create the service with timeout middleware
29    let service = McpService::with_timeout(transport_handle, Duration::from_secs(10));
30
31    // 4) Create the client with the middleware-wrapped service
32    let mut client = McpClient::new(service);
33
34    // Initialize
35    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    // List tools
47    let tools = client.list_tools(None).await?;
48    println!("Available tools: {tools:?}\n");
49
50    // Call tool 'git_status' with arguments = {"repo_path": "."}
51    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    // List resources
57    let resources = client.list_resources(None).await?;
58    println!("Available resources: {resources:?}\n");
59
60    Ok(())
61}