返回市场
MCP远程服务

MCP远程服务

作者:ethereumdegen3 星标更新:2025-03-04

项目介绍

mcp-rs

这是一个用Rust实现的MCP服务器(模型上下文协议)。这是对原始TypeScript实现的Rust移植。

功能

这个Rust实现提供了原始MCP的所有功能:

  • 所有核心MCP服务器功能
  • 内置的身份验证处理器
  • 支持自定义分层中间件
  • 灵活的传输选项(标准输入输出和SSE)

快速开始

安装

在你的Cargo.toml中添加以下内容:

[dependencies]
mcp-rs = "0.1.0"

基本用法

这里是一个如何使用该库的基本示例:

use mcp_rs::{Emcp, SimpleToolBuilder};
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建一个新的服务器实例
    let server = Emcp::new("my-mcp-server", "1.0.0", None);
    
    // 添加一个工具
    let add_tool = SimpleToolBuilder::new("add", |args| async move {
        let a = args["a"].as_f64().unwrap_or(0.0);
        let b = args["b"].as_f64().unwrap_or(0.0);
        Ok(json!(a + b))
    })
    .description("加两个数")
    .input_schema(json!({
        "type": "object",
        "properties": {
            "a": { "type": "number" },
            "b": { "type": "number" }
        },
        "required": ["a", "b"]
    }))
    .build();
    
    server.add_tool(add_tool);
    
    // 启动服务器
    server.start(None).await?;
    
    Ok(())
}

身份验证示例

use mcp_rs::{Emcp, EmcpOptions, SimpleToolBuilder};
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建身份验证处理器
    let auth_handler = Box::new(|request| {
        // 检查认证头、令牌等
        Box::pin(async { 
            // 对于授权请求返回true
            true 
        })
    });
    
    // 使用身份验证处理器创建新的服务器
    let server = Emcp::new(
        "mcp-server-with-auth",
        "1.0.0",
        Some(EmcpOptions {
            authentication_handler: Some(auth_handler),
        }),
    );
    
    // 添加工具、资源或提示...
    
    // 启动服务器
    server.start(None).await?;
    
    Ok(())
}

中间件示例

use mcp_rs::{Emcp, SimpleToolBuilder};
use std::time::Instant;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建一个新的服务器
    let mut server = Emcp::new("mcp-server-with-middleware", "1.0.0", None);
    
    // 添加计时中间件
    server.use_middleware(|request, next| {
        let start_time = Instant::now();
        let method = request.method.clone();
        
        Box::pin(async move {
            // 调用链中的下一个中间件
            let response = next().await;
            
            // 后处理
            let duration = start_time.elapsed();
            println!(
                "请求完成:方法={}, 持续时间={}毫秒",
                method,
                duration.as_millis()
            );
            
            response
        })
    });
    
    // 添加工具、资源或提示...
    
    // 启动服务器
    server.start(None).await?;
    
    Ok(())
}

中间件的工作原理

mcp-rs中的中间件运行方式与原始TypeScript实现相同:

  1. 中间件按注册顺序执行
  2. 每个中间件可以在调用next()之前进行预处理
  3. 核心MCP处理器在所有中间件预处理完成后运行
  4. 处理器完成之后,中间件后处理(next()调用后的代码)按相反顺序运行

这创建了一个类似于Axum、Tower或其他基于中间件系统的“洋葱状”处理流程。

直接使用StdioServerTransport

该库支持直接使用StdioServerTransport,类似于Node.js MCP SDK:

use mcp_rs::{Emcp, StdioServerTransport, SimpleToolBuilder};
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建一个新的服务器
    let server = Emcp::new("my-mcp-server", "1.0.0", None);
    
    // 添加你的工具、资源和提示
    // ...
    
    // 创建一个StdioServerTransport
    let transport = StdioServerTransport::new();
    
    // 将服务器连接到传输
    server.connect(transport).await?;
    
    Ok(())
}

运行示例

仓库中包括几个演示库特性的示例:

# 运行基本示例
cargo run --example basic

# 运行身份验证示例
cargo run --example auth

# 运行中间件示例
cargo run --example middleware

# 运行标准输入输出传输示例
cargo run --example stdio_transport

许可证

MIT