Automazione della GUI desktop¶
local-shell-mcp può osservare e controllare applicazioni desktop native su Linux, Windows e macOS. L'interfaccia pubblica resta volutamente ridotta:
| Strumento | Scopo |
|---|---|
gui_list |
Elenca le finestre delle applicazioni visibili e riporta il backend nativo e le capacità attive. |
gui_state |
Osserva una finestra. Restituisce uno state_id a breve durata, elementi di accessibilità, geometria della finestra e, facoltativamente, uno screenshot MCP nativo. |
gui_action |
Esegue azioni semantiche o basate su coordinate esattamente sull'osservazione indicata. |
Tutti e tre gli strumenti accettano il parametro opzionale machine, quindi lo stesso flusso può operare su un worker desktop connesso.
Osservare, poi agire¶
Inizia con gui_list, seleziona un window_id e poi chiama gui_state. Quando il controllo di destinazione dispone di un elemento di accessibilità, preferisci l'element_id restituito:
gui_list
-> gui_state(window_id)
-> gui_action(window_id, state_id, [{type: "click", element_id: "e17"}])
-> gui_state(window_id)
Usa coordinate x/y relative alla finestra solo quando l'interfaccia non espone un elemento di accessibilità utile, ad esempio una canvas o un controllo disegnato su misura. I limiti degli elementi e gli screenshot restituiti usano lo stesso spazio di pixel logici relativo alla finestra, anche su desktop HiDPI/Retina. Le coordinate grezze esterne alla finestra selezionata vengono rifiutate.
Uno state_id scade dopo 30 secondi ed è monouso. Le azioni a coordinate verificano inoltre che la finestra non sia stata spostata o ridimensionata dopo l'osservazione. Se uno di questi controlli fallisce, richiama gui_state invece di riutilizzare coordinate obsolete.
Le azioni supportate sono click, double_click, right_click, move, scroll, drag, type, key, set_value, focus e wait.
Controllo umano nella Native WebUI¶
La Native WebUI include una pagina Desktop per controllare direttamente gli stessi backend GUI nativi. Scegli una macchina e una finestra, quindi interagisci con l'immagine della finestra tramite clic, doppio clic, clic destro, trascinamento, rotellina, scorciatoie da tastiera o il campo di testo per input IME/CJK.
Questo percorso è volutamente separato dalla semantica di state_id usata dal modello. Ogni frame visualizzato include la geometria osservata della finestra; ogni richiesta di input umano verifica che la finestra conservi esattamente quella geometria prima di iniettare l'input. Se la finestra è stata spostata, ridimensionata o è scomparsa, l'azione viene rifiutata e la WebUI aggiorna l'osservazione. Le coordinate grezze restano limitate alla finestra selezionata.
Le azioni di tastiera e testo mettono esplicitamente a fuoco la finestra nativa selezionata prima dell'iniezione. La WebUI usa un polling leggero di screenshot invece di streaming video VNC/WebRTC; l'RPC remoto gui_human_action è un'operazione interna controller-worker e non uno strumento MCP esposto ai modelli.
Backend nativi¶
| Piattaforma | Accessibilità / controllo semantico | Cattura e input grezzo |
|---|---|---|
| Windows | Microsoft UI Automation | Cattura della finestra e input nativo Windows per mouse e tastiera |
| macOS | Accessibility (AXUIElement) |
screencapture per la finestra selezionata e input Quartz CGEvent |
| Linux | AT-SPI | Input/cattura nativi X11; Wayland usa cattura desktop nativa e XDG Desktop Portal RemoteDesktop/ScreenCast per l'input grezzo |
Quando possibile vengono tentate prima le azioni semantiche. Un pulsante con un'azione nativa di invoke/press può quindi essere attivato senza stimare una coordinata. Le coordinate visive restano il fallback per contenuti non accessibili o disegnati su misura.
Configurazione della piattaforma¶
Windows¶
Esegui LSM nella stessa sessione desktop interattiva delle applicazioni da controllare. L'installazione base di local-shell-mcp resta sicura in ambiente headless e non richiede l'adapter Windows UI Automation; installa l'extra opzionale local-shell-mcp[gui] quando serve il controllo GUI locale su Windows.
macOS¶
Concedi al processo host di LSM:
- Permesso Accessibilità per controllo semantico e input.
- Permesso Registrazione schermo per gli screenshot.
Il pacchetto base non richiede PyObjC. Installa l'extra opzionale local-shell-mcp[gui] quando serve il controllo GUI locale su macOS; le macchine che non usano strumenti GUI non hanno bisogno di questi framework.
Linux¶
La sessione desktop deve esporre AT-SPI. Nei sistemi Debian/Ubuntu i binding di sistema richiesti sono normalmente disponibili con:
Il pacchetto base non richiede gli adapter Python X11 o D-Bus. L'extra opzionale local-shell-mcp[gui] li installa per l'uso GUI locale. I worker remoti rilevano la sessione Linux attiva prima di qualsiasi bootstrap delle dipendenze GUI: X11 richiede solo l'adapter X11, Wayland solo l'adapter D-Bus e i worker headless non installano nessuno dei due. Su Wayland il fallback per puntatore/tastiera usa l'API XDG Desktop Portal RemoteDesktop, quindi il desktop può mostrare una selezione iniziale di permesso/sessione. Sono supportate le implementazioni portal di KDE e GNOME. Gli screenshot della finestra usano il percorso di cattura nativo disponibile e, quando necessario, il portale Screenshot.
I worker LSM spesso partono fuori dall'ambiente di login grafico. Il backend Linux recupera DISPLAY, WAYLAND_DISPLAY, XDG_SESSION_TYPE e le variabili correlate dall'ambiente systemd dell'utente quando non vengono ereditate direttamente.
Desktop remoti¶
Gli strumenti GUI vengono eseguiti sulla macchina selezionata, non sul controller. Il worker remoto deve appartenere all'utente/sessione proprietario del desktop di destinazione. Gli adapter GUI sono caricati in modo lazy e limitati alle chiamate GUI: l'avvio normale del worker e l'uso di shell/file/browser non li installano né importano. Su Linux, un worker headless restituisce GUI non disponibile prima di qualsiasi bootstrap pip GUI; un worker grafico verifica o installa solo l'adapter richiesto dalla sessione X11 o Wayland attiva.
Gli screenshot restituiti da un gui_state remoto vengono trasferiti tramite il percorso di trasferimento file di LSM ed esposti al modello come contenuto immagine MCP nativo; non vengono incorporati nella risposta JSON del worker.