VergeOS MCP服务器
一种用于交互的模型上下文协议(MCP)服务器 VergeOS 虚拟化平台。这使得像Claude、Windsurf/Cascade和其他MCP兼容客户端这样的AI助手能够通过自然语言管理VM、网络、租户和监控您的VergeOS集群。
架构概述
此项目提供了两种部署选项:
┌─────────────────────────────────────────────────────────────────────────────┐
│ DEPLOYMENT OPTIONS │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Option 1: Local (stdio) Option 2: Remote (HTTP + Local Proxy) │
│ ───────────────────────── ───────────────────────────────────── │
│ │
│ ┌──────────┐ stdio ┌─────────┐ ┌──────────┐ HTTP ┌─────────┐│
│ │ Windsurf │◄──────────►│ MCP │ │ Windsurf │◄────────►│ Local ││
│ │ /Claude │ │ Server │ │ /Claude │ stdio │ Proxy ││
│ └──────────┘ └────┬────┘ └──────────┘ └────┬────┘│
│ │ │ │
│ │ HTTPS HTTPS │ │
│ ▼ ▼ │
│ ┌─────────┐ ┌──────────┐ │
│ │VergeOS │ │ K8s MCP │ │
│ │ API │ │ Server │ │
│ └─────────┘ └────┬─────┘ │
│ │ │
│ HTTPS│ │
│ ▼ │
│ ┌──────────┐ │
│ │ VergeOS │ │
│ │ API │ │
│ └──────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘何时使用每个选项
| 选项 | 用例 |
|---|---|
| 本地(stdio) | AI客户端在可以访问VergeOS的同一台机器上运行 |
| 远程(HTTP) | AI客户端是远程的(例如笔记本电脑),VergeOS位于专用网络上 |
特性
MCP工具
VM电源控制
| 工具 | 说明 |
|---|---|
list_vms | 列出所有虚拟机(按运行/名称筛选) |
get_vm | 按ID获取详细的VM信息 |
get_vm_status | 获取VM运行状态和电源状态 |
power_on_vm | 打开虚拟机电源 |
power_off_vm | 优雅地关闭电源,可选等待和自动强制 |
force_off_vm | 强制断电(硬关机) |
reset_vm | 重置/重新启动虚拟机 |
虚拟机配置
| 工具 | 说明 |
|---|---|
modify_vm | 更改CPU内核和/或RAM(处理正在运行的VM) |
add_drive | 向虚拟机添加新的磁盘驱动器 |
resize_drive | 扩展现有磁盘(仅增加) |
get_vm_nics | 获取VM网络接口 |
get_vm_drives | 获取具有大小的VM磁盘驱动器 |
网络管理
| 工具 | 说明 |
|---|---|
list_networks | 列出所有虚拟网络 |
get_network | 获取网络详细信息 |
network_action | 开机/关机、重置、应用规则 |
租户管理
| 工具 | 说明 |
|---|---|
list_tenants | 列出所有租户 |
get_tenant | 获取租户详细信息 |
tenant_action | 打开/关闭电源,重置租户 |
集群和节点管理
| 工具 | 说明 |
|---|---|
list_nodes | 列出群集节点 |
get_node_stats | 获取节点统计信息 |
get_cluster_status | 获取群集运行状况 |
get_cluster_stats | 获取存储层统计信息 |
存储和监控
| 工具 | 说明 |
|---|---|
list_volumes | 列出存储卷 |
get_logs | 获取系统日志(按级别/对象类型筛选) |
get_alarms | 获取活动警报 |
快照管理
| 工具 | 说明 |
|---|---|
list_vm_snapshots | 列出VM的快照 |
create_vm_snapshot | 创建快照(可选过期和暂停) |
delete_vm_snapshot | 删除VM快照 |
restore_vm_snapshot | 从快照还原虚拟机 |
智能功能
- 优雅的关机与等待:
power_off_vm可以等待VM关闭,并在超时后自动强制执行 - 正在运行VM处理:
modify_vm检测正在运行的虚拟机,并可以自动关闭以应用CPU/RAM更改 - 日志过滤:按级别筛选日志(
error,warning,audit)或对象类型(vm,node,vnet) - 快照过期:
create_vm_snapshot支持自动过期(默认7天) - 静止快照:在快照之前暂停VM的选项(需要来宾代理)
MCP资源
vergeos://cluster/status-集群状态概述vergeos://vms/list-所有虚拟机vergeos://networks/list-所有虚拟网络vergeos://alarms/active-主动系统报警
______________________________________________________________________
选项1:本地安装(stdio)
如果您的AI客户端运行在可以直接访问您的VergeOS实例的机器上,请使用此选项。
安装
git clone vergeos-mcp-server
cd vergeos-mcp-server
npm install配置
创建一个 .env 文件:
VERGEOS_HOST=your-vergeos-host
VERGEOS_USER=admin
VERGEOS_PASS=your-password或者使用API令牌(推荐):
# Get a token
curl -sk -X POST "https://your-vergeos-host/api/sys/tokens" \
-u "admin:password" \
-H "Content-Type: application/json" \
-d '{"login":"admin","password":"password"}' | jq -r '."$key"'
# Set in .env
VERGEOS_HOST=your-vergeos-host
VERGEOS_TOKEN=your-token-hereClaude桌面配置
添加到 ~/.config/claude/claude_desktop_config.json:
{
"mcpServers": {
"vergeos": {
"command": "node",
"args": ["/path/to/vergeos-mcp-server/src/index.js"],
"env": {
"VERGEOS_HOST": "your-vergeos-host",
"VERGEOS_USER": "admin",
"VERGEOS_PASS": "your-password"
}
}
}
}风帆配置
添加到 ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"vergeos": {
"command": "node",
"args": ["/path/to/vergeos-mcp-server/src/index.js"],
"env": {
"VERGEOS_HOST": "your-vergeos-host",
"VERGEOS_USER": "admin",
"VERGEOS_PASS": "your-password"
}
}
}
}______________________________________________________________________
选项2:远程安装(Kubernetes+本地代理)
如果您的AI客户端(例如笔记本电脑上的Windsurf)无法直接访问VergeOS,但您有一个可以访问的Kubernetes集群,请使用此功能。
建筑
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Windsurf │─────►│ Local Proxy │─────►│ K8s MCP │─────►│ VergeOS │
│ (Laptop) │stdio │ (Laptop) │HTTPS │ Server │HTTPS │ API │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
│
┌─────┴─────┐
│ Traefik │
│ Ingress │
└───────────┘步骤1:部署到Kubernetes
# Clone the repo on your K8s host
cd vergeos-mcp-server
# Edit credentials in deploy.sh or create ~/.vergeos-credentials
cat > ~/.vergeos-credentials 步骤3:测试服务器
# Health check
curl https://vergeos-mcp.yourdomain.com/health
# List VMs
curl https://vergeos-mcp.yourdomain.com/vms
# MCP protocol test
curl -X POST https://vergeos-mcp.yourdomain.com/message \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'步骤4:安装本地代理(在笔记本电脑上)
由于Windsurf仅支持基于stdio的MCP服务器,因此您需要一个本地代理:
# Create directory
mkdir -p ~/.mcp/vergeos
cd ~/.mcp/vergeos
# Create package.json
cat > package.json index.js ({ tools: TOOLS }));
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
const result = await apiCall(`/tools/${name}`, { method: "POST", body: JSON.stringify(args || {}) });
return { content: [{ type: "text", text: JSON.stringify(result.result, null, 2) }] };
} catch (error) {
return { content: [{ type: "text", text: `Error: ${error.message}` }], isError: true };
}
});
const transport = new StdioServerTransport();
await server.connect(transport);
EOF
# Install dependencies
npm install步骤5:配置Windsurf
添加到 ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"vergeos": {
"command": "node",
"args": ["/Users/yourusername/.mcp/vergeos/index.js"],
"env": {
"VERGEOS_MCP_URL": "https://vergeos-mcp.yourdomain.com"
}
}
}
}重新启动Windsurf以加载新的MCP服务器。
______________________________________________________________________
REST API参考
HTTP服务器还公开了一个用于直接访问的REST API:
| 端点 | 方法 | 描述 |
|---|---|---|
/health | GET | 健康检查 |
/tools | GET | 列出可用的MCP工具 |
/tools/:name | POST | 执行MCP工具 |
/vms | GET | 列出所有虚拟机 |
/vms/:id | GET | 获取VM详细信息 |
/vms/:id/:action | POST | VM操作(开机/关机/重置) |
/networks | GET | 列出网络 |
/tenants | GET | 列出租户 |
/nodes | GET | 列出节点 |
/cluster/status | GET | 群集状态 |
/alarms | GET | 活动警报 |
/logs | GET | 系统日志 |
MCP协议端点
| 端点 | 方法 | 描述 |
|---|---|---|
/sse | GET | 服务器发送事件连接 |
/message | POST | MCP JSON-RPC消息 |
______________________________________________________________________
交互示例
连接后,您可以询问您的AI助手:
- “列出VergeOS中的所有虚拟机”
- “关闭名为'test-VM'的VM的电源”
- “显示群集状态”
- “哪些警报处于活动状态?”
- “列出所有虚拟网络”
- “获取VM ID 34的详细信息”
- “群集中有多少个节点?”
- “显示最近20个日志条目”
- “创建名为“升级前”的VM 34快照”
- “列出web服务器VM的所有快照”
- “从快照ID 123还原VM 34”
- “向数据库VM添加2GB RAM”
- “向VM 34添加50GB数据磁盘”
______________________________________________________________________
VergeOS API说明
认证
VergeOS使用基于cookie的身份验证:
- 张贴到
/api/sys/tokens使用基本身份验证 - 响应中包含令牌
$key领域 - 使用令牌作为cookie:
Cookie: token=
# Get token
TOKEN=$(curl -sk -X POST "https://vergeos/api/sys/tokens" \
-u "admin:password" \
-H "Content-Type: application/json" \
-d '{"login":"admin","password":"password"}' | jq -r '."$key"')
# Use token
curl -sk "https://vergeos/api/v4/vms" -b "token=$TOKEN"API测验
- VM具有
is_snapshot: true是模板,不运行虚拟机 /machine_nics?machine=可以从其他机器返回NIC;始终按机器ID筛选- 使用
fields=most获取详细的响应,但要注意较大的有效载荷
______________________________________________________________________
安全考虑
- 自签名证书的SSL验证已禁用(在家庭实验室中很常见)
- 将凭据存储在环境变量或Kubernetes secrets中
- 尽可能使用API令牌而不是用户名/密码
- HTTP服务器应位于TLS之后(由Traefik/Ingress处理)
- 考虑网络策略以限制对MCP服务器的访问
______________________________________________________________________
故障排除
连接问题
# Test VergeOS API directly
curl -sk https://your-vergeos-host/api/v4/vms -b "token=YOUR_TOKEN"
# Test MCP server
curl https://vergeos-mcp.yourdomain.com/health令牌到期
令牌可能会过期。如果已配置,服务器将使用用户名/密码自动获取新令牌。
# Manually refresh token
curl -sk -X POST "https://your-vergeos-host/api/sys/tokens" \
-u "admin:password" \
-H "Content-Type: application/json" \
-d '{"login":"admin","password":"password"}'Kubernetes日志
kubectl logs -n vergeos-mcp deployment/vergeos-mcp
kubectl get pods -n vergeos-mcp本地代理问题
# Test proxy directly
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | node ~/.mcp/vergeos/index.js______________________________________________________________________
文件结构
vergeos-mcp-server/
├── src/
│ ├── index.js # Stdio MCP server (local use)
│ ├── http-server.js # HTTP server (legacy)
│ ├── mcp-http-server.js # HTTP+MCP server (K8s deployment)
│ └── stdio-proxy.js # Stdio proxy for remote server
├── local-proxy/
│ ├── package.json # Local proxy dependencies
│ └── index.js # Local proxy for Windsurf
├── deploy.sh # Kubernetes deployment script
├── k8s-deployment.yaml # Kubernetes manifests
├── package.json
├── .env.example
└── README.md______________________________________________________________________
许可证
麻省理工学院
