mcpField
M
MCP Runner

MCP Runner

本地服务
github.com/Streamline-TS开发工具326 周前更新

关于 MCP Runner

MCP Runner 是面向需要运行和交互本地 MCP 服务的 Rust 应用的库。它统一管理服务配置与生命周期、客户端通信,并可选提供 SSE 代理以支持 Web 访问。

主要功能

  1. 01启动并管理服务进程
  2. 02集中配置多个服务
  3. 03通过 JSON-RPC 列出并调用工具
  4. 04访问服务提供的资源
  5. 05通过 SSE 代理事件和请求

适用场景

  1. 01在 Rust 应用中运行 MCP 服务
  2. 02调用已配置服务中的工具
  3. 03读取本地服务提供的资源
  4. 04通过 SSE 向 Web 客户端开放服务

MCP 相关

该库负责启动和管理 MCP 服务,并提供客户端来列出和调用工具、访问资源。可选的 SSE 代理通过 HTTP 提供 JSON-RPC 交互和事件流。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

MCP Runner

用于在本地运行和交互 Model Context Protocol(MCP)服务的 Rust 库。

Crates.io Documentation

概述

MCP Runner 为 Rust 应用管理 Model Context Protocol 服务提供了完整的解决方案。它支持:

  • 启动和管理 MCP 服务进程
  • 通过统一接口配置多个服务
  • 使用 JSON-RPC 与 MCP 服务通信
  • 列出并调用 MCP 服务提供的工具
  • 访问 MCP 服务提供的资源
  • 代理 Server-Sent Events(SSE),让客户端能够连接到 MCP 服务

安装

将以下内容添加到你的 Cargo.toml:

[dependencies]
mcp-runner = "0.3.1"

快速入门

以下是使用 MCP Runner 启动服务并调用工具的简单示例:

use mcp_runner::{McpRunner, error::Result};
use serde::{Deserialize, Serialize};
use serde_json::json;

#[tokio::main]
async fn main() -> Result<()> {
    // Create runner from config file
    let mut runner = McpRunner::from_config_file("config.json")?;

    // Start all servers and the SSE proxy if configured
    let (server_ids, proxy_started) = runner.start_all_with_proxy().await;
    let server_ids = server_ids?;

    if proxy_started {
        println!("SSE proxy started successfully");
    }

    // Get client for interacting with a specific server
    let server_id = runner.get_server_id("fetch")?;
    let client = runner.get_client(server_id)?;

    // Initialize the client
    client.initialize().await?;

    // List available tools
    let tools = client.list_tools().await?;
    println!("Available tools:");
    for tool in tools {
        println!("  - {}: {}", tool.name, tool.description);
    }

    // Call the fetch tool with structured input
    let fetch_result = client.call_tool("fetch", &json!({
        "url": "https://modelcontextprotocol.io"
    })).await?;
    println!("Fetch result: {}", fetch_result);

    // Stop the server when done
    runner.stop_server(server_id).await?;

    Ok(())
}

可观测性

此库使用 tracing crate 进行日志记录和诊断。要启用日志记录,请确保已在应用中配置 tracing_subscriber,并设置 RUST_LOG 环境变量。例如:

# Show info level logs for all crates
RUST_LOG=info cargo run --example simple_client

# Show trace level logs specifically for mcp_runner
RUST_LOG=mcp_runner=trace cargo run --example simple_client

配置

MCP Runner 使用 JSON 配置来定义 MCP 服务和可选的 SSE 代理设置。

{
  "mcpServers": {
    "fetch": {
      "command": "uvx",
      "args": ["mcp-server-fetch"]
    },
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed/files"]
    }
  },
  "sseProxy": {
    "address": "127.0.0.1",
    "port": 3000,
    "allowedServers": ["fetch", "filesystem"],
    "authenticate": {
      "bearer": {
        "token": "your-secure-token"
      }
    }
  }
}

你可以通过以下三种方式加载配置:

1. 从文件加载
use mcp_runner::McpRunner;

let runner = McpRunner::from_config_file("config.json")?;
2. 从 JSON 字符串加载
use mcp_runner::McpRunner;

let config_json = r#"{
  "mcpServers": {
    "fetch": {
      "command": "uvx",
      "args": ["mcp-server-fetch"]
    }
  }
}"#;
let runner = McpRunner::from_config_str(config_json)?;
3. 以编程方式创建
use mcp_runner::{McpRunner, config::{Config, ServerConfig}};
use std::collections::HashMap;

let mut servers = HashMap::new();

let server_config = ServerConfig {
    command: "uvx".to_string(),
    args: vec!["mcp-server-fetch".to_string()],
    env: HashMap::new(),
};

servers.insert("fetch".to_string(), server_config);
let config = Config { mcp_servers: servers };

// Initialize the runner
let runner = McpRunner::new(config);

错误处理

