项目简介

这是一个基于Model Context Protocol (MCP) 实现的服务器,旨在为大型语言模型 (LLM) 提供与虚拟计算机(特别是浏览器会话)交互的能力。通过该服务器,LLM 可以执行一系列模拟的用户操作,如点击、输入文本、滚动等,并接收操作后的屏幕截图作为视觉反馈。此外,它还支持将浏览器会话实时流式传输(HLS/RTSP),供人类或LLM观察。

主要功能点

  • 虚拟浏览器控制:允许LLM通过预定义的工具对虚拟浏览器执行鼠标点击、双击、拖动、键盘输入、移动指针、屏幕截图、滚动和类型输入等操作。
  • 视觉反馈:每次执行浏览器操作后,服务器都会捕获当前浏览器页面的屏幕截图,并以Base64编码的PNG图像形式返回给LLM客户端,帮助LLM理解操作结果。
  • 实时会话流:提供HLS或RTSP流功能,可以将虚拟浏览器的实时画面流式传输到外部,方便用户监视LLM与浏览器的互动过程。
  • 多种传输协议:支持Stdio、SSE (Server-Sent Events) 和HTTP等多种通信方式,方便与不同的LLM客户端集成。
  • 会话管理:管理虚拟浏览器实例的生命周期,确保每次交互都在独立的会话中进行。

安装步骤

