quickshell-mcp
quickshell-mcp
Un servidor MCP que ejecuta una aplicación de quickshell (QML) y la maneja.
El servidor lanza la aplicación dentro de un sway headless. Toma capturas de pantalla de las ventanas, vuelca el árbol de objetos de una ventana y lee o escribe el estado de QML. El compositor proporciona la pantalla; un perfil proporciona los backends.
El servidor es agnóstico de la aplicación. El perfil le indica qué directorio de configuración ejecutar, qué archivo de entrada cargar, qué procesos de backend iniciar y qué macros ofrecer. Le das al servidor un perfil, y el servidor maneja esa aplicación.
Ejecutar
nix run inicia el servidor. Habla MCP por stdio.
Ejecuta el ejemplo counter:
nix run ~/git/quickshell-mcp -- --profile ~/git/quickshell-mcp/examples/counter/profile.jsonApunta --profile al JSON del perfil de cualquier aplicación.
Related MCP server: kwin-mcp
Manejar la aplicación
Operas la aplicación a través de herramientas. Cada llamada a una herramienta devuelve un resultado. Una llamada rechazada devuelve un error MCP con el mensaje <code>: <detail>.
El bucle:
screenshot(window_index): ver la aplicación como PNG.windows(): enumerar las ventanas.tree(window_index, root_path, max_depth): mapear el árbol visual de una ventana. Cada nodo informa de unpath(una cadena de índices de hijo como0/2/1) y suobjectName.find(name): obtener las rutas de índice de hijo de los nodos cuyoobjectNameesname.Construye un selector que nombra un nodo y un miembro.
get_property/set_property/invoke/qml_eval/macro: leer o cambiar el estado.screenshot(window_index)de nuevo: ver el resultado.
Selectores
Un selector nombra un nodo y un miembro. Toma una de tres formas:
wN.prop: la propia ventanaN, y luego el miembroprop. Ejemplo:w0.count. Las propiedades de la propia ventana viven aquí.wN/path.prop: la ventanaN, luego una ruta de índices de hijo bajo su elemento de contenido, y luego el miembroprop. Ejemplo:w0/0/2.text.@objectName.prop: el primer nodo con eseobjectName, y luego el miembroprop. Ejemplo:@saveBtn.enabled.
find devuelve rutas simples como 0/2/1. Conviértela en un selector como wN/<path>.<prop>, o pásala a tree(root_path=...).
Un selector @objectName se resuelve a la primera coincidencia. Una aplicación que repite un control por elemento añade el nombre del elemento como sufijo al objectName (activateToggle-alpha), así que cada control tiene un nombre único.
screenshot requiere que el elemento de contenido de la ventana contenga exactamente un hijo visual que cubra la ventana.
Herramientas
Herramienta | Argumentos | Efecto |
| ninguno | Devuelve |
| ninguno | Enumera las ventanas: índice, tipo, título, visible, tamaño. |
|
| Toma una ventana como PNG, componiendo el contenido sobre el color de fondo (opaco) de la ventana para que nunca sea transparente. |
|
| Vuelca el árbol visual de una ventana como JSON. Los campos de contraseña permanecen ocultos. |
|
| Lee una propiedad QML como JSON. |
|
| Escribe una propiedad QML a partir de un valor JSON. |
|
| Llama a un método QML con un arreglo JSON de argumentos. |
|
| Evalúa una expresión JavaScript en el ámbito de la aplicación, donde |
|
| Enumerafa las rutas de índice de hijo de los nodos cuyo |
|
| Ejecuta una macro del perfil, rellenando los valores |
| ninguno | Inicia la aplicación. Idempotente mientras la aplicación esté activa. |
| ninguno | Apaga la aplicación y luego inicia una nueva con los fixtures vuelto a convertir. |
| ninguno | Apaga la aplicación, los backends y el compositor. Una llamada a herramienta mientras está apagada devuelve un error. |
qml_eval puede alcanzar cualquier estado de la aplicación. win(i) te da la ventana i; app te da la raíz de la aplicación.
Códigos de error
Una llamada rechazada devuelve un error MCP. El código es uno de: unresolved, no-member, not-callable, too-many-args, no-window, no-node, not-visible, zero-size, grab-refused, multi-root, partial-window, bad-payload, threw.
Perfiles
Un perfil es un pequeño archivo JSON que escribes para cada aplicación. --profile es obligatorio.
Todos los campos viven en
quickshell_mcp/profile.cue, con un comentario de documentación en cada uno. El cargador revisa tu perfil contra ese esquema con cue vet antes del inicio, así que un perfil roto falla al inicio con el error del esquema.
El perfil más pequeño ejecuta una aplicación independiente:
{ "config_dir": "." }config_dir es el único campo obligatorio. Es absoluto, o relativo al archivo de perfil. entry por defecto es shell.qml.
Dentro de cualquier cadena de valor, ${PROFILE_DIR}, ${CONFIG_DIR}, ${WORK} y ${XDG_RUNTIME_DIR} se expanden al inicio.
Mira examples/counter/profile.json para un exemplo de macro, y examples/async-form/profile.json para un backend con una aprueba de preparación, un fixture de ejemplo y env_out.
Genera un JSON Schema para tu editor desde la misma fuente:
cue def --out jsonschema -e '#Profile' quickshell_mcp/profile.cueEjemplos
Cada ejemplo es autocontenido y hace las veces de prueba. Cada uno trae un check.py que arranca la aplicación de verdad y comprueba los estados que su README documenta.
python examples/check.py # every example
python examples/check.py counter # one of themcounter: una aplicación QML diminuta y autocontenida.async-form: un flujo de formulario frontend/backend con un backend falso sobre un socket Unix, una lista de problemas, formularios por perfil con el mismo resultado, estado de ejecución por clave y un flujo de instalación simplificado. Consultaexamples/async-form/README.mdpara ver las tablas de estados y los selectores.
Contribuir
Lanza el dev-shell:
nix develop ~/git/quickshell-mcpMCP_BACKEND_DELAY_MS se pasa a cada backend que genera un perfil. Un backend que lo adopte ralentizará las transiciones asíncronas lo suficiente para que sean observables entre capturas de pantalla.
This server cannot be deployed
Maintenance
Related MCP Connectors
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
remote debug iOS/Android/Unity/Godot/Flutter/RN/Web on real-device.ui-tree/screenshots/taps,tests.
Securely control computers you explicitly pair through files, terminals, processes, screenshots, desktop UI/input, clipboard, browser automation, diagnostics, and document tools.
Control Unreal Engine to browse assets, import content, and manage levels and sequences. Automate…
Related MCP Servers
- FlicenseNot gradedqualityFmaintenanceProvides screenshot, analysis, mouse and keyboard control tools for modern Linux desktops via Wayland.17-
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to automate Linux desktop GUI by launching and interacting with Wayland applications in isolated virtual KWin sessions, or connecting to live desktops for collaborative automation.124 PyPI61MIT
- AlicenseAqualityAmaintenanceMCP server for automating and introspecting native Qt applications (QWidget and QML) without source changes. Enables AI agents to control running Qt apps through UI snapshots, element lookup, and real input simulation.254MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to see, control, and debug PySide6 desktop applications without modifying their source code, by capturing screenshots, inspecting widget trees, performing clicks and typing, reading logs, and running Python inside the app process.2239 PyPI6MIT