rustglm 1.0.0

Production-oriented async Rust SDK for Zhipu GLM, Realtime, Batch, RAG, and MCP
Documentation
use rustglm::McpClientConfig;
use serde_json::Map;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut args = std::env::args().skip(1);
    let endpoint = args.next().ok_or(
        "usage: cargo run --example mcp_client --features mcp -- <endpoint> [list|call|read|prompt]",
    )?;
    let operation = args.next().unwrap_or_else(|| "list".to_owned());
    let mut config = McpClientConfig::new(endpoint);
    if let Ok(token) = std::env::var("MCP_BEARER_TOKEN") {
        config = config.bearer_token(token);
    }
    let mut client = config.connect().await?;
    match operation.as_str() {
        "list" => {
            for tool in client.list_tools().await? {
                println!("tool={}", tool.name);
            }
            for resource in client.list_resources().await? {
                println!("resource={}", resource.uri);
            }
            for template in client.list_resource_templates().await? {
                println!("resource_template={}", template.uri_template);
            }
            for prompt in client.list_prompts().await? {
                println!("prompt={}", prompt.name);
            }
        }
        "call" => {
            let name = args
                .next()
                .ok_or("mcp_client <endpoint> call <tool> [json]")?;
            let arguments = args
                .next()
                .map(|raw| serde_json::from_str::<Map<String, serde_json::Value>>(&raw))
                .transpose()?;
            println!("{:#?}", client.call_tool(name, arguments).await?);
        }
        "read" => {
            let uri = args.next().ok_or("mcp_client <endpoint> read <uri>")?;
            println!("{:#?}", client.read_resource(uri).await?);
        }
        "prompt" => {
            let name = args.next().ok_or("mcp_client <endpoint> prompt <name>")?;
            println!("{:#?}", client.get_prompt(name, None).await?);
        }
        _ => return Err("operation must be list, call, read, or prompt".into()),
    }
    client.close().await?;
    Ok(())
}