使用说明

项目简介

Kuri 是一个使用 Rust 语言开发的框架,旨在帮助开发者轻松构建 Model Context Protocol (MCP) 服务器。它提供了定义和管理工具 (Tools) 和 Prompt 模板 (Prompts) 的能力,并支持通过 Stdio 进行 JSON-RPC 通信。Kuri 框架的设计目标是开发者友好和代码清晰,使得用 Rust 构建 MCP 服务器变得简单高效。

主要功能点

  • 工具 (Tools) 管理: 允许注册和执行由 LLM 客户端调用的外部功能,例如计算器、数据查询等。工具以 Rust 函数的形式定义,并通过装饰器 '#[tool]' 声明,方便快捷。
  • Prompt 模板 (Prompts) 管理: 支持定义和渲染 Prompt 模板,允许 LLM 客户端获取预定义的 Prompt 文本,以定制 LLM 的交互行为。Prompt 模板也以 Rust 异步函数的形式定义,通过 '#[prompt]' 装饰器声明。
  • 基于 JSON-RPC 协议: 使用标准的 JSON-RPC 协议与 MCP 客户端进行通信,确保了良好的互操作性。
  • Stdio 传输: 支持标准的 Stdio (标准输入/输出) 作为传输协议,易于部署和测试。
  • 能力声明: 服务器能够声明自身提供的工具和 Prompt 能力,方便客户端了解服务器的功能。
  • 会话管理: 服务器端负责管理会话,虽然文档中没有明确强调会话管理的细节,但作为 MCP 服务器实现的基础功能,框架应已包含或易于扩展实现会话管理。
  • 易于扩展: 基于 Tower 生态系统构建,可以方便地利用 Tower 中间件进行功能扩展,例如添加超时处理、追踪、panic 处理等。

安装步骤

  1. 安装 Rust 环境: 如果尚未安装 Rust,请访问 https://www.rust-lang.org/tools/install 按照官方指南安装 Rust 工具链。

  2. 创建 Cargo 项目: 打开终端,使用 Cargo 创建一个新的 Rust 项目(如果已有项目则跳过此步骤):

    cargo new my_mcp_server
    cd my_mcp_server
  3. 添加依赖: 编辑 'Cargo.toml' 文件,在 '[dependencies]' 部分添加 'kuri' 及其它必要的依赖:

    [dependencies]
    kuri = "0.1"
    async-trait = "0.1"
    schemars = "0.8"
    serde = { version = "1.0", features = ["derive"] }
    serde_json = "1.0"
    tokio = { version = "1", features = ["full"] }
    tracing-subscriber = "0.3" # 可选,用于日志
    anyhow = "1.0" # 可选,用于错误处理
  4. 编写服务器代码: 根据 'kuri' 提供的示例,在 'src/main.rs' 文件中编写 MCP 服务器代码。例如,可以参考 'examples' 目录下的示例代码,如 '01_simple_calculator_tool_server.rs' 或 '03_prompt_server.rs',根据需要添加或修改工具和 Prompt 的定义。

    一个简单的 'src/main.rs' 示例 (基于 '01_simple_calculator_tool_server.rs'):

    use anyhow::Result;
    use kuri::{MCPServiceBuilder, ToolError, serve, tool, transport::StdioTransport};
    
    #[tool(
        description = "执行基本的算术运算",
        params(
            x = "计算中的第一个数字",
            y = "计算中的第二个数字",
            operation = "要执行的操作 (add, subtract, multiply, divide)"
        )
    )]
    async fn calculator(x: i32, y: i32, operation: String) -> Result<i32, ToolError> {
        match operation.as_str() {
            "add" => Ok(x + y),
            "subtract" => Ok(x - y),
            "multiply" => Ok(x * y),
            "divide" => {
                if y == 0 {
                    Err(ToolError::ExecutionError("除零错误".to_string()))
                } else {
                    Ok(x / y)
                }
            }
            _ => Err(ToolError::InvalidParameters(format!(
                "未知操作: {}",
                operation
            ))),
        }
    }
    
    #[tokio::main]
    async fn main() -> Result<()> {
        let service = MCPServiceBuilder::new(
            "Calculator Server".to_string(),
            "提供一个计算器工具的 MCP 服务器".to_string(),
        )
        .with_tool(Calculator)
        .build();
    
        serve(service, StdioTransport::new()).await?;
        Ok(())
    }
  5. 编译项目: 在终端中,使用 Cargo 编译项目:

    cargo build --release

    可执行文件将位于 'target/release/my_mcp_server' (或 'target/debug/my_mcp_server' for debug build)。

服务器配置

MCP 客户端需要配置 MCP 服务器的启动命令和参数才能连接。以下是一个 JSON 格式的配置示例,用于连接上面 'src/main.rs' 中定义的计算器服务器。

{
  "serverName": "Calculator Server",  //  MCP 服务器名称,与代码中 MCPServiceBuilder::new() 中定义的名称一致
  "command": "target/release/my_mcp_server", // MCP 服务器可执行文件的路径,根据实际编译结果调整
  "args": [], //  启动参数,对于 Stdio 传输通常为空数组
  "transport": "stdio" //  传输协议,stdio 表示标准输入输出
}

配置参数说明:

  • 'serverName': MCP 服务器的名称,用于客户端识别和显示。
  • 'command': 启动 MCP 服务器进程的命令,通常是编译后的可执行文件路径。
  • 'args': 传递给服务器进程的命令行参数,本例中使用 Stdio 传输,无需额外参数。
  • 'transport': 指定传输协议,这里使用 'stdio' 表示通过标准输入输出进行通信。

基本使用方法

  1. 启动 MCP 服务器: 在终端中,导航到项目根目录,并运行编译后的可执行文件(或直接使用 'cargo run --example 01_simple_calculator_tool_server' 运行示例)。服务器将通过 Stdio 监听 MCP 客户端的请求。
  2. 配置 MCP 客户端: 在 MCP 客户端应用中,根据上述 “服务器配置” 章节的说明,配置连接到 Kuri MCP 服务器。确保客户端配置的 'command' 指向正确的可执行文件路径。
  3. 客户端发起请求: 客户端启动后,应能自动与 Kuri MCP 服务器建立连接,并可以发现服务器提供的工具和 Prompt。客户端可以调用 'tools/list' 和 'prompts/list' 方法获取工具和 Prompt 列表,然后使用 'tools/call' 调用工具,或使用 'prompts/get' 获取 Prompt 内容。
  4. 查看日志 (可选): 如果代码中配置了日志功能 (例如使用了 'tracing-subscriber' 示例),可以在指定的日志文件 (如 'server.log') 中查看服务器运行日志,帮助调试和监控。

注意:

  • 本使用说明基于 Stdio 传输,Kuri 框架未来可能会支持更多传输协议 (如 HTTP),届时配置和使用方法可能会有所不同。
  • 示例代码和配置仅供参考,实际使用时请根据具体需求进行调整和扩展。

信息

分类

开发者工具