Skip to main content
Glama

Ghost

CI Linux Release License: MIT

Verified control of the whole desktop, for agents and programs, on Windows and Linux. Ghost gives Claude Code, Codex, Cursor, any MCP harness, or a plain script the operating system's own control surface: the apps with no API, the windows, the shell, and the browser you are already logged into - in the background without taking your screen or cursor, with every action proven to have happened.

Like Playwright, but for the native desktop, and built for agents. Ghost does the perceiving, the acting, and the verifying; the model you are already running does any looking that is needed, so there is no vision API key to set.

One MCP surface, two engines: Win32 UI Automation on Windows, AT-SPI2 over D-Bus on Linux. The verbs, the locator tiers and the act-then-verify loop are written once and behave the same on both. Platform support · Linux setup

Why Ghost is different

  • Runs in the background, and that is enforced. An agent can click, type, and use shortcuts inside an app while you keep working in another window - no focus steal, no cursor jump. It posts window messages to real controls and uses UI Automation patterns on windowless ones; most tools can only drive whatever is in the foreground. Since 0.19 this is a policy, not a preference: the focus policy defaults to background. Since 0.20 it is also constructive: anything Ghost starts (an app, a windowed browser) is born on a hidden desktop that has its own input queue and cannot take your foreground, and the ordinary verbs drive it there by window title. A call that truly has no background path fails naming the action instead of quietly taking the screen. Since 0.22 the policy is locked there: no tool call can raise it, so an agent cannot decide on its own to take your mouse. You can, by setting GHOST_FOCUS_LOCK=off in the server's environment. And since 0.23 a window that grabs the foreground on its own - browsers do, on their own accessibility calls - is handed straight back, so your typing keeps going where you are looking. Measured on a real desktop with a person typing throughout: of roughly 490 keystrokes a run, zero to one reached the window the agent was driving. (how)

  • Never your window by accident. The session remembers the last window the agent named or launched and every window-scoped verb targets it by default. The human's foreground window is used only when nothing was ever anchored, and the response says so. Three weeks of real transcripts showed "element not found in the foreground window" as the top failure before this; it was the agent searching the window you had open.

  • Many agents at once. Requests are dispatched in parallel, so a 15-second wait in one tab does not stall an instant query behind it, and a second Ghost process runs its own browser alongside the first without contending for the mouse.

  • Prove it on your machine. ghost verify drives the real MCP server over stdio and audits every claim above against hard timing budgets, exiting non-zero if any of them does not hold on your hardware.

  • Every action is verified. Ghost re-checks the screen (or reads the control's value back) after acting and returns verified / focus_confirmed - never a blind ok:true. Agents fail by acting and not knowing if it worked; Ghost closes that loop.

  • Drives apps with no API. Legacy Win32, WPF, Electron, UWP, vendor portals - the software that has no integration and most needs automating. No CDP, no browser, no app cooperation required.

  • No vision key. The model driving Ghost reads ghost_see (every element with its name, role and on-screen centre) or ghost_screenshot itself. Ghost's own vision tier is optional, exists for callers with no model of their own, and is off until configured.

  • Accessibility-native and deep. Real element discovery through the OS's own accessibility API - UI Automation on Windows, AT-SPI2 on Linux - not pixel-guessing. Elements come back with real names, roles and bounds.

See it in one script: examples/background_agent_demo.py drives an app in the background while the foreground stays yours. Honest comparison vs Playwright-MCP / cua-driver / Computer Use: docs/comparison.md.

Related MCP server: pywinauto-mcp

What people use it for

Vision is the smallest part of it. In a typical session an agent calls Ghost mostly to act, to manage windows and processes, to run commands, and to read state back.

Use

Tools

Typical caller

Driving apps with no API: installers, legacy line-of-business software, vendor portals, WPF and Electron tools

ghost_act, ghost_key, ghost_scroll, ghost_drag

agents, RPA scripts

Window and process control: launch invisibly, focus, minimize, restore, close, recover hidden windows, sweep orphaned browsers

ghost_window, ghost_desktop_*, ghost_stats

agents, ops scripts

A terminal for the agent: builds, git, CLIs, persistent PowerShell state, spawning another Claude Code session

ghost_shell, ghost_run

coding agents on Windows

Driving the browser you are already signed into, through its DevTools port: tabs, navigation, DOM clicks, JS eval, page text

19 ghost_browser_* and ghost_tab_* tools

agents, web automations

Reading data out of apps with no export: accessibility text, tab text, OCR

ghost_see mode=text, ghost_tab_text

agents, reporting scripts

Making "did it work" a machine check: element exists, value equals, wait for idle or text

ghost_assert, ghost_wait

QA agents, CI

Isolated desktops: overnight GUI work and parallel agents that never touch the human's screen

ghost_window op=launch, the focus policy, ghost_desktop_*

autonomous runs

Reproducible multi-step flows with retries and conditions, no model in the loop

intents via ghost run, POST /run, ghost_execute_intent

scheduled jobs

The clipboard as a bridge into apps that resist typing

ghost_clipboard

all of the above

Every row runs under the same guarantees: the action returns verified, the default policy never takes your foreground, and Ctrl+Alt+G stops every Ghost process at once.

What is Ghost?

Ghost is the layer between a model and the desktop. The model reasons; Ghost sees the screen the way the operating system does, acts on real controls without touching your foreground, and reports whether the action took. It gives programmatic control over any desktop application - native Win32, Electron, WPF, UWP, GTK, Qt, or otherwise - to an agent, a script, or a program.

On Windows it uses UI Automation for element discovery, SendInput for keyboard/mouse injection, and DXGI/GDI for screen capture. On Linux it uses AT-SPI2 over D-Bus for discovery and actions, XTEST (X11) or the RemoteDesktop portal / uinput (Wayland) for input, and X11 GetImage or the Screenshot portal for capture. The Linux engine is pure Rust - no -devel packages to install.

Ship it three ways:

  • ghost-mcp server - the primary surface: a Model Context Protocol server for Claude Code, Claude Desktop, Codex, Cursor, and any MCP client (54 tools on Windows)

  • ghost CLI - one-shot commands, great for scripts and CI (ghost click --name "Submit")

  • ghost-http server - local REST API, call it from Python, Node, curl, anything (curl http://127.0.0.1:7878/list-windows)

The MCP surface is 20 desktop verbs, 19 ghost_browser_* / ghost_tab_* tools for driving individual browser tabs in the background (Chrome, Comet, Edge, Brave), and 15 Windows-only tools: the focus policy plus ghost_desktop_* for explicit control of isolated Windows desktops the user never sees. Under the default policy you rarely need the latter: ghost_window op=launch already starts the app on the hidden desktop auto, and ghost_see / ghost_act / ghost_key / ghost_scroll reach it with window=<title> exactly as they reach a window on your own desktop (target.surface in the response tells you which). UIA, window messages and capture work fully there. Real SendInput does not, because Windows refuses it off the input desktop, and typing is proven by reading the control's value back, so a target that drops posted characters returns an error rather than a false success. The desktop verbs and the browser tools build on Linux as well; the focus policy and hidden desktops are Windows-only.

No Claude required. No browser required. No CDP. It drives apps through the OS's own automation and input APIs, so it works with native apps that have no API and no automation hooks of their own - the same reliability whether or not an app was built to be automated.

Platforms

Platform

Status

Engine

Windows

✅ full and verified

ghost-core - Win32 UI Automation, SendInput, posted window messages, DXGI/GDI capture

Linux, X11

✅ functional - verified by live CI tests against a real GTK app

ghost-linux - AT-SPI2 over D-Bus, XTEST input, X11 GetImage capture

Linux, Wayland

⚠️ implemented, NOT verified - no test has run it on hardware

same AT-SPI2 discovery and actions; input and capture go through the RemoteDesktop / Screenshot portals or uinput instead

macOS

🚧 scaffold

Accessibility + CGEvent + ScreenCaptureKit - to be built on a Mac

Wayland deserves the separate row rather than a footnote: it is the default session on current Ubuntu and Fedora, so it is what most Linux users would actually run, and it is the part with no test behind it. The discovery and action layer is shared with X11 and is covered, and it is the layer that matters most here - AT-SPI2 asks the application to do the thing, so there is no pointer to move and no window to raise. What is unverified is the fallback underneath: portal input, portal capture, uinput. If you run Wayland, treat ghost doctor as the first thing to run and expect to file bugs. Reports are welcome and are the fastest way that row changes.

ghost-session and ghost-mcp are shared: the locator tiers, grounding cascade, act-then-verify loop and the 20 core MCP verbs are written once and run on both platforms. Only the engine underneath changes, behind a one-line cfg alias. The browser and tab tools are engine-independent and build for both; the focus policy and isolated desktops are Windows-only and are reported as such rather than faked.

The wedge survives the port. On Windows, driving an app without stealing focus is built on posted window messages. Linux has a cleaner analogue in AT-SPI2 actions: the application performs the operation through its own toolkit, so there is no pointer to move and no window to raise. That layer is the same code under X11 and Wayland; synthetic input is only the fallback beneath it, and the fallback is the part Wayland has not been tested on.

This is tested, not asserted: CI stands up a real desktop (Xvfb + D-Bus + at-spi-bus-launcher), drives a real GTK application, and requires that text written through AT-SPI reads back from the app and that invoking a button actually dismisses the dialog. Wayland portal input and capture are implemented but not yet verified on hardware.

Linux setup, verification checklist and honest limitations: docs/linux-fedora.md. Capability matrix across all three: docs/cross-platform.md.

Ghost is a general-purpose automation tool. Use it on systems you own or are authorized to automate, and in line with the terms of the software you drive.

Install

One-click - MCP Bundle (free). Every release ships ghost-windows-x64.mcpb and ghost-linux-x86_64.mcpb on the Releases page. Open one in a client that supports MCP Bundles (Claude Desktop: Settings -> Extensions -> Install from file) and Ghost is registered, no PATH or config editing, and no API key. Ghost is also listed in the MCP registry as io.github.NORTHTEKDevs/ghost, so registry-aware clients can install it from there. The bundle holds the ghost-mcp server only; the CLI and HTTP server are in the archives below.

Prebuilt binaries (free). Every release ships signed-by-checksum archives for both platforms on the Releases page:

# Linux x86_64
curl -LO https://github.com/NORTHTEKDevs/ghost/releases/latest/download/ghost-linux-x86_64.tar.gz
curl -LO https://github.com/NORTHTEKDevs/ghost/releases/latest/download/ghost-linux-x86_64.tar.gz.sha256
sha256sum -c ghost-linux-x86_64.tar.gz.sha256
tar -xzf ghost-linux-x86_64.tar.gz && ./install.sh

Windows: download ghost-windows-x64.zip from the same page. Verify the checksum, unzip, and add the folder to your PATH. Then run ghost doctor.

Check where a download came from. Every release artifact carries a signed build provenance attestation, so you can prove a file came out of this repository's release workflow and nowhere else, at a named commit:

gh attestation verify ghost-windows-x64.mcpb --repo NORTHTEKDevs/ghost

The binaries are not code-signed yet, so Windows SmartScreen will warn you on first run (click More infoRun anyway). That warning is about publisher identity, which needs a paid certificate tied to a verified legal entity; the attestation above is the stronger statement about origin and costs nothing, but Windows does not read it. The pipeline signs the moment a certificate is configured, from any CA - see docs/code-signing.md, and docs/signing-policy.md for what gets signed, by whom, and what leaves your machine (nothing, unless you configure a vision key). If an antivirus engine quarantines a release, verify the checksum and see docs/antivirus.md for what the binaries do to stay recognisable and how to report a false positive. The kit buys convenience, not capability - everything Ghost can do is in the free source below, and building it yourself takes one command.

Option C - Build from source (free, MIT). Ghost is open source. Compile it yourself:

git clone https://github.com/NORTHTEKDevs/ghost
cd ghost
cargo build --release --bin ghost --bin ghost-http --bin ghost-mcp
# binaries in target/release/

Requirements: Windows 10 build 19041+, or Linux with at-spi2-core (and Rust stable only if building from source).

On Linux:

sudo dnf install at-spi2-core xdg-desktop-portal xdg-desktop-portal-gnome
gsettings set org.gnome.desktop.interface toolkit-accessibility true
./scripts/install.sh          # build, install, register the MCP server, run doctor

No -devel packages are needed - the Linux engine is pure Rust. Full setup and troubleshooting: docs/linux-fedora.md.

Check your machine first:

ghost doctor

Reports PASS/WARN/FAIL and exits 1 if anything is FAIL. Run it before opening an issue - it usually names the problem outright.

  • Windows: build version, interactive desktop, UI Automation, DPI awareness, monitor layout, screen capture, optional vision credentials.

  • Linux: session type (X11/Wayland), AT-SPI bus reachability, whether applications are actually exposing accessible trees, the selected input backend, and screen capture.

Quick Start - coding agents and MCP clients

This is the path Ghost is built for. Nothing to configure and no API key.

Claude Desktop: download ghost-windows-x64.mcpb (or the Linux bundle) from the latest release and open it: Settings -> Extensions -> Install from file.

Claude Code:

claude mcp add ghost --scope user -- C:/path/to/ghost-mcp.exe

Any other MCP client (Codex, Cursor, a custom harness): register the binary as a stdio server.

{
  "mcpServers": {
    "ghost": { "command": "C:/path/to/ghost-mcp.exe" }
  }
}

Ghost is also listed in the MCP registry as io.github.NORTHTEKDevs/ghost for clients that install from there.

The repo's Dockerfile builds a headless image (docker build -t ghost-mcp .) that answers initialize and tools/list with no display; registries and CI use it to introspect the server. A container has no windows to drive, so it is not an install path for real use.

How an agent uses it. The loop is look, act, confirm:

  1. ghost_see window="Invoice Editor" - every element in the window with its name, role, enabled state, and on-screen centre. Text mode extracts the readable text instead, roughly ten times cheaper in tokens than an image.

  2. ghost_act window="Invoice Editor" name="Save" action="click" - Ghost drives the control in the background and returns verified: true only when the screen or the control's value shows the action took.

  3. ghost_screenshot window="Invoice Editor" - pixels, for the moments a layout, a chart, or a canvas needs the model's own eyes.

The model reads step 1 and step 3 and chooses; Ghost never has to guess what a picture means, and no vision key is involved.

Beyond the loop: ghost_shell runs commands and persistent PowerShell sessions, ghost_window launches, lists, focuses, restores and closes windows (on a hidden desktop by default), ghost_assert and ghost_wait turn "did it work" into a check, and the ghost_tab_* tools drive the browser you are already signed into. Most real sessions spend more calls there than on looking.

54 tools on Windows (legacy names stay dispatchable): 20 desktop verbs covering see/snapshot/find/act/keys/scroll/drag/clipboard/screenshot/windows/shell/waits/query/run, 19 ghost_browser_* / ghost_tab_* tools, and 15 Windows-only tools for the focus policy and isolated desktops. Building from source instead of downloading: cargo build -p ghost-mcp --release.

Every tool runs on its own task, so a slow call does not block a fast one, and a second Ghost process can run alongside the first. Once it is mounted, run ghost verify to audit that on your own machine.

Speed. Ghost's own time is small: about 75 ms for a text read, 200 ms for a verified click, 1 ms to list windows. What makes an agent session slow is what happens around the calls, and three habits remove most of it. Name the window once and omit window= afterwards: the anchor follows that window by handle, and a title it used to have still resolves instantly with title_drift in the response. Wait for a condition, not a duration: ghost_wait for=element, for=value, and for=navigate (sets the address bar in the background and returns when the title changes, about 0.4 to 1.4 s where a fixed sleep costs 6) return the moment the thing happened. Batch with ghost_run so one model turn does several steps. scripts/speed-probe.mjs measures all of this against any ghost-mcp binary.

Shell control (ghost_shell)

Ghost drives GUIs and the command line. ghost_shell runs terminal commands and persistent PowerShell sessions - builds, git, CLIs, file edits on hosts without file tools, or launching apps. op=run is a one-shot (powershell/pwsh/cmd); op=open starts a persistent PowerShell whose variables and cwd survive across op=send calls. Output is merged stdout+stderr, tail-capped for the agent's context window; a timed-out command keeps running and is drained with op=read; ghost_stop kills a runaway. op=run with the default powershell is served from a pre-spawned spare process, so a command costs about 85 ms instead of the 230-450 ms a fresh PowerShell start takes (the spare is single-use and replaced immediately; GHOST_SHELL_WARM=off disables it).

Spawn a fresh Claude Code session from the agent: ghost_shell op=run cmd='Start-Process wt -ArgumentList "pwsh","-NoExit","-Command","claude"', then drive the new terminal window with ghost_see / ghost_act / ghost_key.

Security: shell access is powerful. Set GHOST_SHELL=off in the server's env to disable the verb entirely - every op then returns a clear refusal, leaving the GUI automation verbs fully usable.

Quick Start - CLI

# Launch Notepad and type into it
ghost launch notepad.exe
ghost focus-window "Notepad"
ghost type --role edit --text "hello from ghost"

# Keys and hotkeys
ghost press Enter
ghost hotkey --mods Ctrl --key s

# Screenshot
ghost screenshot --out shot.png

# Enumerate windows or UI
ghost list-windows
ghost describe --window "Notepad"

# Click at coords or by name
ghost click-at 500 300
ghost click --name "Save"

# Run a JSON intent (finite-state machine with retries, timeouts, conditions)
ghost run my-flow.json
echo '{"ops":[{"op":"launch","exe":"notepad.exe"}]}' | ghost run -

Everything outputs JSON for easy piping into jq or scripts.

Quick Start - HTTP Server

Start the server:

ghost-http --addr 127.0.0.1:7878

Then from any language:

# Bash / curl
curl http://127.0.0.1:7878/list-windows
curl -X POST http://127.0.0.1:7878/click \
  -H 'content-type: application/json' \
  -d '{"name":"Submit"}'
curl http://127.0.0.1:7878/screenshot -o shot.png
# Python
import requests
requests.post("http://127.0.0.1:7878/launch", json={"exe": "notepad.exe"})
requests.post("http://127.0.0.1:7878/type",
              json={"role": "edit", "text": "hello from python"})
// Node
await fetch("http://127.0.0.1:7878/hotkey", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({ mods: ["Ctrl"], key: "s" }),
});

Endpoints: /health, /tools, /click, /click-at, /type, /press, /hotkey, /screenshot, /launch, /list-windows, /focus-window, /window-state, /describe, /clipboard (GET/POST), /run.

Quick Start - Rust SDK

[dependencies]
ghost-session = { git = "https://github.com/NORTHTEKDevs/ghost" }
use ghost_session::{GhostSession, By, session::Region};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let session = GhostSession::new()?;
    session.launch("notepad.exe").await?;
    let edit = session.find(By::role("edit")).await?;
    edit.type_text("hello world")?;
    let png = session.screenshot(Region::full()).await?;
    std::fs::write("screen.png", png)?;
    Ok(())
}

