MCP客户端库

一个用于与MCP服务器交互的Rust客户端库,专为KODEGEN.ᴀɪ数据库查询和模式探索工具设计。

  • by cyrup-ai
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 cyrup-ai/kodegen-mcp-client

使用说明

编码器-mcp-client

用于与以下对象交互的Rust客户端库 MCP(模型上下文协议) 服务器,专为 KODEGEN.017424- 数据库查询和模式探索工具。

特性

✨ 类型安全MCP客户端

  • 适用于所有100+KODEGEN工具的强类型响应结构
  • 编译时类型检查 call_tool_typed<T>()
  • 对两者的支持 camelCase 和 snake_case 字段名称

🚀 异步高效

  • 基于Tokio构建,用于高性能异步操作
  • 克隆客户端句柄成本低廉(内部基于Arc)
  • 具有合理默认值的可配置超时

🔌 多个传输

  • HTTP/SSE(服务器发送事件)
  • 流式HTTP
  • 运输选择方便

🛡️ 稳健的错误处理

  • 具有上下文的全面错误类型
  • 清除调试错误消息
  • 带有操作详细信息的超时跟踪

安装

添加到您的 Cargo.toml:

[dependencies]
kodegen_mcp_client = "0.1"

要求:

  • 锈蚀夜间工具链
  • Tokio异步运行时

快速开始

use kodegen_mcp_client::{create_streamable_client, tools, X_SESSION_PWD, X_SESSION_GITROOT};
use reqwest::header::{HeaderMap, HeaderValue};
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Build session context headers
    let mut headers = HeaderMap::new();
    let cwd = std::env::current_dir()?;
    headers.insert(X_SESSION_PWD, HeaderValue::from_str(&cwd.to_string_lossy())?);
    // Add git root if available
    if let Some(git_root) = find_git_root(&cwd) {
        headers.insert(X_SESSION_GITROOT, HeaderValue::from_str(&git_root.to_string_lossy())?);
    }

    // Create client connection with session headers
    let (client, _conn) = create_streamable_client("http://localhost:8000/mcp", headers).await?;

    // List available tools
    let tools = client.list_tools().await?;
    println!("Available tools: {}", tools.len());

    // Call a tool with JSON arguments
    let result = client.call_tool(
        tools::LIST_SCHEMAS,
        json!({}),
    ).await?;

    println!("Result: {:?}", result);

    Ok(())
}

fn find_git_root(start: &std::path::Path) -> Option<std::path::PathBuf> {
    let mut current = start.to_path_buf();
    loop {
        if current.join(".git").exists() {
            return Some(current);
        }
        if !current.pop() {
            return None;
        }
    }
}

使用示例

类型安全工具调用

使用强类型响应而不是手动JSON解析:

use kodegen_mcp_client::responses::StartSearchResponse;
use kodegen_mcp_client::tools;

// Type-safe tool call with automatic deserialization
let response: StartSearchResponse = client
    .call_tool_typed(tools::START_SEARCH, json!({
        "path": "/project",
        "pattern": "*.rs",
        "searchType": "files"
    }))
    .await?;

// Use the typed response
println!("Search session ID: {}", response.session_id);

可克隆的客户端句柄

客户端句柄的克隆成本很低,可以跨任务共享:

use reqwest::header::HeaderMap;

let (client, _conn) = create_streamable_client(url, HeaderMap::new()).await?;

// Clone the client for concurrent operations
let client2 = client.clone();
tokio::spawn(async move {
    client2.list_tools().await
});

// Original client still works
client.call_tool(tools::READ_FILE, args).await?;

自定义超时

use reqwest::header::HeaderMap;
use tokio::time::Duration;

let (client, _conn) = create_streamable_client(url, HeaderMap::new()).await?;

// Set custom timeout (default is 10 minutes)
let client = client.with_timeout(Duration::from_secs(60));

GitHub集成

use kodegen_mcp_client::responses::{GitHubIssuesResponse, GitHubIssue};

