1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//! Example: Client initialization and capability negotiation
//!
//! This example demonstrates:
//! - Creating a client with stdio transport
//! - Initializing connection with server
//! - Specifying client capabilities
//! - Handling server capability response
use pmcp::{Client, ClientCapabilities, StdioTransport};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize logging
tracing_subscriber::fmt()
.with_env_filter("pmcp=debug")
.init();
println!("=== MCP Client Initialization Example ===\n");
// Create client with stdio transport
let transport = StdioTransport::new();
let mut client = Client::new(transport);
// Define client capabilities
// Note: Client capabilities indicate what the CLIENT can do (handle sampling requests,
// provide user input). Server capabilities (tools, prompts, resources) are advertised
// by servers, not clients.
// ClientCapabilities::full() enables sampling, elicitation, and roots
let capabilities = ClientCapabilities::full();
println!("Initializing connection with capabilities:");
println!("{:#?}\n", capabilities);
// Initialize connection
match client.initialize(capabilities).await {
Ok(result) => {
println!("✅ Successfully connected to server!");
println!(
"Server: {} v{}",
result.server_info.name, result.server_info.version
);
println!("\nServer capabilities:");
println!("{:#?}", result.capabilities);
// Check what the server supports
if result.capabilities.provides_tools() {
println!("\n✓ Server supports tools");
}
if result.capabilities.provides_prompts() {
println!("✓ Server supports prompts");
}
if result.capabilities.provides_resources() {
println!("✓ Server supports resources");
}
},
Err(e) => {
eprintln!("❌ Failed to initialize: {}", e);
return Err(e.into());
},
}
Ok(())
}