Reliability Model

Desktop automation driven from an MCP client has a hostile focus environment: between tool calls, the client's own terminal usually retakes OS focus. Ghost is built for that:

  • ghost_act is atomic - find → act → verify via screen delta. One call, no cross-call race. Under the default background policy it drives the control in place and never raises the window; raise the policy and it additionally brings the target's window to the foreground first (AttachThreadInput, confirmed).

  • Every action response is honest: verified (did the screen actually change), focus_confirmed (was the right window foreground), and a warning when either is off - never a blind ok:true. Check verified before re-issuing an action.

  • Nothing is left running. Browsers Ghost launches are in a kill-on-close job object: when the server ends, however it ends, they end with it (dies_with_server on the launch response). At startup the server also sweeps browsers abandoned by earlier servers and reports them in ghost_stats.orphan_sweep.

  • Anchor to a window - ghost_see, ghost_find, ghost_act, ghost_key, ghost_click_at, ghost_scroll, ghost_wait, ghost_assert and ghost_screenshot (unless full=true) all take window (a title substring, resolved across your desktop and Ghost's hidden desktops: exact title beats prefix beats substring, a window that is not minimised wins ties). The match becomes the session anchor: later calls without window target it, never the window the human happens to be using. ghost_window op=focus anchors without raising under the background policy; op=anchor sets, clears or reports it; every response carries target {hwnd, title, surface, source}. A title that matches nothing lists the open windows and returns code -32007.

  • Your own browser, through its own protocol - when a window's process was started with --remote-debugging-port (Comet, Chrome, Edge, Brave), the same anchored verbs route through the DevTools protocol instead of UI Automation: DOM names and aria-labels rather than a sparse tree, selectors that survive re-renders, trusted input events into that renderer, full modifier combos, and focus emulation so pages that check document.hasFocus() still accept typing. Nothing about it can reach your foreground. The response carries route: {browser, port, tab} and coords: viewport; a browser without a port keeps the UI Automation path unchanged. GHOST_CDP_ROUTE=off turns it off. Start Comet or Chrome once with --remote-debugging-port=9333 to get it.

  • Misses name the alternatives - "element not found" is followed by the closest element names in that window, so an agent does not spend a round trip on ghost_see to learn what the app calls the thing.

  • Disambiguate duplicates - index selects the nth match when several elements share a name/role (multiple "Close Tab" buttons); responses carry a matches count.

  • It audits itself - an independent sampler watches the foreground window and the OS's last-input time; any foreground change with no real hardware input behind it is recorded as synthetic, with the tool calls that were in flight. ghost_stats reports the tally, so the headline claim is proven continuously, not once.

  • Read, don't screenshot - ghost_see mode=text extracts a window/page's readable text straight from the accessibility tree: faster and ~10x cheaper in tokens than images.

  • Latency is visible: every response carries ms, and escalated: true flags when a find had to pay a network VLM round trip (local tiers: cache → UIA → OCR are all on-device).

  • Windows never disappear: minimized windows stay in ghost_window list (with state) and op=focus auto-restores them. A window that something hid outright (not visible, not minimized) shows up with op=list include_hidden=true as state: "hidden", and op=state state=restore brings it back without activating it. op=state also reaches windows on Ghost's own hidden desktops, so an app started with op=launch can be closed by name.

  • Stop always works: ghost_stop preempts the in-flight call the moment it arrives (dedicated stdin reader), and Ctrl+Alt+G remains the OS-level kill switch.

Background mode (agent-harness / computer-use)

Agent harnesses (OpenClaw, Hermes/cua-driver, and any MCP client) mount a computer-use tool to let an LLM operate the desktop. Ghost is that tool - and it acts without stealing your focus or moving your cursor, so an agent drives an app while you keep working in another window.

Since 0.19 this is the default and it is enforced. The process-wide focus policy starts at background, and every primitive that could only work by taking the real cursor or foreground window is gated behind it. There is no silent fallback: a call with no background path returns an error naming the action and the route that needs no policy change (launch the app on the hidden desktop, or the browser over CDP).

Since 0.22 the policy is also locked there. A default is only a promise if the agent cannot flip it, and until 0.22 any agent could call ghost_set_focus_policy foreground the moment a background action was refused, which is exactly when a human notices Ghost moving the mouse. Now that call is refused too, with an error that says so. The key is the operator's, not the agent's: set GHOST_FOCUS_LOCK=off in the MCP server's environment (the host config you write) to allow prefer_background and foreground again, and optionally GHOST_FOCUS_POLICY to start there. ghost_focus_policy reports the policy and whether it is locked; the server logs both at start.

// Only if you WANT an agent to be able to drive your real mouse and keyboard:
{ "mcpServers": { "ghost": {
    "command": "ghost-mcp",
    "env": { "GHOST_FOCUS_LOCK": "off", "GHOST_FOCUS_POLICY": "background" }
}}}

What you are agreeing to

Ghost has two settings that decide how much of your computer an agent gets. Installing the bundle shows both as checkboxes; running the binary directly, they are environment variables. The server prints where it stands on both at start-up, so the host's log always answers the question.

Setting

Default

What "on" means

Keep Ghost off your mouse and keyboard (GHOST_FOCUS_LOCK)

on

The agent can never raise the focus policy, so it drives windows in the background and cannot take your cursor. Turn it off only if you want an agent to use your real input.

Allow shell commands (GHOST_SHELL)

on

ghost_shell runs programs with your account's rights, which is how an agent runs builds, git and scripts - and it is why most agents use Ghost. It is full access to the machine. Turn it off and every shell call refuses; windows, screen reading and input still work.

The shell is on by default deliberately. It is the capability, not a bonus, and a tool that quietly ships without the thing people install it for is worse than one that tells you plainly what it can do. If that is more than you want to hand over, the checkbox is right there and the refusal is explicit.

A locked policy still leaves one thing outside Ghost's control: an application can activate its OWN window, and Chromium does exactly that when an agent types into a page or clicks a button through the accessibility API. Nothing outside the browser can stop that call. So since 0.23 Ghost undoes it. The interference audit doubles as a sentinel: it is told the moment any window takes the foreground (a Windows event, about a millisecond) and hands it straight back unless you chose that window yourself - by clicking it or alt-tabbing to it, which it can tell apart from typing because it watches for REAL input, not synthesized input. ghost_session_state reports how often that happened (foreground_handed_back).

How well it works, measured with an independent observer while a person typed into another window for the whole run (scripts/background-desktop-probe.mjs, scripts/interference-watch.ps1):

before 0.23

now

keystrokes delivered to the wrong window

48

1 in six runs of ~493

how soon a stolen foreground is noticed

never

~1 ms

Since 0.23.2 the foreground is watched by event rather than by polling, so the hand-back starts about a millisecond after the window takes it. Six clean runs with a person typing throughout gave 0, 0, 0, 1, 0 and 0 keystrokes into the window Ghost was driving. It is not a guarantee - undoing an activation can never be one - and for a guarantee let Ghost start the app, so the activation never happens at all.

For zero activation rather than a brief one, let Ghost start the app: anything it launches lives on a hidden desktop with its own input queue and cannot take your foreground at all, and a browser it launches is driven over CDP.

// Drive an app while the human keeps working. No flag needed: background is the default.
ghost_window { "op": "launch", "exe": "notepad.exe" }
// -> { "surface": "hidden", "desktop": "auto", "window": { "title": "Notepad", ... }, "target": {...} }
ghost_act { "role": "edit", "action": "type", "text_input": "hello" }   // targets the anchor
// -> { "verified": true, "focus_preserved": true, "cursor_preserved": true, "mode": "hidden" }
ghost_act { "window": "Comet", "name": "Post", "action": "click" }      // a window on YOUR desktop
// -> { "verified": true, "focus_preserved": true, "cursor_preserved": true, "mode": "background" }
  • Launches never surface. Measured on this repo's CI box: Edge and Chrome activate their first window on launch in every launch style (normal, hidden, minimised, from a background parent, placed at -32000,-32000). A window created on your desktop takes your keyboard the moment it exists. So under the background policy Ghost never creates one there: ghost_window op=launch, ghost_run launch steps and ghost_browser_launch mode=windowed start on a hidden desktop with its own input queue, and the window is anchored so the next ghost_see shows it. An independent observer sampling the foreground at 100 ms across a full launch-drive-close run reported zero changes.

  • True background via posted window messages. Real Win32 controls are driven with BM_CLICK / WM_LBUTTONDOWN·UP (click), WM_SETTEXT (type) and WM_MOUSEWHEEL (scroll). These do not activate the window.

  • Windowless controls, without the screen. UWP/WinUI/Chromium/Electron controls have no window handle. Ghost drives them with UI Automation patterns - Invoke for a click, ValuePattern for typing. Chromium answers some of these by activating its own window when Windows lets it (right after you used that browser): measured on Edge, a SetValue on a web input or the address bar, an Invoke on a page button and a posted click all pulled the window forward within ~90 ms. Since 0.21.10 that is undone on the spot: Ghost watches the foreground around every user-desktop verb, and when the target or any window of its process takes it, hands it back to the window you had, in 30 to 50 ms, and reports focus_preserved: false with a focus_guard record saying so. Posted single keys reach the page's focused element and do not activate anything.

  • Shell children never open a terminal. The MCP server has no console, so a shell started plainly has none either, and every console program it ran (node, python, cargo, cmd) got a brand-new Windows Terminal window that took the foreground for the length of the run. ghost_shell now creates its shells with an invisible console; children inherit it and no window ever appears. Measured: nine foreground changes in seven seconds before, zero after, output unchanged.

  • Verified even while occluded. type is confirmed by reading the control's value back; click by a PrintWindow before/after delta that renders a window that isn't visible. Every response carries verified, focus_preserved, cursor_preserved - Ghost never claims a background action it can't confirm.

  • Hidden desktops are the same vocabulary. A window on the hidden desktop is driven with the same window=<title> calls; target.surface: "hidden" is the only difference. Chromium and Electron windows there are driven by posted messages rather than UIA actions (Chromium services Invoke/SetValue on a non-composited desktop only after a ~2 s internal wait; a posted click lands in ~100 ms), and pixel verification is skipped for them because a software render there costs seconds - confirm through ghost_tab_eval or ghost_see. Real SendInput still does not work on a hidden desktop (Windows refuses it off the input desktop), so an app that answers only real hardware input needs the foreground policy on your own desktop.

  • Honest about single-instance apps. Windows 11 Notepad, Explorer, or a browser on its default profile hand a launch to their already-running process, whose windows live on your desktop. Ghost cannot prevent that; it reports surface: "user" with a warning rather than claiming the app is hidden.

Supports click, type, double_click, right_click, hover and scrolling, plus ghost_key for single keys (Enter/Tab/F-keys/char via WM_KEYDOWN/WM_CHAR). The background: true flag is accepted for compatibility; it is the default behaviour.

The clipboard and edit combos work in the background too - Ctrl+C, Ctrl+X, Ctrl+V, Ctrl+Z and Ctrl+A are sent as the semantic messages an app actually implements (WM_COPY, WM_CUT, WM_PASTE, WM_UNDO, EM_SETSEL) rather than as a posted modifier that apps reading GetKeyState would ignore. Combos outside that set are rejected rather than silently dropped, because posting cannot set the modifier state those apps read; use the foreground policy for them.

Vision: your agent is the model

Ghost is eyes and hands, not a brain. When a model drives it over MCP, that model does the looking: ghost_see gives it the window as structured elements with coordinates, ghost_see mode=text gives it the readable text, and ghost_screenshot gives it pixels when the structure is not enough. Claude, GPT, Gemini, and the strong open-weight vision models all read those directly. There is no key to set and nothing to configure, and Ghost never has to interpret an image on the model's behalf.

The optional built-in vision tier exists for callers that have no model of their own - the CLI, the HTTP API, an intent file - and for the convenience of a description target (ghost_find description="the blue Submit button") when you would rather have Ghost resolve it than read the tree yourself. It works with any tool-capable vision model behind an OpenAI-compatible endpoint (OpenAI, Gemini, Groq, NVIDIA, or a local vLLM / Ollama / LM Studio server) or Anthropic. Point GHOST_VISION_BASE_URL and GHOST_VISION_MODEL at the endpoint and set GHOST_VISION_API_KEY (a keyless local server needs only the base URL). Without it, description targets return a clear error naming the alternative; every other tool is unaffected.

Emergency Stop

Press Ctrl+Alt+G at any time to immediately halt every acting call. Read-only queries (ghost_see, ghost_snapshot, ghost_window list) keep answering, so you can still inspect what happened while everything is stopped.

  • All queued actions are cancelled

  • Any held modifier keys (Shift, Ctrl, Alt) are released immediately

  • No stuck keys, no stuck modifier states

  • Session-wide since 0.19. The stop is a named kernel event (Local\ghost-emergency-stop-event), so one press halts every Ghost process in your logon session, not just the one that happened to register the hotkey. ghost_reset resumes service, again for all of them.

Element Locators

session.find(By::name("Save")).await?          // by accessible name (substring)
session.find(By::role("edit")).await?          // by UIA control type
session.find(By::role("button")).await?

From the CLI: ghost click --name "Save" or ghost click --role button.

Intents - Declarative Flows

Write reproducible multi-step flows as JSON. The FSM executor supports retries, timeouts, and JSONLogic conditions for abort_if / retry_if.

{
  "ops": [
    { "op": "launch", "exe": "notepad.exe" },
    { "op": "focus_window", "name": "Notepad" },
    { "op": "type", "role": "edit", "text": "hello" },
    { "op": "hotkey", "mods": ["Ctrl"], "key": "s" }
  ]
}

Run with ghost run flow.json, POST /run, or ghost_execute_intent over MCP.

Architecture

ghost-cli     ghost-http     ghost-mcp     Rust SDK
    \            |            /   |           |
     \           |           /    |           |
      +-----> ghost-session <-----|-----------+   ← safe Rust API
              /           \       |
      ghost-core      ghost-linux |               ← one cfg alias picks the engine
          |                |      |
    Win32 UIA,       AT-SPI2 over |               ← ghost-core: SendInput, DXGI/GDI
    posted msgs      D-Bus, XTEST |               ← ghost-linux: portal / uinput
          |                |      |
      Windows OS        Linux     +-> ghost-browser  ← CDP over the DevTools port,
                                                        engine-independent

Supporting crates: ghost-cache (UIA snapshot + delta), ghost-intent (FSM + JSONLogic executor), ghost-ground (the locator tier cascade), ghost-platform (the capability matrix reported per OS).

The built-in vision tier (Set-of-Marks)

This section describes the optional tier above; an agent driving Ghost over MCP gets the same information from ghost_see and does not need it.

When you locate an element by natural-language description (ghost_find description="the blue submit button", or when a name/text lookup misses and escalates to the VLM), Ghost does not ask the model to guess pixel coordinates - models are unreliable at that (in testing, a plain "give me the coordinates of the equals button" landed ~250px off the target). Instead it uses Set-of-Marks: it overlays numbered badges on the window's detected elements, sends that marked screenshot plus each badge's accessible-name label, and asks the model which number matches. The number maps back to that element's exact rect, so the result is a real on-element coordinate, not a regression guess.

In a live check on Calculator, four descriptions ("the equals button", "the plus button", "the number seven key", "the multiply button") each landed exactly on the correct button - versus ~250px off with coordinate regression.

Honest scope: when detected elements carry accessible names (most apps), the labels do much of the disambiguation; for unlabeled icons the model leans on the badge's visual position/appearance.

Canvas / no-accessibility-tree apps. When the UIA tree is sparse (custom-drawn UIs, remote-desktop surfaces, game canvases), Ghost augments the Set-of-Marks candidates with a built-in CPU classical-CV detector (ghost_ground::cv_detect): edge density → connected components → size/aspect filter, no GPU and no model download. It gives the VLM real boxes to pick from where the accessibility tree has nothing. It is coarser than a trained detector - an optional OmniParser ONNX tier (--features yolo + GHOST_YOLO_MODEL) plugs into the same Set-of-Marks path when a GPU model is available. The CV-marks → VLM-pick end-to-end needs a configured vision key.

Benchmark - task success, not "did the call return ok"

bench/ holds a reproducible end-to-end benchmark: it drives the real ghost-mcp binary through 14 Windows desktop tasks and scores each by re-observing the actual result (does the Calculator display really read 42? is the typed value really present?), never by trusting a tool call's return.

Latest run (see bench/results/latest.md):

14/14 tasks passed (100%), median ~2.7 s per task (full wall-clock incl. app launch) - perception, click/keyboard action+verify, waits, window management (list/minimize/restore), text extraction, disambiguation, flow chaining, clipboard round-trip, structured errors, element screenshots, and value assertions.

And it proves it can fail: --self-test runs deliberately-wrong negative controls (assert the display reads 99 when it reads 42, etc.) and passes only if the harness scores every one as FAIL - so the green run above is a real signal, not a rubber stamp.

Reproduce on any Windows 10/11 machine:

cargo build --release -p ghost-mcp
python bench/run_bench.py             # exit 0 iff every task passed
python bench/run_bench.py --self-test # exit 0 iff the harness caught every planted failure

Reliability soak

bench/soak.py drives many act-then-verify cycles and gates on the signals unit tests can't see: how often verified comes back null/false, focus-loss rate, error rate, whether each action's real effect happened (the display is re-observed, never trusted from the return), and latency percentiles.

Latest (160 acts): PASS - verify-null 0.0, focus-loss 0.0, effect-mismatch 0 (100% correct), p50 85ms / p95 117ms. See bench/results/soak.md.

python bench/soak.py                  # exit 0 iff every reliability threshold holds
python bench/soak.py --cycles 250     # ~1000 acts
python bench/soak.py --self-test      # exit 0 iff the harness flags a planted-wrong effect

We deliberately publish only Ghost's own measured numbers - never invented columns for other tools. bench/README.md gives an honest protocol for comparing against Playwright-MCP / Computer Use / UI-TARS, and explains why a naive same-suite comparison isn't apples-to-apples (Playwright is browser-only; vision agents need an API + VM).

Microbenchmarks

Operation

Measured

Region capture, GDI, any size

~16.5 ms

Region capture, DXGI, 1600x900

~70-83 ms

BGRA→RGBA convert, 400x300 region

~206 µs

JSONLogic eq/var

32.2 ns

Intent compile (3op)

1.49 µs

End-to-end capture measurement (release, crates/ghost-core/tests/capture_latency_probe.rs) corrected the v0.10.0 assumption: the DXGI acquire dominates and hits a cliff on large windows, so region captures (act-verify, screenshots, Set-of-Marks) route through flat ~16.5ms GDI BitBlt in v0.11.0; full-screen still uses DXGI. Run the convert microbench: cargo bench -p ghost-core --bench convert. Older baselines: docs/benches/v030-baseline.md.

Requirements

  • Windows 10 build 19041 or later

  • Linux with at-spi2-core and a desktop session (X11 or Wayland); xdg-desktop-portal-gnome additionally for Wayland input and capture

  • A Chromium-family browser (Chrome, Comet, Edge, or Brave) for the ghost_browser_* / ghost_tab_* tools only; the desktop verbs need none

  • Rust stable (only for building from source)

License

MIT - Copyright 2026 Northtek

Available Tools

39 tools
ghost_actA

Find an element and act on it in one call. Target window = window= (anchored) or the session anchor. Under the default background policy the window is NEVER raised and the cursor never moves: click = UIA Invoke or a posted click, type = ValuePattern / WM_SETTEXT with read-back, and the response reports {verified, focus_preserved, cursor_preserved}. Works on covered windows, Chromium/Electron pages and hidden-desktop apps. If a windowless control's own provider activates its window anyway (Chromium does on SetValue), the foreground is handed straight back to the window the human had and the response carries focus_guard. Identify the element by name|role (description needs vision and a screen-facing window). verified=false = dispatched but nothing visibly changed: ghost_see before retrying. background=true is accepted for compatibility; it is already the default behaviour.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo
nameNo
roleNo
textNo
indexNoAct on the nth match (0-based) when several elements share the name/role. Honoured on every route (background, hidden desktop, CDP, foreground); use ghost_find with the same name/index first to see the matches count
actionYesAction to perform
windowNoTitle substring of the window to act in (anchors it). Omit to use the anchor.
backgroundNoCompatibility flag: background dispatch is already the default. Real Win32 controls get posted messages; windowless (WinUI/Chromium/Electron) controls get UIA Invoke/ValuePattern; double_click/right_click/hover need a windowed control. focus_preserved in the response reports the truth.
text_inputNoText to type when action=type (use this to avoid param collision with text-target)
descriptionNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries behavioral disclosure. It precisely states that the window is never raised, the cursor never moves, which UIA/Win32 mechanisms are used, what response fields are reported, and how focus_guard behaves when a provider steals foreground. This is exemplary transparency for a mutation tool with no annotation safety hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded: the purpose is stated first, followed by behavior, caveats, and retry guidance. Every sentence carries technical value, though the length is considerable and the closing compatibility note about 'background=true' slightly repeats information already given earlier.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with no output schema and no annotations, the description covers a lot: response reporting, visible-change verification, hidden-desktop support, and foreground restoration. It is still missing guidance on the 'mode' parameter and the intended meaning of 'text' versus 'text_input', which an agent would need to select the right arguments confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaningful semantics beyond the schema: name|role identification, window anchoring, background default behavior, and the effect of type/click mechanisms. However, the 'mode' parameter's enumerated values (instant/deliberate/instant_only) and the 'text'/'description' parameters remain unexplained despite only 50% schema coverage, so compensation is strong but incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Find an element and act on it in one call,' making the combined find-and-act behavior immediately clear. It also distinguishes the tool from siblings like ghost_find and ghost_see by emphasizing the one-call action model and the background/covered-window capability.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys when to use ghost_act: when the target window may be covered, hidden, or on a Chromium/Electron desktop page. It also gives an explicit fallback instruction: 'verified=false ... ghost_see before retrying.' It does not enumerate exclusions or contrast directly with ghost_tab_* tools, but the context is clear enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_assertA

Assert a predicate about screen state. Fails (error) if not satisfied. text-present/text-absent: OCR text check. element-exists: element found. value-equals/value-contains: the element's actual value (ValuePattern) equals/contains 'text' - the fill-then-verify check.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoElement name (element-exists|value-*)
roleNoElement role (element-exists|value-*)
textNoText to check (text-present/absent) or expected value (value-equals/contains)
windowNoTitle substring of the window to check (anchors it). Omit to use the anchor. text-present/absent then OCR THAT window by handle, never the foreground.
predicateYes
foregroundNoOnly without a window/anchor: OCR the foreground window (true) or the whole screen

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does meaningfully disclose two critical traits: assertion failure is an error, and text predicates OCR a specific anchored window 'by handle, never the foreground.' The foreground/window fallback rule ('Only without a window/anchor') further clarifies targeting behavior, which is exactly the kind of context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tightly packed sentences, each earning its place: core purpose, failure behavior, predicate taxonomy, and the value-check semantic. The front-loaded failure mode and the compact slash-notation for predicate groups make it dense but highly scannable for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter tool with no annotations and no output schema, the description covers the most important operational gaps: failure semantics, OCR window anchoring, and predicate-to-parameter relationships. Minor omissions remain — the success return value is never stated, and element matching via name/role is left to the schema — but these are secondary for a verification tool whose core contract (pass/fail-with-error) is explicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 83%, so the baseline is 3, but the description adds genuine meaning beyond the schema: it maps each predicate enum value to its semantic ('text-present/text-absent: OCR text check', 'element-exists: element found') and clarifies that value-equals/value-contains compare the element's actual ValuePattern against 'text' as a 'fill-then-verify check.' This clarifies how predicate and text interrelate in a way the schema's per-field descriptions do not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Assert a predicate about screen state') and immediately distinguishes itself from observation siblings like ghost_see/ghost_find/ghost_query by the failure semantics: 'Fails (error) if not satisfied.' The predicate taxonomy (text-present/absent, element-exists, value-equals/contains) fully enumerates the tool's scope, leaving no ambiguity about what it does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Per-predicate usage is implied through the compact labels ('OCR text check', 'element found', 'fill-then-verify check'), which give an agent a sense of when each mode applies. However, there is no explicit guidance on when to choose ghost_assert over sibling verification alternatives such as ghost_see, ghost_find, or ghost_wait, nor any stated exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_browser_attachA

Attach to a browser already running with --remote-debugging-port= (use for the user's own logged-in browser). Ghost never closes a browser it did not start, and drives background tabs without switching the user's active tab.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
portYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and handles it well. It discloses that Ghost never closes a browser it did not start and that it drives background tabs without switching the user's active tab, which are important side-effect guarantees for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight sentences with no wasted words. The core action is front-loaded, the use case is in a parenthetical, and the behavioral caveats are compactly appended.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity attach operation, the description covers the required invocation detail, the target use case, and key behavioral guarantees. It is not a 5 because the optional 'id' parameter remains undocumented and there is no mention of return behavior or failure conditions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description clarifies that 'port' is the value from --remote-debugging-port=<port>, which directly aids invocation. However, the optional 'id' parameter is not explained at all, and schema description coverage is 0%, leaving a meaningful semantic gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Attach') and a precise resource: a browser already running with --remote-debugging-port=<port>. It also names the intended use case ('the user's own logged-in browser'), which clearly distinguishes this tool from launching or closing browsers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly frames when to use the tool: for an already-running remote-debugging browser and for the user's own logged-in browser. It does not explicitly name an alternative tool or list exclusions, so it falls just short of full guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_browser_closeB

Close a browser ghost launched (attached browsers are only disconnected).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral disclosure burden. It does add meaningful nuance by explaining that launched ghosts are closed while attached ones are only disconnected. Yet it omits important behavior such as what happens to the browser process, whether the operation is destructive, and what the effect of omitting the id parameter is.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence with no filler, and the most important distinction is placed in a clear parenthetical. It is appropriately sized for a simple tool with one parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the tool's simple surface, the description is incomplete for reliable invocation: the only parameter is completely unexplained, and the effect of the operation on the browser ghost or attached browser is only partially clarified. A few more details about the expected id and lifecycle behavior would be needed for the tool to be self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema defines a single 'id' property with no description, and schema description coverage is 0%. The description never mentions the parameter or its role, so an agent cannot tell what value to pass, whether it is required in practice, or what omitting it means.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Close') and resource ('a browser ghost launched'), and the parenthetical distinguishes this from attached browsers. This clearly differentiates the tool from attachment-related siblings without needing to open the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'attached browsers are only disconnected' implies this tool should be used only for launched browser ghosts and not attached ones. However, it does not explicitly name an alternative tool or provide a clear decision rule for when to use this versus attach/disconnect flows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_browser_launchA

Launch an isolated browser for background automation. Each id gets its own process, profile, and DevTools port, so concurrent ghost processes never collide. browser= chrome | comet | edge | brave (default: first installed). mode=headless (invisible, default) | windowed (a real browser window, started on a hidden desktop - never on your screen, never takes focus; use it only for sites that behave differently headless). Never launched on your own desktop: a new Chromium window takes the foreground on creation. Tabs are driven individually via ghost_tab_* without focusing the window or moving the cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoHandle for later calls (default: 'default')
modeNo
browserNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it delivers rich behavioral context: per-id process/profile/DevTools isolation, concurrent processes never colliding, windowed mode running on a hidden desktop that never takes focus, and explicit warning that a new Chromium window takes foreground on creation. These are exactly the behavioral traits an agent needs to anticipate side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose first, then isolation guarantees, then parameter defaults, then safety caveats, then interaction model. It is front-loaded with the core action and avoids filler, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no output schema and no annotations, the description covers the key operational concerns: isolation semantics, browser and mode defaults, when windowed mode is appropriate, desktop safety, and how tabs should subsequently be driven. Nothing critical is missing for an agent to invoke and use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%, but the description substantially compensates by explaining the mode enum values ('headless' invisible/default, 'windowed' real window on hidden desktop), listing the browser enum values, and stating the default behavior ('first installed'). It also enriches 'id' by explaining that each id gets its own process, profile, and DevTools port.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Launch') and resource ('isolated browser for background automation'), and clearly distinguishes itself from ghost_browser_attach by emphasizing that each call creates its own process, profile, and DevTools port. The scope is unmistakable and the tool cannot be confused with its siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: headless is the default, windowed should be used 'only for sites that behave differently headless,' and tabs should be driven via ghost_tab_* without focusing the window. However, it does not explicitly name ghost_browser_attach as the alternative when an existing browser should be controlled, leaving that comparison implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_browser_list_installedA

List Chromium-family browsers installed on this machine (chrome, comet, edge, brave).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It clearly indicates this is a read-only listing operation and scopes it to Chromium-family browsers, but it does not mention output format, sorting, paths, or any edge cases around detection, which would be useful for a no-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that immediately identifies the action, resource, and scope. Every phrase earns its place, with the example browsers adding useful specificity without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter discovery tool, the description is nearly complete: it tells the agent what will be listed and the scope of what counts as installed. Since there is no output schema, it could have clarified the exact return shape or data type, but this is a minor omission for such a straightforward operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so there is nothing for the description to compensate for. The baseline score of 4 applies here because the description accurately reflects that the tool requires no inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List'), a clear resource ('Chromium-family browsers installed on this machine'), and gives concrete examples. This distinguishes it from sibling browser tools like ghost_browser_launch and ghost_browser_attach without needing to inspect their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'installed on this machine' implies this tool is used for discovery, likely before launching or attaching to a browser. However, it does not explicitly state when to use it versus alternatives or mention that it should be used before other browser operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_browser_tabsA

List open tabs with target ids, titles, URLs.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the behavioral burden. 'List' clearly signals a read-only operation, and 'open tabs' plus the output fields define what the agent can expect. It does not discuss optional-id behavior or assumptions like an active browser, but for a simple listing tool the core behavior is transparent enough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every part adds information about what the tool lists and what it returns.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For the no-argument call, the description is sufficient: list all open tabs and return their ids, titles, and URLs. However, because there is no output schema, no annotations, and the optional `id` parameter is completely undocumented, the description is not fully complete for an agent that needs to understand all invocation variants.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only a string `id` with no description, and schema description coverage is 0%. The tool description never explains what `id` means or how it affects the listing, so the agent cannot determine whether passing `id` filters, selects, or targets a specific tab. The phrase 'target ids' refers to output fields, not the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'List' against the resource 'open tabs' and enumerates the returned fields: target ids, titles, and URLs. This makes the tool's purpose unambiguous and distinguishes it from single-tab action tools like ghost_tab_find, ghost_tab_describe, and ghost_tab_close.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates this is the tool to call when the agent needs to enumerate open tabs. It provides enough context for the primary use case, though it does not explicitly mention when not to use it or name alternatives such as ghost_tab_find.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_clipboardA

Clipboard access. op=get (default): read text. op=set: write text.

ParametersJSON Schema
NameRequiredDescriptionDefault
opNoget=read, set=write (default get)
textNoText to write (op=set)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral disclosure burden. It discloses the core behavior: get reads clipboard text and set writes text, with get as the default op. It does not detail side effects such as overwriting existing clipboard contents or whether get returns plain text only, but for a simple clipboard tool the disclosure is reasonably adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely compact, using a clear shorthand format and front-loading the key concept. Every word earns its place, and the default op is stated clearly without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two parameters and full schema coverage, the description is largely sufficient. It covers both operations and the default. It does not explicitly state what get returns, though 'read text' implies the clipboard text, and it omits any note about platform limitations, but these are minor for this tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents both parameters with 100% coverage, including the enum values and their meanings. The description adds little beyond restating that op=get reads and op=set writes, with get as default. This matches the baseline for a fully schema-documented tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the resource ('clipboard') and the two supported operations with verbs: 'read text' and 'write text'. It is immediately clear what the tool does and the clipboard domain distinguishes it from all listed sibling tools, which concern tabs, browsing, and other actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the op modes and the default behavior, so an agent knows how to request read versus write. However, it does not explicitly state when to prefer this tool over alternatives or provide exclusion criteria. Usage context is implied rather than fully stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_dragA

Click-hold at a start point, move to an end point, release. Each endpoint may be raw coords (from_x/from_y, to_x/to_y) OR an element (from_name/from_role, to_name/to_role) resolved to its center - e.g. drag a list row onto another, or a slider handle.

ParametersJSON Schema
NameRequiredDescriptionDefault
to_xNo
to_yNo
from_xNo
from_yNo
to_nameNoEnd element name (instead of to_x/y)
to_roleNoEnd element role
from_nameNoStart element name (instead of from_x/y)
from_roleNoStart element role

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the sequence (click-hold, move, release) and the important semantic detail that elements are resolved to their center. It does not cover coordinate system, duration, or failure behavior, but the core mechanics are transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence that front-loads the gesture, immediately explains the two endpoint modes, and provides illustrative examples. Every clause earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a drag tool with 8 optional parameters, no annotations, and no output schema, the description covers the essential semantics: what qualifies as an endpoint and how element endpoints are resolved. Minor gaps remain, such as coordinate space and whether start/end must both be present, but the examples and mode explanation make the tool usable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%, so the description adds meaningful context by explaining that endpoints can be either raw coordinates (from_x/from_y, to_x/to_y) or elements (from_name/from_role, to_name/to_role) resolved to center. This clarifies how the eight optional parameters group together, though it does not specify units or required combinations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action (click-hold, move, release = drag) and clearly identifies the resource (start and end points). It distinguishes this from siblings like ghost_tab_click or ghost_tab_scroll by describing the drag gesture and giving concrete examples.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The tool's usage context is clear: use it when an interaction requires dragging between two endpoints. It provides examples such as dragging a list row onto another or a slider handle. It does not explicitly contrast with alternatives or state when not to use it, but the behavior is distinct enough that the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_findA

Locate an element (name|role|description|text) and return center (always), rect (has_rect=true for UIA/cache hits), source, confidence, name, escalated (true = a network VLM call was paid). Target window = window= (anchored) or the session anchor; else the foreground. Under the default background policy nothing is focused or raised: the lookup is scoped to the window's own UIA subtree, so it works while the window is covered or lives on a hidden desktop.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo'instant' (default): local tiers, auto-escalates to VLM on miss. 'deliberate': VLM from first attempt. 'instant_only': no VLM.
nameNoAccessible name (case-insensitive substring)
roleNoControl type: button, edit, checkbox, list, menu, tab, toolbar
textNoOn-screen text for OCR-based location
indexNoSelect the nth match (0-based) when several elements share the name/role; name+role AND-combine on this path; returns matches count
windowNoTitle substring of the window to search (anchors it). Omit to use the anchor.
descriptionNoNatural-language description for VLM grounding

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, this description carries the full behavioral burden and meets it: it discloses that center is always returned, rect is conditional on UIA/cache hits, escalated signals a paid VLM call, and the default policy never focuses or raises the target window. It also reveals that the lookup works on covered or hidden-desktop windows, which is non-obvious and important.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but each sentence earns its place: return contract, target-window precedence, and background policy. It is front-loaded with the core action and outputs and avoids filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential return fields, scoping, and side-effect-free background behavior for a 7-parameter tool with no output schema. It stops short of fully complete by not stating failure/not-found behavior or making explicit that a locator parameter is expected despite all params being optional.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds a little extra meaning by grouping locator strategies and clarifying the window= anchoring hierarchy, but it does not substantially extend what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and resource: 'Locate an element' using name/role/description/text, and states the return contract. The mention of 'UIA subtree', window anchoring, and hidden desktops clearly separates this from browser/tab-based siblings such as ghost_tab_find.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives useful context about target-window precedence and background behavior, implying it is for non-raising desktop UI lookups. It does not explicitly state when to prefer this over ghost_see, ghost_snapshot, or ghost_tab_find, nor does it list exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_http_getB

HTTP GET. Returns {status, body}.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
headersNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral disclosure burden. It usefully reveals the operation (GET) and the exact return shape, but it does not disclose potential side effects, authentication needs, redirect/timeout behavior, or error handling. This is adequate but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with zero filler. It front-loads the core action and immediately provides the return format, making it efficient for an agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential action and return shape, which is useful given there is no output schema. However, it omits guidance on the headers parameter, usage versus ghost_http_post, and failure/error behavior, leaving noticeable gaps for an agent selecting and invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it adds no meaning to the 'url' and 'headers' parameters. The agent is left to infer from the parameter names that 'url' is the request target and 'headers' is an object of HTTP headers, which is not explicitly confirmed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific operation, 'HTTP GET', and explicitly defines the return contract as '{status, body}'. This clearly distinguishes it from the sibling ghost_http_post and other tab/browser tools without requiring the agent to open the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives. It does not mention that ghost_http_post should be used for POST requests, nor does it provide any context about when an HTTP GET is appropriate or inappropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_http_postC

HTTP POST. Returns {status, body}.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
bodyNo
headersNo
content_typeNo

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It only reveals that an HTTP POST is performed and that a {status, body} object is returned. It does not describe side effects, error behavior, redirect handling, authentication, or security implications of making arbitrary external requests, which is a significant transparency gap for a network tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely compact: two short sentences with no filler words. The core operation is front-loaded, and the return shape is stated efficiently. However, its brevity is partly a consequence of under-specification rather than deliberate compression of rich content, so it earns a 4 rather than a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 4 parameters, no output schema, and no annotations, this description is insufficiently complete. It omits how parameters map to the HTTP request, what the `status` and `body` values look like, and any defaults for `content_type` or encoding. The presence of many sibling tools adds pressure to provide routing context, which is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description provides zero parameter-level information. It does not clarify how `body`, `headers`, `content_type`, or `url` are used, leaving the agent to guess whether the body should be JSON-encoded, how headers are formatted, or what content types are accepted. The description completely fails to compensate for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('HTTP POST') and the resource being acted on (an HTTP endpoint), and it clearly distinguishes itself from the sibling ghost_http_get by naming the HTTP method. However, it could be more explicit that it sends a request to the provided URL and that `url` is the target, so it stops just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool versus alternatives such as ghost_http_get, nor any mention of typical use cases (e.g., submitting form data, calling an API) or exclusions. The verb 'POST' implies a use case but leaves all contextual decision-making to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_keyA

Send a key to a window WITHOUT focusing it. Target = window= (anchored) or the session anchor. Under the default background policy the key is POSTED to the window's focused control: single keys (Enter, Tab, F5, arrows, any character) and the editing shortcuts Ctrl+C/X/V/A/Z (sent as semantic messages). Other modifier combos have no background path and error naming the alternative. For text prefer ghost_act action=type (read-back verified). Hold/release keys='down:Shift' / 'up:Shift' exist only under a foreground policy.

ParametersJSON Schema
NameRequiredDescriptionDefault
keysYesKey spec: 'Enter', 'a', 'Ctrl+C', 'down:Shift', 'up:Shift'
windowNoTitle substring of the window to send to (anchors it). Omit to use the anchor. With no anchor at all the key goes to the human's foreground window and the response says so.
backgroundNoCompatibility flag: background posting is already the default.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description discloses the default background posting behavior, the supported key classes including semantic messages for editing shortcuts, the error for unsupported modifier combos, and the fallback when no anchor/window is set. This covers the agent's key decision points for side effects and limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five dense sentences with zero fluff; the headline behavior is front-loaded, then supported details, then alternatives. Every sentence adds information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a key-sending tool with policy modes and anchoring rules, the description covers default behavior, limitations, alternatives, and fallback. It doesn't describe return values or error format, but the output schema is absent and the behavior around errors is at least mentioned ('error naming the alternative').

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema already covers all three parameters (100%), so baseline is 3. Description adds meaningful nuance: 'window' anchors by title substring and omitting it falls back to session anchor or human foreground window; 'background' is a compatibility flag since posting is already default. This goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Send a key to a window') and a critical differentiator ('WITHOUT focusing it'), and clarifies target resolution via 'window=' or session anchor. Names a sibling (ghost_act) as alternative, so it stands apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly recommends ghost_act action=type for text, warns that other modifier combos have no background path and will error naming the alternative, and states hold/release exist only under foreground policy. This gives the agent clear conditions for selecting this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_queryA

Extract structured data from the screen. Strategy: UIA name-matching first, then a single batched VLM call for any fields still unmatched. Returns extracted object, unmatched list, and vlm_attempted flag.

ParametersJSON Schema
NameRequiredDescriptionDefault
regionNoOptional [left,top,right,bottom] region for VLM screenshot crop
schemaNoJSON Schema (properties map) or array of field names to extract
windowNoScope to window (partial title)

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals the two-stage strategy (UIA name-matching first, then a single batched VLM call) and the exact return fields. It does not mention failure modes, cost, or side effects, but for a read-style extraction tool the disclosed strategy is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three compact sentences with the purpose front-loaded, followed by the extraction strategy and return value summary. Every sentence earns its place and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is no output schema and no annotations, the description usefully explains what the tool returns and how it operates. It is missing a brief explanation of the 'UIA name-matching' approach and edge-case behavior, but for a 3-parameter, zero-required-parameter tool it is largely sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add meaning to the parameters beyond what the schema already says; it only indirectly references the schema fields via 'fields still unmatched.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Extract structured data') and a clear target ('from the screen'), and also names the returned information. It is not a tautology and is more specific than the tool name. It does not explicitly contrast with sibling extraction/vision tools like ghost_see or ghost_find, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: call this when you need structured data from the screen. However, there is no explicit guidance about when not to use it or which sibling tool to prefer for related tasks, such as ghost_see, ghost_snapshot, or ghost_tab_describe.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_resetA

