rmcp多路复用器–MCP服务器多路复用器
  ](Cargo.toml) 
管理的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 Unix套接字,允许标准MCP主机与rmcp-mux管理的服务器通信。
## CLI 参考
### 主命令
rmcp-mux --config mux.toml [OPTIONS]
**必修的:**
- `--config
` –配置文件路径(TOML)
**服务器选择:**
- `--only ` –仅启动指定的服务器(逗号分隔)
- `--except ` –启动除指定以外的所有服务器(逗号分隔)
**运行时控制:**
- `--show-status` –显示所有服务器的状态并退出
- `--restart-service ` –重新启动特定服务器
- `--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 = 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`
1. 消息获取 `global_id = c:`
1. 使用本地ID将响应解复用回原始客户端
1. 第一 `initialize` 点击服务器;响应已缓存
1. 稍后 `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](.ai-agents/AI_GUIDELINES.md) 发展指南。
## 许可证
麻省理工学院