Contents

Tools

Every tool LetKite's MCP server offers, with what it does, whether it only reads or can change things, and its parameters. This page is generated from the gateway's code, so it lists exactly what an AI client sees.

Each tool carries the standard MCP annotations:

  • Read-only readOnlyHint: true: changes nothing on a machine or in LetKite.
  • Destructive destructiveHint: true: may change or remove what is there, for example by running a command, writing or deleting a file, stopping a job or typing on a screen.
  • Opens or closes a session neither: adds or removes something reversible, such as a shell session, a log subscription, a tunnel or a web share.

Every tool has openWorldHint: false: tools act only on the machines in your own LetKite account. Whatever a tool's annotations, the permissions and approvals of the connection still apply to every call, and every call is recorded in the audit log.

Most tools take a host: a machine's alias or node ID from list_hosts, never an IP address.

Generated from the gateway's code (letkite/letkite@78168ef, 2026-10-19). 47 tools: 17 read-only, 22 destructive, 8 that open or close a session.

Hosts and commands
list_hostsList hostsRead-only
host_factsHost factsRead-only
fleet_statusGateway statusRead-only
execRun commandDestructive
exec_manyRun command on many hostsDestructive
shell_openOpen shell sessionOpens or closes a session
shell_runRun in shell sessionDestructive
shell_closeClose shell sessionOpens or closes a session
Files and transfers
list_dirList directoryRead-only
read_fileRead fileRead-only
write_fileWrite fileDestructive
delete_pathDelete pathDestructive
copy_between_hostsCopy file between hostsDestructive
transfer_startStart file transferDestructive
transfer_statusTransfer statusRead-only
transfer_cancelCancel transferDestructive
Jobs, logs, tunnels and nodes
job_startStart background jobDestructive
job_statusJob statusRead-only
job_outputRead job outputRead-only
job_killKill jobDestructive
job_purgePurge jobDestructive
log_openOpen log subscriptionOpens or closes a session
log_readRead log linesRead-only
log_closeClose log subscriptionOpens or closes a session
tunnel_openOpen tunnelOpens or closes a session
tunnel_httpHTTP through tunnelDestructive
tunnel_closeClose tunnelOpens or closes a session
wake_nodeWake nodeDestructive
wake_deviceWake LAN deviceDestructive
approval_waitWait for approvalRead-only
audit_tailAudit log tailRead-only
Schedules
schedule_createCreate scheduleDestructive
schedule_listList schedulesRead-only
schedule_deleteDelete scheduleDestructive
schedule_runsSchedule run historyRead-only
Web shares
share_createCreate web shareOpens or closes a session
share_listList web sharesRead-only
share_deleteDelete web shareDestructive
Terminals
terminal_openOpen terminalDestructive
terminal_sendType into terminalDestructive
terminal_readRead terminal outputRead-only
terminal_askAsk person to typeDestructive
terminal_resizeResize terminalOpens or closes a session
terminal_closeClose terminalDestructive
Screen
gui_observeObserve screenRead-only
gui_zoomZoom into screenRead-only
gui_actAct on screenDestructive

Hosts and commands

list_hosts List hosts Read-only

List every host in the fleet: node_id, alias, address, user, tags, scopes, notes.

Entry point for every other tool. Their host argument takes an alias or a node_id, never a bare IP. Aliases may repeat; if one is ambiguous the call fails and lists the candidate node_ids. Read-only.

ParameterTypeRequiredDescription
tagsarray of string (optional)nofilter by tag

host_facts Host facts Read-only

Collect basic facts: distro, kernel, load, memory, disk, current user, containers.

Run this before doing real work on a host so you do not send Debian commands to Alpine, or assume you are root. Read-only: a fixed set of probes that change nothing; needs fleet.read.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts

fleet_status Gateway status Read-only

Show the gateway's own state: SSH pool, shell sessions, log subscriptions, tunnels.

Read-only; lists this connection's handles only; needs fleet.read.

exec Run command Destructive

Run one command on one host and wait for the result.

For work measured in seconds to a couple of minutes. Anything longer (builds, backups, large transfers) belongs in job_start, which survives SSH disconnects. Each call is a fresh process: cd and export do not carry over. Use shell_open when you need that state.