Resume automation after ghost_stop. Clears the stop flag.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It clearly states the core state transition: clearing the stop flag and resuming automation. It omits edge cases such as behavior when no stop flag is set, but for a zero-parameter tool this is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the primary effect and no wasted words. Every sentence contributes meaningful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter state-reset tool with no output schema, the description provides sufficient context: when to use it and what it does. There are no hidden inputs or complex return values an agent would need explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description does not need to document parameter meaning. The baseline score of 4 applies because there is no parameter information to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Resume automation') and a specific resource ('after ghost_stop'), and explicitly mentions clearing the stop flag. This clearly differentiates it from sibling tools like ghost_stop and other ghost_* operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit condition for use: after ghost_stop. It does not list alternatives or exclusions, but the direct pairing with ghost_stop makes the usage context clear enough for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_runA

Execute a declarative step-by-step flow in one round-trip. Each step: {op, ...params}. Op is any lean verb or legacy tool name. Retries each step on failure (max_retries). CHAINING: a param value of "${steps.N.path}" is replaced with a field from step N's result before dispatch - e.g. {op:'find',name:'Save'} then {op:'ghost_click_at', x:'${steps.0.center.x}', y:'${steps.0.center.y}'}. A whole-string ref keeps its type (number stays number). SPEED: name the window once; later steps can omit window= because the anchor follows that window by handle through title changes (a stale title still resolves and the response carries title_drift). Wait with {op:'ghost_wait', for:'element'|'value'|'navigate'} rather than for=ms - a fixed sleep costs its full length on every run.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsNoArray of {op, ...params} steps (direct)
scriptNoYAML or JSON string of steps array (YAML tried first)
json_flowNoJSON-encoded steps array string
max_retriesNo
stop_on_errorNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden, and it does so thoroughly. It discloses retry behavior tied to max_retries, chaining substitution semantics, type preservation, window-following behavior across title changes, stale-title resolution, title_drift in responses, and the cost of fixed sleeps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place. It front-loads the primary purpose, uses clear CHAINING and SPEED sections, and includes a concrete example. No filler or repetition exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex orchestration tool with no annotations and no output schema, the description is exceptionally complete. It covers step semantics, chaining, type behavior, window anchoring, retries, and wait guidance, giving an agent enough context to invoke it correctly and interpret key response behavior like title_drift.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 60%, and the description compensates by explaining the steps format, the meaning of ${steps.N.path} references, and the effect of max_retries. However, it does not add much detail about json_flow, script vs json_flow differences, or stop_on_error behavior beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific operation: executing a declarative step-by-step flow in one round-trip, with each step being an {op, ...params} invocation. This clearly distinguishes it from the many single-step sibling tools by emphasizing orchestration and batching.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly conveys when to use the tool: when multiple steps should run together in one round-trip. It also gives explicit guidance to use ghost_wait with 'for' instead of a fixed sleep. It does not explicitly say 'use a single sibling tool for one action', but the intended usage is strongly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_screenshotA

