GNOME Wayland desktop automation via AT-SPI discovery and Mutter input.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Small MCP server for GNOME Wayland desktop automation.
It exposes GNOME desktop inspection and interaction through AT-SPI for discovery and Mutter RemoteDesktop for input. In practice that means element lookup, activation, typing, screenshots, and wait helpers for the current desktop session.
For navigation it follows a snapshot-driven model: take a snapshot of the active window to get stable element uids, then click/fill/hover/fill_form those uids. Stale uids are rejected rather than silently mis-targeted, and actions auto-wait for the UI to settle. See Navigation below.
DBUS_SESSION_BUS_ADDRESS, XDG_RUNTIME_DIR, WAYLAND_DISPLAY, DISPLAY, XDG_SESSION_TYPEThe container must run on the same machine as the GNOME session and use the session environment plus runtime mounts.
The recommended way to run the server is via the published GHCR image:
latest tracks the most recent release. Version tags such as v0.1.0 publish matching image tags as well.
Direct docker run:
--user "$(id -u):$(id -g)" is required so the container joins the same user
session as GNOME, D-Bus, and AT-SPI.
Local development via Compose:
This path additionally requires docker compose.
.env.example to .envThe server supports three transports, both locally and in Docker:
stdio (default): recommended for local MCP clients that spawn the server processstreamable-http: recommended for HTTP-based integrations on http://127.0.0.1:8000/mcpsse: available for backwards compatibility on http://127.0.0.1:8000/sse with message POSTs to http://127.0.0.1:8000/messages/Examples:
The same flags can be passed to the Docker image by appending them after the image name:
The repository includes metadata for these distribution channels:
server.json.claude-plugin/plugin.json.github/plugin/plugin.jsonTo add this repository as a plugin marketplace in Claude Code:
Then install the plugin:
The plugin starts the published Docker image through
scripts/run-docker-mcp.sh, so Docker and the
GNOME session environment must be available on the host.
The blessed way to drive the desktop is snapshot-first:
take_snapshot β capture the active window (or pass window from list_windows, or app_name). Every element gets a stable opaque uid such as 7_42.click / fill / hover / fill_form β reference elements by uid. Actions auto-wait for the shell to settle and report effect verification. Pass include_snapshot=true to get a fresh snapshot of the result in the same turn.select_window sets the implicit snapshot scope.A uid is only valid for the latest snapshot: if the UI changed and a uid is rejected as stale, call take_snapshot again and use a fresh one. The lower-level path-based tools (find_elements, click_element, set_element_text, β¦) remain available as advanced building blocks.
Tool categories can be enabled or disabled at startup with --category NAME / --no-category NAME (for example --category navigation --category input).
Complete tool reference available at https://asattelmaier.github.io/gnome-ui-mcp/
This server can inspect and control the active desktop session. Use it only with trusted MCP clients.
Containerized execution on Ubuntu may require --security-opt apparmor=unconfined
so the process can talk to the GNOME session buses.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/gnome-ui-mcp)<a href="https://allmcps.com/mcp/gnome-ui-mcp"><img src="https://allmcps.com/api/badge/gnome-ui-mcp?style=directory" alt="GNOME UI MCP on AllMCPs" /></a>