Side effects are whatever the command does. Needs fleet.exec; the connection's command rules and approvals apply (a high-risk command needs confirm=true). Output is capped (32 KB by default) and the timeout clamped (60 s by default, 900 s at most).

Batch several steps into one command rather than making many round trips.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
commandstringyesbash in a login shell on SSH nodes; on agent nodes the node's default shell (PowerShell on Windows) unless shell= says otherwise
cwdstring (optional)noworking directory
envobject of string (optional)noextra environment
timeoutinteger (minimum 1) (optional)noseconds
sudobooleannorun via sudo -n (host must allow it) (default false)
confirmbooleannoconfirm a high-risk command (default false)
shellstring (optional)noagent nodes only: sh, bash, zsh, pwsh, powershell or cmd; the node's default when omitted (host_facts lists them)

exec_many Run command on many hosts Destructive

Run the same command on several hosts concurrently.

Use this for sweeps instead of looping over exec. One host failing does not stop the others. Same side effects and checks as exec on every target: the command rules check every target before any runs, and one approval covers the sweep. At most 8 hosts by default; each host's output is capped at half of exec's.

ParameterTypeRequiredDescription
commandstringyescommand to run on every target
hostsarray of string (optional)noaliases or node_ids
tagsarray of string (optional)noselect by tag instead
timeoutinteger (minimum 1) (optional)no
concurrencyinteger (minimum 1, maximum 32)no (default 5)
confirmbooleannoconfirm a high-risk command (default false)

shell_open Open shell session Opens or closes a session

Open a persistent shell session; cwd, variables and functions persist.

bash on SSH hosts; on agent nodes the node's shell (PowerShell on Windows). For continuous debugging: cd somewhere, source an env, activate a venv, then keep working. Close it with shell_close; idle sessions are reaped after 30 min. Starts a shell process and runs nothing else; needs fleet.exec; at most 4 sessions per host; refused when the command rules are an allowlist.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
cwdstring (optional)noinitial working directory
envobject of string (optional)noinitial environment
shellstring (optional)noagent nodes only: pwsh or powershell on Windows, bash, sh or zsh elsewhere; the node's default when omitted

shell_run Run in shell session Destructive

Run a command in an open session; returns exit code, merged output and cwd.

A command inside a session cannot be interrupted on its own: a timeout destroys the session. Use job_start for long work. Side effects are whatever the command does; needs fleet.exec, and the command rules, approvals and output cap of exec apply.

ParameterTypeRequiredDescription
session_idstringyesid from shell_open
commandstringyescommand to run in that session
timeoutinteger (minimum 1) (optional)no
confirmbooleannoconfirm a high-risk command (default false)

shell_close Close shell session Opens or closes a session

Close a persistent shell session and end its shell process. Needs fleet.exec.

ParameterTypeRequiredDescription
session_idstringyessession to close

Files and transfers

list_dir List directory Read-only

List a remote directory: type, size, mode, mtime. Optionally recursive.

Read-only; needs fleet.read. Recursion goes 4 levels deep at most and the answer holds at most 2000 entries.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
pathstringnoabsolute path, or relative to workdir (default ".")
depthinteger (minimum 1, maximum 4)norecursion depth (default 1)
show_hiddenbooleannoinclude dotfiles (default false)

read_file Read file Read-only

Read a remote file. Text is decoded as UTF-8; set binary=true for base64.

Read-only; needs fleet.read. Returns at most max_bytes per call, never more than the gateway's file limit (4 MB by default); continue from next_offset.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
pathstringyesremote file path
max_bytesinteger (minimum 1)nomax bytes to read (default 200000)
offsetinteger (minimum 0)nobyte offset (default 0)
binarybooleannoreturn base64 for binary files (default false)

write_file Write file Destructive

Write a remote file: create, overwrite or append; parent directories are created.

Overwrites are backed up next to the file (<path>.bak-<time>) unless backup=false. Needs fleet.write and may need a person's approval; content is limited to the gateway's file limit (4 MB by default).

Config edits: read_file, write_file with backup, validate with exec (nginx -t, sshd -t), then reload.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
pathstringyestarget path; parent dirs are created
contentstringyesfile content
appendbooleannoappend instead of overwrite (default false)
base64_contentbooleannocontent is base64-encoded (default false)
modestring (optional)nooctal mode, e.g. '0644'
backupbooleannoback up before overwriting (default true)