Capture a screenshot of the window the agent is working in. Target = window= or the session anchor: that window is captured BY HANDLE (works while covered, on a hidden desktop, or via CDP for a routed browser) at max 768px JPEG q=75 (~20-100KB). Only with no anchor does it fall back to the foreground window. Pass name/role to crop to ONE element inside the target, or rect=[l,t,r,b] (great for VLM-in-the-loop checks). full=true: the whole screen at max 1280px JPEG (max_dim=0 = native-res lossless PNG). Always includes size_bytes.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoFull-screen capture (default false)
nameNoCrop to the element with this accessible name
rectNoCrop to [left,top,right,bottom] region
roleNoCrop to the element with this role
windowNoTitle substring of the window to capture (anchors it). Omit to use the anchor.
max_dimNoLongest-edge resize (default 768; 1280 with full=true; 0 = no resize, lossless PNG)
foregroundNoOnly without a window/anchor: crop to the foreground window (default true)
jpeg_qualityNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden — and it delivers richly: captures BY HANDLE (works while covered, on a hidden desktop, or via CDP for a routed browser), default output is max 768px JPEG q=75 (~20-100KB), foreground fallback only when no anchor exists, and 'Always includes size_bytes.' This discloses capture mechanics, output format, size, and return guarantees far beyond the bare schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but purposeful — every clause contributes (targeting, capture mechanism, output format, fallback, crop modes, full-screen mode, PNG mode, size_bytes), and the logical flow from purpose to target to mechanism to options is sound. It is a long single paragraph, but with 8 parameters and zero annotations, the information density is warranted rather than padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Remarkably complete for an 8-param tool with no annotations and no output schema: targeting rules, handle-based capture behavior, output formats, crop modes, and fallbacks are all specified. The one notable gap is the return payload shape — with no output schema, the agent knows only that it 'Always includes size_bytes' but not whether the result is a file path, base64 data, or an object.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 88% (7 of 8 params described), so the baseline is 3. The description adds only marginal value beyond the schema: the VLM-in-the-loop use case for rect, the 'ONE element inside the target' clarifier for name/role, and indirect jpeg_quality context via 'q=75.' No parameter gains substantial new meaning from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb-resource pair ('Capture a screenshot of the window the agent is working in') with concrete scope. The handle-based capture mechanism, element-cropping modes, and full-screen option clearly carve out a distinct niche versus siblings like ghost_tab_screenshot (tab-level capture) and ghost_see/ghost_snapshot (likely vision/analysis), even without naming them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear within-tool routing: when to pass name/role vs rect, when to use full=true, and the exact fallback condition ('Only with no anchor does it fall back to the foreground window'). However, it never names sibling alternatives or states when to choose this over ghost_tab_screenshot, ghost_see, or ghost_snapshot, so cross-tool selection is left largely to inference despite a crowded sibling family.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_scrollA

