use mcp_protocol_sdk::prelude::*;
use mcp_protocol_sdk::transport::{HttpClientTransport, TransportConfig};
use serde_json::json;
use std::collections::HashMap;
use std::time::Duration;
use tracing::{error, info, warn};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
info!("Starting Conservative HTTP Demo");
let config = TransportConfig {
connect_timeout_ms: Some(10_000), read_timeout_ms: Some(30_000), write_timeout_ms: Some(30_000), max_message_size: Some(512 * 1024), keep_alive_ms: Some(300_000), compression: true,
headers: std::collections::HashMap::new(),
};
info!("Conservative HTTP Configuration:");
info!(" - Connect timeout: 10s");
info!(" - Read timeout: 30s");
info!(" - Write timeout: 30s");
info!(" - Max message size: 512KB");
info!(" - Keep alive: 5min");
info!(" - Compression: enabled");
let server_task = tokio::spawn(async {
if let Err(e) = demo_server().await {
eprintln!("Demo server error: {}", e);
}
});
tokio::time::sleep(Duration::from_millis(500)).await;
let transport = match HttpClientTransport::with_config(
"http://localhost:3001",
None, config,
)
.await
{
Ok(transport) => transport,
Err(e) => {
error!("Failed to create HTTP transport: {}", e);
return Ok(());
}
};
let mut client = McpClient::new("conservative-demo-client".to_string(), "1.0.0".to_string());
info!("Connecting to server...");
match client.connect(transport).await {
Ok(_) => info!("Connected successfully"),
Err(e) => {
warn!(
"Connection failed: {}. This is expected if demo server isn't running",
e
);
return Ok(());
}
}
info!("✅ Client connected successfully");
info!("Demonstrating conservative HTTP behavior...");
let mut params = HashMap::new();
params.insert("test".to_string(), json!("value"));
match client
.call_tool("demo_tool".to_string(), Some(params))
.await
{
Ok(result) => info!("Tool call successful: {:?}", result),
Err(e) => info!("Tool call failed (expected): {}", e),
}
info!("Connection Info:");
info!(" - Transport info available");
server_task.abort();
info!("Conservative HTTP Demo completed");
Ok(())
}
async fn demo_server() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
use axum::{Router, response::Json, routing::post};
use std::net::SocketAddr;
let app = Router::new().route(
"/",
post(|| async {
Json(json!({
"jsonrpc": "2.0",
"result": {"status": "ok"},
"id": 1
}))
}),
);
let addr = SocketAddr::from(([127, 0, 0, 1], 3001));
info!("Demo server listening on {}", addr);
let listener = tokio::net::TcpListener::bind(addr).await?;
axum::serve(listener, app).await?;
Ok(())
}