let response: GitHubIssuesResponse = client
    .call_tool_typed(tools::LIST_ISSUES, json!({
        "owner": "myorg",
        "repo": "myrepo",
        "state": "open"
    }))
    .await?;

for issue in response.issues {
    println!("#{}: {}", issue.number, issue.title);
}

数据库操作

use kodegen_mcp_client::tools;

// Execute SQL query
let result = client.call_tool(tools::EXECUTE_SQL, json!({
    "query": "SELECT * FROM users WHERE active = true",
    "database": "production"
})).await?;

// Get table schema
let schema = client.call_tool(tools::GET_TABLE_SCHEMA, json!({
    "table_name": "users",
    "schema": "public"
})).await?;

建筑

手柄+连接方式

该库使用双结构模式进行资源管理:

  • KodegenClient:用于执行MCP操作的克隆手柄成本低廉

    • 跨异步任务自由克隆和共享
    • 包裹 Arc 内部用于高效克隆
    • 线程安全且可共享
  • KodegenConnection:不可克隆的生命周期管理器

    • 只要连接保持活动状态,就必须保持
    • 提供 close() 用于优雅关机
    • 断开连接时自动取消连接
use reqwest::header::HeaderMap;

let (client, _conn) = create_streamable_client(url, HeaderMap::new()).await?;
// client: Clone freely
// _conn: Hold until shutdown desired (auto-cleanup on drop)

可用工具类别

该库提供对100+KODEGEN的类型安全访问。ᴀ多种类别的工具:

  • 文件系统 (14个工具):文件操作、搜索、目录管理
  • 终端 (5个工具):命令执行、流程管理
  • 数据库 (7个工具):模式探索、查询执行、连接池
  • Git (20个工具):存储库操作、分支、提交、工作树
  • GitHub (25个工具):问题、PR、评论、代码搜索、存储库
  • 克劳德特工 (5个工具):多代理编排、生成、通信
  • 网络爬虫 (4个工具):网站爬行、搜索、内容提取
  • 配置 (2个工具):服务器配置管理
  • 提示 (4个工具):模板管理和渲染
  • 顺序思维 (1个工具):思维链推理

所有工具名称在 tools 模块。

错误处理

该库提供了具有上下文的全面错误类型:

use kodegen_mcp_client::ClientError;

match client.call_tool(tools::READ_FILE, args).await {
    Ok(result) => println!("Success: {:?}", result),
    Err(ClientError::Timeout(msg)) => eprintln!("Timeout: {}", msg),
    Err(ClientError::ParseError(msg)) => eprintln!("Parse error: {}", msg),
    Err(ClientError::Connection(msg)) => eprintln!("Connection failed: {}", msg),
    Err(e) => eprintln!("Other error: {}", e),
}

错误变体:

  • Protocol:MCP协议错误
  • Timeout:操作超时(包括持续时间)
  • ParseError:响应反序列化失败
  • Connection:传输连接失败
  • ServiceError, InitError, Io, JoinError:低级错误

运输选项

流式HTTP(推荐)

use kodegen_mcp_client::create_streamable_client;
use reqwest::header::HeaderMap;

let (client, conn) = create_streamable_client("http://localhost:8000/mcp", HeaderMap::new()).await?;

HTTP/SSE(服务器发送事件)

use kodegen_mcp_client::transports::http::create_http_client;

let (client, conn) = create_http_client("http://localhost:8000/mcp").await?;

发展

建筑

cargo build              # Debug build
cargo build --release    # Release build

测试

cargo test               # Run all tests
cargo test --lib         # Library tests only

装订和格式化

cargo clippy             # Run linter
cargo fmt                # Format code

文档

cargo doc --open         # Build and open docs

许可证

根据Apache 2.0或MIT条款双重许可。

看 许可证.md 了解详情。

链接


版权所有©2025大卫·枫树/KODEGEN。ᴀɪ