Scroll. direction: up/down/left/right, amount = notches (default 3). Target = window= (anchored) or the session anchor: under the default background policy the wheel is POSTED to that window (pointer never moves, window never raised; works on covered and hidden-desktop windows). 'Until' mode: until_name/until_role scrolls repeatedly until that element is present, up to max_scrolls; returns found. Coord mode (x/y at the real pointer) needs a foreground policy.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
amountNo
windowNoTitle substring of the window to scroll (anchors it). Omit to use the anchor.
directionYes
until_nameNoScroll until an element with this name is visible
until_roleNoScroll until an element with this role is visible
max_scrollsNoMax scroll steps in 'until' mode

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and delivers detailed context: the wheel is POSTED to the target window, the pointer never moves, the window is never raised, covered and hidden-desktop windows work, and coord mode needs a foreground policy. This is substantial and actionable beyond what the schema provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded, with every clause contributing information about a mode or constraint. It is appropriately sized for an 8-parameter tool, though the semicolon-heavy, run-on middle sentence is harder to parse than a more structured breakdown would be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the absence of an output schema, the description covers target selection, modes, defaults, and background behavior thoroughly. The main gap is that it only specifies the return value for 'until' mode ('returns found') and does not state what a normal scroll returns or how errors/edge cases surface.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning to nearly every parameter despite only 50% schema coverage: amount is in notches with default 3, window anchors the target or falls back to the session anchor, x/y are coordinate-mode values at the real pointer, and until_name/until_role/max_scrolls define the 'until' mode semantics. This meaningfully compensates for the schema's sparse coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly names the action (Scroll) and the target resource (a window via 'window=' or the session anchor), and enumerates directions and modes. It is distinct enough to be understood, but it does not explicitly differentiate itself from sibling tools like ghost_tab_scroll, leaving some sibling comparison to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete context for when each mode applies: background-window scrolling under the default background policy, coord mode requiring a foreground policy, and 'until' mode for repeated scrolling until an element appears. It does not explicitly state when not to use this tool or name alternatives, so the when-not guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_seeA

