da-mcp
The da-mcp server is a cross-platform desktop automation MCP server that enables AI agents to interact with the local desktop environment through tools for screen capture, OCR with UI element classification, mouse and keyboard control, and program launching. It supports Linux (X11/Wayland), macOS, and Windows with automatic backend fallbacks.
Capture and Recognition
Capture full-screen or display-specific screenshots as PNG images.
List all connected displays with their IDs, bounds, scale factors, rotation, and primary status.
Perform OCR on a display to extract text and classify UI elements into categories like buttons, input fields, labels, checkboxes, radio buttons, menus, menu items, and icons, aiding targeted automation.
Mouse Control
Get the current cursor position in screen coordinates.
Move the cursor to absolute coordinates, optionally with a duration for smooth movement.
Click, double-click, and drag with configurable mouse buttons (left, right, middle, back, forward) at any location.
Scroll the mouse wheel horizontally and vertically by pixel deltas.
Keyboard Control
Type text at the current keyboard focus with optional per-character delays.
Press single keys or key chords (e.g., Ctrl+C, Alt+Tab) with support for modifiers (ctrl, alt, shift, meta/super) and hold duration.
Program Launch
Launch applications by name or absolute path, with optional working directory, environment variables, detached mode, and execution timeout.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@da-mcpTake a screenshot and click the OK button at those coordinates"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
da-mcp — Crossplatform Desktop Automation MCP Server
A Model Context Protocol (MCP) server that lets AI agents (OpenCode, Claude Desktop, etc.) interact with a local desktop environment: screenshots, OCR with UI-element classification, mouse/keyboard control, and program launch — on Linux, macOS, and Windows.
For AI agents and automated installers: Do NOT chain
apt install … && npm install && npm run buildby hand. Use the bundled installer scripts — they handle the platform-specific prerequisites (tesseract, xdotool, Node 22+) and surface native-binding / TCC failures as actionable errors instead of silent broken builds. See Install (automated / AI agents) below.
Features
20 tools registered under the da_* namespace:
Capture
da_screenshot— Capture full screen or a specific display as PNG.da_ocr— Run OCR (Tesseract) on a screenshot and return structured text + UI element classification.da_list_displays— List connected displays with id, bounds, scale factor.
Input
da_get_mouse_position— Read current cursor position (Linux X11 usesxdotool getmouselocation --shell, Wayland usesydotool, Windows uses PowerShell +user32!GetCursorPos). macOS is stubbed in v1.0.0 — surfaces a "not implemented" error (tracked by #19).da_move_mouse— Move the cursor to (x, y).da_click— Click at (x, y) with optional button (left/right/middle/back/forward) and count.da_click_text— OCR-then-click: find a UI element by visible text (exact or fuzzy) and click its center. ReturnsNOT_FOUNDif no match.da_find_text— Same OCR+match pipeline asda_click_textbut stops before the click — returns the bbox/center/confidence so the agent can decide what action to take (click vs. drag vs. right-click).da_double_click— Convenience wrapper for double-click.da_drag— Drag from (x1, y1) to (x2, y2).da_draw_path— Trace a multi-point mouse path with optionalModifier[]held throughout (try/finally guarantees modifier cleanup). Used for freeform shapes (circles, signatures) and for constrained drawing in Paint (modifiers:["shift"]).da_scroll— Scroll wheel at (x, y) by (dx, dy).da_type— Type a string at the current focus.da_key— Press a single key or chord (e.g.Ctrl+C).
Stability / verification
da_wait_for_window— Pollda_window_listuntil a window with a matching title appears (substring/exact/regex). Use afterda_launchto wait for the app to paint before clicking inside.da_wait_for_text— Poll the OCR text-match pipeline untiltextappears on screen. Use after any state-changing action to confirm the new state is visible before continuing.da_verify_pixels— Poll the screen until a pixel-level predicate holds:{kind:"color", rgb, minCount}(count matching pixels) or{kind:"diff", baseline, threshold}(fraction differing from a baseline PNG). E.g. wait until 200+ red pixels appear on the canvas region after drawing a circle in Paint.
Launch
da_launch— Launch a program by name or path; returns a spawn handle with PID + POSIX signal exit codes (SIGINT=130, SIGTERM=143, SIGHUP=129, SIGKILL=137, SIGQUIT=131, SIGABRT=134).
Window
da_window_list— Enumerate all visible top-level windows (hwnd/pid/title/bounds/visibility). Cross-platform:wmctrl(Linux X11 + Wayland via XWayland),osascript+ System Events (macOS), PowerShell +user32!EnumWindows(Windows).da_window_focus— Bring a window to the foreground byhwnd,pid, or title match (exact/regex/substring, case-insensitive). Title matching uses pure-JS resolver; multi-window Paint-style flows return aNOT_FOUNDerror when nothing matches.
Skills (for OpenCode / Claude Desktop agents)
This repo ships a generic desktop-orchestration skill that any agent can install to drive the 16 da_* tools through a 6-step loop: Orient → Observe → Locate → Act → Verify → Iterate. It is application-agnostic — Paint, browsers, IDEs, dialogs, file managers, native apps.
Source-of-truth location: docs/skills/da-ui-orchestrator.md. The file is deliberately kept out of .opencode/skills/ so that this repo doesn't auto-load as an OpenCode skill on its own — it stays a portable artefact that you copy into your client.
Install the skill on your machine:
# OpenCode:
mkdir -p ~/.config/opencode/skills/da-ui-orchestrator
cp docs/skills/da-ui-orchestrator.md ~/.config/opencode/skills/da-ui-orchestrator/SKILL.md
# Claude Code:
mkdir -p ~/.agents/skills/da-ui-orchestrator
cp docs/skills/da-ui-orchestrator.md ~/.agents/skills/da-ui-orchestrator/SKILL.mdRestart your MCP client — da-ui-orchestrator will appear in available_skills. After git pull on this repo, re-copy the file to refresh.
UI element classification (OCR post-processing)
The da_ocr classifier tags each detected text region with one of:
Category | Examples |
| "OK", "Cancel", "Apply" |
| Text fields, search boxes |
| Static descriptive text |
| "☑ Enable", "☐ Dark mode" |
| "◉ Local", "○ Network" |
| Top-level menu headers ("File", "Edit") |
| Dropdown entries ("New", "Open…") |
| Toolbar / sidebar icons |
Related MCP server: desk-mcp
Architecture
Language: TypeScript 7.0 (strict, ESM, Node 22+);
exactOptionalPropertyTypes,noUncheckedIndexedAccess,noFallthroughCasesInSwitchall on. Exact version pins (no^/~).MCP SDK: v2 (
@modelcontextprotocol/server@2.0.0) overStdioServerTransport(production) andInMemoryTransport(tests).Module layout (250 LOC ceiling per file):
Screenshot —
src/screenshot/{png,backends,index,types}.ts. PNG validation/encoding isolated inpng.ts; backend dispatch (screenshot-desktop→ OS CLI shell-out:scrot/grim/screencapture/PowerShell BitBlt) inbackends.ts. No native NAPI binary — see #12.OCR —
src/ocr/{cli,index,mock,parse,wasm,types,classify,classify-rules}.ts. CLI backend (runCli), WASM fallback (runWasm), parser, mock; orchestrator inindex.tsrethrows asOCR_FAILEDwhen both backends fail.Input —
src/input/{routing,mouse,keyboard,scroll,drag,types,index}.tsplus per-OS backendsmouse-{macos,windows}.ts,keyboard-{macos,windows}.ts,scroll-{macos,windows}.ts,clipboard.ts. Shared routing helpers (runCli,resolveRouting,requireTool,isMockMode,validateCoords,Routing) inrouting.ts. Linux paths shell out toxdotool/ydotool/wtype. Windows path uses PowerShell +user32(keybd_event,mouse_event,SetCursorPos,GetCursorPos); Unicode text goes via clipboard + Ctrl+V. macOS is a stub in v1.0.0 (tracked by #19) — surfaces a "not implemented in #13" error. No native NAPI binary — see #13.Launch —
src/launch/{launch,types}.ts.open(1)+child_process.spawn(shell:false);SIGNAL_EXIT_CODESmap for POSIX signal mapping.Platform —
src/platform/{detect,types}.ts.detectPlatform()returns{ os, display, tools, home };assertPlatformSupported()throwsPLATFORM_INIT_FAILEDon unsupported combos.Server —
src/server.ts. Registers 20 tools, wraps handler results intoCallToolResultwithstructuredContent(Buffers stripped tonumber[]for JSON-safety), installs SIGINT/SIGTERM shutdown.Server instructions —
src/server-instructions.ts. ExportsSERVER_INSTRUCTIONS, a string surfaced to the AI agent via the MCPinstructionsfield (MCP spec,ServerOptions.instructions). Tells the agent it IS the orchestrator — call the 14da_*tools directly through the MCP client, do NOT write an orchestrator script that imports/spawns the server. Edit this string to update the agent-facing announcement.Window —
src/window/{types,list,list-linux,list-macos,list-windows,focus,resolve,index}.ts. Per-OS list backends (wmctrl / osascript / PowerShell+EnumWindows) keep each file under the 250 LOC ceiling; pure-JSmatchOneresolver inresolve.tsfor title matching.
Backend dispatch
Capability | Primary | Fallback 1 | Fallback 2 |
Screenshot (Linux X11) |
|
| — |
Screenshot (Linux Wayland) |
|
| — |
Screenshot (macOS) |
|
| — |
Screenshot (Windows) |
| PowerShell BitBlt ( | — |
Input (Linux X11) |
| — | — |
Input (Linux Wayland) |
|
| — |
Input (Windows) | PowerShell + | — | — |
Input (macOS) | Stub in v1.0.0 — surfaces "not implemented in #13" error (tracked by #19) | — | — |
OCR (any OS) |
|
| — |
Window list + focus (Linux) |
| — | — |
Window list + focus (macOS) |
| — | — |
Window list + focus (Windows) | PowerShell + | — | — |
Every spawnSync/spawn call uses shell:false. Permission-gated errors (e.g. macOS ScreenCaptureKit, Windows access denied) are detected via a tightened pattern (screen…permission, screencapturekit, access is denied) and re-thrown as DaMcpError('PERMISSION_DENIED').
Install (automated / AI agents)
If you are an AI agent setting this up on behalf of a user, or running scripted/CI installation, use the bundled installer scripts. Do not improvise a manual npm install chain — manual install bypasses the prompts that catch missing system tools and PATH issues, and turns platform-specific gotchas into silent broken builds.
OS | Command |
Linux |
|
macOS |
|
Windows |
|
What each script does:
Verifies / installs system prerequisites — tesseract, xdotool/ydotool (Linux), Node.js 22+ (Xcode CLT only needed if Homebrew is missing it — handled via
brew installif so)Runs
npm ci— locked, reproducible install. Avoidnpm install(which resolves ranges and is slower)Builds TypeScript with
npm run buildRuns
DA_MCP_TEST_MODE=mock npm testso the build is verified before you declare successPrints the MCP client config snippet to drop into Claude Desktop / OpenCode / etc.
If a script fails, read its output — the next step is printed at the end of each failure path. Do not retry by hand without first understanding what the script detected.
For manual / sandboxed installs where you cannot run the scripts, see Install below.
Install (Windows, single-binary)
For Windows users, a self-contained single-binary release is available — no Node.js, no npm install, no build step. The binary embeds Node 22 + the bundled JavaScript via Node SEA (scripts/build-sea.sh); the recommended system dependency is tesseract on $PATH (for fast OCR — see OCR backend fallback below).
# Download latest release asset from GitHub
curl.exe -L -o da-mcp.exe https://github.com/cioinside/da-mcp/releases/latest/download/da-mcp-win32-x64.exe
# First run — prints CLI help and exits 0
.\da-mcp.exe help
# Run stdio MCP server (default — point your MCP client at this binary)
.\da-mcp.exe
# Optional: install Tesseract OCR CLI for fast OCR (auto-elevates via UAC)
.\da-mcp.exe install-tesseractCaveats:
Unsigned binary —
postjectstrips Authenticode when injecting the SEA blob, so Windows SmartScreen will warn on first launch. Click "More info" → "Run anyway".No native NAPI deps —
screenshot-desktop, MCP SDK,zod,tesseract.jsare all inlined in the binary. Onlytesseractis recommended (for fast OCR; not required — see OCR backend fallback).Linux + macOS binaries are not part of the v1.0.0 release — see
BUILD.mdfor the local cross-platform build path (Windows SEA build runs onwindows-latestCI only).
OCR backend fallback
da_ocr tries backends in order; the first one that succeeds is used:
Order | Backend | Speed | Requires | Used when |
1 | Tesseract CLI ( | ~0.5–2 s / screenshot |
| Recommended path |
2 | tesseract.js WASM (in-binary, with pre-bundled | ~5–15 s / screenshot | Nothing — runs offline | Tesseract not installed |
3 | tesseract.js WASM (downloads traineddata) | ~15–30 s on first call, then ~5–15 s | Internet on first call | tesseract.js fallback if no pre-bundled data |
If all backends fail, da_ocr returns OCR_FAILED with a multi-line remediation hint pointing you to the install command for your platform.
Install Tesseract for fast OCR (recommended):
OS | Command |
Windows |
|
macOS |
|
Linux |
|
Configure the tessdata cache directory with DA_MCP_TESSDATA_DIR (default ./tessdata — relative to the process CWD).
For source installs (Linux/macOS/Windows dev workflow), continue to Install below.
Install
# System dependencies (apt/dnf/brew; see scripts/install-system-deps.sh)
sudo ./scripts/install-system-deps.sh
# npm deps
npm install
# Build
npm run build
# Verify type-check (strict mode)
npm run typecheck
# Run all tests (mock mode — skips real native calls)
DA_MCP_TEST_MODE=mock npm testUpgrading
da-mcp upgrade is a single CLI command that self-updates whichever way you installed it — the entry point auto-detects binary vs source mode (process.execPath === process.argv[1]), so the same command works for both the single-binary release and a source checkout:
# Binary install (Windows single-binary release):
.\da-mcp.exe upgrade
# Source install (Linux/macOS/Windows dev workflow):
node /projects/da-mcp/dist/server-dispatch.js upgrade
# or:
npm run upgradeBoth modes accept --force (alias -f). Pass it to reinstall even when the version comparison says you're up to date, or (in source mode) to discard uncommitted local changes.
Binary mode (da-mcp.exe upgrade)
For a Node SEA single-binary install (e.g. Windows da-mcp-win32-x64.exe):
Query GitHub Releases —
GET https://api.github.com/repos/cioinside/da-mcp/releases/latestreturns the latest non-prerelease release with its asset list and sha256 digests.Compare versions — the embedded build-time constant (
process.env.DA_MCP_VERSION, injected by esbuild--defineinscripts/build-sea.sh) is compared againsttag_name. If the running version is already ≥ the release, the command is a no-op (unless--force).Pick the matching asset —
da-mcp-{platform}-{arch}[.exe]for the currentprocess.platform+process.arch.Download to
${execPath}.new.<ts>(sibling of the running binary, never overwriting it in place).Verify sha256 if the asset has a
digest: sha256:…field — mismatches abort before any rename.Atomic replace — rename the running binary to
${execPath}.old.<ts>(Windows allows renaming a running executable; the process keeps its file handle), then rename the staged file toexecPath. On failure, the staged file is left behind and the original is untouched.Restart the service if one is registered via
install-service(see below). If no service is installed, prints a one-line reminder to restart your MCP client manually.
The previous binary is kept at ${execPath}.old.<ts> so the operator can roll back manually if the new binary misbehaves on first launch.
Source mode (npm run upgrade)
For a source checkout (any OS):
Refuse dirty trees —
git status --porcelainmust be empty unless--forceis passed.git fetch origin <branch>+git reset --hard origin/<branch>— fast-forward to the latest commit on the current branch.npm ci— locked, reproducible dependency install.npm run build— TypeScript compile todist/.npm run typecheck— strict-mode smoke check.Restart the service if one is registered, or print a reminder to restart the MCP client manually.
The command refuses to run on a detached HEAD — check out a branch first.
Run da-mcp as a system service (auto-restart)
For long-running installations, da-mcp registers as a managed service so that upgrade can bounce it without manual intervention:
# Install (one-shot, needs root / Administrator):
node /projects/da-mcp/dist/server-dispatch.js install-service
# Uninstall later:
node /projects/da-mcp/dist/server-dispatch.js uninstall-serviceOS | Service type | Restart command used by |
Linux |
|
|
macOS |
|
|
Windows |
|
|
Templates live in scripts/systemd/, scripts/launchd/, and scripts/windows/. Service installation requires elevated privileges (sudo / Run as Administrator). The default transport after install-service is HTTP with token auth (so multiple MCP clients can share one daemon); use DA_MCP_TRANSPORT=stdio if you prefer per-client stdio.
Run
stdio (default)
The server speaks MCP over stdio. Configure your MCP client to launch node /projects/da-mcp/dist/server-dispatch.js (or npx tsx src/server-dispatch.ts for dev).
HTTP (opt-in, token-protected)
Set DA_MCP_TRANSPORT=http to expose the server on http://0.0.0.0:3000/<token>. A 256-bit random token is generated on first start and persisted at:
OS | Token path |
Linux |
|
macOS |
|
Windows |
|
The token file is created with mode 0o600 (owner-only). Rotate it any time:
node /projects/da-mcp/dist/server-dispatch.js token regenerate
# → http://0.0.0.0:3000/<43-char-base64url-token>
# (substitute the host's LAN IP for 0.0.0.0 when configuring the remote client)Override defaults with env vars:
DA_MCP_HTTP_HOST— bind address (default0.0.0.0— LAN-reachable, token-gated); supports IPv4, IPv6 ([::1]), and hostnameDA_MCP_PORT— port (default3000)DA_MCP_TOKEN_PATH— override token storage path
The URL is a bearer-style token — anyone with the token can call tools (mouse, keyboard, screenshot, launch). Default 0.0.0.0 bind means the daemon is reachable from any host that can route to this machine (LAN, VPN, public IP). The token is the sole auth — its 256-bit entropy is unguessable, but treat it as a password: protect the token file, and rotate it (token regenerate) if it may have leaked. To restrict the bind to the loopback interface only, set DA_MCP_HTTP_HOST=127.0.0.1 — the server prints a one-line confirmation at startup.
Remote access from another host on the LAN
Because the default DA_MCP_HTTP_HOST=0.0.0.0 already listens on all interfaces, no special launcher is needed:
DA_MCP_TRANSPORT=http npm start
# → server boots, binds 0.0.0.0:3000, prints URL with token to stderrOn the remote machine, configure your MCP client with http://<lan-ip>:3000/<token> — replace 0.0.0.0 with the host's actual LAN IP (hostname -I, ipconfig getifaddr en0, ipconfig).
Open the host firewall for inbound TCP on DA_MCP_PORT (default 3000) once per OS — this requires elevation and varies per platform:
OS | Command |
Linux (firewalld) |
|
Linux (ufw) |
|
macOS | System Settings → Network → Firewall → allow incoming for the |
Windows (PowerShell, admin) |
|
OpenCode / Claude Desktop example config
stdio (default — per-client process)
{
"mcpServers": {
"da-mcp": {
"command": "node",
"args": ["/projects/da-mcp/dist/server-dispatch.js"],
"env": {
"DISPLAY": ":0",
"DA_MCP_LOG": "info"
}
}
}
}HTTP (token-protected — share one daemon across clients / hosts)
Start the server with DA_MCP_TRANSPORT=http (see HTTP section above for bind/port/token details), then grab the URL it printed at startup — or regenerate the token any time with node /projects/da-mcp/dist/server-dispatch.js token regenerate. Paste the result into the url field below (substitute the server host's LAN IP for 0.0.0.0 when configuring a remote client).
OpenCode (~/.config/opencode/opencode.json):
{
"mcpServers": {
"da-mcp": {
"type": "remote",
"url": "http://<host>:<port>/<token>"
}
}
}Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"da-mcp": {
"url": "http://<host>:<port>/<token>"
}
}
}Cross-platform notes
OS | Screenshot | Input | Notes |
Linux X11 |
|
|
|
Linux Wayland |
|
|
|
macOS |
| Stub in v1.0.0 — see #19; Windows SEA binary is the recommended path | First screenshot call may need Screen Recording permission (TCC) |
Windows |
| PowerShell + | The v1.0.0 single-binary release target — no native NAPI deps |
Development
# Strict type-check (no emit)
npx tsc --noEmit
# All tests in mock mode (CI default)
DA_MCP_TEST_MODE=mock npx vitest run
# Single test file
npx vitest run test/unit/screenshot.test.ts
# Watch mode
npx vitestTest inventory
28 unit test files + 2 e2e (e2e skip in mock mode)
540 tests passing / 18 skipped / 0 failed in
DA_MCP_TEST_MODE=mock npm test(e2e require real X11/tesseract; input dispatcher tests cover per-OS stubs for macOS + Windows PowerShell paths). Post-tool additions:da_find_text,da_wait_for_window,da_wait_for_text,da_verify_pixels,install-tesseractCLI subcommand bring the total to 540 passing.Test runtime:
process.env['DA_MCP_TEST_MODE'] === 'mock'short-circuits native calls;_mock.tsmodules inject deterministic native modules
Conventions
250 LOC ceiling per file (measured as non-blank, non-comment lines:
awk '!/^[[:space:]]*$/ && !/^[[:space:]]*(\/\/|#|--)/' <file> | wc -l)ESM imports use
.jssuffix even for.tssourceAll
spawn*calls withshell: falseAll native errors wrapped in
DaMcpErrorwith typedcodefromErrorCodeunionPublic surface re-exported from
src/screenshot/index.tsandsrc/input/index.ts— consumers import from there, not from per-operation filesForbidden:
as any,@ts-ignore,@ts-expect-error,console.log,shell: true, auto-commits
Environment variables
DISPLAY— X11 display (Linux only)WAYLAND_DISPLAY— Wayland display socketDA_MCP_LOG— log level (trace|debug|info|warn|error), defaultinfoDA_MCP_TESSERACT_BIN— path totesseractbinary, defaulttesseractDA_MCP_OCR_BACKEND—cli(default) orwasmDA_MCP_TEST_MODE—mockskips real native calls in tests; e2e tests skip when setDA_MCP_SCREENSHOT_BACKEND— force a screenshot backend (node-screenshots|screenshot-desktop|windows-cli); default auto-detectDA_MCP_TRANSPORT—stdio(default) orhttp;httpenables the opt-in HTTP transportDA_MCP_PORT— HTTP port whenDA_MCP_TRANSPORT=http(default3000)DA_MCP_HTTP_HOST— HTTP bind address (default0.0.0.0— LAN-reachable, token-gated); supports IPv4, IPv6, hostnameDA_MCP_TOKEN_PATH— override the auth token storage path
License
MIT
Available Tools
20 toolsda_clickB
Click a mouse button (defaults to "left", count 1). When x/y are given, the cursor is moved first.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| count | No | ||
| button | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosure. It does disclose the key behavioral detail that the cursor is moved first when x/y are provided, which is valuable. However, it doesn't mention whether coordinates are absolute or relative to the display, whether there's any delay, or what happens with multiple clicks (click interval).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both useful. The first states the action and defaults; the second clarifies the x/y cursor-moving behavior. Zero filler or redundancy. Front-loaded with the primary function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 4 optional parameters, no annotations, and no output schema, the description is brief but covers defaults. For what is fundamentally a simple click action, the description addresses the essentials. Gaps remain: coordinate system semantics, behavior of back/forward buttons, and interaction with specific displays are undocumented, but the tool is low-complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the description must compensate. The description partly does: it explains that button defaults to 'left', count defaults to 1, and x/y trigger a cursor move. However, it doesn't explain the meaning of 'back'/'forward' buttons, the coordinate system (screen vs window), or clarify that x and y may be independently optional. Partial compensation, not full.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it clicks a mouse button with defaults (left, count 1) and explains the x/y cursor-move behavior. This distinguishes it from sibling tools like da_double_click (which is specifically a double-click) and sufficiently conveys the primary function, though it doesn't explicitly contrast with siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use vs alternatives guidance. It doesn't say when to prefer da_click over da_double_click or da_drag, nor mention any prerequisites (e.g., display must be active, coordinates must be valid for current display). The usage context is only implied by the tool's nature.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_click_textA
Click the on-screen element whose text label matches text. Uses OCR + UI-element classification to locate the text, then clicks the center of its bounding box. Set fuzzy: true for case-insensitive matching with whitespace normalization. Returns the clicked coordinates, the matched bbox, and the recognized text. Throws NOT_FOUND when no element matches.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| fuzzy | No | ||
| displayId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the underlying mechanism (OCR + classification), click location (center of bbox), return values (coordinates, bbox, recognized text), and error behavior (throws NOT_FOUND). This is comprehensive and goes well beyond minimal transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four concise sentences, each contributing unique information: action, method, optional setting, return values, and error. It is front-loaded with the primary action and contains no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking annotations, output schema, and parameter descriptions, the description covers the core purpose, method, return values, and error conditions. The missing `displayId` parameter and lack of return format details prevent a perfect score, but overall it is complete enough for most use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, so the description must compensate. It explains `text` (the label) and `fuzzy` (case-insensitive matching with whitespace normalization), but completely omits `displayId`, leaving that parameter ambiguous. Partial compensation—two of three parameters are meaningfully described, but one is left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Click the on-screen element whose text label matches ‘text’'), method (OCR + UI-element classification), and result (clicks center of bounding box). It distinguishes itself from siblings like da_click (coordinate-based) and da_find_text (find-only) by combining text matching with clicking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is clear: click an element identified by its text label. The description gives a condition for enabling fuzzy matching but does not explicitly state when to use this tool over alternatives like da_click or da_find_text. It provides clear context but lacks formal exclusions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_double_clickB
Double-click the left mouse button. Moves to (x, y) first when provided.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the destructive-ish action (double-click) and the optional move-to-first behavior, but doesn't disclose what the move behavior implies (e.g., does it click at current position if no x/y given?), return values, or whether coordinates are required. For a mouse-input tool, more behavioral detail would help.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The description front-loads the primary action and adds the coordinate behavior succinctly. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-coordinate mouse action with no output schema, this is reasonably complete. However, the description is thin on edge cases (e.g., coordinate range behavior, what happens when no x/y supplied). Given the tool's simplicity and clear schema, it's adequate but has room to add a brief usage note.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description notes that x/y are used for moving before double-clicking. With only 2 optional integer coordinates whose meaning is self-evident (position), and the description adding the 'moves first' behavioral note, this provides baseline useful semantics. It doesn't detail coordinate interpretation beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Double-click the left mouse button') and clearly distinguishes itself from siblings like da_click (single click). The optional coordinate movement is noted. However, it doesn't explicitly frame the use case (e.g., launching an app or selecting), but the purpose is adequately clear for a mouse-action tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (double-click at a location) but provides no when-to-use vs alternatives guidance. It doesn't explicitly contrast with da_click, da_drag, or other siblings. No prerequisites or context are given, though the sibling set makes the distinction fairly intuitive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_dragB
Drag from (x1, y1) to (x2, y2). Button defaults to "left"; non-left buttons are accepted in the schema but currently ignored.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | ||
| x2 | Yes | ||
| y1 | Yes | ||
| y2 | Yes | ||
| button | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses a critical behavioral trait: non-left buttons are accepted but ignored. This is genuinely useful transparency about a subtle gotcha. However, it doesn't mention whether dragging involves holding the button down and releasing, potential timing/duration behavior, or whether this is a press-drag-release operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The critical button gotcha is included efficiently. Could arguably be one sentence but is appropriately concise and front-loaded with the main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema and no annotations, the description is thin on behavioral details like drag duration, button hold behavior, and coordinate reference frame. The button caveat is a strong addition, but the lack of context about how the drag executes (speed, press-and-hold, release) leaves meaningful gaps for an agent deciding how to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for all 5 parameters. It explains the button parameter partially (defaults to left, non-left ignored) but provides no meaning for x1, y1, x2, y2 beyond what's implied by 'drag from/to' — coordinates, units, or screen-relative vs absolute positioning aren't specified. The button gotcha is helpful but the coordinate parameters are largely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (drag) and resource (coordinates x1,y1 to x2,y2). It's a specific action that distinguishes itself from siblings like da_click or da_move_mouse, though it doesn't explicitly name alternatives. The purpose is clear and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not state when to use this tool versus alternatives. It doesn't mention that this is for drag-and-drop interactions, or contrast it with move_mouse (which moves without clicking) or click. No exclusions or prerequisites are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_draw_pathA
Draw a multi-point path with the mouse by tracing through points with the given button held. Useful for freeform shapes, signatures, circles (as N points on the circumference), etc. modifiers are held pressed for the duration of the trace (e.g. ["shift"] for constrained-drawing in Paint). Strict modifier pairing is enforced even on errors.
| Name | Required | Description | Default |
|---|---|---|---|
| button | No | ||
| points | Yes | ||
| modifiers | No | ||
| durationMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that the button is held, modifiers are held for the duration, and strict modifier pairing is enforced even on errors. It does not describe return values, coordinate system, or other side effects, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the primary action and followed by examples and behavioral notes. Every sentence contributes meaningful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 annotations, and no output schema, the description provides a clear overview but misses key details like the meaning of durationMs, the coordinate system for points, and any return/error behavior. The strict modifier pairing note is helpful, but overall completeness is moderate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning to three of four parameters: it explains points as the path to trace, modifiers as held keys with an example, and button as the held button. However, durationMs is not mentioned at all, and the structure of points is only minimally described; schema coverage is 0%, so this partial compensation is modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: drawing a multi-point path by tracing through points with the mouse while holding a button. It provides specific use cases (freeform shapes, signatures, circles) that distinguish it from simpler mouse tools, though it doesn't explicitly contrast with sibling tools like da_drag.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases (freeform shapes, signatures, circles as N points) and explains the modifier behavior with an example. However, it does not mention alternatives or when not to use the tool, so there's no exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_find_textA
Locate the on-screen element whose text label matches text (OCR + UI-element classification). Returns the bounding box, the center coordinates, the recognized text, and the OCR confidence — but does NOT click. Set fuzzy: true for case-insensitive matching with whitespace normalization. Throws NOT_FOUND when no element matches. Use this when you need to decide an action (click vs. drag vs. type-into) based on element position; use da_click_text when you already know the action is "click the center".
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| fuzzy | No | ||
| displayId | No |
TDQS
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 tool does NOT click, throws NOT_FOUND, and explains the fuzzy matching behavior (case-insensitive with whitespace normalization). While it could add more about displayId behavior, the critical side effects and error cases are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: it starts with the main purpose, lists return values, notes the non-click behavior, explains the option, mentions the error condition, and ends with usage guidance against an alternative. Every sentence adds value and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema or annotations, the description provides a good amount of context: what it returns, that it does not click, the fuzzy option, and the NOT_FOUND error. It is moderately complete, but the lack of any explanation of `displayId` and the vague 'UI-element classification' phrase leave some gaps for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 all parameters. It explains `text` (text label to match) and `fuzzy` (case-insensitive matching with whitespace normalization), but `displayId` is not mentioned anywhere. With 3 parameters, missing one is a notable gap, making the parameter guidance adequate but incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Locate the on-screen element whose text label matches `text`'. It clearly states the return values (bounding box, center coordinates, recognized text, OCR confidence) and explicitly distinguishes itself from sibling tool `da_click_text` by noting it 'does NOT click'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use this when you need to decide an action (click vs. drag vs. type-into) based on element position; use `da_click_text` when you already know the action is "click the center"'. This gives a clear when-to-use and names the alternative tool, making the decision straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_get_mouse_positionA
Return the current cursor position as { x, y } in screen coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that it returns screen coordinates (not relative or element-local coordinates), which is useful. It implies read-only behavior implicitly. However, it doesn't mention error conditions, whether the position reflects a real OS-level query, or performance characteristics. For a zero-parameter read tool, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tight sentence that conveys purpose and return shape with zero waste. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only query tool with no output schema, the description is essentially complete. It tells the agent what it returns and in what coordinate space. There's little else a simple getter tool needs to convey. The description fully compensates for the absence of an output schema by stating the return type.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are 0 parameters, so schema does nothing. Baseline is 4 for 0-param tools since there's nothing to document. The description correctly focuses on what is returned (the { x, y } coordinate pair) rather than inputs, which is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Return the current cursor position as { x, y } in screen coordinates.' It states what it returns and the coordinate space. It's a simple, singular tool (get position), so it naturally differs from sibling tools like da_move_mouse or da_click without needing explicit differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (querying cursor position) but doesn't explicitly state when to use this vs alternatives. However, since it's a read-only query tool with no real alternatives among siblings (none retrieve position), the usage context is reasonably clear. No exclusions or alternative guidance provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_keyA
Press a key by name, optionally with modifiers (e.g. {"key":"c","modifiers":["ctrl"]} for Ctrl+C). holdMs > 0 issues a press-hold-release.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| holdMs | No | ||
| modifiers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. The description does explain the holdMs behavior ('holdMs > 0 issues a press-hold-release'), which is useful. However, it does not disclose what happens with a plain press (does it release immediately?), whether the tool blocks until the key event completes, or what the return value is. The description adds some behavioral context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that covers the purpose, modifiers usage with a concrete example, and the holdMs behavior. No wasted words, front-loaded with the core verb+resource. Could arguably be slightly fuller but is appropriately concise for a simple key-press tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a relatively simple 3-parameter tool with no output schema and no annotations. The description explains modifiers and holdMs behavior via the example and the holdMs sentence. It doesn't explain the default behavior when holdMs is absent (0), whether repeated presses are supported, or what the return value contains. For a simple tool it's mostly adequate but leaves some ambiguity about default press behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the weight for parameter meaning. The description names all three parameters ('key', 'modifiers', 'holdMs') and explains two of them in prose. The modifiers example (Ctrl+C mapping) adds practical meaning, and the holdMs semantics are explicit. Only the exact 'key' naming convention (e.g., how special keys like Enter or arrows are referenced) is left underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the action clearly: 'Press a key by name, optionally with modifiers.' The verb+resource is specific and understandable. It doesn't explicitly differentiate from sibling tools like da_type (which types text vs presses keys), but given the sibling set includes da_click, da_double_click, da_drag, da_scroll, da_type, the distinct purpose of pressing a key by name is reasonably evident from context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its usage context (press individual keys, shortcuts with modifiers) and gives a concrete example. However, it doesn't explicitly say when NOT to use it versus da_type (which presumably types strings of characters) or when a modifier combination is preferred over separate presses. The when-versus-alternatives 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.
da_launchB
Launch a program by name or absolute path. argv[0] is required. cwd, env, timeoutMs, and detached are optional.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | ||
| env | No | ||
| argv | Yes | ||
| detached | No | ||
| timeoutMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are not provided, so the description carries the full burden. It mentions that argv[0] is required and that cwd, env, timeoutMs, and detached are optional, which adds some behavioral context. However, it does not disclose what happens on launch failure, whether the process is awaited or returns immediately, what the return value is (no output schema), whether timeoutMs default behavior is meaningful, or how detached mode affects the returned result. For a process-launch tool this is 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose and then lists parameter requirements. It wastes no words and is appropriately sized for the 5-parameter tool. It could arguably add a sentence on failure behavior, but as written, it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks essential context for a process-launch tool: no output schema exists, so return behavior is undocumented. It doesn't explain whether launch is synchronous or asynchronous, what happens on exit code non-zero, whether timeoutMs causes process kill, or how detached affects the process lifetime. While the schema and complexity are moderate (5 params, 1 required, nested env object), the description doesn't cover behavioral expectations that an agent would need to interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. The description does mention argv, cwd, env, timeoutMs, and detached by name and notes that argv is required while others are optional. This adds meaning beyond the bare schema of required/properties. However, it provides no detail on semantics of related parameters (e.g., how env interacts with inherited environment, what detached means behaviorally, what timeoutMs default is). With nested objects present (env) and no per-parameter docs, this is only marginal compensation over a 0% coverage schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the purpose clearly: 'Launch a program by name or absolute path.' It uses a specific verb (launch) and resource (program), and distinguishes from siblings like da_move_mouse, da_type, etc. which are all desktop automation actions. However, it doesn't explicitly name alternative tools for process management (none exist among siblings), so it doesn't differentiate at a sibling level, but the distinction from the listed action tools is obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says when to use it ('Launch a program by name or absolute path'), which gives a clear context. However, it provides no guidance on when NOT to use it or any alternatives. It doesn't mention prerequisites (e.g., if the program must exist in PATH), behavior when the program is already running, or whether the tool waits for process completion. The guidance is implied but there are no explicit exclusions or alternative tool references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_list_displaysA
List connected displays with id, bounds, scale factor, rotation, and primary flag.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The description clearly implies a non-destructive read operation by listing metadata (id, bounds, scale, rotation, primary). It doesn't state whether it requires system permissions or how it handles multiple displays, but the read-only nature is reasonably clear from context. Since it's a listing operation with no schema hints, this is adequate if not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One clean, single sentence that lists the exact data fields returned. Zero waste, no fluff, and front-loaded with the verb and resource. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple, zero-parameter, no-output-schema listing tool. The description enumerating the return fields (id, bounds, scale, rotation, primary flag) is sufficient for a tool of this complexity. While there's no output schema to provide structure, the description covers the essential return value shape adequately. Could mention return format details but for a simple listing tool this is complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters, there's nothing for the description to explain about parameter semantics. The schema is empty and needs no compensation. The description does describe the return fields, which serves as useful semantic context for what the agent will get back. A baseline 4 is appropriate since no parameter documentation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific language ('List connected displays') with a clear verb and resource, and enumerates the exact data fields returned (id, bounds, scale factor, rotation, primary flag). It clearly distinguishes from siblings like da_move_mouse and da_get_mouse_position since it deals with displays rather than mouse actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is a discovery/listing tool used to gather display metadata, which would precede operations like moving the mouse (da_move_mouse) or taking screenshots (da_screenshot). However, it doesn't explicitly state when to use it vs alternatives or mention any prerequisites. The application context is reasonable but 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.
da_move_mouseC
Move the cursor to absolute (x, y) screen coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| durationMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden of behavioral disclosure. It states it moves the cursor but doesn't disclose whether coordinates are primary-monitor-relative vs global multi-monitor, whether the move is instant (given durationMs is optional), or any OS-level quirks. For a physical-action tool with zero annotation coverage, more disclosure is expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, zero waste, gets to the point immediately. The key qualifiers (absolute, screen coordinates) are front-loaded. Not verbose but appropriately brief for the simplicity of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Contextual signals show a 3-parameter tool with no output schema, no enum constraints, and 0% schema coverage. durationMs is entirely unexplained. The description doesn't address coordinate system ambiguity (primary vs. virtual desktop), which is a common real-world concern for multi-monitor setups. Given the tool's simplicity, this is acceptable but leaves meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, but it only explains what x/y mean generically ('absolute screen coordinates'). It gives no explanation of durationMs (the optional third parameter), which is completely undocumented. The description adds minimal meaning beyond what the schema property names already convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states the specific verb 'Move' + resource 'cursor' with clear scope: absolute (x,y) screen coordinates. It's distinct from siblings like da_get_mouse_position (which reads), and the absolute-coordinates qualifier differentiates from relative movements. However, it doesn't name sibling tools for disambiguation beyond the inherent clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives like da_drag (which also moves) or da_click. It doesn't state prerequisites (e.g., multi-monitor coordinate implications) or when this is preferred over other movement approaches. Context is implied but no exclusions or alternates are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_ocrC
Run OCR (Tesseract) on a display and return recognized text plus classified UI elements.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| displayId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It describes the tool as a read operation (running OCR) but doesn't disclose that it depends on the Tesseract engine being installed, whether it captures a fresh screenshot internally or operates on existing data, the latency implications of running OCR, or error conditions (e.g., what happens if Tesseract is unavailable). These are meaningful behavioral considerations the agent would benefit from knowing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that conveys the core purpose without waste. It is front-loaded with the key action (Run OCR on a display) and output expectation. It earns its place but could ideally include more usage detail without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 2 parameters with 0% schema coverage, no annotations, no output schema, and no usage guidance. For what appears to be a computer-use/automation tool with 11 siblings, the description is materially incomplete: it doesn't cover parameter meaning, return structure beyond 'recognized text plus classified UI elements', error behaviors, or when to prefer it over da_screenshot. The description does only the bare minimum of stating the action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 two undocumented parameters (lang, displayId). It does not explain what 'lang' represents (language code? format?) or what 'displayId' refers to (which display to run OCR on, and the null meaning). The description adds no per-parameter meaning beyond what the bare schema shows. This is a meaningful gap for a tool with zero schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Run OCR (Tesseract) on a display') and its output ('recognized text plus classified UI elements'). This distinguishes it from sibling tools like da_screenshot (capture image) and da_list_displays (list displays). However, it doesn't explicitly name a sibling alternative for comparison, slightly reducing differentiation clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as da_screenshot for visual inspection, nor when OCR is preferable. The description implies the context (running OCR on a display for text recognition) but provides no exclusions, prerequisites, or when-not-to-use guidance. With 11 sibling tools, some usage guidance would significantly help selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_screenshotA
Capture a PNG screenshot of the primary display (when displayId is null/undefined) or a specific display id (0..2147483647).
| Name | Required | Description | Default |
|---|---|---|---|
| displayId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full transparency burden. It discloses the PNG format and display selection behavior, but fails to mention what happens with the captured screenshot (e.g., returned as binary, saved to file, or returned as path). This leaves a significant gap for agent reasoning.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence covers the tool's purpose and the key parameter behavior. There is no wasted wording, and the content is efficiently organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no annotations and no output schema, the description covers the input semantics well but omits any information about the return value or output handling. Since no output schema exists, the description should have disclosed what happens after capture to be complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only type and range for displayId, with zero description coverage. The description fully explains the meaning: null/undefined targets the primary display, while an integer targets a specific display. This adds essential meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool captures a PNG screenshot, naming the exact resource and output format. It distinguishes between primary display and specific display id, which uniquely identifies this tool among siblings like da_verify_pixels and da_ocr.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when displayId should be null vs. a specific integer, giving clear usage context for the parameter. It doesn't explicitly mention alternatives, but no sibling tool provides screenshot functionality, so this is acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_scrollA
Scroll the wheel at the current (or given) cursor position by (dx, dy) pixel deltas. Positive dy = down, positive dx = right.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| dx | Yes | ||
| dy | Yes | ||
| stepPx | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral burden. It clarifies the delta semantics (positive/negative direction mapping), which is a key behavioral detail. It also explains the 'current or given cursor position' behavior, which is a meaningful behavioral disclosure. It doesn't mention stepPx behavior or any side effects, but the direction mapping is the most critical semantic detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that conveys the core purpose and direction semantics efficiently. It front-loads the primary action and provides the most critical disambiguation (direction mapping) inline. Could arguably have mentioned stepPx, but overall it's tight and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters with 0% schema coverage and no output schema, the description covers dx/dy semantics but leaves stepPx completely unexplained. For a tool with optional parameters that aren't self-explanatory from names alone (x, y, stepPx), the description should elaborate more. However, the core function is adequately specified for basic use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 explains dx and dy semantics (pixel deltas, direction mapping) which is valuable. However, it provides no explanation of the optional x/y (cursor position) or stepPx parameters — stepPx in particular is cryptic from the schema alone (5 params, only 2 required) and the description does not clarify what it does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (scroll) and resource (wheel at cursor position), and specifies the coordinate semantics (positive dy = down, positive dx = right). It distinguishes itself from sibling mouse tools (move, click, drag) by focusing specifically on wheel scrolling. It doesn't explicitly name a sibling alternative, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (scrolling within a UI) and mentions it works at current or given cursor position, which is helpful. However, it doesn't explain when to prefer this over other input methods or mention any exclusions (e.g., not for canvas-panning scenarios, or when da_key/da_drag would be more appropriate).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_typeA
Type a string at the current keyboard focus. Empty string is a no-op. Optional per-char delay (ms).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| perCharDelayMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses useful behaviors: empty string is a no-op, and the optional per-char delay. However, it does not mention whether typing is fast by default, whether it waits for focus to be settled, whether it fails if no focus exists, or how it handles special characters/keystrokes embedded in the string.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with zero waste. Every element earns its place: the core action, the no-op edge case, and the delay parameter. Highly front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a relatively simple 2-parameter tool with no output schema, the description covers the essentials. However, given no annotations and 0% schema coverage, a bit more would help—for instance, whether the tool returns a success/error status, what happens when there's no active focus, and the default delay. These gaps are notable but not critical for a straightforward typing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains 'text' implicitly (the string to type) and 'perCharDelayMs' explicitly ('Optional per-char delay (ms)'). It also adds the no-op behavior for empty text. Minor gap: doesn't explicitly state that perCharDelayMs defaults to some value when omitted, though 'optional' implies a default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Type') with a specific resource ('a string at the current keyboard focus'), making the purpose unambiguous. It also distinguishes itself from the sibling da_key (which presumably presses individual keys) by specifying it types a string at the current focus, not at a coordinate or element.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool requires a pre-existing keyboard focus ('at the current keyboard focus') rather than establishing one, giving some implicit context. However, it does not explicitly state when to use this over da_key (for keystrokes/modifiers) or da_click (for focus establishment), nor does it name alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_verify_pixelsA
Block until a pixel-level predicate holds on the next screenshot, or timeoutMs (default 10000, max 60000) elapses. Predicates: {kind:"color", rgb:[r,g,b], tolerance?, minCount} (counts matching pixels, succeeds when count >= minCount); {kind:"diff", baseline:"", threshold, tolerance?} (succeeds when >= threshold fraction of pixels differ from the baseline PNG). Optional region clips the check to a rectangle. Polls every intervalMs (default 200). Throws NOT_FOUND on timeout. Use this to verify visual state after an action (e.g. "wait until 200+ red pixels appear on the canvas").
| Name | Required | Description | Default |
|---|---|---|---|
| region | No | ||
| displayId | No | ||
| predicate | Yes | ||
| timeoutMs | No | ||
| intervalMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral disclosure burden. It transparently explains polling behavior, default timeout and max, interval, error thrown (NOT_FOUND), and the exact semantics of both predicate types (color count and diff threshold). It also mentions optional region clipping, leaving little hidden behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured. It front-loads the core blocking behavior, then methodically explains the predicate types, parameters, defaults, and error behavior. Every sentence adds value, and the example cements understanding. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex verification tool with no annotations and no output schema, the description is remarkably complete. It covers the predicate grammar, all relevant parameters (except displayId), timing behavior, and error handling. The usage example and explicit conditions for success make it sufficient for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description thoroughly explains the key parameters: predicate structure (with required fields, tolerance, minCount, threshold, baseline), region, timeoutMs, and intervalMs. However, displayId is not mentioned in the description, leaving a gap for one of the five parameters. Given the schema offers no descriptions, this omission is a minor but notable issue.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Block until a pixel-level predicate holds on the next screenshot'. It uses a specific verb ('Block') and resource ('pixel-level predicate'), and distinguishes from siblings like da_wait_for_text by focusing on pixel conditions. The example 'wait until 200+ red pixels appear on the canvas' further clarifies its intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use this to verify visual state after an action'. It gives a concrete example and explains the blocking behavior with timeout. While it doesn't name alternative tools, the sibling list and the pixel-specific framing imply when to choose this over text-based wait tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_wait_for_textA
Block until text appears on screen (OCR + UI-element classification), or timeoutMs (default 5000, max 60000) elapses. Match strategy is identical to da_click_text / da_find_text — substring by default, set fuzzy: true for case-insensitive + whitespace-normalized matching. Polls every intervalMs (default 200, min 50, max 5000). Throws NOT_FOUND on timeout. Use this after a click / key / dialog-open to confirm the new state is painted before continuing.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| fuzzy | No | ||
| displayId | No | ||
| timeoutMs | No | ||
| intervalMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the burden of disclosing behavioral traits. It details blocking behavior, timeout defaults and max, polling interval defaults and bounds, the NOT_FOUND error on timeout, and matching semantics (substring, fuzzy). This is comprehensive and goes beyond typical descriptions for wait tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise but information-dense: three sentences that cover the core behavior, key parameters with defaults, error semantics, and a concrete usage example. Every sentence contributes value without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers most essential aspects: purpose, matching strategy, polling, timeout, error, and intended usage. However, with no output schema, it does not state what the tool returns on success, and displayId's role is not clarified. These are minor gaps given the tool's simplicity, but they prevent a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 explains text (target), fuzzy (case-insensitive + whitespace-normalized), timeoutMs (default 5000, max 60000), and intervalMs (default 200, min 50, max 5000). However, displayId is not mentioned in the description, leaving its meaning dependent on reader familiarity with sibling tools or the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: it blocks until a specified text appears on the screen, using OCR and UI-element classification. It mentions timeout behavior, and by comparing match strategy to da_click_text and da_find_text, it distinguishes itself as a waiting variant rather than a find/click tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage context: 'Use this after a click / key / dialog-open to confirm the new state is painted before continuing.' It also notes that the match strategy is identical to other tools, implying consistent behavior. However, it does not explicitly state when NOT to use it (e.g., for non-blocking checks), so a clear exclusion is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_wait_for_windowA
Block until a window with a matching title appears in da_window_list, or timeoutMs (default 5000, max 60000) elapses. Match strategies: "substring" (default, case-insensitive), "exact", or "regex" (full match). Polls every intervalMs (default 200, min 50, max 5000). Throws NOT_FOUND on timeout — use this after da_launch to wait for a newly-spawned app to finish painting before clicking inside it.
| Name | Required | Description | Default |
|---|---|---|---|
| match | No | ||
| title | Yes | ||
| timeoutMs | No | ||
| intervalMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and excels: it discloses blocking behavior, timeout defaults/max, match strategies (case-insensitive substring, exact, regex full match), polling interval defaults/bounds, and NOT_FOUND error on timeout.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with the core purpose, then parameter details, then error/usage. Each sentence adds unique, non-redundant information without unnecessary length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a blocking wait tool with no output schema, the description is fully self-contained: it explains behavior, defaults, error conditions, and usage context (after da_launch) while referencing da_window_list. No critical gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description adds critical meaning for every parameter: title matching, match strategy semantics, timeout/interval defaults and bounds, and error behavior. This goes well beyond the raw schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource formulation: 'Block until a window with a matching title appears in da_window_list'. This clearly distinguishes it from siblings like da_wait_for_text and da_window_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit contextual guidance: 'use this after da_launch to wait for a newly-spawned app to finish painting before clicking inside it.' However, it does not explicitly mention when not to use the tool or name alternative tools for exclusion cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_window_focusA
Bring a top-level OS window to the foreground so subsequent da_click / da_type / da_key land on it. Resolves the window either by hwnd (exact match) or by a case-insensitive substring of its title (optionally narrowed by pid). bringToTop: true (default) also calls SetWindowPos(HWND_TOP) on Windows so the window is at the top of the Z-order. Returns { hwnd, pid, title, foreground } where foreground: false indicates the OS refused the foreground change (e.g. another process holds the foreground lock on Windows). Throws NOT_FOUND when no visible window matches. Linux requires wmctrl on PATH; macOS uses osascript; Windows uses PowerShell + Win32 SetForegroundWindow.
| Name | Required | Description | Default |
|---|---|---|---|
| pid | No | ||
| hwnd | No | ||
| title | No | ||
| bringToTop | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: use of SetWindowPos, foreground failure indication via the `foreground` flag, NOT_FOUND error, and OS-specific dependencies (wmctrl, osascript, PowerShell). This exceeds the minimum needed for safe usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, resolution, default, return value, error, and OS notes. It is well-structured and appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, but the description explicitly includes the return object shape and key semantics. Combined with error and environment details, the agent has everything needed to invoke and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description compensates fully by explaining how each parameter is used: hwnd exact match, title case-insensitive substring, pid as optional narrowing, and bringToTop default behavior. This gives agents critical semantic understanding beyond raw types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's verb and resource: 'Bring a top-level OS window to the foreground' with an explicit purpose of directing subsequent da_click/da_type/da_key. It also distinguishes itself from sibling tools like da_window_list by focusing on bringing to foreground rather than enumerating windows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool (before input actions) and explains resolution by hwnd/title/pid. It does not explicitly mention alternatives or when not to use, but the usage scenario is strongly implied, qualifying as 'clear context, no exclusions'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
da_window_listA
List all visible top-level OS windows. Returns one WindowInfo per window with hwnd (platform-specific integer handle), pid (owning process id), title, rect (x/y/width/height), and isVisible. The hwnd can be passed to da_window_focus to bring the window to the foreground. Linux requires wmctrl on PATH; macOS uses osascript; Windows uses PowerShell + Win32 EnumWindows.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load of behavioral disclosure. It reveals platform-specific dependencies (wmctrl, osascript, PowerShell), the return structure (WindowInfo with fields), and the fact that it lists only visible top-level windows. It does not discuss error cases or performance, but the core behavior is well described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: it states the primary action first, then details return fields and platform requirements. Three sentences cover all necessary information without redundancy. Each sentence earns its place, and the format is easy for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple enumeration tool with no output schema or annotations, the description is quite complete. It specifies the output fields, platform dependencies, and a relevant usage pattern (passing `hwnd` to `da_window_focus`). It could mention edge cases like no visible windows or permission errors, but given the tool's simplicity, current coverage is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so schema coverage is trivially 100%. The baseline for 0-parameter tools is 4. The description adds value by explaining how the `hwnd` field can be used downstream, but since there are no parameters to document, the description does not need to compensate for missing parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'List all visible top-level OS windows.' This clearly states the tool's function and distinguishes it from siblings like da_window_focus (which brings a window to the foreground) by focusing on enumeration rather than manipulation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While no explicit 'use when' or alternative exclusions are stated, the description provides context for a primary use case: obtaining an `hwnd` to pass to `da_window_focus`. It also notes platform-specific prerequisites (wmctrl, osascript, PowerShell), giving practical guidance for when the tool can be invoked. There is no clear statement of when not to use it, but the main context is implied.
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. Dates show when Glama detected each change.
9 tool updates
v1.0.5- Added
da_click_text - Added
da_draw_path - Added
da_find_text - Changed
da_screenshot1 field changed- changed
Input schema / properties / displayId / anyOfPrevious value: -[ - { - "maximum": 32767, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +]
- Added
da_verify_pixels - Added
da_wait_for_text - Added
da_wait_for_window - Added
da_window_focus - Added
da_window_list
12 tool updates
v0.1.0- First observed
da_click - First observed
da_double_click - First observed
da_drag - First observed
da_get_mouse_position - First observed
da_key - First observed
da_launch - First observed
da_list_displays - First observed
da_move_mouse - First observed
da_ocr - First observed
da_screenshot - First observed
da_scroll - First observed
da_type
TDQS
Each tool targets a distinct action and resource: mouse positioning vs. clicking vs. dragging, text finding vs. clicking text vs. waiting for text, window listing vs. focusing vs. waiting. Even similar tools like da_find_text and da_click_text are clearly differentiated by whether they click, and da_move_mouse vs. da_drag is clarified by the button-hold behavior.
All tools share the da_ prefix and snake_case, but the pattern varies: most are verb_noun (da_move_mouse, da_list_displays), some are bare verbs (da_click, da_scroll, da_key), and a few are object-first (da_window_list, da_window_focus) or verb_prep_noun (da_wait_for_text, da_wait_for_window). This mix is readable but not fully predictable.
20 tools is on the high side, but the desktop automation domain genuinely requires coverage for mouse, keyboard, windows, displays, OCR, screenshots, and launching. Every tool earns its place and the count feels justified rather than bloated.
The surface covers core desktop automation workflows well: input, text location, window focus, waiting, and launching. Minor gaps exist—no window resize/move/close, no clipboard access, no region-specific screenshot capture—but agents can work around these without major dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Melaya is a remote MCP server. It gives an assistant hands on your own Android phone and browser: it reads the screen through the accessibility tree, then taps, types and navigates inside the apps and sites you allow-list, with no per-app API. It also builds, schedules and runs agent pipelines across 6k+ connected tools. OAuth 2.1, nothing to install.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceAn open-source MCP server for macOS and Windows that provides native desktop control via Accessibility APIs, OCR, and Chrome CDP. It enables AI agents to interact with applications, manage browser sessions, and automate workflows with high-speed native UI actions.3313AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceA desktop automation MCP server that enables AI agents to interact with Linux environments through screenshots, window inspection, and input simulation. It provides tools for mouse control, keyboard input, and screen capture using xdotool and XDG Desktop Portals.MIT
- AlicenseAqualityAmaintenanceWindows desktop automation MCP server — screenshot, mouse, keyboard & UI Automation. Lets LLM agents see and control your Windows desktop directly.301,29217MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that gives any AI assistant eyes and hands on your desktop — screenshots, clicking, typing, OCR, window management, accessibility-tree queries, workflow recording.5Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/cioinside/da-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server