deskwright
Provides computer-use capabilities for a GNOME desktop environment, enabling AI agents to launch applications, read UI widgets, click, type, drag, manage windows, take screenshots, OCR text, and record the screen.
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., "@deskwrightTake a screenshot and read me what's on the screen"
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.
Deskwright
Computer use for AI agents on GNOME Wayland.
Let your coding agent use your Linux desktop. Or give it one of its own, so it stops stealing your mouse.
Install • What it can do • A desktop of its own • When something's off • Security
Claude Code can edit your files and run your commands. It can't open GIMP, click a button in a settings dialog, or read what a native app is showing you. On macOS and Windows it can, through computer use. On Linux that's still on Anthropic's list.
This fills the gap on GNOME. It's an MCP server plus a small shell extension, and it hands an agent the actual desktop: launching apps, reading widgets, clicking, typing, dragging, window management, OCR and screen recording. Any MCP client can drive it. Claude Code, Codex, Cursor, your own script.
The part people tend to like most: DESKWRIGHT_SESSION=headless runs all of
it on a virtual monitor that isn't on any of your screens. Your agent gets a real GNOME
desktop to work on, and it never takes your focus.
Why this exists
Wayland deliberately stops an application from seeing or touching any other
window. That's a good rule, and it's why xdotool, wmctrl and grim either
do nothing on GNOME or fail in ways that look like your own mistake. Every
Linux computer-use project I found either shipped a Docker container running
X11, or quietly assumed X11 and broke.
So I went looking for what GNOME actually permits, and it turns out to be quite a lot, just not where anyone looks. Mutter answers D-Bus. AT-SPI, the accessibility layer built for screen readers, exposes every real widget in every running app with its name, its role and the action it performs. And a shell extension runs inside gnome-shell itself, where the rest lives.
That middle one matters more than it sounds. Pressing a widget's own accessibility action isn't a nicer way to click. It's a different thing: it can't miss, it survives the window moving, and it needs no pointer at all. An agent working this way stops guessing at coordinates, and stops taking a screenshot after every action to find out what happened.
Related MCP server: Wayland MCP Server
Install
You need GNOME Shell on Wayland. Check with echo $XDG_CURRENT_DESKTOP $XDG_SESSION_TYPE, which should mention GNOME and wayland.
The lazy way: hand it to your agent
Open Claude Code, or Codex, or whatever you use, and say:
Set up https://github.com/tristanmuzzu/deskwright on this machine, follow the AGENTS.md.
AGENTS.md is a runbook written for agents. Every command, how to
check each one worked, the right package names for Debian, Fedora and Arch, and
the handful of things that go wrong with their fixes. Your agent will ask you
for a sudo password once and tell you to log out once. That's your whole
involvement.
By hand: two commands and a logout
pipx install --system-site-packages deskwright
deskwright-setupdeskwright-setup narrates every step. It turns on the accessibility flag, installs
the bundled shell extension, and tells you about any missing system package
with the right install line for your distro, so you're never guessing at
package names. It never runs sudo itself.
Then log out and log back in. Once. There's no way around this one: on Wayland, gnome-shell only picks up an extension at session start.
Last step, point your client at it:
claude mcp add deskwright --scope user -- deskwrightThat's it. Ask your agent to open an app and it will.
PyGObject publishes no wheels to PyPI. It's a distro package everywhere
(python3-gi, python3-gobject, python-gobject), so an isolated venv can't
import it. Leave the flag off and you get a server that starts cleanly and then
dies on the first click with input_backend_failed.
uvx has no equivalent flag, which is the only reason this says pipx. If you'd
rather skip pipx, a plain python3 -m venv --system-site-packages followed by
pip install deskwright works identically.
The repo is also a plugin marketplace. It registers the server plus a skill that teaches an agent which tool to reach for first.
claude plugin marketplace add tristanmuzzu/deskwright
claude plugin install deskwright@deskwrightThe plugin runs the server from its own checkout, so there's no pip install. You still need the system packages and the extension, so run the setup out of the checkout Claude Code cloned for you, once:
~/.claude/plugins/marketplaces/deskwright/bin/deskwright-setupThen log out and back in, same as above.
git clone https://github.com/tristanmuzzu/deskwright
cd deskwright
bin/deskwright-setup
./mcp_server.py --self-test./mcp_server.py is the same entry point as the deskwright
command, by the path older registrations already point at.
CONTRIBUTING.md has the layout and which test suites need
a real session.
Check it works
DESKWRIGHT_SESSION=headless deskwright --self-testYou want 18/18 passed. It runs on a virtual monitor rather than your screen,
so it's safe to run while you're working. The first run takes about 20 seconds
because it has to start a second gnome-shell.
Drop DESKWRIGHT_SESSION=headless and it tests your real desktop instead. Do that one
while you're looking at the screen: the self-test injects real input, because
it's checking the guards that refuse dangerous key combinations.
When something's wrong, ask your agent to call desktop_health. It answers in
one line whether this desktop is usable, then says which mechanisms work right
now and what each of them will actually do.
What it can do
33 tools, roughly 11k tokens of schema in a session. That's the honest price, and it's why each one returns enough that you don't need a second call to work out what happened. The order below is the order an agent should reach for them. Accessibility tree first, pixels last.
Tool | What it's for |
| Find things. |
| The good one. Invokes the widget's own action, so it can't miss. Wants |
| The good one for typing. Writes straight into the widget with no focus and no keyboard, then reads it back to prove the write landed. |
| Read a widget's contents. This is how you verify something worked. |
| Start an app by desktop id and wait for its window, inside one call. |
| Where everything is, in pixels: windows top of stack first, plus every pressable widget of the focused app with the point to click it at. Each carries a |
| Real pointer input in absolute screen coordinates. Pass |
| What a click at a point would hit, before you click it. And where the pointer is now, or an honest note that only the last position it set is known. |
| Where a visible string is, in screen coordinates. OCR, about 0.3s for a window, and no image in your transcript. This is the answer for Chrome, Electron and Qt, which expose almost nothing to |
| Wait for a window, a widget, some text, a focus change or the clipboard, instead of sleeping a guessed number of seconds. |
| Wait for pixels to change. For what |
| Pass or fail with evidence, so a long run can decide for itself that it's finished. |
| A known sequence in one call, validated before anything runs, with per-step retry and one picture at the end, or at the step that broke. |
| Window list, focus, and move, resize, close, minimize, maximize, workspace. |
| A picture, or a full-resolution crop of one window, region or widget. |
| For anything that moves, because a still can't show motion. |
| Keyboard input through compositor keysyms, with focus proven before anything gets typed. |
| Pasting beats two thousand keystrokes, and reading back is how you check it arrived. |
| The trail of everything the agent did: arguments, outcome, whether it landed, screenshot hashes. For reviewing an unattended run, or working out where you are after a context reset. |
| One line on whether this desktop is usable, then the detail. |
A second desktop it uses while you work
An agent that needs your screen is only half useful. deskwright-headless starts a
separate GNOME session on a virtual monitor, with its own session bus, its own
gnome-shell --headless and its own runtime directory. A server pinned to it
drives that desktop with the same 33 tools while you keep the physical one.
deskwright-headless start # about 200 MB of gnome-shell, idempotent
deskwright-headless status # liveness, memory, bus address
deskwright-headless stop # don't leave it idling on an 8 GB machineRegister it as a second MCP server and you can hand it long jobs:
claude mcp add deskwright-headless --scope user --env DESKWRIGHT_SESSION=headless -- deskwrightSessions are named, so two agents can each have a desktop of their own and never watch each other's windows move:
deskwright-headless start --name work
deskwright-headless list # every session, memory used, memory free
DESKWRIGHT_SESSION=headless:work deskwrightGive a session its own home and it boots a GNOME that has never been used: no desktop icons, no session restore, no recent files. That is what you want for a recorded demo or a clean-room test, where the default behaviour of sharing your home means an editor opens your last document.
deskwright-headless start --name demo --home /tmp/demo-homeThere are guards on this, because each session is a real compositor at around
205 MB: a per-name start lock so two agents can't both spawn one, a session cap
(DESKWRIGHT_HEADLESS_MAX, default 4), and a free-memory floor that refuses a start
which would push the machine into swap. The agent that would cause that can't
see it coming, so the server does.
When something's off
The extension says INACTIVE, or window tools don't work. You haven't logged out yet. gnome-shell can't load an extension without a session restart and there's no workaround. Until then you still get AT-SPI, pointer, keyboard and clipboard. You don't get window management, extension screenshots, pointer position or the halt switch.
An app shows no widgets in ui_tree. It was already running when
toolkit-accessibility got turned on. Apps read that setting at startup, so
restart the app.
Chrome, Electron or Qt apps look empty. As far as AT-SPI is concerned, they
are. Use find_text instead, which OCRs the screen and hands back coordinates.
For Chrome specifically, launching it with --force-renderer-accessibility
gets you a real tree at a small performance cost.
Everything fails with input_backend_failed. pipx without
--system-site-packages. Reinstall with the flag:
pipx install --force --system-site-packages deskwrightEvery ui_* call says "Namespace Atspi not available". You have
python3-gi but not the AT-SPI typelib, which is a separate package:
gir1.2-atspi-2.0 on Debian and Ubuntu, at-spi2-core on Fedora and Arch.
deskwright-setup --check catches this and names it.
A tool returns halted. Somebody pressed Super+Ctrl+Escape, which is the
halt switch. Press it again to clear it.
Your screen locked and half the tools stopped. Expected. GNOME unloads
extensions that don't declare unlock-dialog, so screenshots and window
geometry go away until you unlock. AT-SPI keeps working, so ui_find,
ui_press and ui_read_text all still do.
What it won't do
Deliberately out of scope as a project, not just off by default:
No CAPTCHA solving. CAPTCHAs exist to tell humans from software. This is software.
No credential typing features. Nothing here is built to harvest, store or autofill secrets. The journal doesn't record what gets typed, only how much.
No detection evasion. No timing jitter to look human, no fingerprint spoofing, no anti-anti-bot work.
No cloud, no telemetry, no account. It's a local process on your session bus, and nothing leaves the machine.
On the other side of that line the design is deliberately permissive. The agent is trusted, and the tooling's job is to make it capable rather than to fence it in. The whole safety budget goes to three things: a halt switch a human can always reach, guards against actions that can't be undone, and an honest record of what happened. SECURITY.md is blunt about what enabling this actually switches on, and it's worth reading before you point it at your real screen.
How it actually works
Wayland denies all of this to Wayland clients. It says nothing about D-Bus, and that's where the doors are. Four mechanisms, roughly in order of how much work they carry:
AT-SPI for anything semantic. Real widgets, real actions, no pointer.
A gnome-shell extension over D-Bus for what gnome-shell keeps to itself: window enumeration and control, screenshots, pointer position, and a keybinding grab for the halt switch.
org.gnome.Mutter.RemoteDesktopfor pointer and keyboard. Absolute coordinates, and keysyms rather than key positions, so your keyboard layout can't transpose what gets typed.xdg-desktop-portalfor the same thing, standardised. This is the route to compositors that aren't GNOME.
Worth knowing: number 2 is the only one of those that isn't already open. Mutter's ScreenCast and RemoteDesktop interfaces answer any client on your session bus with no consent dialog, which is why recording here needs no permission popup, and why the portal is a caller of them rather than a gate in front of them. SECURITY.md has the exact commands if you'd rather check that yourself than take my word for it.
docs/field-notes.md is the long version: every wall
hit on the way here, what the compositor refused, and the measurements that
shaped the tool surface. It's the file to read when something behaves oddly, or
before you change the code.
Requirements
deskwright-setup --check is the real answer. It detects everything, names the
package for your distro and exits nonzero if a hard requirement is missing.
The short version:
Platform | Status |
GNOME Shell 50 on Wayland | Verified. Developed on 50.1 (Ubuntu 26.04), live suites run against it on every change. |
GNOME Shell 48 to 49 | Should work. Same D-Bus and AT-SPI surfaces, not tested. Reports welcome, attach |
KDE Plasma, Sway, Hyprland | Input only. The portal backend drives pointer and keyboard, but window management and screenshots need per-compositor work that isn't done. |
X11 | Not a target. |
Claude Code, not Cowork. On Linux the desktop app runs Cowork tasks inside a QEMU/KVM virtual machine, so an MCP server it starts lives in that VM and cannot see your session bus, your gnome-shell or your screen. Everything here would fail there. Use it from the Claude Code CLI, the Code tab, or any other MCP client running on the host itself.
Claude Code, not Cowork. On Linux the desktop app runs Cowork tasks inside a QEMU/KVM virtual machine, so an MCP server it starts lives in that VM and cannot see your session bus, your gnome-shell or your screen. Everything here would fail there. Use it from the Claude Code CLI, the Code tab, or any other MCP client running on the host itself.
Packages, using Debian names (deskwright-setup prints yours): python3-gi,
gir1.2-atspi-2.0, python3-pil, libglib2.0-bin, wl-clipboard,
tesseract-ocr. ydotool is optional and only used as an input fallback. The
headless session additionally wants gnome-shell and dbus-daemon as
binaries, which any normal desktop already has.
Contributing, security, license
CONTRIBUTING.md has the layout, the test suites and what
each one needs. SECURITY.md is the threat model, stated
plainly. ROADMAP.md is what's next and why, in order.
Apache-2.0. If you get it running on a compositor that isn't GNOME, or on a GNOME older than 50, please open an issue and say so. That's the most useful thing anyone can send.
mcp-name: io.github.tristanmuzzu/deskwright
Available Tools
33 toolsactivate_windowA
Focus and raise a window, then confirm focus actually landed there. Returns an error rather than a false success.
| Name | Required | Description | Default |
|---|---|---|---|
| look | No | What to show you afterwards. Default "auto": wait for the screen to stop changing, measure how much this action changed, and attach a picture of the affected window only if something did change -- so a click that hit nothing costs no tokens and says so. "window" always attaches it, "screen" uses the whole desktop (slower, 6x the tokens), "region" uses look_at, false skips all of it. Use false for the middle of a sequence you are going to check at the end anyway. | auto |
| target | Yes | Window id from list_windows, or a wm_class / title fragment. The window is activated and focus is CONFIRMED before any key is sent; if focus does not land, nothing is typed. | |
| look_at | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| settle_max_s | No | How long to wait for the screen to stop changing before looking. Raise it for an app that animates slowly; set it to 0 to capture immediately. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it discloses the most important behavior: focus is verified and failure produces an error rather than a false success. It does not describe effects on window stacking or minimized windows, but the core activation guarantee is explicit.
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 short sentences with no filler; the main action and the error guarantee are front-loaded. Every clause adds information.
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 activation tool with fully documented parameters, the description plus schema gives enough to call it correctly. It lacks an explicit success return contract, and there is no output schema, but the error-on-failed-focus statement covers the most important outcome.
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 100%, so the description does not need to restate parameters. It adds no parameter-level detail, but every parameter is already well documented in the input schema, meeting the baseline.
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 and resource ('focus and raise a window') and adds a verifiable success criterion ('confirm focus actually landed'), which distinguishes it from inspection tools like list_windows or window_at. It is immediately clear what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not state when to choose this tool over siblings such as window_manage or list_windows, nor does it mention prerequisites or exclusions. The only hint that it belongs before input actions is in the target parameter schema, not in the tool description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assert_stateARead-only
Prove the desktop is in a state, with evidence -- the honest way to END a task. Each assertion comes back passed/failed with what was actually observed; a false assertion is a result, not an error. Give any of: window_exists, window_focused, text_present, widget_exists, clipboard_contains.
| Name | Required | Description | Default |
|---|---|---|---|
| text_present | No | {"text": ..., "window": ...}: the string must be visible (OCR) in that window. | |
| widget_exists | No | {"app": ..., "text" and/or "role"}: a matching AT-SPI widget must exist. | |
| window_exists | No | A window id, wm_class or title fragment that must exist. | |
| window_focused | No | A window that must exist AND hold focus. | |
| clipboard_contains | No | The clipboard text must contain this string. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses two decisive behaviors: assertions 'come back passed/failed with what was actually observed' (return semantics), and 'a false assertion is a result, not an error' — telling the agent a failed check is a normal outcome, not a thrown error. The 'honest/evidence' framing adds integrity context no annotation carries. No conflict with readOnlyHint; asserting is a read-only 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?
Three sentences of roughly 50 words, purpose front-loaded in the first clause. Sentence 2 delivers the load-bearing result-vs-error semantic; sentence 3 enumerates the argument options. Every sentence earns its place and adds new information — no padding or restatement of the name.
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 moderate-complexity read-only tool (5 optional nested parameters, no output schema), the description covers what an agent needs: when to call (task end), what to pass (one of the five), and what happens (passed/failed with observed evidence, never an error). It compensates for the missing output schema with clear return semantics. Minor gaps remain — exact multi-parameter behavior and precise response shape — but the routing and invocation choices are adequately covered given the sibling set.
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 100% — the schema already documents each parameter (e.g., text_present requires OCR visibility, widget_exist targets AT-SPI). The description adds the key semantic beyond the schema: 'Give any of: ...' clarifies these are alternative single assertions, a constraint the all-optional schema leaves implicit. It does not say what happens when multiple are passed at once, but the schema carries the per-parameter detail.
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?
States a specific verb + resource: 'Prove the desktop is in a state' — an assertion/verification tool over desktop state. The five assertion types are enumerated (window_exists, window_focused, text_present, widget_exist, clipboard_contains), and 'the honest way to END a task' positions it against action/search siblings like wait_for and ui_find. An agent can tell what this tool is for without ambiguity.
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 a clear usage context — use at the end of a task to verify the final state with evidence, and a failed assertion is a valid result. However, it does not explicitly name alternatives (e.g., wait_for for polling until a condition becomes true) or state when not to use it, so the routing guidance is context-only, not exclusion-based.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clipboard_readARead-only
What is on the clipboard. Text by default; types:true lists the offered mimetypes instead. An empty clipboard is a clean result, not an error, and a clipboard owner that never serves its offer is reported after a short deadline instead of hanging.
| Name | Required | Description | Default |
|---|---|---|---|
| types | No | List offered mimetypes instead of reading text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds valuable behavioral edge cases beyond that: an empty clipboard is a clean result rather than an error, and a non-serving clipboard owner is reported after a short deadline instead of hanging. These details prevent an agent from misinterpreting empty output as failure and reassure about timeout behavior. No contradiction exits with the read-only annotation.
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 three compact sentences with no filler: the first establishes the core purpose, the second explains the only parameter, and the third covers important edge-case behavior. Each sentence adds distinct value and the most important information is front-loaded. It is an example of efficient, well-structured documentation.
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 single-parameter read tool, the description is complete: it explains the default return, the alternative mimetype mode, and the two non-obvious edge cases (empty clipboard and hanging clipboard owners). There is no output schema, so the description appropriately covers return semantics. No prerequisites or additional failure modes are needed for correct invocation.
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 100%, and the schema already describes types as 'List offered mimetypes instead of reading text.' The description reinforces this by stating 'Text by default; types:true lists the offered mimetypes instead,' which clarifies the default but adds little beyond the schema. This matches the baseline where the schema carries the parameter semantics.
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 identifies the resource (clipboard) and the read operation, with 'What is on the clipboard' immediately conveying purpose. It also distinguishes two modes—reading text by default and listing mimetypes with types:true—so an agent knows exactly what the tool returns. The read intent is obvious even without an explicit imperative verb, and it is clearly differentiated from the sibling clipboard_write.
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 clear context for when to use this tool: whenever clipboard contents are needed, with the types parameter for inspecting offered mimetypes. It does not explicitly reference alternatives or exclusion conditions, but the sibling list makes the read-vs-write distinction apparent. The default behavior and parameter switch are stated precisely enough for an agent to choose the correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clipboard_writeA
Put text or a file's bytes on the clipboard, and PROVE it landed by reading it back. Goes through the gnome-shell extension so the compositor sets the clipboard itself -- mutter has a measured bug (S-018) where an external client's offer can serve wrong bytes to text requests, so wl-copy is only the fallback and says so when used.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | File whose bytes go on the clipboard, e.g. a PNG | |
| text | No | Text to place on the clipboard. Give this OR path+mimetype, not both. | |
| mimetype | No | The type those bytes are offered as, e.g. image/png. Required with path. |
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 that the tool will write and then read back to verify, that it goes through gnome-shell/mutter rather than an external client, why that matters (bug S-018), and that the wl-copy fallback says when it is used. This is unusually transparent about side effects and implementation 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?
Two sentences, front-loaded with the core action and verification guarantee, followed by a concise rationale for the implementation choice. The mutter bug detail earns its place by explaining why the fallback exists and why the extension path is preferred.
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 explains purpose, mechanism, verification, and fallback behavior, and the schema completes parameter semantics. The main gap is that without an output schema, return/error behavior is only implicit ('prove it landed' and the fallback 'says so'), so an agent might not know exactly what to expect on success or failure.
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 already documents all three parameters with 100% coverage, including the 'text OR path+mimetype' constraint and the role of mimetype. The description adds only the high-level 'text or a file's bytes' framing, which does not materially deepen parameter understanding 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 opens with a specific verb and resource: 'Put text or a file's bytes on the clipboard.' It also explains the mechanism (gnome-shell extension) and distinctly implies the inverse operation of the sibling clipboard_read, so an agent can tell it apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives context about when the extension path is used and mentions wl-copy as a fallback that identifies itself when used, but it does not explicitly state when to prefer this tool over clipboard_read or any alternative. The usage guidance is mostly implied by the tool name and action, not stated as routing rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
desktop_healthARead-only
Whether each mechanism is usable right now, and what each one will actually do: extension state and which methods the RUNNING shell has (an edited extension does not load until the next login), absolute pointer control, window and AT-SPI counts, keyboard layout, and the XTEST trap. Call this first when something behaves oddly.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds valuable behavioral detail: it reports live state of the running shell, calls out the edited-extension-not-loading-until-login caveat, and exposes specifics like XTEST trap and AT-SPI counts. This gives the agent a concrete mental model of what the tool reveals without an output 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?
A single front-loaded sentence opens with the core question ('whether each mechanism is usable right now') and then delivers a compact, comma-separated list of specifics. Every clause earns its place, and the parenthetical about edited extensions is high-value nuance rather than padding.
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 parameterless tool with no output schema, the description is complete: it names the mechanisms covered, explains the kind of information returned, flags an important reload caveat, and even gives call-order guidance. An agent has everything needed to select and invoke it 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 tool takes zero parameters and the schema is empty, so there is no parameter meaning to add. Per the zero-param baseline this is a non-issue; the description spends no unnecessary words on parameters.
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 exactly what the tool reports: whether each desktop-automation mechanism is usable right now and what it will do, enumerating extension state, running shell methods, pointer control, counts, keyboard layout, and the XTEST trap. This clearly identifies a diagnostic resource and sets it apart from the sibling action tools like pointer_click or ui_find by framing it as an environment health check.
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?
It gives an explicit trigger: 'Call this first when something behaves oddly.' That tells an agent when to invoke it, but it does not spell out when not to use it or name alternatives, so it stops just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
do_stepsA
Run a short sequence of actions in ONE call and look once at the end. Every separate tool call costs a model round trip of several seconds while the action itself takes milliseconds, so a known sequence -- activate, click, type, press Return, see the result -- belongs here rather than in four calls. Steps run with their own look off; the picture is taken after the last one, or at the step that failed. Use single tools when the next action depends on what the last one revealed. The sequence is validated up front -- a call that cannot finish never starts.
| Name | Required | Description | Default |
|---|---|---|---|
| look | No | What to show you afterwards. Default "auto": wait for the screen to stop changing, measure how much this action changed, and attach a picture of the affected window only if something did change -- so a click that hit nothing costs no tokens and says so. "window" always attaches it, "screen" uses the whole desktop (slower, 6x the tokens), "region" uses look_at, false skips all of it. Use false for the middle of a sequence you are going to check at the end anyway. | auto |
| steps | Yes | Ordered actions. Each is {do: verb, ...the same arguments that tool takes}. Verbs: activate(target), click(x,y), move(x,y), drag(from_x,from_y,to_x,to_y), scroll(x,y,dy), type(target,text), key(target,combo), press(path,expect_name), set_text(path,text), wait_for(condition,target,timeout) -- same arguments as the wait_for tool; 'wait' is an alias -- and sleep(ms, 1-60000; prefer a wait_for condition over a guessed duration). A malformed step anywhere refuses the whole call naming that step, and nothing executes. Any step may carry retry: {"attempts": N, "on": [codes]} -- it reruns on those error codes (default: the world-moved set) and reports how many runs it took. | |
| look_at | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| settle_max_s | No | How long to wait for the screen to stop changing before looking. Raise it for an app that animates slowly; set it to 0 to capture immediately. | |
| stop_on_error | No | Stop at the first failing step. Leave this true unless the steps are genuinely independent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that steps run with their own look off, the picture is taken after the last step or the failing step, and the sequence is validated up front so a call that cannot finish never starts. This is useful, non-obvious execution 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 front-loaded with the core purpose, then explains the cost rationale, the alternative case, and the up-front validation guarantee. Every sentence contributes and no space is wasted.
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 tool with no output schema, the description covers the critical context: when to batch, when not to, how look behaves, and how failures are handled. A formal return description is absent, but the observable outcomes are clearly implied.
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?
Input schema coverage is 100%, and the schema already documents steps, look, look_at, settle_max_s, and stop_on_error in detail. The description adds selection context but does not need to repeat parameter syntax; it correctly leaves parameter semantics to 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 first sentence clearly states the tool's purpose: run a short sequence of actions in one call and look once at the end. It also names typical verbs and explicitly contrasts with making four separate calls, making it distinguishable from the single-action sibling tools.
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 explicit when-to-use guidance: batch known sequences because separate calls cost round trips, and use single tools when the next action depends on what the last one revealed. This directly tells an agent when to choose do_steps versus a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_textARead-only
Where a visible piece of text is on screen, in coordinates you can click. Reads the pixels with OCR, so it works in Chrome, Electron and Qt apps, which expose almost nothing to ui_find. Try ui_find FIRST -- pressing a real widget cannot miss -- and come here when it returns nothing. About 1.5s for a window; cheaper and more exact than taking a picture and estimating. Blind to icon-only buttons: there is no text in them to read.
| Name | Required | Description | Default |
|---|---|---|---|
| psm | No | tesseract page segmentation mode. Defaults to 6 inside a window and 11 for the whole screen, which is what measured best for each. | |
| text | Yes | The visible string to find. A phrase is matched across consecutive words on one line. | |
| exact | No | Whole word, case sensitive. | |
| limit | No | ||
| region | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| window | No | Search inside this window only (id, wm_class or title fragment). Much faster and far fewer false matches than the whole screen. | |
| min_confidence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the readOnlyHint annotation: it reads pixels with OCR, takes about 1.5 seconds per window, is cheaper and more exact than estimating from a screenshot, and is blind to icon-only buttons. No contradiction with annotations.
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?
Four concise sentences with no filler. The core purpose and clickable-coordinate outcome are front-loaded, followed by the comparison to ui_find, performance characteristics, and the key limitation.
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 7-parameter tool with no output schema, the description covers purpose, alternative routing, performance, and limitations well. It implies a coordinate result but does not explicitly describe the return format or how limit/min_confidence affect results, which is a minor gap.
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 enriches parameter understanding by explaining how text phrases are matched across consecutive words on one line and by giving the default PSM modes for window vs whole-screen searches. The schema already covers most parameters; min_confidence and limit lack schema descriptions, but the description provides enough context for typical use.
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 and resource: locating visible on-screen text and returning clickable coordinates via OCR. It also distinguishes itself from ui_find by naming the exact gap it fills (OCR-based pixel reading for Chrome/Electron/Qt apps).
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?
Explicitly instructs the agent to try ui_find first and only fall back to find_text when ui_find returns nothing, with a clear rationale. Also notes the limitation with icon-only buttons, so the agent knows when this tool is unsuitable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
framesARead-only
Turn a video into ONE image you can actually look at: N frames, evenly spaced, stamped with frame number and timestamp, tiled into a contact sheet. This is the other half of screencast -- a model cannot decode an mp4, so a recording is useless until it becomes stills. Also measures per-frame change and reports duplicate frames, which detects a source repainting slower than the capture rate and catches stutter and frozen output that eyeballing misses. Use from_frame/to_frame to zoom into a fraction of a second once the overview shows where the interesting moment is. Works on any video, not just screencast output.
| Name | Required | Description | Default |
|---|---|---|---|
| cols | No | ||
| path | Yes | The video to read, e.g. /tmp/cast.mp4 | |
| rows | No | ||
| outdir | No | Where to write the sheet; defaults to <video>-frames next to the video | |
| compare | No | A second video. Its sheet is stacked underneath the first in ONE image, which is what a before/after needs -- two separate sheets are never on screen together to be compared. | |
| to_frame | No | ||
| from_frame | No | Start of a dense slice, in frames. Omit to span the whole clip. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry the safety profile (readOnlyHint=true), and the description adds substantial behavior beyond that: the output is exactly ONE tiled image with frame-number and timestamp stamps, per-frame change is measured, and duplicate frames are reported to catch stutter and frozen output. It also discloses how compare stacks a second sheet underneath in the same image, a non-obvious behavioral trait. No contradiction with the read-only annotation.
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?
Five sentences, each earning its place: core purpose, why the tool exists (models cannot decode mp4), extra detection behavior, parameter workflow, and scope clarification. The core verb-and-output is front-loaded in the first sentence, and no wording is redundant.
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 7-parameter tool with no output schema, the description covers the output artifact, the overview-then-zoom workflow, the compare layout, and the duplicate-detection behavior. The only notable omission is the return value, an agent is not told what the function returns after writing the sheet, though the outdir parameter provides the artifact location.
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 57% schema coverage, the description compensates for the real gaps: to_frame has no schema description at all, and the description explains its purpose alongside from_frame as a zoom into a fraction of a second. It also enriches compare's rationale (before/after needs both sheets in ONE image). However, cols and rows are left to inference from the 'tiled into a contact sheet' context rather than being explained.
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 first sentence states a specific verb-plus-resource: turn a video into ONE image, with N evenly spaced frames stamped with frame number and timestamp, tiled into a contact sheet. It explicitly positions this against the sibling screencast as the other half of screencast, so an agent can distinguish it from the other 32 tools without opening the schema.
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 names screencast as the complementary sibling and states the trigger condition: a model cannot decode an mp4, so a recording is useless until converted to stills. It also prescribes a workflow, use from_frame/to_frame to zoom into a fraction of a second once the overview shows the interesting moment, and scopes applicability with Works on any video, not just screencast output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hold_keyA
Hold ONE key down for a duration, then release it -- a real press and a separate release, not a tap. For shift-selection, held-key scrolling and games. Blocks for the whole duration; press_keys is the tool for combinations.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | One key, e.g. 'shift', 'down', 'w'. No combos. | |
| look | No | What to show you afterwards. Default "auto": wait for the screen to stop changing, measure how much this action changed, and attach a picture of the affected window only if something did change -- so a click that hit nothing costs no tokens and says so. "window" always attaches it, "screen" uses the whole desktop (slower, 6x the tokens), "region" uses look_at, false skips all of it. Use false for the middle of a sequence you are going to check at the end anyway. | auto |
| target | No | Window id from list_windows, or a wm_class / title fragment. The window is activated and focus is CONFIRMED before any key is sent; if focus does not land, nothing is typed. | |
| look_at | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| seconds | Yes | How long to hold. The call blocks for this long. | |
| settle_max_s | No | How long to wait for the screen to stop changing before looking. Raise it for an app that animates slowly; set it to 0 to capture immediately. |
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 discloses important behavior: it is a real press with a separate release, not a tap, and blocks for the duration. This adds meaningful behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no waste. The core behavior is front-loaded, followed by use cases, the blocking caveat, and the sibling alternative that should be used instead.
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 combination of the description and the rich input schema covers the high-level behavior, blocking semantics, target focus guarantee, and visual feedback options. No output schema exists, but the tool's primary semantics are clearly conveyed.
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 100%, so the baseline is 3. The description does not add parameter-specific detail beyond what the schema already provides, but the schema fully documents key, seconds, look, target, look_at, and settle_max_s.
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 and resource: 'Hold ONE key down for a duration, then release it'. It clearly distinguishes this from a tap and from press_keys for combinations, so an agent can tell it apart from sibling tools without opening the schema.
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 states explicit use cases ('shift-selection, held-key scrolling and games') and names the alternative tool ('press_keys is the tool for combinations'). It also warns that the call blocks for the whole duration, giving clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
journalARead-only
Read back the trail of acted tool calls -- every state-changing call is journaled with its arguments, outcome, hit/miss verdict and screenshot hash. Use it to reconstruct what already happened after context loss, or to review an unattended run. Reading tools are not in it.
| Name | Required | Description | Default |
|---|---|---|---|
| tail | No | How many of the most recent entries to return, oldest first. | |
| session | No | current: only this server process's actions. all: every session in the 14-day retention window. | current |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true, the safe-read nature is already annotated. The description adds meaningful context about what the journal contains, what it excludes, and the audit/replay use case, going beyond the annotation's bare safety signal.
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 tight sentences: the first states the core function and contents, the second gives usage guidance and an exclusion. Every sentence earns its place with 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?
The tool is simple, the schema is complete, and the read-only annotation covers safety. The description explains the return content, use cases, and exclusions, so an agent has enough context to select and invoke the tool correctly without an output schema.
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 describes both parameters fully, including default values, constraints, and field-specific semantics, so schema coverage is 100%. The description adds no additional parameter-level detail, which fits the baseline 3 for high 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 and resource: 'Read back the trail of acted tool calls.' It also clarifies scope and content by listing what is journaled (arguments, outcome, hit/miss verdict, screenshot hash) and distinguishes itself from sibling tools with 'Reading tools are not in it.'
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 explicit use cases: reconstruct past context after loss and review an unattended run. It also provides a when-not-to-use signal by stating that reading tools are not included, though it does not name specific alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
launch_appA
Start an application and confirm it actually arrived: the result carries the NEW window's dict (or, while the screen is locked, the new AT-SPI app) and names which mechanism confirmed. Every real task starts with an app that is not running yet; this is that step, inside the protocol instead of a shell command.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Optional file for the app to open | |
| command | No | Argv list, not a shell string. Exactly one of desktop_id/command. | |
| timeout | No | ||
| desktop_id | No | Desktop id for `gio launch`, with or without '.desktop', e.g. 'org.gnome.TextEditor' | |
| wait_window | No | Confirm arrival by a NEW window id (or a new AT-SPI app when the extension is down). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it does disclose substantial behavior: launch confirmation is actually verified, the result carries the NEW window dict, and the screen-locked fallback returns a new AT-SPI app while naming the confirming mechanism. It could add failure behavior, but the core side effects and return semantics are clear.
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 only two sentences. The first sentence leads with the action and immediately gives the confirmation contract; the second gives the use-case context. Every clause carries useful information, with no padding.
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 the lack of an output schema, the description usefully describes result contents, including the locked-screen behavior. It also signals the protocol-native intent. It does not detail failure/timeout behavior, but the schema's timeout min/max/default partially fills that gap, so overall the tool is usable for first-step launch tasks.
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 at 80%, and the schema already explains file, command, desktop_id, and wait_window, including the exact-one constraint between desktop_id/command. The tool description adds no per-parameter meaning beyond that, so the agent has adequate but not enriched parameter semantics.
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 and resource: 'Start an application and confirm it actually arrived.' It also clarifies what makes this tool distinct from listing or activating apps: it handles the case where the app is not running yet, and it reports the NEW window or AT-SPI app that confirms launch.
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?
It gives clear context: 'Every real task starts with an app that is not running yet; this is that step.' The phrase also positions launch_app as the protocol-native replacement for shell-launching, so an agent knows when to reach for it. It does not explicitly name sibling alternatives, but the use-case signal is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_windowsARead-only
Every open window with id, wm_class, title, geometry, pid and which one has focus. Start here: ids from this list are what type_text and press_keys target (ids change when a dialog is recreated -- a wm_class or title fragment does not). HOW TO DRIVE THIS DESKTOP, because the round trip is the expensive part and the actions are milliseconds: (1) ui_find then ui_press where the app has an accessibility tree -- it cannot miss; (2) find_text for Chrome, Electron and Qt, which expose almost nothing; (3) do_steps when you already know the next few actions, instead of one call each; (4) let the acting tool show you the result rather than following it with a screenshot -- they all do now. A screenshot of the whole screen is the last resort, not the first move.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint is true, and the description adds behavioral context beyond it: it returns the focused window, ids are consumed by type_text and press_keys, and ids change when a dialog is recreated while a wm_class/title fragment does not. The HOW TO DRIVE section also frames cost expectations by noting the round trip is expensive while actions take milliseconds. There is no contradiction with the read-only annotation.
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 first two sentences are front-loaded and high-value, but a long general desktop-driving primer follows, covering ui_find, find_text, do_steps, and screenshot policy. This material is only loosely about list_windows and would be better placed in a shared system prompt. The description is overlong for a zero-parameter, read-only tool, even though it is structured as a numbered list.
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 no output schema, the description explains the return content ('id, wm_class, title, geometry, pid and which one has focus') and how the ids should be used, which is enough to call the tool correctly. It also covers the dynamic nature of ids and the recommended order of operations. It is functionally complete despite the extraneous driving advice.
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 is empty and schema description coverage is 100%, so there are no parameter semantics for the description to clarify. Baseline 4 applies because zero parameters mean the description has no burden to explain parameter meaning. The description appropriately focuses on outputs and usage instead.
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 names a concrete resource ('every open window') with an explicit verb ('list') and enumerates the returned fields: id, wm_class, title, geometry, pid, and focus. It positions the tool as the entry point for obtaining window ids, which clearly separates its role from action tools like type_text and press_keys. An agent can tell exactly what this tool does without inspecting the schema.
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 explicitly says 'Start here' for targeting type_text and press_keys and explains that ids from this list are what those tools consume. It also gives broader routing guidance for driving the desktop and says a full screenshot is the last resort. It does not explicitly contrast list_windows with sibling window-related tools such as window_at or ui_apps, so the when-not guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pointer_clickA
Click at an absolute screen position. Reports whether it LANDED on anything -- the screen is compared before and after, so a click into dead space says so instead of looking exactly like one that worked -- and shows you the result without a separate screenshot. Also reports whether the keyboard moved as a result. PASS expect_window: the click is refused if something else is under that point, which is the difference between a missed click and a click in someone else's window. Needs no consent dialog, unlike xdotool.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| ref | No | A widget number from the last screen_map -- the click lands at that widget's CURRENT position after its identity is re-verified, no coordinates needed. Give ref OR x/y, never both. Refs die at the next screen_map call. | |
| look | No | What to show you afterwards. Default "auto": wait for the screen to stop changing, measure how much this action changed, and attach a picture of the affected window only if something did change -- so a click that hit nothing costs no tokens and says so. "window" always attaches it, "screen" uses the whole desktop (slower, 6x the tokens), "region" uses look_at, false skips all of it. Use false for the middle of a sequence you are going to check at the end anyway. | auto |
| count | No | 2 for a double click. | |
| button | No | left | |
| look_at | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| hover_first | No | Approach the point and settle before clicking, so a toolkit that only arms a button on hover gets its motion event. Chromium/CEF/Electron buttons (Creative Cloud, Spotify, 'desktop web' apps) commonly ignore a bare click and report nothing changed. Costs ~0.25s. | |
| on_occluded | No | What to do when expect_window is not the window at that point. Default refuses and names the blocker with its id and geometry. "click_topmost" clicks whatever is in front instead, in this same call, and says which window received it -- for a dialog that spawned over the button you were aiming at. | refuse |
| settle_max_s | No | How long to wait for the screen to stop changing before looking. Raise it for an app that animates slowly; set it to 0 to capture immediately. | |
| expect_window | No | The window this click is aimed at (id, wm_class or title fragment). Nothing is clicked if it is not the window at that point. |
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 does well by explaining that the screen is compared before and after, that clicks into dead space are reported as such, that the result is shown without a separate screenshot, and that keyboard movement is reported. It also discloses the refusal behavior when expect_window is not matched. It does not fully specify side effects or exact response shape, but it covers the key behavior strongly.
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 front-loaded with the core action and includes several valuable behavioral notes without being bloated. It is slightly conversational and could be tightened, but every sentence contributes useful information about what the tool does and how to use it safely.
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 an 11-parameter tool with no output schema and no annotations, the description gives important behavioral context but does not fully cover the tool's usage space. It explains click landing, expect_window, and result presentation, but does not address choosing between ref and x/y, the meaning of other parameters, or the exact structure of the returned result. The rich schema descriptions compensate partially, leaving the description adequate but not 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?
Schema description coverage is 73%, so the schema already documents most parameters. The description adds meaningful nuance for expect_window, explaining the difference between a missed click and clicking in someone else's window, but it does not add extra semantics for the other parameters, such as ref, button, count, or look_at. Overall it provides modest added value over 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 opens with a specific verb and resource: 'Click at an absolute screen position.' This clearly distinguishes the tool from siblings like pointer_move, pointer_drag, and pointer_scroll by establishing that it performs a click and reports outcomes. The additional details about landing detection and expect_window further clarify its role.
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 useful context, especially 'PASS expect_window' to avoid clicking in the wrong window, and notes it needs no consent dialog unlike xdotool. However, it does not explicitly say when to use pointer_click versus sibling input tools like pointer_move or pointer_drag, so usage guidance is implied rather than fully articulated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pointer_dragA
Press at one point, travel, release at another. The travel is real intermediate motion, because a press-and-teleport is not a drag to most toolkits.
| Name | Required | Description | Default |
|---|---|---|---|
| look | No | What to show you afterwards. Default "auto": wait for the screen to stop changing, measure how much this action changed, and attach a picture of the affected window only if something did change -- so a click that hit nothing costs no tokens and says so. "window" always attaches it, "screen" uses the whole desktop (slower, 6x the tokens), "region" uses look_at, false skips all of it. Use false for the middle of a sequence you are going to check at the end anyway. | auto |
| to_x | Yes | ||
| to_y | Yes | ||
| steps | No | ||
| button | No | left | |
| from_x | Yes | ||
| from_y | Yes | ||
| look_at | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| dwell_ms | No | Hover at the destination this long before releasing. Default 0 is the timing measured at 5/5 on a real drop target; a slower variant scored 4/5, so this is NOT a better default. Try ~400 only after a cross-app drop has actually failed (GTK source, Electron target). | |
| settle_max_s | No | How long to wait for the screen to stop changing before looking. Raise it for an app that animates slowly; set it to 0 to capture immediately. | |
| expect_window | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must shoulder the behavioral burden. It does disclose the crucial non-obvious trait that the travel is real intermediate motion, not a teleport. However, it omits other meaningful behaviors such as the default left button, step count, and how look/settle affect results.
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 tight sentences, front-loaded with the action and then a discriminating behavioral caveat. No wasted words.
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 11 parameters, no annotations, and no output schema, the description is too thin to be complete. It covers the drag concept but not the parameter landscape, expected outcomes, or failure modes.
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 only 36%, so the description needs to compensate for undocumented parameters like steps, button, and expect_window. It only loosely covers from/to coordinates and says nothing about the other parameters, leaving the agent undersupplied.
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 defines the action: press at one point, travel, release at another. It is specific about being a real drag with intermediate motion, distinguishing it from pointer_move and similar 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?
Implied usage is clear – use for actual drag gestures where toolkits need real motion. But it does not explicitly name alternatives or state when not to use it, leaving the routing partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pointer_moveA
Move the pointer to an absolute screen position. Exact: this goes to the compositor (org.gnome.Mutter.RemoteDesktop), not through ydotool, so there is no acceleration curve and no closed loop needed. Coordinates are the same ones list_windows and screen_map report.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| look | No | What to show you afterwards. Default "auto": wait for the screen to stop changing, measure how much this action changed, and attach a picture of the affected window only if something did change -- so a click that hit nothing costs no tokens and says so. "window" always attaches it, "screen" uses the whole desktop (slower, 6x the tokens), "region" uses look_at, false skips all of it. Use false for the middle of a sequence you are going to check at the end anyway. | auto |
| look_at | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| settle_max_s | No | How long to wait for the screen to stop changing before looking. Raise it for an app that animates slowly; set it to 0 to capture immediately. | |
| expect_window | No | Refuse the move if this window is not the one at that point. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It reveals a meaningful implementation detail: the move goes through org.gnome.Mutter.RemoteDesktop rather than ydotool, resulting in no acceleration curve and no closed loop. This is genuinely useful beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. The core action is front-loaded, then the exact execution path and coordinate semantics are added without redundancy. 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 pointer-move action, the description covers the essential behavioral context: absolute coordinates, coordinate origin, and the compositor path. While it does not describe return values or failure modes, the schema handles the look/settling parameters, making the overall package sufficient.
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 has 67% coverage, leaving x and y undocumented. The description compensates by defining them as absolute screen coordinates consistent with list_windows and screen_map. Other parameters already have thorough schema descriptions, so the added coordinate context is the key contribution.
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?
States a precise verb and resource: 'Move the pointer to an absolute screen position.' It also separates itself from pointer_drag, pointer_scroll, and pointer_click by emphasizing absolute positioning, and clarifies the coordinate convention shared with list_windows and screen_map.
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 when to use it: whenever an absolute pointer move is needed using the same coordinate space as list_windows and screen_map. However, it does not explicitly contrast with sibling tools like pointer_drag or pointer_position, nor does it state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pointer_positionARead-only
Where the pointer is. Answers from the compositor when the extension supports it, otherwise from the last position this server set and says which. Never guesses from X, whose answer is stale whenever the pointer is over a Wayland surface.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds meaningful behavioral detail: it may answer from the compositor or from the last server-set position, it explicitly says which source was used, and it never guesses from X due to staleness over Wayland surfaces. This is rich, non-obvious behavior disclosure.
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 three short sentences, front-loaded with the core purpose, and every sentence adds necessary caveats about source reliability and staleness. There is no filler or redundant restatement of the tool name.
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 getter with no output schema, the description covers the key behavioral context: data source, fallback, and reliability. It could explicitly state the coordinate system or return format, but the semantics of 'pointer position' are sufficiently clear for safe invocation.
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 tool has zero parameters and an empty input schema, so there are no parameter semantics for the description to clarify. The baseline of 4 applies because there is no parameter surface to document.
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 identifies the tool as a pointer-position getter ('Where the pointer is'), which distinguishes it from pointer-mutation siblings like pointer_move and pointer_drag. It lacks an explicit verb like 'get' or 'read,' but the meaning 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 explains when the compositor source is used and when the server-derived last position is used, which gives useful selection context. It does not name alternative tools or state when not to use it, but for a zero-parameter read-only getter the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pointer_scrollB
Wheel clicks at a point. dy positive scrolls down, dx positive scrolls right.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| dx | No | ||
| dy | No | ||
| look | No | What to show you afterwards. Default "auto": wait for the screen to stop changing, measure how much this action changed, and attach a picture of the affected window only if something did change -- so a click that hit nothing costs no tokens and says so. "window" always attaches it, "screen" uses the whole desktop (slower, 6x the tokens), "region" uses look_at, false skips all of it. Use false for the middle of a sequence you are going to check at the end anyway. | auto |
| look_at | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| settle_max_s | No | How long to wait for the screen to stop changing before looking. Raise it for an app that animates slowly; set it to 0 to capture immediately. | |
| expect_window | 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 adds a useful detail beyond the schema: the sign convention for dx and dy. However, it does not state whether the pointer is moved to the point first, what units dx/dy use, or whether any settling or screenshot behavior occurs. This is a meaningful but partial disclosure.
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 short and front-loaded: the action is stated first, followed by the most important parameter semantics. There is no filler or redundant wording. It is appropriately concise, though it could be slightly expanded without becoming bloated.
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 8 parameters, no annotations, and no output schema, this description is too sparse to be complete. It leaves key invocation details to the schema or agent inference, such as what x/y actually represent, how dx/dy are interpreted, what expect_window does, and what happens after the scroll. The richer schema descriptions for look and settle_max_s help, but the overall tool context remains under-specified.
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 low (38%), so the description must compensate. It does add meaning for dx and dy by specifying scroll direction, and 'at a point' implies x and y are the target coordinates. However, it does not explain expect_window, the meaning or units of dx/dy values, or other parameters, so compensation is 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 identifies the operation as a wheel-based action at a point, which distinguishes it from pointer_click and pointer_move siblings. The direction semantics ('dy positive scrolls down, dx positive scrolls right') further clarify what the tool does. It could be stronger by explicitly saying 'scrolls' rather than 'wheel clicks', but the meaning is reasonably clear.
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 about when to use pointer_scroll versus alternatives like pointer_click, pointer_drag, or pointer_move. No context is given for scrolling behavior, prerequisites, or situations where this tool is preferable. The agent is left to infer usage from the tool name and minimal description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_keysA
Send a key combination to a named window, e.g. ctrl+s. Chain several with do_steps rather than one call each. Focus is confirmed first. Ctrl+Alt+F1-F12 is refused: it switches virtual terminal and looks exactly like a frozen machine.
| Name | Required | Description | Default |
|---|---|---|---|
| via | No | auto | |
| look | No | What to show you afterwards. Default "auto": wait for the screen to stop changing, measure how much this action changed, and attach a picture of the affected window only if something did change -- so a click that hit nothing costs no tokens and says so. "window" always attaches it, "screen" uses the whole desktop (slower, 6x the tokens), "region" uses look_at, false skips all of it. Use false for the middle of a sequence you are going to check at the end anyway. | auto |
| combo | Yes | e.g. 'ctrl+shift+t' | |
| target | Yes | Window id from list_windows, or a wm_class / title fragment. The window is activated and focus is CONFIRMED before any key is sent; if focus does not land, nothing is typed. | |
| look_at | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| settle_max_s | No | How long to wait for the screen to stop changing before looking. Raise it for an app that animates slowly; set it to 0 to capture immediately. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden and does meaningful work: it discloses that focus is confirmed before any key is sent, that nothing is typed if focus fails, and that Ctrl+Alt+F1-F12 is deliberately refused because it can look like a frozen machine. It falls short of full transparency because it says nothing about return behavior or other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the core action with an example, the batching guidance, and a critical safety warning. There is no filler or redundant restatement of the schema.
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 no output schema and no annotations, the description covers the essential selection and safety context: focus confirmation, fail-safe behavior, the do_steps alternative, and the dangerous combo. The schema covers the look and settle parameters, making this complete enough to invoke correctly, though a one-line statement of what the tool returns would make it fully self-sufficient.
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 83%, so the schema already documents most parameters. The description adds an extra combo example and reinforces the focus-confirmation behavior for target, but the optional 'via' parameter remains undocumented and the description does not compensate for that gap.
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 ('Send') and a well-defined resource ('a key combination to a named window'), with a concrete example ('ctrl+s'). It also distinguishes itself from do_steps by advising chaining, so an agent can tell when this tool is the right one.
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?
It gives an explicit routing rule: chain several key combinations with do_steps instead of calling this tool once per combo, which is actionable guidance. It also warns against the dangerous Ctrl+Alt+F1-F12 combination, but it does not compare press_keys with closely related keyboard siblings like ui_press, hold_key, or type_text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
region_changedARead-only
Wait until a window or rectangle CHANGES, then show it. For anything wait_for cannot express: a reply arriving, a spinner finishing, a download completing. Polls pixels here instead of making you take blind screenshots and look at each one, and returns as soon as it changes.
| Name | Required | Description | Default |
|---|---|---|---|
| look | No | Attach the picture once it changes. | |
| region | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| window | No | ||
| timeout | No | ||
| poll_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the readOnlyHint annotation: it explicitly says the tool 'Polls pixels', 'returns as soon as it changes', and waits. This tells the agent the tool is a polling/observation primitive, not an immediate action. No contradiction with annotations and no misleading claims.
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?
Three sentences, front-loaded with the core behavior, then enriched with relevant use cases and mechanism. Every sentence adds value: one states purpose, one gives when-to-use, one explains the polling approach. No fluff or repetition.
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 overall purpose, polling behavior, return timing, and main inputs, but no output schema leaves 'show it' somewhat ambiguous. It also does not address what happens when neither window nor region is provided, or how the tool signals a timeout. Given 5 params and low schema coverage, the description is solid but not fully 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?
Schema description coverage is only 40%, with window, timeout, and poll_seconds lacking schema descriptions. The description partially compensates by mentioning 'window or rectangle' and 'Polls pixels', which maps to window vs region and poll_seconds. However, it does not explain timeout semantics, defaults, units, or how window vs region interact, leaving an agent with meaningful gaps.
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 action ('Wait until a window or rectangle CHANGES, then show it') and clearly identifies the resource. It also differentiates itself from the sibling wait_for by saying 'For anything wait_for cannot express', so an agent can tell this tool apart from the most similar alternative.
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 concrete use cases ('a reply arriving, a spinner finishing, a download completing') and contrasts itself with taking blind screenshots, implicitly directing the agent away from screenshot-based polling. It does not explicitly name exclusions, but the context is clear enough for an agent to select this tool over wait_for or screenshot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screencastARead-only
Record the screen, or one window, to an h264 mp4. Use this instead of screenshot whenever the thing being judged MOVES -- an animation, a transition, a scroll, a stutter, a hover state. Stills cannot show motion and bursting them tops out near 5 fps. Goes under the xdg portal straight to org.gnome.Mutter.ScreenCast, so there is no share-your-screen consent dialog, and encodes on the iGPU. Read the result back by pulling frames out with ffmpeg.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | ||
| path | Yes | Where to write the mp4, e.g. /tmp/cast.mp4 | |
| target | No | Window id from list_windows, or a wm_class / title fragment. The window is activated and focus is CONFIRMED before any key is sent; if focus does not land, nothing is typed. | |
| seconds | No | ||
| include_cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description does not contradict that. It adds valuable behavioral context beyond the annotation: it uses the xdg portal to org.gnome.Mutter.ScreenCast, skips the consent dialog, encodes on the iGPU, and suggests reading frames back with ffmpeg. This is useful implementation-level 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 compact and front-loaded: purpose first, then the key usage decision, then brief implementation detail, then the outcome-readback hint. No sentence is redundant, and the structure makes the most decision-relevant information appear early.
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 screen-recording tool with no output schema, the description sufficiently covers what the output is (h264 mp4), how to consume it (ffmpeg), and the key behavior (no consent dialog, iGPU encoding). It does not detail return values or consequences of optional parameters, but those are secondary and partly covered by the input schema defaults.
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 only 40%, with fps, seconds, and include_cursor lacking schema descriptions. The tool description mentions screen vs. one window, which relates to target, but does not explain the semantics of fps, seconds, or include_cursor. With low schema coverage, the description needed to compensate for those parameters but did not.
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 starts with a specific verb and resource: 'Record the screen, or one window, to an h264 mp4.' It clearly differentiates itself from screenshot by stating when motion capture is needed, naming the sibling tool explicitly and explaining why stills are insufficient.
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?
It explicitly says to use this tool 'instead of screenshot whenever the thing being judged MOVES' and gives concrete examples: animation, transition, scroll, stutter, hover state. It also explains the limitation of the alternative ('Stills cannot show motion and bursting them tops out near 5 fps'), so an agent can choose confidently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screen_mapARead-only
Everything on screen with the coordinates to reach it: the desktop rectangle, every window top of the stack first with its centre point, where the pointer is, and every pressable widget of the focused application with the exact pixel to click it at. This is the one call that turns 'click the Save button' into a number without looking at an image. Every widget also carries a ref: N -- pass it straight to ui_press(ref) or pointer_click(ref); refs are valid until the next screen_map call, and the result's refs_generation says which call issued them.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | AT-SPI application name, if not the focused window's. | |
| limit | No | ||
| widgets | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already marks the call as non-mutating, and the description adds genuinely useful behavioral detail a caller could not infer: refs are valid until the next screen_map call, refs_generation identifies the issuing call, and windows are ordered with the topmost first. This materially reduces the risk of stale-ref mistakes.
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?
Each sentence is information-dense and earns its place: the first defines the output, the second gives the decision-relevant purpose, the third explains ref lifecycle and use. It is front-loaded with the core 'coordinates to reach it' idea and contains no 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?
With no output schema, the description does a good job of explaining return content and ref validity, and the generation marker closes an important ambiguity. However, it stays silent on the limit and widgets parameters, so an agent cannot predict truncation or reduction of the widget list without guessing.
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 only 33%: app is described in the schema, but limit and widgets are bare. The description does not compensate by explaining what limit controls, what widgets=false does, or how app scopes the operation to a non-focused application.
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 names an exact deliverable: screen coordinates for the desktop, windows, pointer, and pressable widgets, and frames the tool as the one that turns 'click the Save button' into a number without looking at an image. This clearly distinguishes it from visual/coordiate tools like screenshot and from ref-consuming tools like ui_press/pointer_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 strongly implies when to use it: any time you need exact pixel/ref coordinates or need to convert a semantic widget into an actionable ref. It even tells the caller what to do with refs, but it does not explicitly name alternatives such as ui_find or screenshot or say when not to use this call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotARead-only
Look at the screen, one window, or one rectangle. The image comes back in this reply -- there is nothing to Read afterwards. CROP, DO NOT SHRINK: window costs about 1300 tokens and a region strip about 160, against 1843 for the whole desktop, and all three stay legible, while scale below 1 makes small text unreadable for a saving a crop would have made anyway. Passing window AND region means a rectangle measured inside that window. annotate draws grid lines and window boxes labelled in SCREEN coordinates, so the number to pass to pointer_click can be read off the picture instead of estimated. Before reaching for this at all: ui_find and find_text answer "where is X" without an image, and every acting tool already shows you the result.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | AT-SPI application name for annotate.widgets, if the focused window is not the one to map. | |
| path | No | Where to write the PNG, e.g. /tmp/shot.png | |
| scale | No | Resize the image you are shown. Below 1 it shrinks -- measured on this 1920x1080 screen, 0.5 makes UI text hard to read and OCR fails on it entirely, so crop instead. Above 1 it enlarges, which is what a tiny crop of an icon needs. | |
| inline | No | Set false to only write the PNG and get its path back, for a capture nobody needs to look at now. | |
| region | No | Capture just this rectangle, in screen pixels. | |
| window | No | Capture just this window (id, wm_class or title fragment). Captures what is ON SCREEN there, so anything in front of it is included. | |
| annotate | No | true for grid + window boxes, or an object: {grid: true|<spacing px>, windows: bool, widgets: bool, limit: int}. | |
| include_cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important behaviors: the image is returned inline with nothing to Read afterwards, window captures reflect whatever is on screen including occluding content, annotate labels are in SCREEN coordinates, and scale below 1 harms readability. These are genuinely useful behavioral details not present in the structured fields.
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 longer than average but every sentence earns its place: primary behavior, token costs, crop advice, combination semantics, coordinate labeling, and alternatives. It is front-loaded with the core outcome before diving into tradeoffs.
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 no output schema, the description properly explains return behavior. It covers capture targets, inline vs file-only behavior, scaling pitfalls, occlusion semantics, coordinate conventions, and alternative tools. For an 8-parameter screenshot tool, this is sufficiently 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?
Schema coverage is high (88%), so the baseline is 3, and the description adds real value beyond the schema: scale cost/readability tradeoffs, window+region composition, and annotate's coordinate purpose. However, include_cursor has no schema description and is not mentioned in the description, leaving one parameter fully undocumented.
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: 'Look at the screen, one window, or one rectangle,' and clarifies the immediate return behavior ('image comes back in this reply'). It also differentiates from siblings by naming ui_find and find_text as non-image alternatives and noting that acting tools already show results.
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?
It gives explicit when-not-to-use guidance: ui_find and find_text answer 'where is X' without an image, and every acting tool already shows the result. It also gives concrete crop-vs-shrink guidance with token cost comparisons and explains the window+region combination semantics, so an agent can choose the right capture mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_textA
Type into a named window. Focus is confirmed first, nothing is typed if it cannot be confirmed, and the widget is read back afterwards to check the right characters arrived. Characters go to the compositor as keysyms, so the keyboard layout cannot transpose them -- the German-QWERTZ hazard that made ydotool type z for y does not apply to this path. ui_set_text is still better where it works: it hands text to the widget and needs no focus at all.
| Name | Required | Description | Default |
|---|---|---|---|
| via | No | auto prefers compositor keysyms and falls back to ydotool. | auto |
| look | No | What to show you afterwards. Default "auto": wait for the screen to stop changing, measure how much this action changed, and attach a picture of the affected window only if something did change -- so a click that hit nothing costs no tokens and says so. "window" always attaches it, "screen" uses the whole desktop (slower, 6x the tokens), "region" uses look_at, false skips all of it. Use false for the middle of a sequence you are going to check at the end anyway. | auto |
| text | Yes | Literal text to type | |
| target | Yes | Window id from list_windows, or a wm_class / title fragment. The window is activated and focus is CONFIRMED before any key is sent; if focus does not land, nothing is typed. | |
| look_at | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| verify_app | No | AT-SPI application name to read back for verification; auto-detected from the window if omitted | |
| key_delay_ms | No | ||
| settle_max_s | No | How long to wait for the screen to stop changing before looking. Raise it for an app that animates slowly; set it to 0 to capture immediately. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It reveals that focus is confirmed before typing, nothing is typed if confirmation fails, the widget is read back for verification, and keysyms avoid keyboard-layout transposition. It stops short of explaining what happens if the read-back verification fails, but this is otherwise strong behavioral disclosure.
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 three sentences, each adding distinct value: the verification workflow, the keysym technical property, and the alternative tool. There is no filler, and the most important behavioral guarantee is front-loaded.
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 8 parameters, no annotations, and no output schema, the description covers the core workflow, a critical safety property, and the main alternative. The only notable gap is the absence of an explicit statement about what happens when post-type verification fails or what the tool returns.
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 88%, with detailed descriptions for via, look, target, look_at, verify_app, and settle_max_s. The description itself adds no per-parameter semantics, only global context about keysym delivery and verification, so the baseline for high schema coverage applies.
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 'Type into a named window,' giving a specific verb and resource. It also distinguishes itself from ui_set_text by explaining that ui_set_text hands text directly to the widget and requires no focus, making the tool's unique scope clear.
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 explicitly names ui_set_text as the preferred alternative when it works, giving the agent a clear routing condition. It also explains type_text's focus-confirmation guarantee, which helps the agent decide when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_appsARead-only
Applications currently on the AT-SPI bus. These names are what ui_tree and ui_find take.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares that the tool is read-only, and the description adds value by indicating the result is a live snapshot of the AT-SPI bus ('currently') and that the returned values are directly consumable by sibling tools. No side effects are implied and no contradiction exists.
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 short sentences, front-loaded with the main object and followed by a targeted note about how the result is used. 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?
For a zero-argument, read-only enumerator, this description is sufficient: it defines the output and explains its relationship to ui_tree and ui_find. It does not cover empty-bus edge cases or output formatting, but those are minor gaps given the tool's 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?
The tool has zero parameters and an empty input schema, so there is nothing for the description to add. The baseline of 4 for zero-parameter tools applies.
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 that the tool provides applications currently on the AT-SPI bus, and it distinguishes itself from sibling tools by noting that these names are what ui_tree and ui_find accept as input. The verb 'list' is implicit, but the meaning is unmistakable.
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 usage context: use this tool to obtain valid app names for ui_tree and ui_find. It does not explicitly mention alternatives or when not to use it, but the integration hint is actionable and specific enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_findARead-only
Find widgets by visible text. THE way to locate something to act on: pressing a real widget through AT-SPI cannot miss and does not care where the window moved to. Paths returned here are valid only while the tree is unchanged -- find, then act.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Restrict to one application (much faster) | |
| role | No | Require an exact AT-SPI role, e.g. push_button | |
| text | No | Substring to look for in widget names. Optional if role or actionable_only is given -- which is how you list the icon-only buttons that have no name to search. | |
| depth | No | GTK4 nests deeply -- the default is 30 because a text view can sit at depth 23 | |
| actionable_only | No | Only widgets that expose an action |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, and the description adds valuable behavioral context: returned paths are only valid while the accessibility tree is unchanged, and lookup works through AT-SPI independent of window position. This goes beyond the annotation without contradicting it.
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?
Three sentences, each earning its place: the first states what the tool does, the second explains why it is the reliable way to act, and the third gives a critical freshness caveat. It is front-loaded and free of 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 purpose, mechanism, and a key validity constraint, and 100% param schema coverage fills in the parameter details. There is no output schema, so it would be helpful to describe the exact return format more explicitly, but 'Paths returned here' already indicates the return value and its intended downstream 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 100%, so the schema already documents all five parameters in detail. The description adds little parameter-specific meaning beyond the schema, only framing the tool's purpose rather than elaborating on app, role, text, depth, or actionable_only.
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 and resource ('Find widgets by visible text') and positions itself as 'THE way to locate something to act on', which conveys its role among the broader toolset. It does not explicitly name sibling tools like ui_tree or find_text to differentiate itself, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: use this when you want to locate a real widget to act on, and it emphasizes robustness ('cannot miss and does not care where the window moved to'). It also provides a strong sequencing guideline ('find, then act') and warns about tree changes. It does not explicitly state exclusions or when to prefer alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_pressA
Invoke a widget's own action through AT-SPI -- the preferred way to act on this desktop. Requires expect_name or expect_role, and refuses if the path no longer points at that widget, so a shifted tree cannot make you press the wrong thing.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | A widget number from the last screen_map; path, expect_name and expect_role are filled from it. Give ref OR path, never both. | |
| look | No | What to show you afterwards. Default "auto": wait for the screen to stop changing, measure how much this action changed, and attach a picture of the affected window only if something did change -- so a click that hit nothing costs no tokens and says so. "window" always attaches it, "screen" uses the whole desktop (slower, 6x the tokens), "region" uses look_at, false skips all of it. Use false for the middle of a sequence you are going to check at the end anyway. | auto |
| path | No | Index path from ui_find, e.g. "gedit/0/3/1" | |
| look_at | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| expect_name | No | Name the widget should still have (substring) | |
| expect_role | No | Role the widget should still have | |
| action_index | No | ||
| settle_max_s | No | How long to wait for the screen to stop changing before looking. Raise it for an app that animates slowly; set it to 0 to capture immediately. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it explains that the tool acts through the widget's own AT-SPI action and adds a meaningful safety detail — it refuses when the path no longer matches the expected widget, preventing accidental presses on the wrong element. It does not detail side effects or failure output, but the core behavior is clearly 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?
Two sentences, both informative: the first states purpose and preference, the second states the critical safety constraint. No filler, no repetition of schema content, and the most decision-relevant information is front-loaded.
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 an 8-parameter tool with no annotations and no output schema, the description covers the essential selection and safety context. It could go further by describing what the action actually returns or how failures surface, but the parameter schema covers the remaining operational details well.
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 high at 88%, so the schema already documents most parameters. The description adds genuinely non-schema value by stating that expect_name or expect_role is required at runtime, despite the schema's required list being empty, and by explaining the safety consequence of these guards.
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 action (invoke a widget's own action) and the mechanism (AT-SPI), making clear this is not a coordinate click like pointer_click or a key press like press_keys. Calling it 'the preferred way to act on this desktop' further distinguishes it from sibling tools.
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?
Explicitly frames the tool as the preferred way to act on the desktop, which tells the agent when to reach for it over pointer-based alternatives. It does not spell out when to avoid it or explicitly name alternatives, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_read_textARead-only
Read the content of a text widget straight out of the accessibility tree. This is how you VERIFY that something landed, instead of trusting that a keystroke arrived.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Application name; its editable text widget is located automatically | |
| path | No | Or an exact index path. Both tools return the resolved path -- pass it back to address the SAME document across write and read; without it, both prefer the focused text widget. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavior beyond the readOnlyHint annotation by specifying that the content is read 'straight out of the accessibility tree' and frames it as a verification step. This gives insight into how the value is obtained and why it is authoritative, without contradicting the annotation.
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, no wordiness. The first sentence states the operation, the second communicates the intended use case. Every sentence earns its place and the key concept is front-loaded.
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 read tool with readOnlyHint and a fully documented schema, the description is complete: it states what is returned (content), where it comes from (accessibility tree), and when to use it (verify something landed). No critical gap remains.
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 100%, so the baseline is 3. The description itself adds no parameter-specific meaning; the detailed guidance about `app`, `path`, and the focused text widget lives in the input schema rather than in the description.
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 ('Read') with a clear resource ('content of a text widget') and source ('accessibility tree'). It also states the intent: verification that something landed, which distinguishes it from sibling tools that send keystrokes or search for text.
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?
It explicitly frames when this tool is appropriate: to VERIFY that something landed after input, rather than trusting a keystroke arrived. It does not name a specific sibling alternative, but the context is clear enough for an agent to select it for read-verification tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_set_textA
PREFERRED way to enter text. Writes through AT-SPI EditableText, which needs no focus and no ydotool: it works on an unfocused window and even while the screen is locked, and it reads the widget back to prove the text landed. Use type_text only when a widget is not AT-SPI-editable.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Application name; its editable text widget is located automatically | |
| look | No | What to show you afterwards. Default "auto": wait for the screen to stop changing, measure how much this action changed, and attach a picture of the affected window only if something did change -- so a click that hit nothing costs no tokens and says so. "window" always attaches it, "screen" uses the whole desktop (slower, 6x the tokens), "region" uses look_at, false skips all of it. Use false for the middle of a sequence you are going to check at the end anyway. | auto |
| path | No | Or an exact index path. Both tools return the resolved path -- pass it back to address the SAME document across write and read; without it, both prefer the focused text widget. | |
| text | Yes | Text to write | |
| look_at | No | Rectangle for look:"region", in screen pixels. Object form {x, y, width, height} or array form [x, y, width, height]. | |
| replace | No | Clear existing content first | |
| settle_max_s | No | How long to wait for the screen to stop changing before looking. Raise it for an app that animates slowly; set it to 0 to capture immediately. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden and does it well: it reveals that no focus is needed, that it works on a locked screen, that it does not rely on ydotool, and that it verifies the text landed by reading the widget back. It does not mention what happens with existing text when replace is false, but the schema covers the replace parameter.
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, front-loaded, and every sentence earns its place. It states the core purpose, the key behavioral advantages, and the sibling fallback condition without adding redundant details.
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 7-parameter tool with no output schema, the description gives enough decision-relevant context: what the tool does, how it works, and when not to use it. It does not fully spell out able default insertion behavior or return-value shape, but the schema's rich parameter descriptions compensate for those 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 description coverage is 100%, so the schema already fully documents all seven parameters. The description adds useful context about the overall mechanism and verification behavior, but does not add much per-parameter meaning beyond what the schema provides. This matches the baseline for full 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 opens with 'PREFERRED way to enter text' and states it writes through AT-SPI EditableText, giving a specific verb, resource, and mechanism. It also explicitly distinguishes itself from the sibling type_text by naming it and explaining the boundary.
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?
It clearly states when to use this tool: for entering text into AT-SPI-editable widgets, including when focus is unavailable or the screen is locked. It also gives an explicit exclusion: 'Use type_text only when a widget is not AT-SPI-editable,' which tells the agent when to choose the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_treeARead-only
Accessibility tree for one application: roles, names, screen bounds, and which nodes are actionable. Prefer ui_find unless you genuinely need the shape of the whole window.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | Application name from ui_apps | |
| depth | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates a safe read operation, and the description adds meaningful behavioral context by specifying what the tree exposes. It also signals that ui_find is likely the better default, which is useful beyond the annotation, though it does not mention performance or failure behavior when the app is not available.
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 purposeful: the first defines the tool's output and the second gives routing guidance. No filler 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?
The description covers the tool's scope, output contents, and relationship to ui_find, which is most of what an agent needs for a simple read-only tool. However, with no output schema and an undocumented optional 'depth' parameter, the definition is not fully 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 describes the 'app' parameter as 'Application name from ui_apps', but the 'depth' parameter has no schema description. The tool description adds no parameter-level guidance, leaving the meaning and effect of 'depth' unclear to an agent.
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 identifies the tool as retrieving an accessibility tree for a single application and lists the key data it contains (roles, names, screen bounds, actionable nodes). It also implicitly distinguishes itself from the sibling ui_find by framing this as the whole-window tree option.
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 explicitly says 'Prefer ui_find unless you genuinely need the shape of the whole window,' which gives the agent a concrete rule for choosing between this tool and a sibling. This is clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_forARead-only
Wait until the desktop reaches a state, instead of sleeping a guessed number of seconds. Conditions: window_exists, window_gone, window_focused, focus_changes; text_appears (OCR polls a window for a string -- a reply arriving, a build finishing); widget_exists (an AT-SPI widget matching text/role shows up in app); clipboard_changed (a copy landed); elapsed (just wait N seconds -- for a long install with nothing to poll, and the honest alternative to watching for a string you know will never appear). Returns as soon as it is true, or reports honestly that it timed out. A timeout over 300s is clamped, not refused.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | For widget_exists: the AT-SPI application name | |
| role | No | For widget_exists: the widget role, e.g. 'push button' | |
| text | No | For text_appears: the string to watch for. For widget_exists: the widget name to match. | |
| target | No | ||
| timeout | No | ||
| condition | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description reveals how the tool behaves: it polls OCR, AT-SPI widgets, clipboard, or timers; it returns as soon as the condition is true; it honestly reports timeouts; and it clamps timeouts over 300s. This gives the agent a clear mental model of polling semantics.
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 and every sentence carries information, but the long run-on structure could be easier to parse. The core purpose is front-loaded, and the condition list is compact, so it remains effective.
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 6 parameters and no output schema, the description explains the major behavioral modes and timeout handling well. However, it omits a precise definition of target for several conditions and does not clarify the exact return value on success or timeout, which an agent would need for reliable downstream handling.
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 useful meaning for condition values and timeout behavior, but it never clearly binds the target parameter to conditions such as window_exists or text_appears, despite schema coverage being only 50%. The parameter semantics are partially compensated, not fully.
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: 'Wait until the desktop reaches a state.' It then enumerates all supported condition types, making the tool's scope immediately identifiable and distinguishing it from a simple sleep or blind wait.
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 practical guidance for when to use specific conditions, such as using text_appears to detect a reply or build finishing and using elapsed when there is nothing to poll. It also contrasts this tool with sleeping a guessed number of seconds. It does not explicitly compare against sibling tools like assert_state, but the condition-level guidance is substantial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
window_atARead-only
What a click at this point would hit. Use it before clicking somewhere you inferred from a screenshot. Reports both the compositor's own pick (which respects input shapes, so a click-through overlay is seen through) and every window whose rectangle covers the point.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals safety, and the description adds meaningful behavior: the compositor pick respects input shapes, sees through click-through overlays, and the result includes every window whose rectangle covers the point. This is beyond what annotations convey.
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 deliver the purpose, the usage trigger, and the key output distinction, front-loading the main idea. No filler or repetition.
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 no output schema, the description still explains what the tool reports: the compositor's pick and all covering windows. The only notable gap is the undocumented coordinate system, but for a simple read-only hit-test tool it is otherwise sufficient.
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 carries the burden for x and y. It only refers to 'this point' and does not specify coordinate space, units, or whether coordinates are screen-relative vs image-relative, which is essential for correct use with screenshots.
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?
States a specific operation: determine what a click at a coordinate would hit. It disambiguates from sibling tools by promising both the compositor's input-shape-aware pick and all covering windows, which no sibling name suggests.
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?
Explicitly tells the agent when to use it: before clicking a location inferred from a screenshot. It does not spell out exclusions or alternatives, but the use-before-clicking context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
window_manageB
Move, resize, close, (un)minimize, (un)maximize, re-workspace or pin a window -- through the compositor, where these are ordinary calls. The result reports the window as it IS afterwards (new geometry, or gone), not just that the call was sent. close that leaves the window standing names the usual reason: an unsaved-changes dialog.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| above | No | For action: above -- pin or unpin. | |
| index | No | Workspace index, for action: workspace | |
| width | No | ||
| action | Yes | ||
| height | No | ||
| target | Yes | Window id, wm_class or title fragment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a genuinely useful behavioral trait: the result reports the window's post-operation state, not merely that the call was sent. It also explains that a close that leaves the window standing names the likely reason, such as an unsaved-changes dialog. With no annotations provided, this is meaningful transparency, though it stops short of covering side effects, reversibility, or permissions.
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 compact and front-loaded with the action list, then result semantics, then the close-failure behavior. The last sentence is grammatically awkward and 'where these are ordinary calls' is slightly extraneous, but overall every sentence contributes useful information without padding.
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 an 8-parameter mutation tool with no annotations and no output schema, this description covers purpose and one error mode but lacks parameter semantics, when-to-use guidance, and broader behavioral outcomes. An agent would likely need additional information to invoke it reliably, especially for workspace and geometry parameters.
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 only 38%, so the description must compensate. It loosely connects actions to parameters (pin to 'above', workspace to 'index', geometry to x/y/width/height), but it does not clarify coordinate origin, units, workspace indexing, or valid ranges. Several parameters remain effectively undocumented, so the description is too thin to bridge the schema gap.
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 names a specific resource (windows) and a clear set of verbs: move, resize, close, minimize, maximize, re-workspace, pin. It distinguishes itself from read-only window tools like list_windows or window_at by emphasizing mutation/manipulation through the compositor. Minor ambiguity from 're-workspace' and typos in the enum values keep it from a 5.
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 guidance on when to use this tool versus siblings such as activate_window, list_windows, or window_at. The phrase 'through the compositor, where these are ordinary calls' hints at context but does not define selection criteria or exclusions. Usage is only implied by the operation list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zoomARead-only
Look closer at a small area at FULL resolution -- never scaled, unlike screenshot, which fits everything to the model's 1568px ceiling. For a tiny glyph, a hairline border, an icon. Refuses more than half the desktop: zoom exists to spend tokens on FEW pixels.
| Name | Required | Description | Default |
|---|---|---|---|
| pad | No | Extra pixels of context on every side. | |
| path | No | Where to keep the PNG; defaults to the shot cache | |
| region | No | Rectangle in screen pixels, [x, y, width, height] or {x, y, width, height}. With window=, measured inside that window. | |
| window | No | Zoom into this window (id, wm_class or title fragment). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry readOnlyHint, and the descrption's observe/capture framing is consistent with it — no contradiction. It adds genuinely useful behavioral traits beyond the annotation: never-scaled full-resolution capture, and the refusal error when the region exceeds half the desktop, which an agent must know before invoking. It stops short of disclosing what the tool returns or how the PNG result is consumed, which would have made it fully transparent.
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?
Four compact sentences and front-loaded: the core purpose and sibling contrast land in sentence one, with use cases and the size cap following in order of importance. The final clause 'zoom exists to spend tokens on FEW pixels' is mildly redundant with the refusal statement, but costs little and reinforces intent.
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 read-only capture tool with full schema param coverage, the descrption covers purpose, alternative, use cases, and the key failure mode. The one substantive gap is the return value — with no output schema, the agent is left to infer from the path parameter that a PNG path is what comes back.
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 100%, so the schema documents all four parameters and the baseline is 3. The descrption adds one meaningful param-level constraint the schema lacks — 'Refuses more than half the desktop' caps the region size — and the 'small area' framing ties the region parameter to the tool's intended use. That value above baseline justifies a 4.
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?
States a specific action and resource — 'Look closer at a small area at FULL resolution' — and immediately differentiates itself from the screenshot sibling by the scaling contrast. Names concrete use cases (tiny glyph, hairline border, icon) and a precise size constraint. An agent can select this over screenshot without opening either schema.
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?
Explicitly names the alternative (screenshot) and the decisive differentiator (the model's 1568px ceiling vs full-resolution capture). The 'For a tiny glyph, a hairline border, an icon' list gives concrete when-to-use guidance, and 'Refuses more than half the desktop' supplies the when-not boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct mechanism or operation — pointer, AT-SPI, OCR, compositor, clipboard, video — and the descriptions explicitly steer between adjacent pairs (ui_find vs find_text, ui_set_text vs type_text, wait_for vs region_changed, screenshot vs zoom). The closest pair, screen_map vs window_at, is separated by one being a full snapshot with refs and the other a cheap single-point hit test.
snake_case verb_noun dominates and prefix families are consistent (pointer_*, ui_*, clipboard_*). A handful of bare-noun tools (zoom, frames, journal, screenshot, screencast) and two odd formulations (window_at, region_changed) break the pattern but never obscure meaning.
33 tools is heavy, but the domain — full Wayland desktop control across pointer, keyboard, AT-SPI, window management, video, OCR, clipboard, and diagnostics — is unusually broad, and nearly every tool maps to a distinct operation. It's more than a typical CRUD server needs, but the count is large without being bloated.
The full loop of see → decide → act → verify is covered: capture (screenshot, zoom, screencast, frames), locate (ui_find, find_text, screen_map), act (pointer/keyboard/widget tools), manage (launch_app, window_manage, activate_window), verify (assert_state, ui_read_text, clipboard_read), plus wait_for, region_changed, desktop_health, and journal. No dead ends or critical gaps for the stated purpose.
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
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Headless browser primitives for AI agents when sites need real JS rendering.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to interact with native Linux desktop applications through AT-SPI2 accessibility interfaces. Provides semantic element targeting, natural language search, and automation capabilities (clicking, typing, keyboard shortcuts) across GTK, Qt, and Electron applications.6MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to automate Wayland desktop environments through screenshot analysis, mouse control, and keyboard input simulation. It supports visual context via VLM providers like Gemini and OpenRouter to perform complex, multi-step desktop actions.7GPL 3.0
- AlicenseBqualityCmaintenanceGNOME desktop automation for AI agents. 30 tools via D-Bus: screenshots, window management, mouse/keyboard injection, clipboard, workspaces, and system notifications. Works on any GNOME 45–49 Linux desktop.3012GPL 3.0
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to automate Linux desktop GUI by launching and interacting with Wayland applications in isolated virtual KWin sessions, or connecting to live desktops for collaborative automation.41MIT
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/tristanmuzzu/deskwright'
If you have feedback or need assistance with the MCP directory API, please join our Discord server