Describe a window's UI as elements {name, role, rect}. Target = window= (title substring; becomes the session anchor) or the current anchor; with neither, the human's foreground window and the response says so (target.source). Never focuses or raises anything. mode=full (default whenever a window is targeted: scoped walk, works on covered windows and hidden-desktop apps), mode=fast (foreground-only quick path, used only when nothing is targeted), mode=text (READ the visible text - the cheapest way to read content), mode=delta (changed elements since since_seq), mode=marks (DEBUG Set-of-Marks image), mode=selection (selected text of a name/role element). Elements capped at 150 (limit); text at 20000 chars.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNofull=scoped tree (default with a target), fast=foreground quick path, delta=changed only, text=readable text, marks=SoM debug image, selection=selected text of name/role element
nameNoElement name (mode=selection)
roleNoElement role (mode=selection)
limitNoMax elements (default 150) or chars for mode=text (default 20000); 0 = unlimited elements
windowNoTitle substring of the window to describe. Anchors it for later calls. 'foreground' = the human's current window.
since_seqNoPrior snapshot seq for delta mode

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden—and it delivers. It discloses that the tool 'Never focuses or raises anything', how session anchoring works, what happens when neither window nor anchor is provided, coverage of hidden-desktop windows, and hard caps on elements and text.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every clause earns its place: target resolution, no-focus guarantee, per-mode semantics, and limits. It is front-loaded with the core purpose and preserves a clear structure through semicolon-separated mode explanations, making it efficient for a tool with six parameters and multiple modes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description must cover return shape and side-effect behavior itself. It states the element shape, target source reporting, mode-specific outputs like 'SoM debug image' and 'selected text', plus caps for elements and text. This is sufficient for an agent to invoke the tool correctly across all modes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful extras beyond the schema: window= 'becomes the session anchor', mode=full is the default when a window is targeted, fast is only for the foreground quick path, and text is positioned as the cheapest read path. These details improve parameter selection beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource: 'Describe a window's UI as elements {name, role, rect}.' This clearly sets it apart from sibling tab-focused or action-oriented tools, and the target/window semantics solidify what object the tool operates on.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when each mode applies, e.g., 'full (default whenever a window is targeted)', 'fast (foreground-only quick path, used only when nothing is targeted)', and 'text (READ the visible text - the cheapest way to read content)'. It stops short of explicitly contrasting this tool with sibling tools like ghost_find or ghost_tab_describe, but the mode-level usage guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_shellA

Run shell commands and drive persistent shells. THE way to run builds, git, CLIs, scripts, or open apps from a command line, and to edit files on machines with no file tools. op=run (default): one-shot - spawn shell, run 'cmd', return {output, exit_code, timed_out}. shell=bash (default) | sh | zsh | pwsh. op=open: start a persistent bash whose variables/cwd/env survive across commands (returns an 'id'). op=send: run 'cmd' in session 'id' (state persists). op=read: drain the rest of a command that hit its timeout (busy=true). op=list: show sessions. op=kill: end a session. Output is merged stdout+stderr, tail-capped at 24000 chars. Emergency-stop (ghost_stop) kills a runaway command. To START A NEW CLAUDE CODE SESSION: op=run cmd='gnome-terminal -- claude' (or your terminal of choice), then drive the terminal window with ghost_see / ghost_act / ghost_key. Disabled entirely when GHOST_SHELL=off.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoSession id (op=send|read|kill required; op=open optional custom name, else auto s1,s2,...)
opNoOperation (default run)
cmdNoCommand text (op=run|send)
cwdNoWorking directory (op=run|open)
shellNoop=run shell (default bash). Persistent sessions are bash only.
timeout_msNoPer-command timeout, default 30000, max 600000. On timeout op=run kills the process; op=send leaves it running (drain via op=read).

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and meets it: merged stdout+stderr with a 24000-char tail cap, timeout asymmetry (op=run kills the process; op=send leaves it running, drainable via op=read), persistent state across send, and the GHOST_SHELL=off kill switch. Destructive and stateful traits are all surfaced explicitly. No annotation contradiction exists because there are no annotations to contradict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely packed, front-loading the core purpose before the op semantics, output behavior, and escape hatch. Compact notation (op=run, shell=bash) and enumeration avoid redundancy. It could be trimmed slightly, as the Claude Code session workflow is arguably supplementary material, but every section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a stateful six-op tool with no output schema and no annotations, this is remarkably complete: return values, timeout nuances, output caps, session lifecycle, emergency stop, and disable condition are all specified. An agent has enough information to select and invoke the tool correctly without consulting external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, establishing a baseline of 3. The description adds real value beyond the schema for the op parameter, which the schema merely labels 'Operation (default run)': it defines each op's semantics, return shape ({output, exit_code, timed_out} vs an 'id'), and session behavior. The remaining parameters are already well covered by their schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence, 'Run shell commands and drive persistent shells,' names a specific verb and resource, and the op enum breakdown (run/open/send/read/list/kill) makes the scope unmistakable. It also enumerates concrete use cases: builds, git, CLIs, scripts, apps, and file editing. However, it never explicitly differentiates itself from the sibling ghost_run, which by name could be the one-shot variant, so sibling differentiation is implicit rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear when-to-use context: shell work for builds, git, CLIs, scripts, and file editing on machines lacking file tools. It also names follow-on alternatives for terminal driving (ghost_see / ghost_act / ghost_key) and an emergency backstop (ghost_stop). It stops short of explicit when-not-to-use exclusions, such as preferring ghost_http_get for network calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_snapshotA

Structured, agent-planning view of a window's UI: every element with a stable id, name, role, rect, center, enabled flag, actionable flag, and the actions it accepts (click/type). actionable = interactable role AND currently enabled - so a greyed-out button reads actionable:false. Far cheaper than a screenshot to reason over; plan here, then ghost_act by name/role. Params: window? (title substring; omitted = foreground), actionable_only? (only enabled interactable elements), limit?.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax elements (default 150; 0 = unlimited)
windowNoWindow title substring; omitted = foreground window (faster)
actionable_onlyNoReturn only interactable elements (buttons/edits/links/...) - cuts noise for planning

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral disclosure burden. It does so well: it enumerates what is returned, defines the actionable flag precisely with the greyed-out button example, and signals a non-mutating, read-oriented operation through 'view' and 'planning view.'

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences deliver purpose, behavioral semantics, workflow guidance, and parameter summaries without wasted words. The key purpose is front-loaded, and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only inspection tool with three optional parameters and no output schema, the description covers what is returned, how actionable is computed, default window behavior, and the intended planning-then-acting workflow. No material information needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value by explicitly adding 'enabled' to actionable_only's meaning beyond the schema's 'interactable' phrasing, and by tying it to noise reduction for planning. It adds little for limit beyond the schema, so it earns a 4 rather than 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it produces a structured, agent-planning view of a window's UI, listing concrete element fields and accepted actions. It also distinguishes itself from screenshots and from ghost_act by framing the tool as the 'plan here' step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to use this tool: reason over the UI cheaply before acting, then act via ghost_act by name/role. It also contrasts itself with screenshots on cost, which is a clear selection signal among the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_statsA

Grounding + cache telemetry for debugging flow speed/reliability: which tier is winning (cache/UIA/OCR/VLM), VLM escalation rate, cache hit/miss counts, UIA-mirror stats. Call when a flow is slow or a find is unreliable.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of explaining behavior. It does so by describing that this is telemetry for debugging, listing the metrics returned, and implying a non-mutating read-only role. It stops short of explicitly stating 'no state changes' or describing the output format, but those are not hidden given the tool's zero-parameter stats nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences carry all the needed information: what the tool reports, which metrics are included, and when to call it. The description is front-loaded with the core purpose and contains no filler or repeated schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only telemetry tool, the description is nearly complete: it names the resource, metrics, and call triggers. There is no output schema, so a sentence about the return shape would fully close the last gap, but the description's explicit metric list leaves little ambiguity for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the empty input schema already exhaustively describes the parameter surface. The description adds no parameter detail, but none is needed; with 0 params this is the baseline 4 case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a concrete diagnostic resource — grounding and cache telemetry — and enumerates the specific metrics it exposes (which tier is winning, VLM escalation rate, cache hit/miss counts, UIA-mirror stats). This clearly distinguishes ghost_stats from the action-oriented sibling tools (ghost_tab_click, ghost_act, etc.), so an agent can tell what it is for without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit trigger conditions: 'Call when a flow is slow or a find is unreliable.' This is strong usage guidance for a diagnostic tool. It does not mention alternatives or exclusions, but among the siblings there is no other stats/telemetry tool, so the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_stopA

Emergency stop: halt all automation and release held modifier keys.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description carries the full behavioral disclosure burden. It transparently states both the main effect (halting all automation) and an important side effect (releasing held modifier keys). It could mention whether the browser or session is left open, but for an emergency-stop command the description is substantially transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. The 'Emergency stop' label is immediately actionable, and both behavior components are stated with minimal words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool, the description covers what it does, when it is used, and what effect to expect. It does not explicitly distinguish itself from ghost_reset, but the emergency framing plus the modifier-key release detail make the tool's role clear enough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema provides no parameter documentation burden. The description correctly focuses on behavior rather than explaining nonexistent inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('stop'), a clear resource ('all automation'), and a concrete side effect ('release held modifier keys'). It is immediately distinguishable from siblings like ghost_wait or ghost_reset because it is framed as an emergency halt rather than a pause or reset.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Emergency stop' label explicitly establishes when this tool should be used: when automation must be halted immediately. It does not name alternatives or explicitly say when not to use it, but the emergency framing supplies sufficient usage context for a zero-parameter stop tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_clickA

