MCP服务器管理工具

一个原生macOS应用程序,用于管理MCP服务器实例并作为统一的MCP代理,适用于AI工具聚合和开发环境管理。

  • by antruongnguyen
  • Rust
  • 本地部署
  • 8 星标
  • 更新于
在 GitHub 查看 antruongnguyen/mcp-server-manager

使用说明

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 --on v* 标签(或手动调度),为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:

  1. 使用管道stdin/stdout/stderr生成进程(或连接到远程URL)
  2. 执行MCP initialize 通过rmcp SDK进行握手
  3. 呼叫 tools/list 发现可用工具(带描述和注释)
  4. 过渡到 准备就绪 --工具通过代理变得可用
  5. 显示MCP服务器信息:名称、版本、协议版本、功能

建筑学

MCPSM被组织成一个有三个板条箱的货物工作区:

  • mcpsm-core --具有所有业务逻辑(配置、服务器管理器、MCP代理、web仪表板)的共享库
  • mcpsm-cli --无头CLI守护进程(mcpsm binary)--在主线程的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 拆卸会话

许可证

麻省理工学院