delete_path Delete path Destructive

Delete a remote file, or a directory tree with recursive=true.

Irreversible: nothing is backed up. Requires confirm=true and fleet.write, and may need a person's approval; refuses system directories (/, /etc, /usr, /home, ...).

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
pathstringyesabsolute path to delete
recursivebooleannorecurse into directories (default false)
confirmbooleannomust be true to proceed (default false)

copy_between_hosts Copy file between hosts Destructive

Copy a file between two hosts through the gateway.

Replaces the destination file without a backup. Needs fleet.read on the source and fleet.write on the destination; the file must fit the gateway's file limit (4 MB by default). For large files use transfer_start between agent nodes, or exec with rsync/scp directly between the hosts.

ParameterTypeRequiredDescription
src_hoststringyessource host
src_pathstringyessource path
dst_hoststringyesdestination host
dst_pathstringyesdestination path

transfer_start Start file transfer Destructive

Copy a file or a whole directory between two agent nodes, of any size.

Runs in the background through the gateway; returns when done or after wait_s with a transfer_id (follow it with transfer_status). Each file appears at its target only complete and checked (SHA-256); links are skipped. Writes on the destination node and replaces files already there only with overwrite=true. Both nodes' policies apply: read (fleet.read) at the source, write (fleet.write) at the destination. For SSH hosts use copy_between_hosts or rsync with exec.

ParameterTypeRequiredDescription
src_hoststringyessource agent node
src_pathstringyesa file or a directory there
dst_hoststringyesdestination agent node
dst_pathstringyeswhere it goes: the file's new path (a directory that exists, or a path ending in / or \, receives the file inside it), or the directory to copy into
overwritebooleannoreplace files already there (default false)
wait_sinteger (minimum 0, maximum 60)nowait this long for it to finish (default 20)

transfer_status Transfer status Read-only

Show a transfer's progress: files and bytes done, rate, what failed or was skipped.

Read-only; optionally waits up to wait_s for the transfer to finish.

ParameterTypeRequiredDescription
transfer_idstringyesfrom transfer_start
wait_sinteger (minimum 0, maximum 60)nowait this long for it to finish (default 0)

transfer_cancel Cancel transfer Destructive

Stop a transfer. Files already finished stay; the one in progress does not appear.

ParameterTypeRequiredDescription
transfer_idstringyesfrom transfer_start

Jobs, logs, tunnels and nodes

job_start Start background job Destructive

Start a detached job on the node and return a job_id immediately.

The job outlives the SSH connection, the gateway restart and this conversation. stdout/stderr land in ~/.letkite/jobs/<job_id>/ on the node. Use this for builds, backups, bulk transfers, benchmarks. Side effects are whatever the command does; needs fleet.exec, and the command rules and approvals of exec apply.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
commandstringyescommand to run in the background
labelstringnohuman-readable label
cwdstring (optional)noworking directory
envobject of string (optional)noextra environment
confirmbooleannoconfirm a high-risk command (default false)
shellstring (optional)noagent nodes only: sh, bash, zsh, pwsh, powershell or cmd; the node's default when omitted (host_facts lists them)

job_status Job status Read-only

Show a job's state: running / finished / aborted, plus exit code and output sizes.

Omit job_id to list every job on the host. Read-only; needs fleet.read.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
job_idstring (optional)noomit to list all jobs on the host

job_output Read job output Read-only

Read a job's stdout or stderr. Returns next_offset for a gap-free incremental follow-up.

Read-only; needs fleet.read; at most 32 KB per call by default.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
job_idstringyesid from job_start
streamstringnostdout or stderr (default "stdout")
offsetinteger (minimum 0)nobyte offset; pass back next_offset for incremental reads (default 0)
max_bytesinteger (minimum 1)nomax bytes to return (default 64000)
tailbooleannoignore offset, return the tail (default false)

job_kill Kill job Destructive

Send a signal (TERM by default) to the job's whole process group.

Usually ends the job and everything it started. Needs fleet.exec.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
job_idstringyesjob to terminate
signalstringnoTERM / KILL / INT / HUP (default "TERM")

