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: wayland-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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides powerful inspection and interaction tools for connected android devices or emulators.11MIT
- FlicenseNot gradedqualityFmaintenanceProvides screenshot, analysis, mouse and keyboard control tools for modern Linux desktops via Wayland.17
- AlicenseNot gradedqualityCmaintenanceEnables 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.39MIT
- AlicenseAqualityCmaintenanceControls any built Tauri app's UI via WebDriver, enabling mouse/keyboard actions, DOM inspection, and screenshots.22MIT
Related MCP Connectors
Eyes and hands on real Windows PCs — observe, click, type via Glasswarp API.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Access Kernel's cloud-based browsers and app actions via MCP (remote HTTP + OAuth).
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/hsjobeki/quickshell-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server