Skip to main content
Glama
README.md
# 🚀 YIXZ-MCP 节点聚合管理平台

**YIXZ-MCP** 是一个轻量级的 **Model Context Protocol (MCP)** 节点聚合管理工具。它允许你管理多个 MCP 服务节点(支持 SSE 在线服务和本地 stdio 命令),并将它们聚合为一个统一的 SSE 接入地址。

通过这个工具,你只需在xiaozhi.me控制台获取接入地址,填入实例后即可同时使用所有集成的 MCP 工具。

> **📌 本仓库说明**
>
> 本仓库是 [NasWanke/yixz-mcp-open](https://github.com/NasWanke/yixz-mcp-open) 的**部署修正版**(fork 后修复)。
> 上游代码在 **pnpm 11 + Windows** 环境下无法启动,本版修复了该问题,并补充了**实测内存数据**与**服务器选型建议**。
> 详细修复内容见文末 [🔧 启动问题修复记录](#-启动问题修复记录)。

## ✨ 核心功能

*   **🔗 节点聚合**:将分散的 MCP 服务(如本地运行的 Python 脚本、远程 SSE 服务)聚合成单一入口。
*   **⚡ 统一接入**:生成标准的 SSE 接入地址,完美兼容 Cursor、Trae 等支持 MCP 的客户端。
*   **🔌 多协议支持**:
    *   **SSE (Server-Sent Events)**: 接入现有的 MCP Web 服务。
    *   **Stdio (Standard Input/Output)**: 直接运行本地命令(如 `node script.js`, `python script.py`)。
*   **📱 响应式界面**:完美适配桌面端和移动端,随时随地管理节点。
*   **🚀 轻量级架构**:基于 Node.js + Express + Vue 3,数据存储采用 JSON 文件,无需数据库,部署极简。

## 🚀更新日志

### v0.0.3 (2025-01-30)
- 每次添加点节不用再手动重启了,会自动更新
- 自动更新的时候节点显示"连接中"状态(黄色背景显示)
- 节点状态自动轮询更新(每2秒),直到显示“已连接”就说明成功了

## 📝更新说明

⚡**更新前请先备份MCP配置文件**

```
# 在项目目录下,请手动备份
./api/data/instances.json
```



## 📊 实测数据与服务器选型建议

> 以下数据均来自**真实运行实例**的实测(2026-09-06),不是估算。

### 测试环境

| 项目 | 值 |
|------|-----|
| 操作系统 | Windows 11(10.0.26200) |
| Node.js | v22.22.2 |
| pnpm / npm | 11.5.3 / 10.9.7 |
| 启动方式 | `node_modules\.bin\tsx.cmd api\index.ts` |

### 实测资源占用

| 指标 | 实测值 | 说明 |
|------|--------|------|
| **服务进程内存(空闲)** | **102 MB** | 工作集,此时**未连接任何 MCP 实例** |
| 前端产物体积 | `index.html` 12.4 KB<br>`index-*.js` 146 KB<br>`index-*.css` 22 KB<br>`*.js.map` 841 KB | 已构建在 `dist/` 中 |
| 监听地址 | `0.0.0.0:3001` + `[::]:3001` | IPv4 / IPv6 双栈 |
| **每个 MCP 子节点** | **约 100 – 300 MB** | 通过 `StdioClientTransport` 派生,npx 类常见 100–200 MB |

⚠️ **关键点**:真正吃内存的不是服务本体(仅 102 MB),而是**你接入的每个 MCP 子节点**。评估配置时必须把节点数量算进去:
`总内存 ≈ 100 MB + N × (100~300 MB)`

### 功能验证结果(全部通过)

| 验证项 | 结果 |
|--------|------|
| `GET /`(首页) | ✅ HTTP 200,含 `<div id="app">` 挂载点 |
| `GET /assets/index-DDefo-a4.js` | ✅ HTTP 200(页面不会白屏) |
| `GET /assets/index-BLZJsBXW.css` | ✅ HTTP 200 |
| `GET /favicon.svg` | ✅ HTTP 200 |
| `GET /health` | ✅ `{"status":"ok"}` |
| `GET /api/network-ip` | ✅ HTTP 200 |
| SPA 路由回退(任意路径) | ✅ HTTP 200 |
| 启动日志 | ✅ 无报错,`Server running on port 3001` |

### 💡 服务器选型结论(重点:2核2G 够不够?)

**结论:2核2G + Windows 是错误搭配,不推荐;同样的 2核2G 换 Linux 则完全够用。**

瓶颈是**内存,不是 CPU**(Node 基本单线程,本应用 CPU 占用极低,2 核绰绰有余)。

| 配置 | 系统 | OS 占用 | 应用 + 3 个 MCP 节点 | 剩余余量 | 结论 |
|------|------|---------|---------------------|----------|------|
| 2核2G | **Windows Server** | **1.3 – 1.8 GB** | ~0.7 GB | **≈ 0** | ❌ **不可用**,接 1–2 个节点就 OOM |
| 2核2G | **Linux** | 0.2 – 0.3 GB | ~0.7 GB | ~1.0 GB | ✅ **推荐** |
| 2核4G | Windows Server | ~1.5 GB | ~0.7 GB | ~1.8 GB | ✅ 可用(Windows 的实用底线) |
| 2核4G+ | Linux | ~0.25 GB | ~0.7 GB | ~3 GB | ✅ 宽松 |

**为什么 Windows 不行**:Windows Server 空载就要吃掉 1.3–1.8 GB,2 GB 内存几乎被系统占满,留给应用的只剩两三百 MB,随便接个 MCP 子节点就会触发 OOM 并疯狂读写页面文件,表现为"卡死/无响应"。

**具体建议**:

1. **🥇 首选:2核2G 就装 Linux**(Alibaba Cloud Linux 3 / Ubuntu 22.04)。操作系统省下 1 GB 以上,本应用运行从容,还能稳定挂载多个 MCP 节点。而且阿里云 **Windows 镜像需额外付许可证费**,Linux 免费——省两笔钱。
2. **若必须用 Windows:最低 2核4G**,4核8G 更从容。2G 跑 Windows 生产环境不建议。
3. **死磕 2G Windows 的唯一办法**(不推荐生产):Server Core 无桌面版 + 关闭非必要服务 + 调大页面文件,且只能接 1 个 MCP 节点,仍随时可能 OOM。

### 🚀 上云部署注意事项

- **不要直接用 `tsx` 跑生产**:`tsx` 是即时编译 TypeScript,启动慢且多占内存。生产环境应先把 `api/` 编译为 JS 再用 `node` 运行。
- **不要靠 `run_windows.bat` 常驻**:用 **pm2**(Linux)或 **nssm**(Windows)托管为服务,实现崩溃自拉起与开机自启。
- **放行端口**:安全组/防火墙开放 `3001`(或 Nginx 反向代理到 80/443)。
- **本仓库已内置 `dist/`**:弱配置服务器可跳过 `npm run build`,直接启动即可对外服务,省去在 2G 机器上构建的内存压力。
- **⚠️ 凭证安全(重要)**:`api/data/instances.json` 中**存有 MCP 实例的 JWT 凭证**,已被 `.gitignore` 排除;`.env` 同样已排除。**部署前请务必确认没有把这两个文件提交进公开仓库**。

---

## 🛠️ 部署指南

我们提供了三种部署方式,请根据你的使用场景选择最适合的一种:

| 部署方式 | 适用场景 | 难度 | 维护成本 |
|---------|---------|------|---------|
| 🚀 **一键启动脚本** | 个人电脑、快速测试 | ⭐ 简单 | 低 |
| 🐳 **Docker 容器化** | 服务器、生产环境 | ⭐⭐ 中等 | 低 |
| 🌐 **服务器面板** | VPS 长期运行、已有面板 | ⭐⭐ 中等 | 中 |

---

### 方式一:一键启动脚本 (无 Docker) 🚀

**适合人群**:个人用户、开发者、想快速体验的用户

**系统要求**:
- **操作系统**:Windows 10+ / macOS / Linux
- **Node.js**:v18 或更高版本 ([下载地址](https://nodejs.org/))

#### 🪟 Windows 用户

1. **下载项目**
   ```bash
   git clone https://github.com/NasWanke/yixz-mcp-open.git
   cd yixz-mcp-open
   ```

2. **一键启动**
   - 双击运行 `run_windows.bat`
   - 脚本会自动完成以下操作:
     - ✅ 检测 Node.js 环境
     - ✅ 安装项目依赖
     - ✅ 构建前端资源
     - ✅ 启动服务
     - ✅ 自动打开浏览器

3. **访问应用**
   - 浏览器会自动打开 `http://localhost:3001`
   - 如需停止服务,在命令行窗口按 `Ctrl + C`

#### 🍎 Mac / Linux 用户

1. **下载项目**
   ```bash
   git clone https://github.com/NasWanke/yixz-mcp-open.git
   cd yixz-mcp-open
   ```

2. **赋予执行权限**
   ```bash
   chmod +x run_mac.sh
   ```

3. **一键启动**
   ```bash
   ./run_mac.sh
   ```

4. **访问应用**
   - 浏览器会自动打开 `http://localhost:3001`
   - 如需停止服务,在终端按 `Ctrl + C`

#### ⚙️ 脚本功能说明

两个脚本(`run_windows.bat` 和 `run_mac.sh`)均提供以下智能功能:

- 🔍 **环境检测**:自动检测 Node.js 是否安装
- 📦 **智能依赖管理**:
  - 首次运行自动安装依赖
  - 已安装依赖时跳过安装步骤
  - 自动检测并使用 pnpm(如果存在)
- 🏗️ **构建优化**:
  - 首次运行自动构建前端
  - 已构建时跳过构建步骤
- 🚀 **自动启动**:服务启动后自动打开浏览器
- 🛡️ **错误处理**:详细的错误提示和解决方案

#### 📝 常见问题

<details>
<summary><b>Q: 提示 "Node.js 未安装" 怎么办?</b></summary>

访问 [Node.js 官网](https://nodejs.org/) 下载 LTS 版本安装。安装完成后重新运行脚本。
</details>

<details>
<summary><b>Q: 依赖安装失败怎么办?</b></summary>

可能原因:
1. 网络问题:尝试配置 npm 镜像源 `npm config set registry https://registry.npmmirror.com`
2. 权限问题(Linux/Mac):尝试使用 `sudo npm install`
3. Node.js 版本过低:升级到 v18+
</details>

<details>
<summary><b>Q: 如何强制重新构建前端?</b></summary>

删除 `dist` 文件夹后重新运行脚本即可:
- Windows: 删除 `dist` 文件夹
- Mac/Linux: `rm -rf dist`
</details>

---

### 方式二:Docker 容器化部署 🐳

**适合人群**:
- 熟悉 Docker 的开发者
- 需要在服务器上部署的用户
- 希望环境隔离、易于迁移的场景

**系统要求**:
- **Docker**:20.10+
- **Docker Compose**:2.0+

#### 📦 快速开始

1. **安装 Docker**
   - **Windows/Mac**:下载 [Docker Desktop](https://www.docker.com/products/docker-desktop/)
   - **Linux**:
     ```bash
     curl -fsSL https://get.docker.com | sh
     sudo usermod -aG docker $USER
     ```

2. **启动服务**
   ```bash
   # 克隆项目
   git clone https://github.com/NasWanke/yixz-mcp-open.git
   cd yixz-mcp-open
   
   # 构建并启动(后台运行)
   docker-compose up -d --build
   ```

3. **查看日志**
   ```bash
   # 查看实时日志
   docker-compose logs -f
   
   # 查看服务状态
   docker-compose ps
   ```

4. **访问应用**
   - 打开浏览器访问 `http://localhost:3001`

#### 🛠️ Docker 管理命令

```bash
# 停止服务
docker-compose stop

# 启动服务
docker-compose start

# 重启服务
docker-compose restart

# 停止并删除容器
docker-compose down

# 查看资源占用
docker stats yixz-mcp-open
```

#### 💾 数据持久化

- 配置数据自动保存在 `./api/data` 目录
- 容器删除或重建不会丢失数据
- 备份数据只需复制 `api/data` 文件夹

#### 🔧 高级配置

<details>
<summary><b>自定义端口</b></summary>

修改 `docker-compose.yml` 中的端口映射:
```yaml
ports:
  - "8080:3001"  # 将 8080 映射到容器内的 3001
```
</details>

<details>
<summary><b>使用 Nginx 反向代理</b></summary>

取消 `docker-compose.yml` 中 Nginx 服务的注释,配置 `nginx.conf`:
```nginx
server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://yixz-mcp:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
```
</details>

<details>
<summary><b>健康检查</b></summary>

Docker 会自动检查服务健康状态:
- 检查间隔:30 秒
- 超时时间:10 秒
- 重试次数:3 次

查看健康状态:
```bash
docker inspect --format='{{.State.Health.Status}}' yixz-mcp-open
```
</details>

---

### 方式三:服务器面板部署 (宝塔 / 1Panel) 🌐

**适合人群**:
- 使用 VPS/云服务器的用户
- 已安装宝塔或 1Panel 面板的用户
- 需要通过 Web 界面管理的场景

**系统要求**:
- **操作系统**:CentOS / Ubuntu / Debian
- **Node.js**:v18+
- **面板**:宝塔面板 7.x+ 或 1Panel

#### 📋 部署步骤

1. **上传项目文件**
   - 使用 Git 克隆或 FTP/SFTP 上传到服务器
   - 推荐目录:`/www/wwwroot/mcp-open` 或 `/opt/mcp-open`

   ```bash
   # 使用 Git 克隆
   cd /www/wwwroot
   git clone https://github.com/your-repo/yixz-mcp-open.git
   cd yixz-mcp-open
   ```

2. **安装依赖与构建**

   ```bash
   # 安装依赖
   npm install

   # 构建前端资源
   npm run build

   # 验证构建结果
   ls -la dist/
   ```

3. **启动服务**

   **方式 A:宝塔面板**
   - 登录宝塔面板
   - 点击左侧 `网站` -> `Node项目`
   - 点击 `添加Node项目`
   - 填写配置:
     - **项目名称**:`yixz-mcp-open`
     - **项目目录**:`/www/wwwroot/yixz-mcp-open`
     - **启动文件**:`api/index.ts` 或使用 `package.json` 的 `start` 脚本
     - **端口**:`3001`
     - **运行用户**:`www`
   - 点击 `提交` 并启动项目

   **方式 B:1Panel**
   - 登录 1Panel 面板
   - 点击 `容器` -> `应用商店`
   - 搜索并安装 `Node.js` 运行环境
   - 配置:
     - **项目目录**:`/opt/yixz-mcp-open`
     - **启动命令**:`npm start`
     - **端口**:`3001`

   **方式 C:命令行 PM2**
   ```bash
   # 安装 PM2
   npm install -g pm2

   # 启动服务
   pm2 start npm --name "yixz-mcp-open" -- start

   # 设置开机自启
   pm2 startup
   pm2 save

   # 查看状态
   pm2 status
   pm2 logs yixz-mcp-open
   ```

4. **配置反向代理 (可选)**

   如果你想通过域名访问,配置 Nginx 反向代理:

   **宝塔面板:**
   - 点击 `网站` -> `添加站点`
   - 填写域名,创建站点
   - 点击 `设置` -> `反向代理`
   - 添加规则:
     - **代理名称**:`MCP Open`
     - **目标 URL**:`http://127.0.0.1:3001`
     - **发送域名**:`$host`

   **手动配置 Nginx:**
   ```nginx
   server {
       listen 80;
       server_name your-domain.com;

       location / {
           proxy_pass http://127.0.0.1:3001;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection 'upgrade';
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_cache_bypass $http_upgrade;
       }
   }
   ```

5. **配置 SSL (可选)**

   使用宝塔面板或 Let's Encrypt 免费证书:
   ```bash
   # 使用 Certbot
   sudo apt install certbot python3-certbot-nginx
   sudo certbot --nginx -d your-domain.com
   ```

#### 🔧 服务器维护

```bash
# 查看日志
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

# 重启服务
pm2 restart yixz-mcp-open

# 重启 Nginx
sudo systemctl restart nginx

# 查看端口占用
netstat -tulnp | grep 3001
```

#### 📊 性能优化建议

1. **使用 PM2 集群模式**(多核 CPU)
   ```bash
   pm2 start npm --name "mcp-open" -i max -- start
   ```

2. **配置 Nginx 缓存**(静态资源)
   ```nginx
   location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
       expires 1y;
       add_header Cache-Control "public, immutable";
   }
   ```

3. **启用 gzip 压缩**
   ```nginx
   gzip on;
   gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
   ```

---

## 📖 使用指南

1.  **创建实例**:
    *   打开首页,点击右上角“新建实例”,填写名称(如 "My Tools")。
2.  **添加节点**:
    *   进入实例详情页,点击“添加节点”。
    *   **SSE 模式**:填写远程 MCP 服务的 URL。
    *   **Stdio 模式**:填写要执行的命令(如 `npx`)和参数(如 `-y @modelcontextprotocol/server-filesystem c:\projects`)。
3.  **获取接入地址**:
    *   在实例详情页顶部,复制“接入地址”(通常以 `/api/mcp/{id}/sse` 结尾)。
4.  **配置 AI 客户端**:
    *   打开 **Cursor** 或 **Trae** 的设置页面。
    *   找到 **MCP** 设置 -> **Add new MCP server**。
    *   **Type** 选择 `SSE`。
    *   **URL** 填入刚才复制的地址。
    *   点击保存,即可连接成功!

---

## 💻 开发指南

如果你想参与开发或修改源码:

```bash
# 1. 安装依赖
pnpm install

# 2. 启动开发服务器 (前后端同时启动)
pnpm run dev
```

*   **前端地址**: `http://localhost:5173`
*   **后端地址**: `http://localhost:3001`

---

## 🔧 启动问题修复记录

记录本仓库相对上游所做的修复,供排障参考。

### 问题现象

双击 `run_windows.bat` 后,浏览器打不开 `http://localhost:3001`,端口无监听。

### 根因

`pnpm start` 会先执行依赖状态检查并**自动触发 `pnpm install`**,而 **pnpm ≥ 10 默认拦截依赖的 postinstall 构建脚本**,导致 install 失败并中断启动:

```
[ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: esbuild@0.21.5, esbuild@0.27.0, esbuild@0.27.2
[ERROR] Command failed with exit code 1: ... pnpm install
```

服务进程**从未被启动**,因此端口无监听。

> 排查难点:原脚本用 `>nul 2>&1` 吞掉了全部输出,错误信息完全不可见。

### 修复内容

| # | 文件 | 修改 | 说明 |
|---|------|------|------|
| 1 | `pnpm-workspace.yaml` | `allowBuilds: esbuild: true` | 放行 esbuild 构建脚本(原为占位值 `set this to true or false`) |
| 2 | `run_windows.bat` | 改用 `start "YIXZ-MCP-Server" cmd /c "node_modules\.bin\tsx.cmd api\index.ts > server.log 2>&1"` | 直接调用本地 `tsx`,**绕开 pnpm 依赖检查**;独立窗口运行,关闭 bat 窗口后服务不退出;输出落盘到 `server.log` |
| 3 | `run_windows.bat` | 启动前检测 3001 端口占用 | 避免重复启动时子进程 EADDRINUSE 静默失败,而脚本却误报"启动成功" |
| 4 | `.gitignore` | 新增 `api/data/`、`.env` | 运行时含 MCP 实例 JWT 凭证,禁止入库 |

### ⚠️ 一个无效写法(避坑)

**不要**在 `package.json` 中添加:

```json
"pnpm": { "onlyBuiltDependencies": ["esbuild"] }
```

pnpm 11 **已不再读取** `package.json` 的 `pnpm` 字段,实测会告警且完全无效:

```
[WARN] The "pnpm" field in package.json is no longer read by pnpm.
       The following keys were ignored: "pnpm.onlyBuiltDependencies"
```

正确位置是 **`pnpm-workspace.yaml`** 的 `allowBuilds`。

### 排障建议

服务起不来时,**第一件事是把启动输出落到日志文件**,而不是丢给 `>nul`:

```bat
:: 错误示范 —— 报错全被吞掉,无法排障
start /B cmd /c "pnpm start >nul 2>&1"

:: 正确示范 —— 报错可见 + 独立窗口 + 关窗不死
start "YIXZ-MCP-Server" cmd /c "node_modules\.bin\tsx.cmd api\index.ts > server.log 2>&1"
```

随后检查 `server.log` 与 `/health` 接口即可快速定位。

---

## 📄 License

Apache-2.0 license