use mcprotocol_rs::{
protocol::{Message, Method, Request, RequestId},
transport::{ClientTransportFactory, TransportConfig, TransportType},
Result,
};
use serde_json::json;
use std::{collections::HashSet, env, time::Duration};
use tokio::time::sleep;
#[tokio::main]
async fn main() -> Result<()> {
let mut session_ids = HashSet::new();
let server_path = env::current_dir()?.join("target/debug/examples/stdio_server");
let config = TransportConfig {
transport_type: TransportType::Stdio {
server_path: Some(server_path.to_str().unwrap().to_string()),
server_args: None,
},
parameters: None,
};
let factory = ClientTransportFactory;
let mut client = factory.create(config)?;
client.initialize().await?;
eprintln!("Client initialized and connected to server...");
sleep(Duration::from_millis(100)).await;
let request_id = RequestId::Number(1);
let request = Request::new(
Method::ExecutePrompt,
Some(json!({
"content": "Hello from client!",
"role": "user"
})),
request_id,
);
if !request.validate_id_uniqueness(&mut session_ids) {
eprintln!("Request ID has already been used in this session");
return Ok(());
}
eprintln!("Sending message to server...");
client.send(Message::Request(request)).await?;
match client.receive().await {
Ok(response) => {
eprintln!("Received response: {:?}", response);
match response {
Message::Response(resp) => {
if let Some(result) = resp.result {
eprintln!("Server response result: {}", result);
}
if let Some(error) = resp.error {
eprintln!(
"Server response error: {} (code: {})",
error.message, error.code
);
}
}
_ => eprintln!("Unexpected response type"),
}
}
Err(e) => {
eprintln!("Error receiving response: {}", e);
}
}
client.close().await?;
Ok(())
}