Click an element by CSS selector via a trusted synthetic mouse event inside the tab's renderer. ~1-2ms; no cursor movement; works in a tab that is not in front.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabYes
browserNo
selectorYes
timeout_msNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does reveal meaningful traits: ~1-2ms execution, no cursor movement, trusted synthetic event, and background-tab capability. It does not disclose timeout behavior, side effects such as triggering navigation, or failure behavior when the selector is absent or non-clickable, leaving a notable transparency gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence with the action front-loaded. The performance and capability details ('~1-2ms; no cursor movement; works in a tab that is not in front') are packaged efficiently with no filler. Every clause contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tab-click action, the description covers the core invocation facts: target tab, CSS selector, synthetic trusted event, and background-tab support. However, with no annotations, no output schema, and 0% schema coverage, the missing timeout semantics, error behavior, and lack of alternative routing leave clear gaps. It is adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must compensate. It adds meaning to selector ('CSS selector') and partly to tab ('inside the tab's renderer'), but leaves browser and timeout_ms semantically unexplained. While timeout_ms is somewhat self-explanatory by name, its exact behavior is not described, so the description only partially compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Click an element by CSS selector' inside the tab's renderer. It adds distinguishing mechanism details ('trusted synthetic mouse event', 'no cursor movement', 'works in a tab that is not in front') that separate it from generic click or act tools. This is clear and sibling-differentiating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides useful contextual signals, such as the click being synthetic, fast, and working in background tabs, which implies when it should be used. However, it never names alternatives or states exclusions, so an agent must infer when to prefer ghost_tab_click over ghost_act, ghost_tab_eval, or ghost_tab_press. Usage guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_closeB

Close a tab by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabYes
browserNo

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the action without noting that closing is irreversible, what happens to unsaved state, or whether confirmation is needed. The tool name and verb imply destruction, but the description does not make behavioral consequences explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler. It immediately conveys the operation and target. While terse, every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, no annotations, and zero schema description coverage, this description is too thin. It fails to explain the optional browser parameter, any side effects, or how this interacts with the tab lifecycle. An agent would likely need to infer or probe behavior to use it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for both parameters. It clarifies that the tab is referenced 'by id,' which maps to the required 'tab' parameter, but it does not mention the optional 'browser' parameter at all. This leaves the agent without semantic guidance for half of the input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Close a tab by id.' This clearly distinguishes it from sibling operations like ghost_tab_open, ghost_tab_navigate, and ghost_tab_click. The scope is unambiguous for an agent selecting among many tab-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, such as ghost_browser_close for closing an entire browser or ghost_reset for broader cleanup. There are no stated exclusions, prerequisites, or context cues. An agent must infer usage entirely from the tool name and sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_describeB

Structured list of visible interactive elements with selectors and coordinates. Prefer this over screenshots for deciding what to click.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabYes
limitNo
browserNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the behavioral disclosure burden. It discloses that the output is a structured list containing visible interactive elements, selectors, and coordinates. It does not mention side-effect safety, failure modes, or whether results are bounded by the limit parameter, but the read-only inspection nature is reasonably implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler. The output definition is front-loaded, followed immediately by practical usage guidance. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has three parameters and no output schema, so the description needs to clarify required tab semantics and optional limit/browser behavior; it does neither. The return value is described, but the input side is too underspecified for confident invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description adds nothing about the tab, limit, or browser parameters. An agent must guess what tab identifies and what limit caps. There is no parameter-level guidance in the description to compensate for the empty schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a structured list of visible interactive elements with selectors and coordinates. It gives the tool a specific role: helping the agent decide what to click. It distinguishes itself from screenshot-based tools, though not from nearby tools like ghost_tab_find.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to prefer this tool over screenshots when deciding what to click. This is a direct when-to-use statement with a named alternative. It does not cover when screenshots would be better, but the core usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_evalB

Evaluate a JavaScript expression in the tab and return its value (awaits promises).

ParametersJSON Schema
NameRequiredDescriptionDefault
tabYes
browserNo
expressionYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description does add one useful behavioral trait: it awaits promises before returning the value. However, there are no annotations, so the description carries the full burden, and it does not disclose potential side effects of executing arbitrary JavaScript, error behavior, serialization limits, or security implications. This is a significant gap for a code-execution tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one tight sentence with no filler. It front-loads the core action and then adds the important promise-awaiting detail parenthetically. Every word contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool that evaluates arbitrary JavaScript, the description is too thin. With no output schema, no annotations, and 0% parameter coverage, the agent is left without guidance on return value formats, exception handling, side effects, or parameter semantics. The promise handling is helpful but not enough for safe and correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description only gives meaning to 'expression' (it is a JavaScript expression). The 'tab' and 'browser' parameters are left unexplained—no guidance on their formats, how to identify a tab, or whether browser is optional. The description does not compensate for the lack of parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Evaluate'), resource ('a JavaScript expression in the tab'), and outcome ('return its value'). This clearly distinguishes it from sibling tab tools like ghost_tab_navigate or ghost_tab_click, which do different operations. No ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used when you need to run JavaScript inside a tab and get a result, but it does not explicitly state when to prefer this over alternatives such as ghost_query, ghost_run, or ghost_tab_describe. No exclusions or alternative-routing guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_findA

Find a tab whose URL or title contains a substring.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
browserNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description must carry behavioral disclosure. 'Find' implies read-only, non-navigating behavior, and the substring criterion is stated. However, it does not mention what is returned on success or failure, whether matching is case-insensitive, or whether search is scoped to a specific browser.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single 12-word sentence, immediately front-loaded with the verb and resource. Every word earns its place and there are no redundant phrases.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with no annotations and no output schema, the description is incomplete: it omits the browser parameter's role and the return value or behavior when no tab matches. An agent can invoke it, but may guess at the optional parameter and result format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description needed to document both parameters. It defines query as a substring for URL or title, but the optional browser parameter is left entirely unexplained; an agent cannot tell what values it accepts or what it selects.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Find'), a concrete resource ('a tab'), and a precise criterion ('URL or title contains a substring'). This clearly distinguishes it from page-oriented siblings like ghost_find and from navigation/action tab tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Use is implied: call it whenever a tab must be located by URL or title substring. There is no explicit guidance contrasting it with ghost_browser_tabs for listing tabs or ghost_find for page-level search, but the purpose statement gives enough context for basic selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_navigateB

Navigate a tab and wait for load. Runs in a background tab; the user's view never changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabYes
urlYes
browserNo
timeout_msNo

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral disclosure burden. It meaningfully reveals that navigation happens in a background tab, does not change the user's view, and waits for load. It does not cover failure handling or timeout behavior, but the disclosed traits are significant and not inferable from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler. The core action is front-loaded, and the second sentence adds critical behavioral context without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with four parameters, no parameter descriptions, no annotations, and no output schema, the description is too thin. It omits timeout semantics, return behavior, failure conditions, and how it relates to sibling tab tools, leaving an agent to guess important invocation details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only implies the roles of 'tab' and 'url' through the verb 'Navigate', and says nothing about 'browser' or 'timeout_ms'. The meaning of timeout and the permissible URL format are left undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Navigate'), a resource ('a tab'), and a behavioral outcome ('wait for load'). It is clear and distinct from scroll/click/type siblings, though it does not explicitly distinguish itself from ghost_tab_open or ghost_act.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Runs in a background tab; the user's view never changes' gives useful context, but there is no explicit guidance about when to choose this tool over alternatives such as ghost_tab_open, ghost_act, or ghost_tab_find. No exclusions or recommended conditions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_openA