job_purge Purge job Destructive

Delete a finished job's directory and logs. Running jobs are left alone.

Its output cannot be read afterwards. Needs fleet.write.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
job_idstringyesfinished job to purge

log_open Open log subscription Opens or closes a session

Start collecting a log on the gateway; read it later with log_read.

Subscribe first, trigger something with exec, then read what appeared. That ordering is not possible with exec alone. On a Windows agent node a channel gives one line per event: time, level, provider, id and message. Starts a tail (journalctl, logread, an event log reader) on the node and changes nothing else; needs fleet.read. Close it with log_close.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
pathstring (optional)nolog file path (or unit, or channel)
unitstring (optional)nosystemd unit (Linux)
channelstring (optional)noWindows event log on agent nodes: System, Application, Security, or a channel such as Microsoft-Windows-PowerShell/Operational
syslogbooleannothe system log of an agent node without journald: OpenWrt routers (logread) (default false)
grepstring (optional)noline filter, ERE
initial_linesinteger (minimum 0, maximum 500)noinitial history lines (default 50)

log_read Read log lines Read-only

Read new log lines. dropped_lines > 0 means the ring buffer overflowed.

Read-only; needs fleet.read; at most 2000 lines per call.

ParameterTypeRequiredDescription
sub_idstringyesid from log_open
since_seqinteger (minimum 0)nonext_seq from the previous call, 0 to start (default 0)
limitinteger (minimum 1, maximum 2000)nomax lines (default 300)

log_close Close log subscription Opens or closes a session

Close a subscription and kill the remote tail/journalctl.

ParameterTypeRequiredDescription
sub_idstringyessubscription to close

tunnel_open Open tunnel Opens or closes a session

Forward a node-local port to the gateway.

Pair with tunnel_http to reach admin interfaces bound to 127.0.0.1 on the node (Grafana, Prometheus, pprof, database HTTP gateways), or a device on the node's network. On agent nodes the node's ceiling.toml (tunnel_targets) and this connection's policy decide which addresses and ports are reachable; a refusal says so. The gateway listens on its own loopback only and closes the tunnel after 1 hour; needs fleet.admin and may need a person's approval.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
remote_portinteger (minimum 1, maximum 65535)yesremote port
remote_hoststringnotarget address as seen from the node (default "127.0.0.1")

tunnel_http HTTP through tunnel Destructive

Send one HTTP request through an open tunnel; returns status, headers and body.

Any method goes: a POST, PUT or DELETE changes whatever the service behind the tunnel does with it. Needs fleet.admin; the body read back is cut at 32 KB by default.

ParameterTypeRequiredDescription
tunnel_idstringyesid from tunnel_open
pathstringnorequest path (default "/")
methodstringnoHTTP method (default "GET")
headersobject of string (optional)noextra headers
bodystring (optional)norequest body
timeoutinteger (minimum 1, maximum 120)no (default 20)

tunnel_close Close tunnel Opens or closes a session

Close a tunnel; requests through it stop working. Needs fleet.admin.

ParameterTypeRequiredDescription
tunnel_idstringyestunnel to close

wake_node Wake node Destructive

Wake a sleeping agent node with Wake-on-LAN, through another node of the account.

The other node must be online on the same network (same subnet, same public address) and the sleeping machine's network card set to wake on a magic packet. Powers the machine on; needs fleet.exec on it and may need a person's approval.

ParameterTypeRequiredDescription
hoststringyesa sleeping agent node (list_hosts says asleep or offline)
waitinteger (minimum 0, maximum 180)noseconds to wait for it to connect (default 60)

wake_device Wake LAN device Destructive

Wake a machine with no agent (a NAS, a PC) by Wake-on-LAN.

via sends the magic packet to the broadcast address of one of its own networks. Nothing confirms the machine woke: check it after a minute, e.g. exec ping on via. Its card must be set to wake on a magic packet. Needs fleet.exec on via and may need a person's approval.

ParameterTypeRequiredDescription
viastringyesan online agent node on the device's LAN, e.g. the router
macstringyesthe device's hardware address, aa:bb:cc:dd:ee:ff
networkstring (optional)nowhich of via's networks the device is on (192.168.1.0/24, or an address in it); needed when via is on more than one

approval_wait Wait for approval Read-only

