MCP服务器多路复用器

一个Rust守护进程,用于从单个进程管理所有MCP服务器,提供Unix套接字、ID重写、初始化缓存、自动重启和交互式TUI仪表板功能。

  • by vetcoders
  • Rust
  • 本地部署
  • 5 星标
  • 更新于
在 GitHub 查看 LibraxisAI/rmcp_mux

使用说明

rmcp多路复用器–MCP服务器多路复用器

管理的Rust守护进程 从单个进程访问所有MCP服务器。在中定义服务器 mux.toml,运行一个 rmcp-mux 命令,并为每个服务获取Unix套接字。功能包括ID重写、初始化缓存、自动重启和交互式TUI仪表板。

0.3.x版本新增:具有守护进程状态套接字的统一进程模型!一 rmcp-mux 进程从配置文件管理所有服务器。用于监控和控制的交互式TUI仪表板。通过查询实时状态 rmcp-mux daemon-status.

目录

特性

核心

  • 单进程、多服务器 -一个 rmcp-mux 管理配置中定义的所有MCP服务器
  • 每个服务的Unix套接字 –每台服务器都有自己的套接字用于客户端连接
  • ID重写 –所有服务的响应都与正确的客户端相匹配
  • 初始化缓存 –每台服务器执行一次;缓存响应服务于后续客户端
  • 自动重启 –服务器在出现故障时以指数级回退重新启动
  • 平滑关闭 –Ctrl+C停止所有服务器,删除套接字

监控与控制

  • 交互式TUI (--tui)–具有服务器状态、重启控制的实时仪表板
  • 状态命令 (--show-status)–所有服务器状态的JSON快照
  • 每台服务器控制 –在运行时重新启动、停止、启动各个服务器
  • 选择性启动 – --only 和 --except 部分发射标志

配置

  • TOML配置 –简单易读的服务器定义
  • 环境变量 –每台服务器的环境变量注入
  • 灵活的参数 –超时、客户端限制、重启策略

快速开始

# 1. Create config file
cat > mux.toml << 'EOF'
[servers.memory]
socket = "/tmp/mcp-memory.sock"
cmd = "npx"
args = ["-y", "@modelcontextprotocol/server-memory"]

[servers.filesystem]
socket = "/tmp/mcp-fs.sock"
cmd = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
EOF

# 2. Start all servers
rmcp-mux --config mux.toml

# 3. Or start with TUI dashboard
rmcp-mux --config mux.toml --tui

# 4. Connect via proxy (for MCP hosts expecting STDIO)
rmcp-mux-proxy --socket /tmp/mcp-memory.sock

安装

来源

cargo build --release
# Binaries: target/release/rmcp-mux, target/release/rmcp-mux-proxy

一个衬垫(卷曲|sh)

curl -fsSL https://raw.githubusercontent.com/Loctree/rmcp-mux/main/tools/install.sh | sh

环境覆盖:

  • INSTALL_DIR –包装器位置(默认值: $HOME/.local/bin)
  • CARGO_HOME –货房(默认值: ~/.cargo)
  • MUX_REF –分支/标签/提交(默认值: main)
  • MUX_NO_LOCK=1 –跳过 --locked 旗帜

内置代理

如果您的MCP主机需要STDIO命令,请使用捆绑的代理:

rmcp-mux-proxy --socket /tmp/mcp-memory.sock

配置

配置文件格式(TOML)

[servers.memory]
socket = "~/mcp-sockets/memory.sock"
cmd = "npx"
args = ["-y", "@modelcontextprotocol/server-memory"]
max_active_clients = 5
tray = true

[servers.brave-search]
socket = "~/mcp-sockets/brave.sock"
cmd = "npx"
args = ["-y", "@anthropic/mcp-server-brave-search"]
env = { BRAVE_API_KEY = "your-api-key" }
request_timeout_ms = 60000

[servers.filesystem]
socket = "~/mcp-sockets/fs.sock"
cmd = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/docs"]
lazy_start = true

[servers.rmcp-memex]
socket = "~/.rmcp-servers/sockets/rmcp-memex.sock"
cmd = "/path/to/rmcp-memex"
args = ["serve", "--config", "config.toml", "--db-path", "~/.ai-memories/lancedb"]
env = { SLED_PATH = "~/.rmcp-servers/sled/memex" }
lazy_start = false

参数参考