MCP Runner 使用自定义错误类型,涵盖:

  • 配置错误
  • 服务生命周期错误
  • 通信错误
  • 序列化错误
match result {
    Ok(value) => println!("Success: {:?}", value),
    Err(Error::ServerNotFound(name)) => println!("Server not found: {}", name),
    Err(Error::Communication(msg)) => println!("Communication error: {}", msg),
    Err(e) => println!("Other error: {}", e),
}

核心组件

McpRunner

用于管理 MCP 服务的主要入口:

let mut runner = McpRunner::from_config_file("config.json")?;
let server_ids = runner.start_all_servers().await?;
McpClient

用于与 MCP 服务交互:

let client = runner.get_client(server_id)?;
client.initialize().await?;

// Call tools
let result = client.call_tool("fetch", &json!({
    "url": "https://example.com",
})).await?;

SSE 代理

SSE(Server-Sent Events)代理允许客户端通过 HTTP 连接到 MCP 服务,并使用 Server-Sent Events 协议接收实时更新。它基于 Actix Web 构建,提供统一的 JSON-RPC over HTTP 接口,具备高性能、高可靠性和易维护性。

功能
  • 统一的 JSON-RPC API:通过单一端点使用 JSON-RPC 与 MCP 服务进行所有交互
  • 身份验证:可选的 Bearer 令牌身份验证,确保访问安全
  • 服务访问控制:限制可通过代理访问的服务
  • 事件流:通过 SSE 将 MCP 服务的实时更新发送给客户端
  • 跨域支持:内置 CORS 支持,适用于 Web 浏览器客户端
  • JSON-RPC 兼容性:全面支持双向 JSON-RPC 2.0 消息
  • 高效的事件广播:使用 Tokio 广播通道高效分发事件
启动代理

你可以在启动服务时自动启动 SSE 代理:

// Start all servers and the proxy if configured
let (server_ids, proxy_started) = runner.start_all_with_proxy().await;
let server_ids = server_ids?;

if proxy_started {
    println!("SSE proxy started successfully");
}

也可以在配置服务后手动启动:

if runner.is_sse_proxy_configured() {
    runner.start_sse_proxy().await?;
    println!("SSE proxy started manually");
}
代理配置

在配置文件中配置 SSE 代理:

{
  "mcpServers": { /* server configs */ },
  "sseProxy": {
    "address": "127.0.0.1",  // Listen address (localhost only) - default if omitted
    "port": 3000,            // Port to listen on - default if omitted
    "workers": 4,            // Number of worker threads - default is 4 if omitted
    "allowedServers": [      // Optional: restrict which servers can be accessed
      "fetch",
      "filesystem"
    ],
    "authenticate": {        // Optional: require authentication
      "bearer": {
        "token": "your-secure-token-here"
      }
    }
  }
}
代理 API 端点

SSE 代理提供以下 HTTP 端点:

端点方法描述
/sseGET用于接收实时更新的 SSE 事件流端点(发送 endpoint 和 message 事件)
/sse/messagesPOST用于向 MCP 服务发送请求的 JSON-RPC 端点(支持 initialize、tools/list、tools/call、ping)

示例

更多用法示例请参阅 examples/ 目录:

  • simple_client.rs:客户端 API 的基本用法

    # Run with info level logging
    RUST_LOG=info cargo run --example simple_client
    
  • sse_proxy.rs:使用 SSE 代理向 Web 客户端提供 MCP 服务的示例

    # Run with info level logging
    RUST_LOG=info cargo run --example sse_proxy
    

    此示例使用 examples/sse_config.json 中的配置来启动服务和 SSE 代理, 让 Web 客户端能够通过 HTTP 和 SSE 连接并与 MCP 服务交互。

    JavaScript 客户端示例:

    // Connect to the event stream
    const eventSource = new EventSource('http://localhost:3000/sse');
    
    // First you'll receive the endpoint information
    eventSource.addEventListener('endpoint', (event) => {
      console.log('Received endpoint path:', event.data);
    });
    
    // Then you'll receive JSON-RPC responses
    eventSource.addEventListener('message', (event) => {
      const response = JSON.parse(event.data);
      console.log('Received JSON-RPC response:', response);
    });
    
    // Make a tool call
    async function callTool() {
      const response = await fetch('http://localhost:3000/sse/messages', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'Authorization': 'Bearer your-secure-token-here'
        },
        body: JSON.stringify({
          jsonrpc: '2.0',
          id: 1,
          method: 'tools/call',
          params: {
            server: 'fetch',
            tool: 'fetch',
            arguments: {
              url: 'https://modelcontextprotocol.io'
            }
          }
        })
      });
      const result = await response.json();
      console.log('Tool call initiated:', result);
      // Actual response will come through the SSE event stream
    }
    

参与贡献

欢迎参与贡献!欢迎提交 Pull Request。

许可证

本项目根据 LICENSE 文件中的条款授权。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。