pub mod common;
use crate::common::inquiry_utils::InquiryUtils;
use crate::common::{initialize_tracing, ExampleClientHandler, SimpleClientObserver};
use rust_mcp_sdk::schema::{
ClientCapabilities, Implementation, InitializeRequestParams, LoggingLevel,
SetLevelRequestParams, LATEST_PROTOCOL_VERSION,
};
use rust_mcp_sdk::{
error::SdkResult, mcp_client::client_runtime, mcp_icon, McpClient, RequestOptions,
StreamableTransportOptions,
};
use std::sync::Arc;
const MCP_SERVER_URL: &str = "http://127.0.0.1:3001/mcp";
#[tokio::main]
async fn main() -> SdkResult<()> {
initialize_tracing();
let client_details: InitializeRequestParams = InitializeRequestParams {
capabilities: ClientCapabilities::default(),
client_info: Implementation {
name: "simple-rust-mcp-client".into(),
version: "0.1.0".into(),
title: Some("Simple Rust MCP Client (Streamable Http/SSE)".into()),
description: None,
icons: vec![mcp_icon!(
src = "https://raw.githubusercontent.com/rust-mcp-stack/rust-mcp-sdk/main/assets/rust-mcp-icon.png",
mime_type = "image/png",
sizes = ["128x128"],
theme = "dark"
)],
website_url: None,
},
protocol_version: LATEST_PROTOCOL_VERSION.into(),
meta: None,
};
let transport_options = StreamableTransportOptions {
mcp_url: MCP_SERVER_URL.into(),
request_options: RequestOptions {
..RequestOptions::default()
},
};
let handler = ExampleClientHandler {};
let client = client_runtime::with_transport_options(
client_details,
transport_options,
handler,
None,
None,
Some(SimpleClientObserver::new()),
);
client.clone().start().await?;
let utils = InquiryUtils {
client: Arc::clone(&client),
};
utils.print_server_info();
utils.print_server_capabilities();
utils.print_tool_list().await?;
utils.print_prompts_list().await?;
utils.print_resource_list().await?;
utils.print_resource_templates().await?;
utils.call_get_sum_tool(100, 25).await?;
match utils
.client
.request_set_logging_level(SetLevelRequestParams {
level: LoggingLevel::Debug,
meta: None,
})
.await
{
Ok(_) => println!("Log level is set to \"Debug\""),
Err(err) => eprintln!("Error setting the Log level : {err}"),
}
utils.ping_n_times(3).await;
client.shut_down().await?;
Ok(())
}