参数 默认值 说明
socket 必需 Unix套接字路径(支持 ~ 扩展)
cmd 必需 MCP服务器命令
args [] 命令参数
env {} 子进程的环境变量
max_active_clients 5 并发客户端限制
lazy_start false 将孩子的出生推迟到第一个请求
max_request_bytes 1048576 最大请求大小(1 MiB)
request_timeout_ms 30000 请求超时(30s)
restart_backoff_ms 1000 初始重启延迟(1秒)
restart_backoff_max_ms 30000 最大重启延迟(30s)
max_restarts 5 重启限制(0=无限制)
tray false 为此服务器启用托盘图标
status_file none JSON状态快照的路径

客户端配置(克劳德桌面等)

MCP主机希望通过STDIO通信连接 rmcp-mux-proxy:

{
  "mcpServers": {
    "rmcp-memex": {
      "command": "rmcp-mux-proxy",
      "args": ["--socket", "~/.rmcp-servers/sockets/rmcp-memex.sock"]
    },
    "loctree": {
      "command": "rmcp-mux-proxy",
      "args": ["--socket", "~/.rmcp-servers/sockets/loctree.sock"]
    },
    "brave-search": {
      "command": "rmcp-mux-proxy",
      "args": ["--socket", "~/.rmcp-servers/sockets/brave-search.sock"]
    }
  }
}

每个代理实例都转换STDIO<->Unix套接字,允许标准MCP主机与rmcp-mux管理的服务器通信。

CLI 参考

主命令

rmcp-mux --config mux.toml [OPTIONS]

必修的:

  • --config <PATH> –配置文件路径(TOML)

服务器选择:

  • --only <NAMES> –仅启动指定的服务器(逗号分隔)
  • --except <NAMES> –启动除指定以外的所有服务器(逗号分隔)

运行时控制:

  • --show-status –显示所有服务器的状态并退出
  • --restart-service <NAME> –重新启动特定服务器
  • --tui –启动交互式TUI仪表板

示例:

# Start all servers from config
rmcp-mux --config mux.toml

# Start only memory and filesystem servers
rmcp-mux --config mux.toml --only memory,filesystem

# Start all except brave-search
rmcp-mux --config mux.toml --except brave-search

# Check status of running servers
rmcp-mux --config mux.toml --status

# Restart a specific server
rmcp-mux --config mux.toml --restart-service memory

# Interactive dashboard
rmcp-mux --config mux.toml --tui

子指令

daemon-status –查询正在运行的守护进程

# Get status of running daemon (requires daemon to be running)
rmcp-mux daemon-status

# Output as JSON
rmcp-mux daemon-status --json

# Use custom status socket
rmcp-mux daemon-status --socket /custom/path.sock

返回:版本、正常运行时间、服务器计数、每台服务器状态(活动客户端、挂起请求、重启、心跳延迟)。

health –验证连接

# Check specific socket
rmcp-mux health --socket /tmp/mcp-memory.sock

# Check service from config
rmcp-mux health --config mux.toml --service memory

proxy –STDIO代理

rmcp-mux proxy --socket /tmp/mcp-memory.sock

scan –发现并生成配置

rmcp-mux scan \
  --manifest ~/.codex/mcp-mux.toml \
  --snippet ~/.codex/mcp-mux \
  --socket-dir ~/.rmcp-servers/rmcp-mux/sockets

rewire –更新主机配置

# Rewire a host config to use rmcp-mux proxy (creates .bak backup)
rmcp-mux rewire --host codex --socket-dir ~/.rmcp-servers/rmcp-mux/sockets

# Preview changes without writing
rmcp-mux rewire --host codex --dry-run

wizard –交互式配置

rmcp-mux wizard --config ~/.codex/mcp-mux.toml

交互式TUI仪表板

启动时 --tui 对于实时仪表板:

rmcp-mux --config mux.toml --tui

显示

  • 带有状态指示器(运行/停止/错误)的服务器列表
  • 每台服务器连接的客户端数
  • 待定申请
  • 重启计数和上次重启原因
  • 实时更新

键盘控制

关键 行动
j / Down 向下移动选择
k / Up 向上移动选择
r 重新启动所选服务器
s 停止所选服务器
S 启动所选服务器
q / Esc 退出

图书馆使用情况

添加到您的 Cargo.toml:

