stdio_client/
stdio_client.rs1use mcprotocol_rs::{
2 protocol::{Message, Method, Request, RequestId},
3 transport::{ClientTransportFactory, TransportConfig, TransportType},
4 Result,
5};
6use serde_json::json;
7use std::{collections::HashSet, env, time::Duration};
8use tokio::time::sleep;
9
10#[tokio::main]
11async fn main() -> Result<()> {
12 let mut session_ids = HashSet::new();
15
16 let server_path = env::current_dir()?.join("target/debug/examples/stdio_server");
19
20 let config = TransportConfig {
23 transport_type: TransportType::Stdio {
24 server_path: Some(server_path.to_str().unwrap().to_string()),
25 server_args: None,
26 },
27 parameters: None,
28 };
29
30 let factory = ClientTransportFactory;
33 let mut client = factory.create(config)?;
34
35 client.initialize().await?;
38 eprintln!("Client initialized and connected to server...");
39
40 sleep(Duration::from_millis(100)).await;
43
44 let request_id = RequestId::Number(1);
47 let request = Request::new(
48 Method::ExecutePrompt,
49 Some(json!({
50 "content": "Hello from client!",
51 "role": "user"
52 })),
53 request_id,
54 );
55
56 if !request.validate_id_uniqueness(&mut session_ids) {
59 eprintln!("Request ID has already been used in this session");
60 return Ok(());
61 }
62
63 eprintln!("Sending message to server...");
66 client.send(Message::Request(request)).await?;
67
68 match client.receive().await {
71 Ok(response) => {
72 eprintln!("Received response: {:?}", response);
73 match response {
74 Message::Response(resp) => {
75 if let Some(result) = resp.result {
76 eprintln!("Server response result: {}", result);
77 }
78 if let Some(error) = resp.error {
79 eprintln!(
80 "Server response error: {} (code: {})",
81 error.message, error.code
82 );
83 }
84 }
85 _ => eprintln!("Unexpected response type"),
86 }
87 }
88 Err(e) => {
89 eprintln!("Error receiving response: {}", e);
90 }
91 }
92
93 client.close().await?;
96 Ok(())
97}