虚拟显示器测试服务器

一个用于无头GUI测试的虚拟显示器MCP服务器,使用Xvfb创建隔离的虚拟显示,不影响物理桌面。

  • by Dizzident
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 Dizzident/xvfb-computer-use-mcp

使用说明

xvfb计算机使用mcp

屏幕外计算机使用MCP服务器进行无头GUI测试。用途 Xvfb (X Virtual Framebuffer)创建不干扰物理桌面的隔离虚拟显示器。

专为Claude Code和其他MCP客户端的自主E2E测试而构建。

特性

  • 屏幕外显示 --测试在虚拟帧缓冲区中运行,您的桌面保持不变
  • 平行会议 --每个会话都有自己的显示(:99, :100等),实现并发测试执行
  • 快速截图 --用途 ffmpeg x11grab用于亚秒级捕捉
  • 完全输入控制 --键盘、鼠标、滚动、拖动 xdotool
  • 窗口检测 --按标题模式等待并查找窗口
  • 进程管理 --启动并跟踪每个会话的应用程序流程
  • 自动清理 --会话和进程在销毁或服务器关闭时被清理
  • Qt6就绪 --自动设置 QT_QPA_PLATFORM=xcb 适用于Qt应用程序

系统要求

  • Linux(需要X11支持)
  • Node.js 18+

系统包

Arch Linux:

sudo pacman -S xorg-server-xvfb xdotool ffmpeg xorg-xdpyinfo openbox

Debian/Ubuntu:

sudo apt install xvfb xdotool ffmpeg x11-utils openbox

Fedora:

sudo dnf install xorg-x11-server-Xvfb xdotool ffmpeg xdpyinfo openbox

或者运行附带的脚本: ./install-deps.sh

安装

npm install
npm run build

使用Claude代码

claude mcp add --transport stdio computer-use-offscreen -- \
  node /path/to/xvfb-computer-use-mcp/dist/main.js

然后在Claude Code会话中:

  1. 创建会话 — create_session 可选宽度/高度
  2. 启动您的应用程序 — run_in_session 使用命令
  3. 注意了 — wait_for_window 直到应用程序的窗口出现
  4. 互动 — computer 截图、点击、键盘工具
  5. 清理 — destroy_session 完成后

MCP工具

会话管理

工具 说明
create_session 创建新的Xvfb虚拟显示(默认1920x1080)
destroy_session 销毁会话并终止其所有进程
list_sessions 列出所有活动会话及其进程信息
run_in_session 在会话中启动命令
wait_for_window 轮询,直到出现具有匹配标题的窗口
find_windows 查找所有窗口,可选择按标题筛选

计算机控制

这 computer 该工具支持所有标准操作:

动作 描述
get_screenshot 将虚拟显示捕获为PNG格式
key 按下组合键(例如。 ctrl+s, Return, alt+F4)
type 键入文本字符串
left_click 在可选坐标处左键单击
right_click 在可选坐标处单击鼠标右键
middle_click 在可选坐标处单击鼠标中键
double_click 双击可选坐标
mouse_move 将光标移动到坐标
left_click_drag 从当前位置拖动到坐标
scroll 在坐标处滚动(文本: up, down:500等等)
get_cursor_position 获取当前光标x,y

所有基于协调的动作在API图像空间和显示空间之间自动缩放。

并行测试示例

// Create two isolated sessions
const s1 = await callTool("create_session", { width: 1280, height: 720 });
const s2 = await callTool("create_session", { width: 1280, height: 720 });

// Launch apps in parallel
await Promise.all([
  callTool("run_in_session", { session_id: "s1", command: "./my-app" }),
  callTool("run_in_session", { session_id: "s2", command: "./my-app" }),
]);

// Each session has independent mouse, keyboard, and display
await callTool("computer", { session_id: "s1", action: "key", text: "ctrl+n" });
await callTool("computer", { session_id: "s2", action: "key", text: "ctrl+o" });

// Screenshots are per-session
const shot1 = await callTool("computer", { session_id: "s1", action: "get_screenshot" });
const shot2 = await callTool("computer", { session_id: "s2", action: "get_screenshot" });

运作原理

  1. Xvfb 创建无物理监视器的轻量级虚拟X11显示器
  2. 开箱 提供了一个最小的窗口管理器,用于正确的窗口管理
  3. Xdotool 将键盘和鼠标事件发送到虚拟显示器
  4. FFmpeg 通过X11屏幕截图捕获屏幕截图
  5. 锋利的 调整屏幕截图的大小以符合Claude的API图像限制

每个会话都是完全隔离的——独立的显示服务器、窗口管理器和输入状态。

许可证

麻省理工学院