Wait for a person to approve or turn down a call that needs approval.

Approved: call the same tool again with exactly the same arguments; the approval is for that call, once. Turned down or expired: do not retry, ask the user instead. Read-only: it only reports the decision.

ParameterTypeRequiredDescription
approval_idstringyesthe id a call said it is waiting for
wait_sinteger (minimum 0, maximum 60)nowait this long at most for a decision (default 40)

audit_tail Audit log tail Read-only

Tail the gateway audit log: who ran what, where, when (newest last).

Read-only; needs fleet.admin; at most 500 records per call. The gateway's own records are all there; the sign-in service's may arrive up to 100 ms late.

ParameterTypeRequiredDescription
limitinteger (minimum 1, maximum 500)nohow many records (default 50)
eventstring (optional)noonly these events: "tool", "agent" (agent.*), "console" ...
hoststring (optional)noonly records about this host

Schedules

schedule_create Create schedule Destructive

Run a command on a node on a schedule, e.g. a backup every night.

Every run starts the command as a detached job, with the same effects as job_start; needs fleet.exec and a plan that includes schedules. Runs under this connection: its policy, command rules and approvals apply at every run (a command that needs a person's approval asks at each run and is skipped if nobody approves). Revoking the connection stops it. Failed and missed runs are emailed to the user. Tell the user what you scheduled and when it next runs.

ParameterTypeRequiredDescription
hoststringyesalias or node_id from list_hosts
namestringyeswhat it is, e.g. nightly backup
cronstringyesfive fields "minute hour day-of-month month day-of-week", e.g. "0 3 * * *" (03:00 every day), "*/15 9-17 * * 1-5", or @daily / @hourly
commandstringyesthe command; it runs as a detached job
tzstringnoIANA time zone of the times, e.g. Asia/Singapore (default "UTC")
shellstring (optional)noagent nodes only: sh, bash, zsh, pwsh, powershell or cmd; the node's default when omitted (host_facts lists them)
timeout_sinteger (minimum 10, maximum 86400)nostop the run after this long (default 3600)
wakebooleannowake the machine first when it sleeps (Wake-on-LAN through a node on its network) (default true)
catch_upbooleannoa run missed while the gateway was down runs late instead of being skipped (default false)
confirmbooleannoconfirm a high-risk command (default false)

schedule_list List schedules Read-only

List the schedules this connection made, with their next and last run.

schedule_delete Delete schedule Destructive

Remove a schedule this connection made; no further runs, a run in progress finishes.

ParameterTypeRequiredDescription
schedule_idstringyesfrom schedule_create or schedule_list

schedule_runs Schedule run history Read-only

List a schedule's recent runs: when, how (woken?), exit code, the end of the output.

Also says why a run failed, was missed or skipped. Read-only.

ParameterTypeRequiredDescription
schedule_idstringyesfrom schedule_create or schedule_list
limitinteger (minimum 1, maximum 50)nomost recent first (default 5)

Web shares

share_create Create web share Opens or closes a session

Publish a web service running on a node at an https address, for this account.

A dev server or an admin page, for the people of this account: they sign in to open it. No ports opened on the node's router. The policy's tunnel_targets and the node's ceiling decide what can be shared; the person who connected you needs the permission shares.create there, and it may need a person's approval. Delete it with share_delete when done; it expires by itself after hours (24 by default, 30 days at most).

ParameterTypeRequiredDescription
hoststringyesalias or node_id of the node the service runs on
portinteger (minimum 1, maximum 65535)yesthe service's port on that node
target_hoststringnothe service's address as the node sees it (default "127.0.0.1")
namestring (optional)nothe address's first label: https://<name>.<share domain>; random when omitted
hoursnumber (maximum 720)nohow long it stays up (default 24)

share_list List web shares Read-only

List the web shares this connection created.

share_delete Delete web share Destructive

Take a web share down: its address stops answering at once.

ParameterTypeRequiredDescription
sharestringyesshare_id or name from share_create

Terminals

terminal_open Open terminal Destructive

Open an interactive terminal (a shell on a pseudo-terminal) on a node.

For programs that need one: prompts that ask, menus, sign-ins (gh auth login), REPLs, top, less. Prefer exec or shell_run for plain commands. Give command= to start one right away. Type with terminal_send, close with terminal_close. Starts a shell, and with command= runs that command at once (command rules and approvals apply as for exec); needs fleet.exec; at most 8 terminals per connection; refused when the command rules are an allowlist.

Each answer has the output since the last call and, when the program looks like it asks something, waiting_for: {kind: choice | confirm | password | device_code | text, prompt, ...} with how to answer.

ParameterTypeRequiredDescription
hoststringyesalias or node_id: an agent node (Linux, macOS, Windows) or an SSH node
colsinteger (minimum 20, maximum 500)nowidth (default 120)
rowsinteger (minimum 5, maximum 200)noheight (default 40)
shellstring (optional)nosh, bash or zsh; pwsh, powershell or cmd on Windows; the node's default when omitted (bash over SSH, PowerShell on Windows)
cwdstring (optional)noworking directory
commandstring (optional)notyped at the prompt once it shows, as terminal_send would (enter included)
untilstring (optional)nowait until this shows up in the output (any case), or regex:<expression>; the call returns once it does, when the terminal ends, when the program stops to ask something else, or after wait_ms (up to 10 minutes); with command
wait_msinteger (minimum 0, maximum 600000)nohow long to wait for the prompt (for the command's output with command) (default 3000)
confirmbooleannoconfirm a high-risk command (default false)

terminal_send Type into terminal Destructive

Type into a terminal and return what it printed since the last call.

Returns once the output stops with the cursor after a prompt (or a menu) on screen, or with until once that text shows up. waiting_for says what the program asks, if it asks. Keystrokes act as typed (enter runs a command, ctrl+c interrupts); typed text passes the command rules and approvals; needs fleet.exec.

ParameterTypeRequiredDescription
terminal_idstringyesfrom terminal_open
textstring (optional)notyped as is; end a command with keys=["enter"] or \r
keysarray of string (optional)nopressed after the text, in order: enter, tab, escape, backspace, up, down, left, right, home, end, pageup, pagedown, delete, f1-f12, ctrl+c, ctrl+d, alt+x
untilstring (optional)nowait until this shows up in the output (any case), or regex:<expression>; the call returns once it does, when the terminal ends, when the program stops to ask something else, or after wait_ms (up to 10 minutes)
wait_msinteger (minimum 0, maximum 600000)nowait this long at most: for the output to stop with a prompt on screen, or for until (default 3000)
confirmbooleannoconfirm a high-risk command (default false)

terminal_read Read terminal output Read-only

Show what a terminal printed since the last call, without typing.

With until, wait for it: a sign-in finishing, a build printing "done". Read-only; needs fleet.read.

ParameterTypeRequiredDescription
terminal_idstringyesfrom terminal_open
untilstring (optional)nowait until this shows up in the output (any case), or regex:<expression>; the call returns once it does, when the terminal ends, when the program stops to ask something else, or after wait_ms (up to 10 minutes)
wait_msinteger (minimum 0, maximum 600000)nowait this long at most for output (for until) (default 0)

terminal_ask Ask person to type Destructive

Hand the program's next answer to the person who connected you.

A password, a passphrase, a one-time code, anything that should not pass through the conversation. They get a notification (phone, email) and type it in the LetKite console; it goes into the terminal followed by enter. You get what the program printed after it and how many characters were typed, never the text (masked if the program shows it). Needs fleet.exec.

Waits for them up to wait_ms, sending progress meanwhile; if they have not answered by then, call terminal_ask again to keep waiting for the same request (it stays open 15 minutes). Tell the user in the conversation that the console is waiting for them.

ParameterTypeRequiredDescription
terminal_idstringyesfrom terminal_open
promptstring (maxLength 300) (optional)nowhat to tell the person, when the program's own prompt does not say it
untilstring (optional)nowait until this shows up in the output (any case), or regex:<expression>; the call returns once it does, when the terminal ends, when the program stops to ask something else, or after wait_ms (up to 10 minutes); after the answer
wait_msinteger (minimum 1000, maximum 600000)nohow long to wait for the person (then for the output) (default 300000)

terminal_resize Resize terminal Opens or closes a session

Change a terminal's size; full-screen programs redraw.

ParameterTypeRequiredDescription
terminal_idstringyesfrom terminal_open
colsinteger (minimum 20, maximum 500)yeswidth
rowsinteger (minimum 5, maximum 200)yesheight

terminal_close Close terminal Destructive

Close a terminal; its shell and what runs in it end. Needs fleet.exec.

ParameterTypeRequiredDescription
terminal_idstringyesfrom terminal_open

Screen

gui_observe Observe screen Read-only

Listed only when the connection's policy turns the screen tools on.

Look at a window on an agent node (Windows), or the whole screen: who and what is on it.

The tree lists elements with short ids (e3) to use in gui_act; prefer it to images, which cost far more context. The first line says whether the desktop is active, locked or taken over at the machine. Read-only: nothing on the desktop changes; needs the connection's gui level observe or act.

ParameterTypeRequiredDescription
hoststringyesalias or node_id of an agent node (list_hosts)
windowstring (optional)nowindow id from a previous gui_observe (w1); default: the focused window
appstring (optional)noor the app whose window to use, as the window list names it
screenbooleannoor the whole screen, every display: a picture only, and only for a connection that may see every app; a point in it works in gui_act on the window there (default false)
modestringnotree: the accessibility tree, cheapest (default); text: OCR words with positions, for canvases and remote desktops; image: a screenshot; marks: both (default "tree")
regionarray of integer (optional)no[x, y, width, height] in screen pixels: only this part
tree_rootstring (optional)noonly this element's subtree, e.g. the next page of a long list
child_offsetinteger (minimum 0)nowith tree_root: from this child on (default 0)
max_nodesinteger (minimum 10, maximum 2000) (optional)noelements at most
include_textbooleannoalso static text elements (default false)
last_image_idstring (optional)noimage id you already have: if nothing changed, no new image is sent
max_long_edgeinteger (minimum 200, maximum 2576) (optional)noimage size limit, pixels

gui_zoom Zoom into screen Read-only

Listed only when the connection's policy turns the screen tools on.

Capture part of a window (or of the screen) at its own resolution, to read small text.

Read-only; same permission as gui_observe.

ParameterTypeRequiredDescription
hoststringyesalias or node_id of an agent node (list_hosts)
regionarray of integeryes[x, y, width, height] in screen pixels
windowstring (optional)nowindow id from a previous gui_observe (w1); default: the focused window
appstring (optional)noor the app whose window to use, as the window list names it
screenbooleannoor the whole screen, every display: a picture only, and only for a connection that may see every app; a point in it works in gui_act on the window there (default false)

gui_act Act on screen Destructive

Listed only when the connection's policy turns the screen tools on.

Click, type and press keys in a window on an agent node, by element ids from gui_observe.

Points in an image gui_observe sent work too. This acts as a person at the machine would: whatever a click or keystroke does (send, delete, close) happens. Needs the connection's gui level act and may need a person's approval.

Batch the steps of one task; waiting happens on the node ({"wait": ..}), so there is no need to observe in between. Returns what changed.

ParameterTypeRequiredDescription
hoststringyesalias or node_id of an agent node (list_hosts)
stepsarray of objectyesrun in order on the node, stopping at the first that fails: {"click": "e3"} (or "double_click", "right_click"; "button", "count", "modifiers"), {"click": {"image": "i2", "x": 40, "y": 12}}, {"type": "text", "into": "e2", "replace": true}, {"key": "ctrl+s", "repeat": 1}, {"scroll": "e4", "dy": 3} (or "until_visible": "e40"), {"drag": "e10", "to": "e20"}, {"set_value": "e2", "value": "x"}, {"focus": "w2"}, {"launch": "app", "args": []}, {"close": "w2"} (or true: the target window; as its close button does), {"wait": {"appears": "e7"}} (or {"role": "dialog", "name": "Save"}; "disappears", "title": "regex", "stable_ms": 500; "timeout_ms")
windowstring (optional)nowindow id from a previous gui_observe (w1); default: the focused window
appstring (optional)noor the app whose window to use, as the window list names it
observestringnowhat to return afterwards: delta (what changed, default), tree, image or none (default "delta")
base_snapshotstring (optional)nothe delta is against this snapshot; default: the latest
timeoutinteger (minimum 1, maximum 300)noseconds for all steps (default 60)