GNOME Desktop MCP
# Gnome-MCP
Desktop automation for GNOME Wayland via MCP. Take screenshots, manage windows, and inject keyboard/mouse input from AI assistants like Claude Code.
[](https://glama.ai/mcp/servers/sbuysse/gnome-desktop-mcp)
```
Claude Code ──MCP──▶ gnome-desktop-mcp (Python) ──D-Bus──▶ GNOME Shell Extension
```
## Why
GNOME Wayland blocks external processes from taking screenshots or injecting input. This extension runs **inside** the compositor, bypassing those restrictions, and exposes a D-Bus API. The MCP server bridges that API to any MCP-compatible client.
## Features
- **30 MCP tools**: screenshots, window management, input injection, workspace control
- **Privacy indicator**: top bar icon shows connection status (red = active, grey = idle)
- **Consent dialog**: first-use confirmation before enabling automation
- **Access gating**: master kill switch to disable all automation instantly
## Requirements
- GNOME Shell 45-49 (Wayland)
- Python 3.12+
## Installation
### Quick install (development)
```bash
git clone https://github.com/sbuysse/gnome-mcp.git
cd gnome-mcp
./install.sh
```
Then log out and back in (required for Wayland), and enable:
```bash
gnome-extensions enable desktop-automation@gnomemcp.github.io
```
### MCP server only (from PyPI)
```bash
pip install gnome-desktop-mcp
```
## Claude Code Configuration
Add to `~/.claude/settings.json`:
```json
{
"mcpServers": {
"desktop-automation": {
"command": "gnome-desktop-mcp"
}
}
}
```
## Tools
### Screenshots
| Tool | Description |
|---|---|
| `screenshot` | Full screen capture |
| `screenshot_window` | Capture a specific window |
| `screenshot_area` | Capture a rectangular region |
| `pick_color` | Get pixel color at coordinates |
| `cleanup_screenshots` | Remove temp screenshot files |
### Windows
| Tool | Description |
|---|---|
| `list_windows` | List all open windows |
| `get_window` | Get detailed window properties |
| `focus_window` | Focus and raise a window |
| `move_resize_window` | Move and resize a window |
| `minimize_window` / `unminimize_window` | Minimize/restore |
| `maximize_window` / `unmaximize_window` | Maximize/restore |
| `close_window` | Close a window |
| `list_workspaces` | List all workspaces |
| `activate_workspace` | Switch workspace |
### Input
| Tool | Description |
|---|---|
| `key_press` | Press a single key ("Return", "F5", "a") |
| `key_combo` | Key combination ("Ctrl+Alt+t") |
| `type_text` | Type text character by character |
| `mouse_move` | Move mouse to coordinates |
| `mouse_click` | Click at coordinates |
| `mouse_double_click` | Double-click |
| `mouse_down` / `mouse_up` | Press/release mouse button |
| `mouse_drag` | Drag from point A to point B |
| `mouse_scroll` | Scroll at coordinates |
### Utility
| Tool | Description |
|---|---|
| `ping` | Check extension is alive |
| `get_enabled` / `set_enabled` | Check/toggle automation |
| `get_monitors` | List monitors with geometry |
## Privacy
- **Top bar indicator** shows when automation is active
- **Toggle switch** to disable all automation instantly
- **Activity log** tracks last 20 method calls (name + timestamp only, no data)
- **D-Bus access gating**: all methods blocked when disabled
- **Session bus trust model**: any local user process can call the API (consistent with GNOME's security model)
## Architecture
The GNOME Shell extension (`desktop-automation@gnomemcp.github.io`) runs inside the Wayland compositor. It exports `io.github.gnomemcp.DesktopAutomation` on the session D-Bus with privileged access to:
- `Shell.Screenshot` — silent screenshots (no permission dialog)
- `Meta.Window` — window management
- `Clutter.VirtualInputDevice` — keyboard/mouse injection
The Python MCP server (`gnome-desktop-mcp`) translates MCP tool calls into D-Bus method calls via `dasbus`.
## Development
```bash
# Install in development mode
pip install -e mcp-server[dev]
# Run tests
python -m pytest tests/ -v
# Watch extension logs
journalctl /usr/bin/gnome-shell -f
# Test D-Bus directly
gdbus call --session --dest org.gnome.Shell \
--object-path /io/github/gnomemcp/DesktopAutomation \
--method io.github.gnomemcp.DesktopAutomation.Ping
```
## License
[GPL-3.0](LICENSE)
TDQS
Scored across 30 tools
Most tools have distinct purposes with clear boundaries, such as separate mouse actions (click, drag, scroll) and window operations (maximize, minimize, move_resize). However, some overlap exists between key_press and key_combo, which could cause confusion if an agent needs to press a single key versus a combination, though descriptions help clarify.
All tool names follow a consistent snake_case pattern with clear verb_noun structure, such as activate_workspace, close_window, and screenshot_area. There are no deviations in naming conventions, making the set predictable and easy to parse.
With 30 tools, the count is borderline high for a desktop automation server, as it includes many granular actions like separate mouse_down and mouse_up. While comprehensive, it may feel heavy and could be streamlined by grouping related operations, though it covers a broad scope reasonably.
The tool set provides complete coverage for GNOME desktop automation, including window management (list, focus, close, resize), workspace control, input simulation (keyboard, mouse, typing), screenshots (full, area, window), and system checks (ping, enable/disable). No obvious gaps exist; agents can perform end-to-end automation tasks without dead ends.