A side-by-side look at the Kwin MCP and Linux MCP Server MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Kwin MCP for os automation work as a local process; choose Linux MCP Server for os automation as a local process. You can also run both side by side in one mcpServers block.
session_start, session_connect, session_stop.get_journal_logs, read_log_file, get_network_interfaces.Rows where the two servers differ are marked.
| Spec | K Kwin MCP | |
|---|---|---|
| Category | OS Automation | OS Automation |
| Quality signal | 59/100 · Good | 64/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | No auth required | Not declared |
| Pricing | Free | Not declared |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 71 | 316 |
| Directory activity | 1 views 0 installs 0 upvotes | 2 views 0 installs 0 upvotes |
| Tools | 29 | 23 |
| Full listing | View Kwin MCP | View Linux MCP Server |
session_startStart an isolated virtual KWin Wayland session (one at a time) with its own `dbus-run-session` bus, `kwin_wayland --virtual` compositor, AT-SPI2 bus and EIS input. `screen_width`/`screen_height` must be positive integers. `enable_clipboard=true` serves the clipboard tools (off by default because `w…session_connectAttach to an already running KWin session: the real desktop or a KWin inside a container. Empty values default to `$DBUS_SESSION_BUS_ADDRESS` and `$WAYLAND_DISPLAY` (a socket name is resolved under `$XDG_RUNTIME_DIR`). Clipboard is always enabled. Actions affect real applications, and `window_close…session_stopEnd the current session. Virtual: terminate the whole session process group (`SIGTERM`, then `SIGKILL` for members that remain), KWin, launched apps and the bus. Live: detach, kill only apps launched through kwin-mcp, restore the accessibility switch. Releases all held input and reports it. Idempot…session_infoReport the current session (or `null`): its kind, Wayland socket, bus address, screen size, enabled backends (input, clipboard, accessibility), retention and artifacts directory, every app launched through kwin-mcp, and the held input. Works without a session.app_launchLaunch a program in the session, split with `shlex` (no shell), in its own process group, with stdin closed. `env` adds environment variables for this process. stdout and stderr go to a log file read with `app_log`. An empty command or unbalanced quotes is an error. A failed launch keeps the sessio…app_logReturn the tail of the captured stdout/stderr of an app launched with `app_launch` (`session_info` lists the PIDs). `last_n_lines=0` returns the whole log.screen_captureCapture the whole workspace, or a `region` rectangle of it, as a PNG via KWin ScreenShot2 (Spectacle fallback). Returns a `Frame`: the file path, the `kwin://screenshots/{name}` URI, the image size, `size_kb`, the image-to-logical `mapping` and `coverage`, plus the `Coordinate space` text line. `ma…element_queryReturn the AT-SPI2 elements matching `locator`, in pre-order, with role, name, description, states, rectangle (or the reason it is unavailable), actions, text content (capped at 200 characters), slider/scrollbar value, `app`, `window_id`, `child_count` and a `ref` to use as a target. `locator.match…element_actInvoke a named AT-SPI action (case-insensitive, e.g. `Press`, `Toggle`, `Activate`) on exactly one element without pointer coordinates: `element={ref}` from `element_query`, or `element={strict: Locator}` for a strict search with the same `match` modes (depth 64, fails closed on any unreadable node…window_listList KWin windows, dialogs, popups and shell surfaces included, with `id`, `app_id`, `caption`, `kind`, `active`, `frame` and `client` rectangles, `moveable`/`resizeable`/`closeable`, and `desktops`. `filter` is the same `WindowSelector` the mutators use, applied as an AND-ed filter: `{active: true…desktop_listList KWin virtual desktops in pager order (`id`, `name`) with the current one marked.window_focusRaise and activate exactly one window through KWin scripting (`workspace.activeWindow`). The result reports the window's observed state afterwards, or that it vanished.get_journal_logsGet systemd journal logs.read_log_fileRead a specific log file.get_network_interfacesGet detailed information about network interfaces including address and traffic statistics.get_network_connectionsGet detailed information about active network connections.get_listening_portsGet details on listening port, protocols, and services.pcp_guideReturns the PCP metrics guide: a catalog of the metric names recorded on a typical Linux system, and how to read the values the other PCP tools return. Read it before investigating performance with PCP, and take metric names from it rather than from memory.pcp_list_metricsBrowses the PCP metric namespace. Lists the metrics under 'prefix' with their descriptions, collapsing any large sub-namespace to one line giving its name and how many metrics it holds; call again with that name as the prefix to see inside it. Only metrics this system's pmlogger records are listed, so everything listed can be passed to pcp_query_metrics. The pcp_guide tool already names the commonly needed metrics, so reach for this when you need a subsystem the guide does not cover. Use only if get_system_information() indicates PCP is available.pcp_query_metricsRetrieves historical metric data from PCP archives as JSON samples. When start_time, end_time, or interval is omitted, reasonable defaults are chosen, targeting one hour or about 20 samples. Call pcp_guide first for the metric catalog and how to read the values; do not guess metric names. Use only if get_system_information() indicates PCP is available.pcp_performance_summaryProduces a condensed snapshot of CPU, memory, disk, network, and process information using pcp xsos. Can summarize the live system or a particular time in the past. Use only if get_system_information() indicates PCP is available.list_processesList running processesget_process_infoGet information about a specific process.list_servicesList all systemd services.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"kwin-mcp-2": {
"command": "uvx",
"args": [
"kwin-mcp"
]
}
}
}
{
"mcpServers": {
"linux-mcp-server-2": {
"command": "uvx",
"args": [
"linux-mcp-server"
]
}
}
}