pub mod common;
use crate::common::{initialize_tracing, inquiry_utils::InquiryUtils, ExampleClientHandler};
use rust_mcp_sdk::schema::{
ClientCapabilities, Implementation, InitializeRequestParams, LoggingLevel,
SetLevelRequestParams, LATEST_PROTOCOL_VERSION,
};
use rust_mcp_sdk::{
error::SdkResult,
mcp_client::{client_runtime, McpClientOptions},
mcp_icon, McpClient, StdioTransport, ToMcpClientHandler, TransportOptions,
};
use std::sync::Arc;
const MCP_SERVER_TO_LAUNCH: &str = "@modelcontextprotocol/server-everything";
#[tokio::main]
async fn main() -> SdkResult<()> {
initialize_tracing();
let client_details: InitializeRequestParams = InitializeRequestParams {
capabilities: ClientCapabilities::default(),
client_info: Implementation {
name: "simple-rust-mcp-client-stdio".into(),
version: "0.1.0".into(),
title: Some("Simple Rust MCP Client (Stdio)".into()),
description: Some("Simple Rust MCP Client, by Rust MCP SDK".into()),
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: Some("https://github.com/rust-mcp-stack/rust-mcp-sdk".into()),
},
protocol_version: LATEST_PROTOCOL_VERSION.into(),
meta: None,
};
let transport = StdioTransport::create_with_server_launch(
"npx",
vec!["-y".into(), MCP_SERVER_TO_LAUNCH.into()],
None,
TransportOptions::default(),
)?;
let handler = ExampleClientHandler {};
let client = client_runtime::create_client(McpClientOptions {
client_details,
transport,
handler: handler.to_mcp_client_handler(),
task_store: None,
server_task_store: None,
message_observer: None,
});
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?;
utils
.client
.request_set_logging_level(SetLevelRequestParams {
level: LoggingLevel::Debug,
meta: None,
})
.await?;
utils.ping_n_times(3).await;
client.shut_down().await?;
Ok(())
}