在本地运行该服务器需要Node.js环境和一些系统级依赖。

  1. 克隆仓库并安装依赖

    git clone https://github.com/supercorp-ai/computer-use-mcp.git
    cd computer-use-mcp
    npm install
    npm run build
  2. 安装系统级依赖

    • 'Xvfb':一个虚拟X11显示服务器,用于在无头环境下运行浏览器。
    • 'ffmpeg':包含'libx264'支持,用于HLS输出和屏幕捕获。
    • 'xdotool':用于在虚拟显示器内模拟鼠标和键盘事件。
    • 'Google Chrome / Chromium':Puppeteer 默认会下载一个测试构建版本,或者您也可以指定本地已安装的Chrome/Chromium路径。

    macOS (开发环境)

    brew install --cask xquartz # 提供 /opt/X11/bin/Xvfb
    brew install ffmpeg
    brew install xdotool

    Debian/Ubuntu (Docker): 通常在Dockerfile中安装,请参考仓库中的'Dockerfile'片段:

    # ... 其他基础镜像设置
    FROM node:22-bookworm-slim
    WORKDIR /app
    ENV DEBIAN_FRONTEND=noninteractive
    RUN apt-get update && apt-get install -y --no-install-recommends \
          xvfb ffmpeg chromium \
          libgtk-3-0 libnss3 libatk-bridge2.0-0 libxss1 libdrm2 libxkbcommon0 libgbm1 libasound2 \
          fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf \
        && rm -rf /var/lib/apt/lists/*
    # 可选: 配置Puppeteer使用系统Chromium
    RUN echo '#!/usr/bin/env bash\nexec /usr/bin/chromium --no-sandbox --disable-dev-shm-usage "$@"' \
          > /usr/local/bin/chromium-wrapper \
     && chmod +x /usr/local/bin/chromium-wrapper
    ENV PUPPETEER_SKIP_DOWNLOAD=true \
        PUPPETEER_EXECUTABLE_PATH=/usr/local/bin/chromium-wrapper
    # ... 您的应用代码安装
    CMD ["npm", "start", "--", "--chromePath", "/usr/local/bin/chromium-wrapper"]
  3. 启动服务器: 根据您的操作系统和需求,选择合适的启动命令。 macOS 示例 (启用自动流和流管理工具)

    npm start -- \
      --stream auto \
      --stream functions \
      --previewPath /preview \
      --xvfbPath /opt/X11/bin/Xvfb \
      --ffmpegPath "$(which ffmpeg)"

    Docker 示例 (启用自动流和流管理工具)

    npm run start:docker -- --stream auto --stream functions --previewPath /preview

    如果您通过Docker启动,容器会将端口 '8000' 暴露出来。您可以在主机浏览器中访问 'http://localhost:8000/preview' 来观看实时流。

服务器配置

MCP客户端需要知道如何连接到此服务器。以下是配置此MCP服务器到客户端的示例信息。请注意,这只是一个配置JSON的示例,不包含实际代码。

{
  "name": "ComputerUseMCP",
  "command": "npm",
  "args": [
    "start",
    "--",
    "--port", "8000",
    "--transport", "http",
    "--displayWidth", "1280",
    "--displayHeight", "720",
    "--toolsPrefix", "computer_",
    "--stream", "auto",
    "--stream", "functions",
    "--previewPath", "/preview",
    "--chromePath", "path/to/your/chromium",
    "--ffmpegPath", "path/to/your/ffmpeg",
    "--xvfbPath", "path/to/your/xvfb"
  ],
  "comment": "这是一个 MCP 服务器配置示例,用于连接 Computer Use MCP Server。",
  "parameters": {
    "port": "服务器监听的端口,默认为8000。",
    "transport": "选择通信协议,可以是 'stdio', 'sse', 或 'http',默认为 'http'。",
    "displayWidth": "虚拟浏览器窗口的宽度,默认为1280。",
    "displayHeight": "虚拟浏览器窗口的高度,默认为720。",
    "toolsPrefix": "注册工具名称的前缀,默认为 'computer_'。",
    "stream": "启用流功能,可以多次传递。例如,'auto' 自动启动流,'functions' 暴露流管理工具。可以同时传递两者。",
    "previewPath": "挂载HTML预览页面的路径,需要同时启用 '--stream'。",
    "chromePath": "Puppeteer 启动的Chrome/Chromium可执行文件路径。如果未指定,Puppeteer会下载一个捆绑的二进制文件。",
    "ffmpegPath": "用于显示捕获的ffmpeg二进制文件路径。如果未指定,默认使用系统PATH中的ffmpeg。",
    "xvfbPath": "用于虚拟显示的Xvfb二进制文件路径。如果未指定,默认使用系统PATH中的Xvfb。",
    "defaultUrl": "(可选)当会话启动时加载的默认URL。",
    "publicBaseUrl": "(可选)当服务器部署在反向代理后时,用于构建屏幕截图和流链接的公共基础URL。",
    "streamFps": "默认的MJPEG流帧率(1-30),默认为2。",
    "streamQuality": "默认的JPEG流质量(10-100),默认为80。"
  }
}

基本使用方法

一旦服务器启动并与MCP客户端连接,LLM就可以通过调用注册的工具来与虚拟浏览器交互。

调用主要工具: 使用 'computer_call' 工具,LLM可以发送一个包含浏览器操作的JSON payload。例如:

  • 执行点击操作: '{"tool_code": "computer_call", "args": {"action": {"type": "click", "x": 100, "y": 200, "button": "left"}}}' 这将模拟在屏幕坐标 (100, 200) 处进行一次左键点击,并返回操作后的屏幕截图。
  • 输入文本: '{"tool_code": "computer_call", "args": {"action": {"type": "type", "text": "Hello LLM world!"}}}' 这将在当前聚焦的输入框中输入指定文本,并返回屏幕截图。

管理直播流 (如果 'stream functions' 已启用):

  • 启动流: '{"tool_code": "computer_start_stream", "args": {"fps": 5, "quality": 90}}' 这将启动一个HLS流,并返回一个可供观看的流URL。
  • 获取流URL: '{"tool_code": "computer_get_stream"}' 返回当前活动流的URL。
  • 停止流: '{"tool_code": "computer_stop_stream"}' 停止当前的HLS流。

每次工具调用都会返回一个包含屏幕截图(Base64编码的PNG图像)的响应,LLM可以利用这些视觉信息进行推理和下一步决策。

信息

分类

AI与计算