[dependencies]
rmcp-mux = { version = "0.3", default-features = false }

基本示例-单多路复用服务器

use rmcp_mux::{MuxConfig, run_mux_server};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let config = MuxConfig::new("/tmp/my-mcp.sock", "npx")
        .with_args(vec!["-y".into(), "@anthropic/mcp-server".into()])
        .with_max_clients(10)
        .with_service_name("my-mcp-server");

    run_mux_server(config).await
}

多个Mux实例(单个进程)

use rmcp_mux::{MuxConfig, spawn_mux_server, MuxHandle};
use std::time::Duration;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let services = vec![
        ("memory", "/tmp/mcp-memory.sock", "npx", vec!["@mcp/server-memory"]),
        ("filesystem", "/tmp/mcp-fs.sock", "npx", vec!["@mcp/server-filesystem"]),
    ];

    let mut handles: Vec<MuxHandle> = Vec::new();
    for (name, socket, cmd, args) in services {
        let config = MuxConfig::new(socket, cmd)
            .with_args(args.into_iter().map(String::from).collect())
            .with_service_name(name)
            .with_request_timeout(Duration::from_secs(60));

        handles.push(spawn_mux_server(config).await?);
    }

    for handle in handles {
        handle.wait().await?;
    }
    Ok(())
}

健康检查

use rmcp_mux::check_health;

async fn verify_service() -> bool {
    check_health("/tmp/mcp-memory.sock").await.is_ok()
}

功能标志

特性 默认值 描述
cli yes CLI二进制、向导、扫描命令
tray 是 系统托盘图标支持

仅用于库(最小依赖性):

[dependencies]
rmcp-mux = { version = "0.3", default-features = false }

运行时行为

客户处理

  1. 新客户端连接到服务器的套接字->分配 client_id
  2. 消息获取 global_id = c<client>:<seq>
  3. 使用本地ID将响应解复用回原始客户端
  4. 第一 initialize 点击服务器;响应已缓存
  5. 稍后 initialize 从缓存应答的呼叫

安全防护装置

  • 最大请求大小 –默认1 MiB
  • 请求超时 –默认30秒,用于清理挂起的呼叫
  • 指数级重启回退 –1秒->30秒,可配置限制
  • 缓慢启动 –将孩子的出生推迟到第一个请求

错误处理

  • 子系统退出或I/O失败->重新启动子系统,清除缓存/挂起,向受影响的客户端发送错误
  • 优雅关机(Ctrl+C)->停止所有子进程,删除所有套接字

项目结构

rmcp-mux/
├── src/
│   ├── lib.rs            # Library entry point, MuxConfig, public API
│   ├── config.rs         # Config types, loading, validation
│   ├── state.rs          # MuxState, StatusSnapshot, helpers
│   ├── scan.rs           # Host discovery and rewiring (cli feature)
│   ├── tray.rs           # Tray icon (tray feature)
│   ├── bin/
│   │   ├── rmcp_mux.rs       # CLI binary (cli feature)
│   │   └── rmcp_mux_proxy.rs # STDIO proxy (cli feature)
│   ├── runtime/          # Core mux daemon
│   │   ├── mod.rs        # run_mux, health_check
│   │   ├── types.rs      # ServerEvent, constants
│   │   ├── client.rs     # Client connection handling
│   │   ├── server.rs     # Child process management
│   │   ├── proxy.rs      # STDIO proxy logic
│   │   ├── status.rs     # Status file writing & daemon status socket
│   │   └── heartbeat.rs  # Backend health monitoring
│   └── wizard/           # Interactive TUI wizard (cli feature)
├── tools/
│   ├── install.sh        # One-liner installer
│   └── launchd/          # macOS launchd templates
└── public/
    └── rmcp_mux_icon.png # Tray icon

测试

# Run all tests
cargo test

# Run tests without tray feature (for CI/headless)
cargo test --no-default-features

# Linting
cargo clippy --all-targets --all-features

launchd(macOS)

模板位于 tools/launchd/rmcp-mux.sample.plist:

cp tools/launchd/rmcp-mux.sample.plist ~/Library/LaunchAgents/rmcp-mux.plist
# Edit paths: set --config to your mux.toml
launchctl load -w ~/Library/LaunchAgents/rmcp-mux.plist

贡献

看 .ai代理商/ai_GUIDELINES.md 发展指南。

许可证

麻省理工学院