mirror of
https://github.com/aljazceru/goose.git
synced 2025-12-17 14:14:26 +01:00
94 lines
3.0 KiB
Rust
94 lines
3.0 KiB
Rust
// This example shows how to use the mcp-client crate to interact with a server that has a simple counter tool.
|
|
// The server is started by running `cargo run -p mcp-server` in the root of the mcp-server crate.
|
|
use anyhow::Result;
|
|
use mcp_client::client::{
|
|
ClientCapabilities, ClientInfo, Error as ClientError, McpClient, McpClientTrait,
|
|
};
|
|
use mcp_client::transport::{StdioTransport, Transport};
|
|
use std::collections::HashMap;
|
|
use std::time::Duration;
|
|
use tracing_subscriber::EnvFilter;
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), ClientError> {
|
|
// Initialize logging
|
|
tracing_subscriber::fmt()
|
|
.with_env_filter(
|
|
EnvFilter::from_default_env()
|
|
.add_directive("mcp_client=debug".parse().unwrap())
|
|
.add_directive("eventsource_client=debug".parse().unwrap()),
|
|
)
|
|
.init();
|
|
|
|
// Create the transport
|
|
let transport = StdioTransport::new(
|
|
"cargo",
|
|
vec!["run", "-p", "mcp-server"]
|
|
.into_iter()
|
|
.map(|s| s.to_string())
|
|
.collect(),
|
|
HashMap::new(),
|
|
);
|
|
|
|
// Start the transport to get a handle
|
|
let transport_handle = transport.start().await.unwrap();
|
|
|
|
// Create client
|
|
let mut client = McpClient::connect(transport_handle, Duration::from_secs(10)).await?;
|
|
|
|
// Initialize
|
|
let server_info = client
|
|
.initialize(
|
|
ClientInfo {
|
|
name: "test-client".into(),
|
|
version: "1.0.0".into(),
|
|
},
|
|
ClientCapabilities::default(),
|
|
)
|
|
.await?;
|
|
println!("Connected to server: {server_info:?}\n");
|
|
|
|
// List tools
|
|
let tools = client.list_tools(None).await?;
|
|
println!("Available tools: {tools:?}\n");
|
|
|
|
// Call tool 'increment' tool 3 times
|
|
for _ in 0..3 {
|
|
let increment_result = client.call_tool("increment", serde_json::json!({})).await?;
|
|
println!("Tool result for 'increment': {increment_result:?}\n");
|
|
}
|
|
|
|
// Call tool 'get_value'
|
|
let get_value_result = client.call_tool("get_value", serde_json::json!({})).await?;
|
|
println!("Tool result for 'get_value': {get_value_result:?}\n");
|
|
|
|
// Call tool 'decrement' once
|
|
let decrement_result = client.call_tool("decrement", serde_json::json!({})).await?;
|
|
println!("Tool result for 'decrement': {decrement_result:?}\n");
|
|
|
|
// Call tool 'get_value'
|
|
let get_value_result = client.call_tool("get_value", serde_json::json!({})).await?;
|
|
println!("Tool result for 'get_value': {get_value_result:?}\n");
|
|
|
|
// List resources
|
|
let resources = client.list_resources(None).await?;
|
|
println!("Resources: {resources:?}\n");
|
|
|
|
// Read resource
|
|
let resource = client.read_resource("memo://insights").await?;
|
|
println!("Resource: {resource:?}\n");
|
|
|
|
let prompts = client.list_prompts(None).await?;
|
|
println!("Prompts: {prompts:?}\n");
|
|
|
|
let prompt = client
|
|
.get_prompt(
|
|
"example_prompt",
|
|
serde_json::json!({"message": "hello there!"}),
|
|
)
|
|
.await?;
|
|
println!("Prompt: {prompt:?}\n");
|
|
|
|
Ok(())
|
|
}
|