使用说明
MCPSM——MCP服务器管理器
一个本地macOS应用程序,用于管理 模型上下文协议 (MCP)服务器实例,并充当 统一MCP代理配置一次MCP服务器,然后将任何客户端(Claude Code、Cline、GitHub Copilot、Cursor等)指向单个端点——MCPSM会自动聚合所有运行服务器的工具。
特性
- 统一MCP代理 --单端点聚合来自所有子服务器的工具
- 可流式HTTP传输 --通过会话管理提供完整的MCP协议支持(POST/GET/DELETE) rmcp 软件开发工具包
- 工具名称间距 --每个服务器的工具都有前缀(
server_id__tool_name)避免碰撞 - Web仪表板 --启动/停止服务器、自动启动切换、查看丰富的工具信息、监视器日志、暗/亮主题
- 丰富的工具信息 --工具描述、注释(只读、破坏性、幂等)、具有功能的MCP服务器信息面板
- 黑暗/光明主题 --以岛屿为灵感的配色方案,标题中有主题切换(保存在localStorage中)
- 服务器自动启动 --未禁用的服务器在启动时自动启动
- 自动启动切换 --仪表板中的每台服务器切换;切换仅保存配置(不启动/停止运行服务器)
- 全部启动/停止 --用于批量服务器控制的标题按钮(基于服务器状态的条件可见性)
- 可配置端口 --set
"port": 8080在配置中更改仪表板/代理端口(默认值:3456) - 配置文件监视 --对配置文件的外部编辑会被检测到并自动应用(智能差异:只有受影响的服务器才会重新启动)
- 状态栏应用程序 --带模板图标的macOS状态栏、SF Symbol菜单图标、“打开仪表板”、“编辑配置”和“退出”
- 壳牌环境捕获 --在启动时捕获用户的完整登录shell环境,以便子进程找到通过nvm、pyenv、Homebrew等安装的工具。(关键
.app捆绑) .app捆绑 --构建为适当的macOS应用程序包(MCPSM.app)带有应用程序图标和LSUIElement(无Dock图标)- 编辑配置 --打开
~/.config/mcpsm/mcp.json在默认编辑器的状态栏中 - 实时日志查看器 --带自动滚动的等宽日志面板(每台服务器最后200行)
- 内置模板 --用于顺序思维、知识图谱记忆和上下文的预配置服务器7
- 自动保存 --添加/更新/删除/禁用切换后,服务器配置立即持久化到磁盘
- 平滑关闭 --退出并使用Ctrl+C彻底停止所有正在运行的服务器(SIGTERM→ 5s → 西格尔)
需求
- 铁锈(2024年版)
- macOS(对于GUI二进制文件,CLI二进制文件是跨平台的)
- Node.js/
npx(用于运行使用它的MCP服务器)
建筑
cargo build --workspace # Build all crates (debug)
cargo build --release -p mcpsm-cli # Release build — CLI only
cargo build --release -p mcpsm-gui # Release build — GUI only
CI和发布
.github/workflows/ci-linux.yml--构建和测试mcpsm-cli+mcpsm-core在Linux上(x86_64,aarch64).github/workflows/ci-windows.yml--构建和测试mcpsm-cli+mcpsm-core在Windows上(x86_64).github/workflows/release.yml--onv*标签(或手动调度),为Linux、Windows和MCPSM.app对于macOS,然后将它们发布到GitHub Release
要剪切发布,请按下语义标签,如下所示 v0.1.0:
git tag v0.1.0
git push origin v0.1.0
构建为.app捆绑包(macOS)
./scripts/build-app.sh
open target/release/MCPSM.app
这将创建一个带有应用程序图标和 LSUIElement (无Dock图标)。这个 .app bundle在启动时捕获您的shell环境,因此通过nvm、pyenv、Homebrew等安装的工具可以正常工作。
跑步
无头CLI (无GUI,可在任何平台上运行):
cargo run -p mcpsm-cli
macOS图形用户界面 (状态栏应用程序):
cargo run -p mcpsm-gui
启动时,MCPSM从以下位置读取服务器配置 ~/.config/mcpsm/mcp.json (首次运行时自动创建)。未禁用的服务器会自动启动。通过web仪表板添加的服务器会自动保存到此文件中。
配置格式为:
{
"port": 3456,
"mcpServers": {
"sequential-thinking": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking"],
"env": {}
},
"remote-server": {
"url": "https://mcp.context7.com/mcp",
"disabled": true
}
}
}
配置字段:
port(可选)--web仪表板和代理端口(默认值:3456)mcpServers--服务器ID映射→ 配置command+args+env--用于stdio(子进程)服务器url--用于远程HTTP服务器disabled(可选,默认值:false)--什么时候true,服务器在启动时不会自动启动(JSON中省略了false)
配置文件监视: MCPSM监视配置文件以查看外部更改。当您在编辑器中编辑它时,MCPSM会检测到更改并应用智能差异——只有受影响的服务器才会停止/启动/重新启动。
连接MCP客户端
一旦MCPSM运行并且服务器显示 准备就绪 在仪表板中的状态下,将MCP客户端指向代理端点:
可流式传输的HTTP: http://127.0.0.1:3456/mcp (或您配置的端口)
Claude 代码
claude mcp add mcpsm --transport http http://127.0.0.1:3456/mcp
GitHub副本(VS代码)
创建或编辑 .vscode/mcp.json 在您的工作区(或打开 MCP:打开用户配置 从全局配置的命令面板):
{
"servers": {
"mcpsm": {
"type": "http",
"url": "http://127.0.0.1:3456/mcp"
}
}
}
Cline(VS代码)
{
"mcpServers": {
"mcpsm": {
"url": "http://127.0.0.1:3456/mcp",
"type": "streamableHttp",
"disabled": false
}
}
}
光标
添加到光标MCP设置(~/.cursor/mcp.json):
{
"mcpServers": {
"mcpsm": {
"url": "http://127.0.0.1:3456/mcp"
}
}
}
任何MCP客户端
指向 http://127.0.0.1:3456/mcp --任何客户支持 可流式HTTP传输 将工作。端点句柄 POST (JSON-RPC请求), GET (SSE通知),以及 DELETE (会议结束)。
服务器生命周期
Stopped → Starting → Initializing → Ready (with tools)
↕
Stopping ← ──────┘
当服务器启动时,MCPSM:
- 使用管道stdin/stdout/stderr生成进程(或连接到远程URL)
- 执行MCP
initialize通过rmcp SDK进行握手 - 呼叫
tools/list发现可用工具(带描述和注释) - 过渡到 准备就绪 --工具通过代理变得可用
- 显示MCP服务器信息:名称、版本、协议版本、功能
建筑学
MCPSM被组织成一个有三个板条箱的货物工作区:
mcpsm-core--具有所有业务逻辑(配置、服务器管理器、MCP代理、web仪表板)的共享库mcpsm-cli--无头CLI守护进程(mcpsmbinary)--在主线程的tokio运行时上运行后端mcpsm-gui--macOS状态栏应用程序(mcpsm-gui二进制)——双线程设计:主界面为AppKit,后台为tokio
External MCP Client (Claude Code, Cline, etc.)
│
│ Streamable HTTP: POST/GET/DELETE /mcp
▼
┌─ axum :{port} ────────────────────────────────┐
│ GET / → web dashboard │
│ /api/* → REST management API │
│ POST /mcp → JSON-RPC request handling │
│ GET /mcp → SSE for server notifications│
│ DELETE /mcp → session teardown │
└─────────┬─────────────────────────────────────┘
│
┌─────────▼─────────────────────────────────────┐
│ ProxyHandler (proxy.rs) │
│ - tools/list → aggregated + namespaced tools │
│ - tools/call → route to correct child │
└─────────┬─────────────────────────────────────┘
│ (strip namespace prefix, forward)
┌─────────▼─────────────────────────────────────┐
│ McpClient (rmcp SDK) per server │
│ - stdio: JSON-RPC over stdin/stdout │
│ - http: StreamableHttpClientTransport │
│ - initialize → tools/list → Ready │
└─────────┬──────────────┬──────────────────────┘
stdin│ stdout│ (JSON-RPC) stderr│ (logs)
▼ ▼ ▼
Child MCP Server Process LogBuffer
项目结构
Cargo.toml # Workspace root
crates/
├── mcpsm-core/ # Shared library
│ └── src/
│ ├── lib.rs # Public module exports
│ ├── runtime.rs # run_backend() — shared async entry point
│ ├── core/
│ │ ├── config.rs # Config I/O (~/.config/mcpsm/mcp.json), port extraction
│ │ ├── server.rs # ServerConfig, ServerStatus, ToolInfo, McpPeerInfo types
│ │ ├── process.rs # Child process management (SIGTERM/SIGKILL, stderr reader)
│ │ ├── log_buffer.rs # Ring buffer (200 lines per server)
│ │ ├── shell_env.rs # Shell environment capture ($SHELL -l -c env)
│ │ ├── templates.rs # Built-in server templates
│ │ ├── manager.rs # Async orchestrator: auto-start, config reload, enable/disable
│ │ └── watcher.rs # Config file watcher (notify crate)
│ ├── bridge/
│ │ └── commands.rs # AppCommand + BackendEvent enums
│ ├── mcp/
│ │ ├── client.rs # rmcp SDK McpClient wrapper (stdio + HTTP connect)
│ │ └── proxy.rs # Tool aggregation + request routing (ProxyHandler)
│ └── web/
│ ├── state.rs # Shared AppState
│ ├── server.rs # Router + web server startup (configurable port)
│ ├── handlers.rs # REST API handlers (CRUD + disabled toggle + start/stop all)
│ ├── sse.rs # Server-Sent Events stream
│ └── dashboard.html # Web dashboard UI
├── mcpsm-cli/ # Headless CLI daemon
│ └── src/main.rs # Tokio runtime on main thread, Ctrl+C shutdown
└── mcpsm-gui/ # macOS status bar app
└── src/
├── main.rs # Two-thread: AppKit main + tokio background
└── gui/
└── status_bar.rs # Status bar (template icon, SF Symbols, menus)
resources/ # Status bar PNGs, .icns
scripts/ # build-app.sh, generate-icons.sh
管理REST API
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | / |
Web仪表板 |
| 得到 | /api/servers |
列出服务器的状态、工具、对等信息 |
| 职位 | /api/servers |
添加服务器(自动保存到配置) |
| 职位 | /api/servers/:id/start |
启动服务器 |
| 职位 | /api/servers/:id/stop |
停止服务器 |
| 职位 | /api/servers/:id/disabled |
设置禁用标志({ "disabled": bool }) |
| PUT | /api/servers/:id |
更新服务器配置 |
| 删除 | /api/servers/:id |
删除服务器(自动保存到配置) |
| 得到 | /api/servers/:id/logs |
请求日志快照 |
| 删除 | /api/servers/:id/logs |
清除服务器日志 |
| 职位 | /api/servers/start-all |
启动所有未禁用的服务器 |
| 职位 | /api/servers/stop-all |
停止所有正在运行的服务器 |
| 得到 | /api/health |
守护进程运行状况:状态、名称、版本、服务器计数 |
| 得到 | /api/templates |
列出内置模板 |
| 得到 | /api/events |
SSE事件流 |
MCP代理端点
| 方法 | 路径 | 标题 | 描述 |
|---|---|---|---|
| 职位 | /mcp |
Mcp-Session-Id (初始化后) |
JSON-RPC请求(initialize, tools/list, tools/call, ping) |
| 得到 | /mcp |
Mcp-Session-Id |
服务器到客户端通知的SSE流 |
| 删除 | /mcp |
Mcp-Session-Id |
拆卸会话 |
许可证
麻省理工学院