
Glovebox Mcp
io.github.segentic-lab由 GitHub 帳號 segentic-lab 發布v0.3.0更新於 Nov 3, 2026
Sandboxed computer-use for AI agents: drive real browser + desktop apps in nested X11 windows
概覽
沙箱化的電腦操作 MCP 伺服器,讓 AI 代理在巢狀 X11 視窗內以滑鼠、鍵盤、截圖和剪貼簿操作真實瀏覽器與桌面應用程式。
- 可以做什麼
- 擷取沙箱畫面、放大指定區域,並辨識螢幕元素及其座標
- 點擊、雙擊、移動、捲動、拖曳,輸入 Unicode 文字,按下組合鍵或按鍵序列
- 讀取與設定剪貼簿,等待畫面穩定,查看視窗標題與幾何資訊
- 啟動、列出與關閉多個沙箱應用程式實例,並查看應用程式的標準錯誤日誌
- 將本機檔案上傳到瀏覽器檔案輸入欄、以原生應用程式開啟檔案,並列出各實例的暫存資料夾
- 查看伺服器、視覺後端與系統相依套件的狀態
- 適用情境
- 適合需要讓代理操作真實圖形介面應用程式或網站、而非呼叫 API 的情境,並希望它的點擊與截圖被限制在一個可即時觀看、隨時關閉的視窗內。適用於 Linux 桌面,包括需要 X11 自動化工具的 Wayland 主機。
- 執行需求
- 僅限 Linux(不支援 macOS 與 Windows),需要 Python 3.10+ 與 uv,以及 Xephyr、openbox、scrot、x11-utils、xdotool、wmctrl、xclip 等系統套件;在 Debian/Ubuntu 上安裝腳本會透過 apt 自動安裝。沙箱內需有 Chromium 系列瀏覽器。可選用 Tesseract OCR 進行 basic 辨識,或至少 6 GB 顯示記憶體的 NVIDIA GPU 進行 local 的 OmniParser 辨識。用戶端設定需將 DISPLAY 指向沙箱顯示。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Glovebox Mcp,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
glovebox-mcp
A sandboxed computer-use MCP server — let an AI agent drive a real browser and desktop apps (mouse, keyboard, screenshots, clipboard, vision grounding), confined to a nested X11 window so its input and vision never touch your real screen or the windows of your other apps.
Like a lab glovebox: the agent reaches in and manipulates real applications, sealed off from your desktop. Bring the sandbox up, log into whatever sites or apps you want to automate inside that window, and the agent operates only there — you can watch it live and close it instantly.
Speaks the Model Context Protocol, so it works with MCP clients like Claude Code. Your host can run Wayland; the sandbox gives the agent a real X server to drive.
[glovebox-mcp — an agent filling a sign-up form inside the sandbox]
An agent driving a real browser in the sandbox — gliding the cursor, inserting a unicode name (Nadja Kovačič), typing, and submitting. All confined to a nested X11 window.
Why a nested X11 sandbox?
- Most desktop automation (xdotool, PyAutoGUI) is X11-only, but many modern desktops run Wayland.
- Xephyr provides a real X server inside a single window (
DISPLAY :1). Everything the agent does — clicks, typing, screenshots — is confined to that window, not your real desktop. - You stay in control: watch it live,
pkill Xephyrto close everything.
The isolation is display-level (see Safety): the apps themselves run as your user with your filesystem. For OS-level isolation run glovebox inside a VM or container.
Requirements
- Linux — the sandbox nests a real X server (Xephyr), so it works even on Wayland hosts (via Xwayland). Not macOS/Windows. Developed on Ubuntu; any modern Linux with the packages below.
- Python 3.10+ and
uv(used for the virtualenv). - System packages —
xserver-xephyr(Xephyr),openbox,scrot,x11-utils,xdotool,wmctrl,xclip(+tesseract-ocrforbasic). On Debian/Ubuntu the installer auto-installs them viaapt(sudo); on Fedora/Arch it prints the matchingdnf/pacmancommand. The MCP server itself is distro-agnostic — any Linux with these tools works.openboxis not optional in practice: without a window manager Xephyr ignores synthetic pointer motion, so clicks would land in the screen center (launch_appwarns when it is missing). - A browser in the sandbox (Chromium, Chrome, Brave, Edge, Vivaldi or Opera).
- NVIDIA GPU (≥6 GB VRAM) — only for the
localvision mode. The server checks this itself (status()→vision.gpu) andautofalls back tobasic/nonewhen it is not met.
Install
Pick a vision backend and run its one-liner (clone → install). Each one installs the system packages
(auto via apt on Debian/Ubuntu) and the Python deps for that mode, and writes a ready-to-paste
mcp-config.json with your paths.
none — no local models; your agent reads screenshots itself (lightest, instant):
basic — Tesseract OCR grounding (parse_screen → text lines + coordinates, CPU-only):
local — OmniParser on an NVIDIA GPU (parse_screen → text + icons, pixel-precise; ~4 GB weights, ≥6 GB VRAM):
Your choice is written to .vision-mode (override per run with the GLOVEBOX_VISION env var).
Without either, the server runs in auto and picks the best backend that is actually usable.
python vision.py check prints the same diagnosis status() returns (GPU, weights, tesseract).
Works with any MCP client / harness
Claude Code, Cursor, Codex, or your own agent — it's a standard MCP server, not tied to any one host.
Two compatibility notes: basic/local return element coordinates as text, so they work even
with text-only agents; none relies on the client passing the tool's screenshots to a
multimodal model (fine for Claude Code, Cursor, and other image-capable MCP clients). In any mode,
clipboard() gets exact text out of an app without vision at all.
Quickstart
- Start the sandbox (leave it running): Log into any sites or apps you want to automate in that window.
- Register the server with your MCP client.
install.shalready wrotemcp-config.jsonwith your real install path — copy itsgloveboxblock into your client's MCP config: Restart the client so it loads the server. - Ask the agent to screenshot / click / type — it operates only on the
:1window.
Driving it with an AI agent? Paste
AGENTS.mdinto the agent's system prompt — it teaches the observe → act → verify loop, grounding, the upload/unicode gotchas, and when to stop.
Tools (23)
Every control tool takes instance=N and optional observe / settle_ms (see below).
In local mode OmniParser is lazy-loaded on first parse_screen (~6 s once, then ~2 s/parse),
after a GPU preflight (VRAM present and free).
Structured, honest responses
Every tool returns JSON: {"ok": true, "action": "click", "instance": 1, "detail": "clicked (10,20) button 1", …}.
Failures come back with the MCP isError flag set and the same JSON shape embedded in the error
text — {"ok": false, "error": "…", "fix": "…"} — where fix names the call that unblocks you
(e.g. a click on a dead instance says to run list_instances() / launch_app(); an unknown element
id says to re-run parse_screen(); a GPU that is too small says which mode to switch to). Silent
no-ops are treated as failures too: an invalid keysym, a zero scroll, an off-screen click, closing an
instance that isn't running, an app that exits on launch, or non-ASCII typing without xclip all
error instead of pretending success. Clamped waits are flagged (clamped / settle_clamped).
Image-returning calls (screenshot(), observe="screenshot"|"parse") return [json, image].
No subprocess can hang a call: xdotool/xdpyinfo/xclip run under timeouts and a frozen display is
reported as such.
Vision backend (selectable, self-diagnosing)
GLOVEBOX_VISION env var, or the .vision-mode file, or default auto:
In local mode the models are loaded by one shared vision-service process per machine
(vision_service.py), not by every agent's server: the first parse_screen starts it, parallel
agents queue on it (queued_ms in the result), and it exits after 15 idle minutes so a forgotten
service never pins the GPU. If it can't be reached the server loads the models in-process instead —
the service is an optimization, never a new failure mode. status() shows it under
vision.omniparser.service; python vision_service.py status|stop from the shell.
An explicitly requested basic/local that is not usable fails parse_screen with the fix named
(OmniParser not installed, no/too-small GPU, GPU out of memory, missing tesseract language data) —
it never silently falls back; only auto does, and it says so. Tesseract languages default to
slv+eng filtered to what is installed (GLOVEBOX_TESS_LANG overrides). Switch anytime with
./install.sh <mode> (installs only what that mode needs).
Multi-instance (a fleet of app windows)
Every control tool takes instance=N (default 1 = the start-display.sh sandbox). Spin up more —
each its own Xephyr display/window on the host desktop:
launch_app(command, name?, size?)→ starts the next free:Nrunning any GUI app (chromium,gimp,inkscape,xterm, …). Chromium-family browsers auto-get X11 flags, a per-instance profile, a remote-debugging port, and downloads routed tofiles/<N>/; other GTK apps get D-Bus isolation. Returns the instance id, size and any warnings.list_instances()·close_instance(n)·app_log(n).
Because each display has its own cursor, multiple agents can drive different instances in parallel —
one window each. Each agent's server process allocates display numbers under a cross-process lock,
so simultaneous launches don't collide. The GPU is shared through the vision service (one model
load, requests queue; see above). The host display for new windows is GLOVEBOX_HOST_DISPLAY
(default :0); XAUTHORITY is auto-discovered. Instances outlive the server process by default
(another agent or session can pick them up via list_instances); set GLOVEBOX_CLEANUP_ON_EXIT=1 to
close the ones a server launched when it exits.
One-call action + observe
click · click_element · type_text · press_keys · scroll · drag · double_click ·
upload_file · wait_for_stable take observe (none default · screenshot · parse) and
most take settle_ms. With observe="screenshot" the action returns its result and the
resulting screen in a single call — no separate screenshot round-trip. Use settle_ms when you know
the delay, wait_for_stable(observe="screenshot") when you don't. Default none keeps routine steps
cheap; opt into screenshot/parse on the steps that change the page (navigations, submits).
Files & uploads
Each instance gets a staging folder files/<N>/ inside the install dir — a stable place to drop
files for that instance (readable by native apps and, since it's under $HOME, by snap Chromium too).
list_files(instance) shows the folder and its contents, with sizes and a partial flag for
in-progress downloads.
- Browser
<input type=file>→upload_file(path, instance)(via CDP;page_url_containspicks the tab when several are open). The nested file picker is invisible to automation and hangs snap Chromium, so never click an upload button expecting a dialog. - Native apps (GIMP, Inkscape, editors) →
open_file(path, instance, app="gimp"), or just drive the app's own Open dialog — unlike the browser's, it's a real visible window you can type a path into (Ctrl+Lin a GTK file chooser). - Saving / downloads → apps run as your user, so they can save anywhere you can write.
launch_appbrowser instances are pre-configured to download and "save as" intofiles/<N>/; point native apps' Save dialogs there too, thenlist_files(instance)to see the results.
Environment variables
Maintenance (local mode)
The OmniParser lifecycle lives in vision.py (the server owns it; install.sh local just calls
it): python vision.py install-omniparser clones OmniParser,
downloads the v2 weights into OmniParser/weights/, and makes PaddleOCR optional (this uses easyocr).
python vision.py check reports readiness. transformers is pinned to 4.49.0 — newer releases
break Florence-2's remote config. If you upgrade OmniParser manually, re-run install-omniparser to
re-apply the patch.
Stop
Safety
- The agent's input and vision are scoped to the sandbox display — it does not see or control your real desktop.
- The server process and the apps it launches run as your user (shell/file access, like any MCP server); only the GUI control is sandboxed to the Xephyr window. Files the agent saves, opens or uploads are your real files. For OS-level isolation from your files, run it inside a VM or container.
- You can watch everything live and close it instantly with
pkill Xephyr. - Automate responsibly — only sites and services you are authorized to use.
Files
server.py— the MCP server (all 23 tools).vision.py— vision backends: selection rules, GPU preflight, tesseract grouping, OmniParser lifecycle (check/install-omniparserCLI).vision_service.py— the shared OmniParser process (Unix socket, idle-exit,status/stopCLI).install.sh— mode-aware installer (none/basic/local).start-display.sh— launches the Xephyr sandbox (display + window manager + browser).AGENTS.md— drop-in tool-usage instructions for the AI agent (paste into its system prompt).ROADMAP.md— what is planned next (MCP SDK 2.x migration, …).mcp-config.json— a ready-to-paste MCP client config snippet.
Credits
local vision mode uses Microsoft's OmniParser
(cloned and weights downloaded by vision.py, under its own license). Screen capture uses
mss; input is driven with
xdotool. Not affiliated with Microsoft.
Contributing
Shipped as-is under MIT. Issues and PRs are welcome, but this is maintained by one person — no support or response time is guaranteed. If it's useful to you, a ⭐ helps.
License
MIT — see LICENSE.
來源:README.md,提交 eccfb0e
工具
0版本歷史
2- v0.3.0最新Nov 3, 2026
- v0.2.0Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分