Open a new background tab (never brings the tab or window to the front). Returns its id for the other ghost_tab_* tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
browserNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It openly states the key side effect (never focuses the tab/window) and the return contract (id for sibling tools). However, it omits prerequisites, such as whether a browser must already be launched, error behavior, or permissions, which would be valuable for a tool of this type.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that delivers the core behavior, the negative guarantee, and the output contract. Every clause earns its place; no redundant or filler wording exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two undocumented parameters, no annotations, and no output schema, the description is incomplete. It explains the purpose and return value but leaves the 'browser' parameter undefined and does not clarify preconditions (e.g., an already launched browser) or what happens if the tab cannot be opened. This is a gap an agent must resolve before invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage and the tool description does not explain either parameter. 'url' is implicitly the address to open, but 'browser' is entirely unexplained, and with 0 required parameters it is unclear what values are allowed or whether either parameter is optional. The description adds no semantic meaning beyond the parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description precisely states the action ('Open a new background tab') and adds a critical constraint, 'never brings the tab or window to the front', which distinguishes it from navigation or foreground tab operations. It also names the resource (tab) and the output (the tab's id), making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the usage context clear: this is for creating a new tab that stays in the background, and the returned id is meant for other ghost_tab_* tools. It does not explicitly name when-not-to-use or alternatives like ghost_tab_navigate, but the context is specific enough that an agent can select this tool for background tab creation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_pressB

Send a key (Enter, Tab, ArrowDown, a, ...) to the tab's focused element. modifiers: Alt/Ctrl/Meta/Shift.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
tabYes
browserNo
modifiersNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It does disclose that the key is sent to the focused element and that modifiers are limited to Alt/Ctrl/Meta/Shift, which is useful. It does not explain what happens if no element is focused, whether the press also triggers default browser actions, or what the tool returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler; the core action and examples come first, and modifiers are added as a compact second clause. Every phrase contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite its concise clarity, this is not enough for a 4-parameter tool with no schema descriptions, no output schema, and no annotations. The agent is left guessing about the required tab identifier and optional browser value, as well as the return/error behavior, so the definition is not self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero descriptions, so the tool description must explain parameters. It provides semantic detail for key (with examples) and modifiers (allowed values), but leaves tab and browser underspecified—an agent still has to infer how to identify a tab or choose a browser instance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the action as 'Send a key' to 'the tab's focused element,' which clearly identifies a keyboard-press operation scoped to a tab. The examples of possible keys and modifiers help an agent distinguish it from text-typing or clicking siblings like ghost_tab_type and ghost_tab_click, though it does not explicitly name those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: use this tool when a single key press needs to be delivered to the element currently focused in a tab. However, it offers no explicit guidance on when not to use it or which sibling tool is preferred for related actions such as typing text, clicking, or scrolling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_screenshotA

PNG of a tab, rendered by that tab regardless of whether it is in front or focused.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabYes
browserNo
full_pageNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It usefully discloses that the screenshot is rendered by the tab itself and does not require the tab to be in front or focused, addressing the most likely behavioral surprise. It also specifies PNG output, though it does not discuss side effects or whether the tab must already be loaded.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence that front-loads the core purpose ('PNG of a tab') and then adds the distinguishing behavioral caveat. Every word contributes meaning; there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is relatively simple, but the complete absence of parameter descriptions, combined with no output schema and no annotations, leaves notable gaps. The description adequately conveys the main operation but does not fully equip an agent to correctly set optional parameters or handle the return value beyond knowing it is a PNG.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the undocumented parameters. It clarifies that 'tab' is the target of the screenshot, but it gives no meaning for 'browser' or 'full_page', leaving an agent to guess whether full_page captures the entire scrollable page and whether browser selects a specific browser instance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool produces a PNG of a specific tab, and the key qualifier 'regardless of whether it is in front or focused' distinguishes it from general screenshot tools like ghost_screenshot. It identifies the resource (tab), the output format (PNG), and a defining behavioral characteristic in a single focused sentence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: when you need a tab's visual rendering even if it is not foreground or focused. However, it does not explicitly name alternatives such as ghost_screenshot or ghost_snapshot, nor does it state when those should be preferred instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_scrollC

Scroll a tab or a scrollable element inside it.

ParametersJSON Schema
NameRequiredDescriptionDefault
dxNo
dyNo
tabYes
browserNo
selectorNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden of behavioral disclosure, but it only restates the core action. It does not say whether scrolling is instant or animated, whether it waits for scroll completion, what happens if no scrollable element is found, or what the tool returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. It is concise and easy to parse, though it is too sparse to stand alone as a full behavioral specification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given five parameters, no output schema, and no annotations, the description is not complete enough for reliable invocation. It lacks information about scroll semantics, parameter behavior, return values, and edge cases, which an agent would need for correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, and the tool description does little to clarify the parameters. 'tab' and 'selector' are vaguely implied by 'a tab or a scrollable element inside it', but dx, dy, and browser are completely unexplained, leaving the agent to guess their meaning and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Scroll') and identifies the resource: a tab or a scrollable element inside it. It is clear about the intended scope and is distinguishable from the sibling ghost_scroll by the tab-based targeting, though it does not explicitly name any alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives such as ghost_scroll or other tab-scoped tools. There is no mention of when to target the tab versus supplying a selector, nor any exclusion criteria or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_select_optionB

Choose an option in a , firing the input/change events a real choice fires.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabYes
valueYes
browserNo
selectorYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it does disclose the single most important behavioral trait — that input/change events fire exactly as with a real choice. However, it is silent on failure modes (invalid/missing option value, disabled or hidden select), prerequisites, and whether the operation mutates page state irreversibly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single 16-word sentence that front-loads the core action ('Choose an option in a <select>') and appends the essential behavioral caveat about event firing. There is no filler; every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero annotations, no output schema, and 0% schema parameter coverage, the definition is under-specified for a tool with four parameters and three required ones. An agent cannot recover what value refers to structurally (option value attribute vs. label), what selector format is expected, or how failures surface — none of that is available in any other field.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It implicitly tells an agent that selector targets a <select> element and value is the option to choose, but tab and browser receive no semantic explanation at all. With a 4-parameter tool, this partial compensation leaves real gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource — 'Choose an option in a <select>' — and adds the decisive detail that it 'fir[es] the input/change events a real choice fires.' This makes the operation concrete and implicitly separates it from generic interaction siblings like ghost_tab_click or ghost_act, though it never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied: reach for this tool when you need to simulate a real user choice on a <select>, including its event side effects, rather than a bare click or key press. No explicit when-to-use or when-not-to-use guidance is given, and no sibling is called out among the many interaction tools available.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_textA

Visible text of an element, or the whole page when selector is omitted. Prefer over screenshots for reading content.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabYes
browserNo
selectorNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It transparently states that only visible text is returned and that omitting the selector causes the whole page to be used. The 'reading content' wording implies a read-only operation, though it does not explicitly mention edge cases like missing selectors or empty text.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. It states the core behavior, the selector fallback, and a usage preference in a compact form.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity of the tool and the explicit statement about return content and selector behavior, the description is mostly complete. It lacks explicit return-format details and edge-case behavior, but the absence of an output schema is partly mitigated by the clear statement that visible text is returned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for parameter meaning. It usefully explains the selector parameter and its omission behavior, but it does not explain the 'tab' or 'browser' parameters beyond their names, leaving some ambiguity for the agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies what the tool returns: visible text of an element or the whole page when selector is omitted. It also distinguishes the tool from screenshots for content reading, though it does not explicitly differentiate it from sibling text/describe tools like ghost_tab_describe.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Prefer over screenshots for reading content' gives clear guidance on when to use this tool instead of an alternative. It does not explicitly state exclusions or when to prefer other tab tools, but the context is clear enough for typical text-extraction scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_typeB

Focus an element by CSS selector and type into it. Layout-independent; does not touch the user's keyboard.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabYes
textYes
clearNoClear the field first (default true)
browserNo
selectorYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the behavioral burden. It does disclose non-obvious traits: the action is layout-independent and does not touch the user's keyboard. However, it says nothing about the default clearing behavior, whether the field value is replaced or appended, visibility requirements, or failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence that front-loads the core action and adds only high-value differentiators. Every word earns its place; there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with five parameters, no annotations, and no output schema, the description is too thin. It lacks parameter semantics, default behavior for 'clear', browser/tab context, and guidance on selecting this tool from its many siblings. An agent would need to inspect the schema and infer too much.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 20%, and the description only clarifies 'selector' by mentioning CSS selector. It does not explain the meaning or format of 'tab', 'text', or 'browser', though some are inferable from names. The description fails to compensate for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Focus an element by CSS selector and type into it'), naming both the resource and the operation. It adds useful differentiators ('Layout-independent; does not touch the user's keyboard') that separate it from keyboard-level siblings, though it does not name any sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when element-focused, layout-independent typing is needed without affecting the user's keyboard, but it does not explicitly state when to choose this tool over alternatives like ghost_key, ghost_tab_press, or ghost_tab_text. There is no when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_tab_wait_forC

Wait until a CSS selector matches an element in the tab.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabYes
browserNo
selectorYes
timeout_msNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description bears the full burden of explaining behavior. It states that the tool waits until a selector matches an element, but it does not disclose timeout behavior, what happens when the selector never matches, whether the element must be visible, or whether the tool returns a result or fails. This is a significant gap for a wait operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the core action and target. It avoids fluff, but it may be slightly too terse given the lack of annotations and the presence of several parameters that need explanation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has four parameters, no output schema, and no annotations, yet the description only covers the basic waiting condition. It does not explain return values, failure modes, default timeout behavior, or how the tab and browser parameters relate. The description is not sufficient for an agent to confidently invoke this tool in varied situations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for explaining parameters. It adds meaning for 'selector' by clarifying it is a CSS selector and for the general waiting behavior, but it does not explain the 'tab' identifier, the optional 'browser' parameter, or the unit/default behavior of 'timeout_ms'. The description only partially compensates for the missing schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies a specific action (wait) and resource (an element matching a CSS selector in the tab). It is not a tautology and is distinguishable from sibling tools like ghost_wait by explicitly mentioning the tab and selector-based matching, though it does not strongly differentiate itself from all related tab tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives such as ghost_wait, ghost_tab_find, or ghost_assert. There is no mention of prerequisites, conditions, or situations where this tool should be preferred or avoided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_waitA

Unified wait - use it instead of sleeping. for=element: an element (name/role) appears or disappears in the target window; returns the moment it does. for=value: an element's VALUE equals/contains/changes (forms, async fields, 'wait until the total updates'). for=navigate: load url in a browser window WITHOUT raising it - sets the address bar over UIA, presses Enter, returns when the window title changes (response: title_before, title_after, title_changed, ms); only a foreground focus policy takes the old focus-and-type path. for=idle: screen stable. for=text: click a target then wait for text. for=event: next foreground change. for=cond: JSONLogic poll. for=ms: a plain sleep - last resort, it costs its full length every run. Target window for element|value|idle|text|navigate = window= or the session anchor.

ParametersJSON Schema
NameRequiredDescriptionDefault
msNoMilliseconds (for=ms)
forNoWhat to wait for (default ms)
urlNoURL to navigate to (for=navigate)
nameNoElement name (for=element|value)
roleNoElement role (for=element|value)
textNoText to wait for (for=text) or expected value (for=value)
windowNoWindow scope (for=idle|element|value|navigate); omit to use the anchor
appearsNofor=element|text: true=wait to appear, false=wait to disappear
conditionNoJSONLogic expression (for=cond)
predicateNofor=value: how to compare the element's value to text (default equals)
settle_msNofor=navigate: pause after the title change so the page can paint (0 = return immediately)
since_seqNofor=event
timeout_msNo
stable_framesNofor=idle

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does well by disclosing key side effects: navigate loads a URL 'WITHOUT raising it,' 'sets the address bar over UIA, presses Enter,' and 'returns when the window title changes'; ms 'costs its full length every run.' It does not describe timeout or failure behavior, so it is not a perfect 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but appropriately sized for eight modes, and it is front-loaded with the unified purpose before enumerating the for= variants. It uses a consistent semicolon-separated structure, though bullet formatting would make it easier for an agent to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter tool with no output schema and no annotations, the description explains every mode, specifies the target-window rule, and even gives the navigate response fields. Minor gaps remain around since_seq for event waits and the click-target parameter for text waits, but the overall guidance is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 93%, and the description adds meaningful context beyond the schema: value waits for equals/contains/changes semantics, element waits for appearance or disappearance 'in the target window,' and navigate has a settle_ms pause after the title changes. The for=text mode is slightly ambiguous about how the click target is identified, which prevents a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Unified wait - use it instead of sleeping' and enumerates eight distinct wait modes (element, value, navigate, idle, text, event, cond, ms), so the verb and resource are clear. It does not explicitly contrast itself with the sibling ghost_tab_wait_for, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides mode-specific selection guidance, explicitly calls for=ms a 'last resort' that 'costs its full length every run,' and notes the condition under which navigate uses the old focus-and-type path. It does not mention when to prefer the sibling ghost_tab_wait_for, but the within-tool routing between modes is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghost_windowA

Window management across the user's desktop AND Ghost's hidden desktops. op=list: every window (name, pid, hwnd, focused, state, surface=user|hidden) plus the current anchor. op=focus: under the default background policy this ANCHORS the window and does NOT raise it (the anchored verbs drive it without focus); only an operator-unlocked prefer_background/foreground policy raises it. op=anchor: name= sets the anchor, clear=true clears it, no args reports it. op=state: maximize|minimize|restore|close (name+state); under the background policy these never activate the window, so the user's focus stays put (restore is how a minimized window becomes actionable). op=launch: start exe - under the background policy the app starts on a hidden desktop, never on your screen, and is anchored (see target.surface in the response).

ParametersJSON Schema
NameRequiredDescriptionDefault
opNoOperation (default list)
exeNoExecutable path or command line (op=launch)
nameNoWindow title substring (op=focus|anchor|state). Also accepted as alias for 'exe' on op=launch.
clearNoop=anchor: forget the current anchor
stateNoop=state. On Linux only 'close' is available (via the window's own accessible action); maximize/minimize/restore report Unsupported.
include_hiddenNoop=list: also list windows that have vanished (not visible, not minimised - state=hidden); op=state state=restore on one of them shows it again without activating it

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, and it delivers: focus 'ANCHORS the window and does NOT raise it,' state operations 'never activate the window, so the user's focus stays put,' and launch 'starts on a hidden desktop, never on your screen.' These are exactly the surprising, non-obvious side effects an agent needs to know before invoking the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one dense paragraph, but every sentence earns its place and the op= prefixes make it scannable. It is long only because it covers five operations with real behavioral nuance; still, a bullet-per-op layout would have improved readability over the wall-of-text format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description covers a remarkable amount: list output fields, anchor mechanics, state-operation effects, launch destination, and a hint about target.surface. Minor gaps remain — 'the anchored verbs' and 'operator-unlocked prefer_background/foreground policy' are referenced without definition, and the non-default policy path is only partially explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds genuine value beyond the schema by tying parameter effects to policy: 'name= sets the anchor, clear=true clears it, no args reports it,' 'name+state' for op=state, and the note to 'see target.surface in the response' for launch. This enriches parameter meaning rather than repeating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb and resource: 'Window management across the user's desktop AND Ghost's hidden desktops.' The op= enumeration then concretely details what the tool does for each operation (list, focus, anchor, state, launch). No sibling tool claims desktop/hidden-desktop window management, so it is clearly differentiated from ghost_tab_* and ghost_browser_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear conditional context: each op states what it does under the default background policy, and it explains when restore is the path to making a minimized window actionable and when launch places an app on a hidden desktop. It never explicitly names alternatives or exclusions among siblings (e.g., when to prefer ghost_run for a visible launch), so it stops short of full when-to-use vs. when-not-to guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 39 tool updatesv0.23.4
    • First observedghost_act
    • First observedghost_assert
    • First observedghost_browser_attach
    • First observedghost_browser_close
    • First observedghost_browser_launch
    • First observedghost_browser_list_installed
    • First observedghost_browser_tabs
    • First observedghost_clipboard
    • First observedghost_drag
    • First observedghost_find
    • First observedghost_http_get
    • First observedghost_http_post
    • First observedghost_key
    • First observedghost_query
    • First observedghost_reset
    • First observedghost_run
    • First observedghost_screenshot
    • First observedghost_scroll
    • First observedghost_see
    • First observedghost_shell
    • First observedghost_snapshot
    • First observedghost_stats
    • First observedghost_stop
    • First observedghost_tab_click
    • First observedghost_tab_close
    • First observedghost_tab_describe
    • First observedghost_tab_eval
    • First observedghost_tab_find
    • First observedghost_tab_navigate
    • First observedghost_tab_open
    • First observedghost_tab_press
    • First observedghost_tab_screenshot
    • First observedghost_tab_scroll
    • First observedghost_tab_select_option
    • First observedghost_tab_text
    • First observedghost_tab_type
    • First observedghost_tab_wait_for
    • First observedghost_wait
    • First observedghost_window

TDQS

A3.5/5.0

Scored across 39 tools

Disambiguation4/5

Most tools are cleanly separated by domain prefix (ghost_tab_* for browser tabs, ghost_* for desktop/window automation), and action verbs like find, act, wait, and assert have distinct roles. The main ambiguity is between ghost_snapshot, ghost_see, and ghost_tab_describe, which all produce element-tree-like views and could occasionally be confused.

Naming Consistency5/5

All tools share the ghost_ prefix and use consistent snake_case verb-oriented names, with noun qualifiers like ghost_tab_navigate, ghost_browser_launch, and ghost_http_get. Even the bare-verb tools (ghost_act, ghost_wait, ghost_scroll) fit the same pattern without style mixing.

Tool Count2/5

39 tools is well beyond the typical well-scoped MCP surface, even for a broad automation toolkit. The toolset covers desktop UI, browser tab automation, shell, HTTP, clipboard, and window management, which arguably belongs split across multiple focused servers. Many tools are specialized enough to earn their place, but the aggregate count is heavy.

Completeness4/5

The surface is remarkably complete for its broad purpose: observe, interact, wait, assert, manage windows, drive browser tabs, run shell commands, and make HTTP calls are all covered. Minor gaps exist, such as HTTP only supporting GET/POST and desktop mouse actions being limited to background-friendly patterns, but these do not create dead ends.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that gives any AI assistant eyes and hands on your desktop — screenshots, clicking, typing, OCR, window management, accessibility-tree queries, workflow recording.
    5
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    A Windows computer use agent — FastMCP server that gives AI assistants hands on the real desktop: windows, UI elements, mouse, keyboard, screenshots, OCR, shortcuts, dialogs, and outcome verification.
    38
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A local, dependency-free MCP server that gives AI agents controlled access to the active Windows desktop, enabling automated interaction with applications through screenshots, clicks, typing, and window management.
    87 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for driving any Windows app through five layers including OCR, UI Automation, and direct OS operations. Enables AI agents to control Windows desktop and OS cursor-free, even on background/locked windows.
    78 npm
    2
    MIT