MCP协议服务器实现

一个Rust实现的MCP服务器(Model Context Protocol),提供核心MCP功能、内置认证处理、自定义中间件支持和灵活的传输选项。

  • by ethereumdegen
  • Rust
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 ethereumdegen/mcp-rs

使用说明

mcp rs

MCP服务器的Rust实现(模型上下文协议)。这是一个Rust端口 原始TypeScript实现.

特性

这个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>> {
    // Create a new server instance
    let server = Emcp::new("my-mcp-server", "1.0.0", None);
    
    // Add a tool
    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("Add two numbers")
    .input_schema(json!({
        "type": "object",
        "properties": {
            "a": { "type": "number" },
            "b": { "type": "number" }
        },
        "required": ["a", "b"]
    }))
    .build();
    
    server.add_tool(add_tool);
    
    // Start the server
    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>> {
    // Create authentication handler
    let auth_handler = Box::new(|request| {
        // Check auth headers, tokens, etc.
        Box::pin(async { 
            // Return true for authorized requests
            true 
        })
    });
    
    // Create a new server with auth handler
    let server = Emcp::new(
        "mcp-server-with-auth",
        "1.0.0",
        Some(EmcpOptions {
            authentication_handler: Some(auth_handler),
        }),
    );
    
    // Add tools, resources, or prompts...
    
    // Start the server
    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>> {
    // Create a new server
    let mut server = Emcp::new("mcp-server-with-middleware", "1.0.0", None);
    
    // Add timing middleware
    server.use_middleware(|request, next| {
        let start_time = Instant::now();
        let method = request.method.clone();
        
        Box::pin(async move {
            // Call next middleware in the chain
            let response = next().await;
            
            // Post-processing
            let duration = start_time.elapsed();
            println!(
                "Request completed: method={}, duration={}ms",
                method,
                duration.as_millis()
            );
            
            response
        })
    });
    
    // Add tools, resources, or prompts...
    
    // Start the server
    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>> {
    // Create a new server
    let server = Emcp::new("my-mcp-server", "1.0.0", None);
    
    // Add your tools, resources, and prompts
    // ...
    
    // Create a StdioServerTransport
    let transport = StdioServerTransport::new();
    
    // Connect the server to the transport
    server.connect(transport).await?;
    
    Ok(())
}

运行示例

该存储库包括几个示例,演示了库的功能:

# Run the basic example
cargo run --example basic

# Run the auth example
cargo run --example auth

# Run the middleware example
cargo run --example middleware

# Run the stdio transport example
cargo run --example stdio_transport

许可证

麻省理工学院