VisionCLI
VisionCLI's MCP server lets an AI assistant see your screen, inspect your project's database read-only, drive your Chrome/Brave browser, and start voice mode.
See the screen:
lookscreenshots the front-most window, a display, a named app, a window id, or the window under the cursor;list_windowslists visible windows;select_regionhas the user drag a box;clipboard_imagereturns a clipboard image;device_screenshotcaptures an iOS Simulator or Android device cleanly.Query the database (read-only):
db_schemashows tables, columns and foreign keys (MySQL/Postgres/SQLite from.env);db_queryruns one SELECT/SHOW/DESCRIBE/EXPLAIN/WITH query in a read-only transaction, capped at 50 rows.Control the browser:
browser_tabs,browser_open,browser_switch_tab,browser_navigate(back/forward/reload/close/new),browser_read(page title, URL, selected and readable text),browser_elements(clickable elements with ids),browser_click,browser_type(optionally submitting),browser_scroll.Start voice mode:
start_voiceopens the overlay so the user can hold Option+Space, ask aloud, and get a bubble answer.
Captures clean screenshots from Android devices via adb for visual analysis.
Provides fast Brave browser control via AppleScript, including tab management, navigation, reading pages, clicking, typing, and scrolling.
Reads project .env files to discover database connection settings for read-only MySQL, Postgres, and SQLite queries.
Integrates with Gemini CLI and the Gemini API via API-key auth, enabling voice and typed questions with access to VisionCLI's vision tools.
Captures clean screenshots from iOS Simulator for visual analysis.
Opens file:line references in JetBrains IDEs and detects JetBrains project windows for context.
Integrates with macOS system features for screen capture, microphone/speech input, menu bar presence, automation, and AppleScript-based control.
Supports read-only MySQL schema inspection and SELECT/SHOW/DESCRIBE/EXPLAIN/WITH queries using connection details from the project's .env.
Maps PhpStorm project windows to their local project folders so questions are answered about the correct project.
Supports read-only SQLite schema inspection and SELECT/SHOW/DESCRIBE/EXPLAIN/WITH queries using connection details from the project's .env.
Interacts with terminal apps such as Warp to type questions into running Claude/Gemini CLI sessions and receive answers.
Uses Xcode for iOS Simulator screenshots and can open file:line references in Xcode.
Click on "Deploy 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., "@VisionCLIwhat is this error on my 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.
"What is this file for?" Your assistant looks at the window under your mouse, finds the real file in your project and answers with
file:linereferences.Hold ⌥ and ask out loud (⌥⌘ to include a screenshot). Visi, a little robot, peeks in from the edge of the screen while it listens and thinks; the answer appears in the top-right corner and is read aloud.
Claude or Gemini, your choice. Uses your own
claudeoragysign-in (no API keys) and the session already running for that project, so you can type and talk in the same conversation. Pick the model and effort in VisionCLI menu → Settings… → Assistant.Uses your computer. "Open Xcode and run the app", "fill this form", "switch the dropdown to Production": it clicks, types, presses shortcuts and opens apps, one checked step at a time, reading each app's real buttons and fields through Accessibility. You approve each action (or allow all), passwords and System Settings always ask, a task panel shows every step with Pause/Stop, and Esc stops it instantly.
Meeting Notes (optional). In a meeting, it transcribes your colleagues (your computer's sound) and you (the microphone) on your computer and shows the conversation in a side panel. Each colleague's turn gets a one-line summary. When you're asked something, three short replies appear once they've finished talking. Questions about the code are answered from your project. Each meeting is saved with its notes, a summary at the end and a recording you can play back. Nothing is sent for you.
Notices crashes. When your app (Mac or Simulator) crashes, VisionCLI offers to explain it, and the next question already knows which crash report to read.
Points and draws. Answers point at things on your real screen (boxes, circles, arrows, numbered steps) and can include Mermaid diagrams rendered in the bubble.
Fast browser control. "Open the Stripe tab", "click sign in", "pause the video" run in under a second (via TypeSafe Jev), with a visible AI cursor. Forms, dropdowns, toggles and framed portals work through the page itself, without opening stray tabs.
Multi-step browser tasks. "Find a stay in Lisbon with a pool and free cancellation and open it": a Jev agent works through the page in front one step at a time (type, click, pick, scroll), about 0.3–0.5 s per step, with each step shown in the bubble. Needs Chrome's Allow remote debugging (chrome://inspect/#remote-debugging) and a click on Allow when it first connects.
Knows your data. Read-only database questions ("how are payments and orders related?") using your project's
.env.
Install
Requirements
macOS 13 or later (Apple Silicon or Intel), Linux (x86_64 or arm64; X11 or Wayland: see Linux), or Windows 10/11 (x64 or Arm, preview: see Windows)
At least one AI CLI, installed and signed in: Claude Code (
claude), Antigravity CLI (agy, Gemini on a Google account), or Gemini CLI (gemini)Node.js 18 or later
1. Download the app
Download
VisionCLI-<version>-macos.dmgfrom the latest release.Open it and drag VisionCLI into Applications.
The app isn't notarized by Apple yet, so the first time:
Right-click VisionCLI → Open → Open (on macOS 15 and later: System Settings → Privacy & Security → Open Anyway), or
run
xattr -dr com.apple.quarantine /Applications/VisionCLI.appin Terminal.
With Homebrew (available once published):
brew install --cask thethirdsourcers/tap/visioncliEvery release file can be checked against the workflow that built it: gh attestation verify <file> -R thethirdsourcers/visioncli. All install options are on visioncli.thethirdsourcers.com; docs/DISTRIBUTION.md covers each channel.
Updates
VisionCLI checks GitHub for new releases at launch and every 6 hours. When one is out, the VisionCLI menu shows Install Update: it downloads the release, checks it's signed with the same certificate, replaces the app and restarts, keeping your permissions and settings. Use VisionCLI menu → Settings… → General → Check Now to check now, or turn automatic checks off there.
2. First launch
The VisionCLI icon appears in the menu bar and a welcome screen offers to set up the CLIs it finds. That registers VisionCLI's tools for every project: claude mcp add visioncli --scope user … for Claude Code, the global MCP config for Antigravity CLI, and gemini mcp add -s user --trust visioncli … for Gemini CLI. You can also do it later from VisionCLI menu → Settings… → Integrations → Connect.
macOS will ask for three permissions. VisionCLI needs all of them:
Permission | Why |
Microphone and Speech Recognition | to hear your question while you hold ⌥ |
Screen & System Audio Recording for VisionCLI | to see the window you're asking about in voice mode. After allowing it, quit and reopen VisionCLI. |
Screen & System Audio Recording for your terminal app (iTerm, Terminal, Warp…) | when you type to Claude Code, the screenshot is taken by the terminal running |
Automation (iTerm, Chrome/Brave) | asked the first time it types into your terminal or controls the browser |
If something doesn't work, check System Settings → Privacy & Security, and VisionCLI menu → Settings… → Advanced → Open Log.
3. Optional extras
Add | Get | How |
Parakeet | Fastest local transcription (~0.3s on the Neural Engine) that spells your project's class names right. Apple Silicon | VisionCLI menu → Settings… → Voice → Speech recognition → Parakeet (downloads ~600 MB on first use) |
Wispr Flow | Use your own Wispr Flow account: hold ⌥ and speak as usual | Have Flow running with its push-to-talk key on fn, then pick Wispr Flow in Speech Recognition |
Whisper | More accurate transcription of names and jargon (~0.7s, local) | VisionCLI menu → Settings… → Voice → Speech recognition → Whisper Download… (installs |
Kokoro | Natural voices for spoken answers (local) | VisionCLI menu → Settings… → Voice → Natural voices Download… (installs |
TypeSafe Jev | Instant browser commands and multi-step browser tasks | add your key via VisionCLI menu → Settings… → Integrations → Edit API Keys…, or set |
Browser control | Click, scroll and read pages | in Chrome or Brave: View → Developer → Allow JavaScript from Apple Events |
Models are saved in ~/Library/Application Support/visioncli/models/. Whisper and Kokoro models you already have from other tools (e.g. in ~/.cache/whisper) are picked up automatically. Without them, VisionCLI uses Apple's on-device speech recognition and the system voice.
Related MCP server: PeepIt MCP
Linux
Download
VisionCLI-<version>-linux-x86_64.AppImage(or-arm64), the.debfor Debian/Ubuntu or the.rpmfor Fedora/openSUSE, from the latest release. Or install from a repository, so updates come with the system's (available once published):# Debian / Ubuntu curl -fsSL https://visioncli.thethirdsourcers.com/public.key | sudo gpg --dearmor -o /usr/share/keyrings/visioncli.gpg echo "deb [signed-by=/usr/share/keyrings/visioncli.gpg] https://visioncli.thethirdsourcers.com stable main" | sudo tee /etc/apt/sources.list.d/visioncli.list sudo apt update && sudo apt install visioncli-linux # Fedora / RHEL / openSUSE sudo curl -fsSL -o /etc/yum.repos.d/visioncli.repo https://visioncli.thethirdsourcers.com/visioncli.repo sudo dnf install visioncli-linux # Flathub / Snap Store flatpak install flathub com.thethirdsourcers.VisionCLI sudo snap install visioncli --classicInstall the desktop tools VisionCLI uses (the script detects apt/dnf/pacman/zypper and your desktop, and asks before installing):
sh app/scripts/install-deps.shfrom the repo, or see docs/LINUX.md.Start VisionCLI. The setup wizard checks each piece and offers fixes:
Hold Alt to talk reads the keyboard directly, so join the
inputgroup once (sudo usermod -aG input $USER, then log out and in). On X11 it also works without it.GNOME on Wayland: VisionCLI installs a small GNOME Shell extension so it can see windows and the pointer (log out and in once). KDE, Sway and Hyprland need nothing extra.
Computer control on Wayland asks once through the desktop's Remote Desktop permission.
Terminal mode types into
clauderunning in tmux, kitty or WezTerm, or into any terminal window directly.
Keys: ⌥ is Alt, ⌘ is Super. Everything else matches the macOS app.
Windows
Preview. Download VisionCLI-<version>-windows-x64.exe (or -arm64) from the latest release and run it: it installs for your user only, no admin rights. The installer isn't code-signed yet, so SmartScreen asks once: More info → Run anyway. With winget (available once published): winget install TheThirdSourcers.VisionCLI; a Microsoft Store listing is in preparation.
Keys: ⌥ is Alt, ⌘ is the Win key (hold Alt to ask, Alt + Win with a screenshot, Alt + Shift + Space to drag a region). Terminal mode types into claude in Windows Terminal, WezTerm or any console window, including Claude Code inside WSL. Nothing else to install: keyboard, screen, UI Automation and the microphone work out of the box; the setup wizard downloads the speech models.
Gemini (Antigravity CLI or Gemini CLI)
VisionCLI works with Gemini as well as Claude, using your own sign-in, the same way it uses your claude login:
Use when | |
Antigravity CLI ( | You sign in with a personal Google account. Google now serves personal accounts through Antigravity. |
Gemini CLI ( | Your Gemini CLI sign-in still works (paid Code Assist / work account), or you add an API key. |
Set up: VisionCLI menu → Settings… → Integrations → Connect next to Gemini (Antigravity) or Gemini CLI (or
visioncli install, which registers every CLI it finds).Antigravity: adds visioncli to
~/.gemini/config/mcp_config.jsonand allows its read-only/navigation tools in~/.gemini/antigravity-cli/settings.json.Gemini CLI:
gemini mcp add -s user --trust visioncli ….
Typing: in
agyorgemini, the visioncli tools (look, browser, database, device screenshots…) are available in every workspace.Voice: choose VisionCLI menu → Settings… → Assistant → Gemini (Antigravity).
Terminal mode types your question into the
agy/geminirunning for the project (or opens one) and shows the answer in the terminal and the bubble.Bubble Only mode runs it headless (
agy -p … --output-format stream-json, orgemini -p … -o stream-json) and continues the same conversation each time.
Pointing at a terminal that runs
claude,agyorgeminiuses that CLI, whatever the Assistant setting.
Notes:
In Bubble Only mode the CLI can't ask for approval, so it only reads (code, screen, browser, database). Use terminal mode for edits and commands.
Headless
agytakes ~15s to start per question; terminal mode keeps it running and answers faster.Gemini CLI on a free personal Google sign-in now fails with "…no longer supported for Gemini Code Assist for individuals". Use Antigravity instead, or add
"gemini": {"apiKey": "..."}in VisionCLI menu → Settings… → Integrations → Edit API Keys….
Use it
Voice (anywhere)
Keys | What happens |
Hold ⌥, speak, let go | Ask as text, no screenshot (cheap). The assistant knows which window you're over and takes a look itself if it needs to. Tap to start, tap again to send |
Hold ⌥ ⌘ | Ask with a screenshot of the window under the mouse |
Hold ⌥ ⇧ Space | Ask with a screenshot of just an area: drag a box around exactly what you mean, or tap ⌥ ⇧ Space again for the whole window |
⌥ P | Pin the answer: scroll, select text, click |
⌥ O | Open the first |
⌥ ↩ / esc | Approve or deny an edit or command (background mode) |
esc | Dismiss, or stop the answer |
To attach a screenshot to every question instead, turn on VisionCLI menu → Settings… → General → Screenshot every question.
Which project? By default VisionCLI follows the window under your mouse. PhpStorm myshop – payments maps to ~/PhpstormProjects/myshop, and a terminal running claude maps to its folder. With several projects open, pick one in VisionCLI menu → Project. The menu bar shows the current project.
Which session? In Terminal mode (the default), voice questions are typed into the claude (or agy/gemini, see Gemini) already running for that project in iTerm, or a new one is opened. You can type there too; it's one conversation, and answers show in both the terminal and the bubble. Bubble Only mode uses a hidden, leaner session instead. Switch in VisionCLI menu → Settings… → Assistant → Answers appear.
In Claude Code (typing)
After Set Up Claude Code, just talk about what's on screen in any project:
"what is this file for?", "why is this view misaligned in the simulator?"
"let me select an area", "read the page I have open and summarize it"
"how are the orders and payments tables related?"
Slash commands: /mcp__visioncli__see <question>, /mcp__visioncli__point <question>.
Tool | |
| Screenshot the window behind the terminal, the one under the mouse, a named app, or a display; reports the pointer position |
| Pick a window, drag a box, or use the clipboard image |
| Clean iOS Simulator (needs Xcode) or Android ( |
| Tables, columns, foreign keys; single read-only SELECT/SHOW/DESCRIBE/EXPLAIN/WITH queries in a read-only transaction (MySQL, Postgres, SQLite from |
| Fast Chrome/Brave control via AppleScript (dropdowns, toggles with on/off state, custom React/Radix widgets) |
| Fills a whole form in one call: text fields, dropdowns (native, custom or searchable) and checkboxes |
| Hands a multi-step task on the open page to the Jev agent (about 0.4 s a step) |
| Use any app: Accessibility element list with ids, real mouse/keyboard, by element id or screenshot pixels. Performed by VisionCLI.app (needs Accessibility permission), approved in the bubble |
| Start the voice overlay |
Menu
Project (Auto, or pick from running claude/agy/gemini sessions, open editors and recent projects) · Claude Usage · History · New Conversation · Copy Last Answer · Show Terminal · Settings… (⌘,).
Settings… opens one window, laid out like System Settings; changes apply right away:
General: start at login, check for updates (now or automatically), Setup Wizard, screenshot every question.
Assistant: Claude Code or Gemini (Antigravity), where answers appear (terminal or bubble only), model, effort, fast model for simple questions.
Voice: read answers aloud, speed, voice (with a sample), natural voice download, speech recognition (Parakeet, Wispr Flow, Whisper, Apple), vocabulary, microphone and speaker.
Computer Control: ask before each action, allow all, or off; Accessibility; AI cursor and instant commands in the browser; watch for app crashes.
Meeting Notes: on/off, summaries (colleagues, you), suggested replies, code answers, recording, past meetings, and hiding VisionCLI from screen sharing.
Integrations: connect VisionCLI's tools to Claude Code, Antigravity and Gemini CLI; API keys.
Advanced: Fix Permissions, log, crash log, home folder.
API keys
VisionCLI menu → Settings… → Integrations → Edit API Keys… opens ~/Library/Application Support/visioncli/integrations.json (readable only by you):
{
"typesafe": { "apiKey": "..." },
"gemini": { "apiKey": "..." }
}typesafe: instant browser commands with Jev. Without it, every request goes to the assistant.gemini(optional): makes VisionCLI's Gemini runs use this API key instead of yourgeminisign-in.
TYPESAFE_API_KEY in your shell is copied here by visioncli voice if the file has none.
Privacy
Screenshots and questions go to the assistant you picked (Claude Code or Antigravity), through your own login.
With Jev enabled, quick commands send your spoken words, open tab titles and URLs, and visible link/button text to api.typesafe.ai. Browser tasks also send the visible text, controls and field values of the page in front (never password fields). Turn it off in Settings.
Computer control runs locally: the MCP server talks to VisionCLI.app over 127.0.0.1 with a per-launch secret token (in a file only you can read). Nothing is clicked or typed unless an assistant asks and you allow it (or chose Allow All Actions).
Whisper and Kokoro run locally. History is stored in
~/Library/Application Support/visioncli/.
Build from source
git clone https://github.com/thethirdsourcers/visioncli.git && cd visioncli
npm install # builds the MCP server (dist/)
node dist/index.js install # register with Claude Code, Antigravity CLI and Gemini CLI (whichever are installed)
npm run build # build VisionCLI.app and install it into /Applications
node dist/index.js voice # start voice mode (under launchd: restarts after a crash)npm run setup-signing(optional, once) creates a local code-signing identity so macOS keeps permissions across rebuilds.npm run releasebuilds the downloadable universal.dmgand.zipintorelease/. Pushing av*tag does the same on GitHub Actions and attaches them to a release.
Layout: src/ is the MCP server and CLI (TypeScript). overlay/Sources/ is the menu-bar app (Swift). scripts/ has the build, release and signing scripts.
Troubleshooting
Problem | Fix |
"VisionCLI can't be opened" | Right-click → Open, or |
Claude sees only the wallpaper | Voice: enable Screen Recording for VisionCLI. Typing in Claude Code: enable it for your terminal app. Then quit and reopen that app. |
Tools missing in Claude Code / Gemini CLI | VisionCLI menu → Settings… → Integrations → Connect / Reconnect (again after moving the app or switching Node versions), then restart |
Gemini CLI: "no longer supported for Code Assist for individuals" | Google moved personal accounts to Antigravity: choose VisionCLI menu → Settings… → Assistant → Gemini (Antigravity) (or add a Gemini API key) |
Gemini answers "tried a step that needs your approval" | Bubble Only mode can't approve commands/edits; switch VisionCLI menu → Settings… → Assistant → Answers appear to the terminal |
Answers only in the terminal, or none at all | VisionCLI menu → Settings… → Advanced → Open Log; check |
Microphone errors | Pick a specific mic in VisionCLI menu → Settings… → Voice → Microphone |
Sound bars move but no text appears | The pill now says why. Usually: allow Speech Recognition for VisionCLI (Privacy & Security), or turn on Keyboard → Dictation. Installing Whisper also transcribes without Apple's recognizer. |
Asked for permissions again after updating, though Settings shows VisionCLI as allowed | The switch belongs to an older signature. VisionCLI 0.5.5+ clears it automatically on first launch; otherwise use VisionCLI menu → Settings… → Advanced → Fix Permissions… (or remove VisionCLI with − and add it again). Happens once when moving to the permanently signed releases; later updates keep permissions. |
It crashed | It restarts automatically; details are in VisionCLI menu → Settings… → Advanced → Open Crash Log |
Contributing
Contributions are welcome: bug reports, fixes, platform support and docs. See CONTRIBUTING.md for how the code is organised and how to build and test it, and look for issues labelled good first issue to get started. Security problems: SECURITY.md.
License
MIT © Third Sourcers
Available Tools
31 toolsannounceTell the user out loudA
Show a short update in VisionCLI's bubble and say it out loud, e.g. when background work you promised to report on has finished ("The v0.7.6 release is live."). One or two short spoken sentences, plain text, no markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | What to tell the user, as it should be spoken |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden and does well: it discloses the output modality (visual bubble plus spoken audio) and hard content constraints (one or two short sentences, plain text, no markdown). It does not cover failure behavior or whether the call blocks/interrupts ongoing speech, keeping it out of 5 territory.
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 well-formed sentence with an embedded example and format constraints, front-loaded with the action. Every clause earns its place; nothing is padded.
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 one-parameter, side-effecting announcement tool with no output schema and no annotations, the description covers purpose, timing, and content format adequately. Minor gaps remain around error/failure behavior, but the tool is simple enough that this is nearly 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 100% so baseline is 3, but the description adds real meaning to the single 'text' parameter: it constrains length (one or two sentences), content type (plain text), and format (no markdown), which the schema's generic 'as it should be spoken' does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific dual action: display a short update in VisionCLI's bubble AND speak it aloud. The medium and modality are unambiguous, and it is clearly distinct from voice/screenshot siblings like start_voice or device_screenshot.
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?
Gives a concrete when-to-use trigger ('when background work you promised to report on has finished') with an example. It offers clear context but names no exclusions or alternative tools (e.g., start_voice), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_clickClick an elementB
Click an element by id from browser_elements (or by its visible text).
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Element id like e12, or visible text |
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 says nothing about what happens after the click (navigation, new tab, page mutation), whether it waits for load, scroll-into-view, or failure behavior on missing elements.
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 with the essential action first and zero filler. Nothing 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 simple one-param tool this is close to adequate, but with no annotations and no output schema the description omits any post-click consequence, leaving the agent unsure whether to re-read the page or expect a return value.
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 single param is fully documented in the schema ('Element id like e12, or visible text'). The description merely restates the same id-or-text duality, adding no syntax or format detail beyond the schema. Baseline 3 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?
States a specific verb (click) and resource (element), and names the sibling browser_elements as the source of the id. However, it does not contrast with other interaction siblings like browser_type, so differentiation is only partial.
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 parenthetical '(or by its visible text)' implies a usage style, and referencing browser_elements hints at a prerequisite workflow. But there is no explicit when-to-use/when-not guidance and no alternatives named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_dragDrag and dropA
Drag an element onto another (ids from browser_elements, which lists draggables, or visible text): sorting lists, boards, upload drop zones, sliders built from divs. Returns the target's text afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Where to drop it: id or visible text | |
| from | Yes | What to drag: id or visible text |
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 does disclose one behavioral fact the schema cannot: the return value is the target's text afterwards. It still omits mutation/reversibility implications, how the drag is performed (HTML5 vs synthesized mouse events), and what happens when the drop fails — all meaningful for a notoriously flaky interaction.
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 dense sentence with the core action front-loaded, followed by applicability examples and the return value. No filler, no restating of the name or title.
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 2-parameter tool with no annotations and no output schema, the description covers both parameter sourcing and the return value, which is most of what an agent needs. It stops short of covering failure modes or drag-mechanism caveats, which would be valuable for such a brittle operation.
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 baseline is 3, and the description adds a bit more: it clarifies that ids come from browser_elements, 'which lists draggables', and that visible text is also accepted for both endpoints. This helps the agent source valid values rather than guessing.
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 concrete verb+resource ('Drag an element onto another') and enumerates the scenarios it targets (sorting lists, boards, upload drop zones, div-based sliders). It does not, however, distinguish itself from the near-identical sibling tool `drag`, which an agent could easily confuse it with.
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 use cases listed imply when this tool is appropriate, and pointing to browser_elements for ids gives practical setup context. There is no explicit when-not guidance, no statement of failure/fallback conditions, and no routing away from the `drag` sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_elementsList clickable elementsARead-only
Visible links, buttons, fields, dropdowns (with options) and toggles (with on/off state) on the active page, with ids (e1, e2, …) for browser_click / browser_type / browser_select.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds real context beyond that: only visible elements are returned, and the payload includes dropdown options and toggle on/off state, which tells the agent what fidelity to expect. It omits viewport/iframe scope and any listing caps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence that front-loads the element inventory and ends with the actionable id mapping. No filler, and the most decision-relevant information (what is listed, what the ids are for) comes first.
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 the work of describing the return shape by enumerating element kinds, options, toggle state, and id format — sufficient for an agent to consume the result. Minor gaps remain around scope (viewport only? iframes?) and result size limits.
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, so there is nothing for the description to compensate for; baseline 4 applies. The schema is empty and fully self-consistent with the no-argument design.
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 verb+resource: it lists visible interactive elements (links, buttons, fields, dropdowns, toggles) on the active page, and explains the id scheme (e1, e2, …). An agent can tell exactly what comes back. It does not differentiate itself from the sibling ui_elements, which is the one ambiguity left.
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?
Usage is implied rather than stated: the ids exist 'for browser_click / browser_type / browser_select', which sketches the intended workflow of enumerate-then-act. There is no explicit when-to-use / when-not guidance, and no mention of how this differs from ui_elements or look.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_fillFill in a formA
Fill several fields of a form in one call (ids from browser_elements): text fields get the text, dropdowns (native, custom or searchable) pick the option by its text, checkboxes/radios/switches are set on (true) or off (false). Much faster than one call per field. Each field reports its result; submit with browser_click afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses per-field result reporting and the follow-up submit step, but says nothing about failure behavior (abort vs. continue), whether existing text is cleared, or whether it waits for elements to be ready.
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?
Front-loaded and dense, with each clause carrying information. The opening sentence is long and stacks several type-mapping clauses, but nothing 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 batch mutation tool with no annotations and no output schema, the description covers value semantics, id sourcing, per-field reporting, and the next step. The main gaps are error/partial-fill behavior and pre-existing value handling, which an agent would reasonably want to know.
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 effectively 0% for the value field and the array structure, so the description must compensate — and it does, explaining that text fields take the text string, dropdowns take the option text, and checkboxes/radios/switches take true/false. The target format is only loosely covered via 'ids from browser_elements'.
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 (fill) on a specific resource (several fields of a form) and defines behavior per field type, which distinguishes it from the single-field siblings browser_type and browser_select. The batch scope is front-loaded ('in one call').
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?
Points to browser_elements for the element ids and to browser_click for submitting afterwards, and implies the alternative of one-call-per-field. It never names browser_type/browser_select explicitly, so the routing is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_hoverHover over an elementA
Hover over an element (id from browser_elements) to show what appears on hover: menus, captions, tooltips. Then call browser_elements to see and click what appeared.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Element id like e12, or its visible text / image description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the observable effect of hovering and the necessary follow-up re-inspection step, which is genuinely behavioral context. It omits timing concerns (hover menus may need a wait before they render), whether hover state persists, and failure behavior when hover reveals nothing.
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 its purpose, followed by the required next step. Every clause earns its place, though naming browser_elements twice is slightly repetitive for such a short description.
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 one-parameter interaction tool with no output schema and no annotations, the description covers what it does, why, and the follow-through workflow. Only the timing/robustness caveats are missing, which is a minor gap at this complexity level.
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% for the single target parameter, so the schema already documents both the id format (e12) and the text/image-description fallback. The description only adds the provenance of the id ('from browser_elements'), which is marginal 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?
States a specific verb (hover) and resource (element) and immediately distinguishes itself from click-style siblings by declaring what hovering reveals: menus, captions, tooltips. An agent can tell it apart from browser_click or browser_elements without opening any 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?
Provides a clear workflow context - hover to expose hidden UI, then call browser_elements to see and click what appeared. It implies the 'when' (revealing hover-gated menus) without explicitly stating when not to use it or naming a competing sibling as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_openOpen a URLA
Open a URL in Chrome/Brave. Always use this (never ⌘L/⌘T + typing) to go to a page: it switches to a tab already showing it, otherwise reuses your own working tab, and only opens one new tab the first time. new_tab: false loads it in the user's current tab.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| new_tab | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and usefully discloses tab behavior: it switches to an existing tab, reuses the current working tab, and only opens a new tab the first time. It does not cover failure behavior or permissions, but for an open-URL tool the key behavioral traits are present.
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 then adds the critical navigation behavior without unnecessary filler. Both sentences earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description provides enough behavioral context to call it correctly. The main remaining gap is lack of sibling-tool differentiation.
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 needs to compensate for parameter meaning. It explains new_tab:false clearly, but it does not explain URL format or fully document the default true behavior of new_tab.
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: opening a URL in Chrome/Brave. It clearly distinguishes itself from manual keyboard navigation, but it does not differentiate itself from sibling tools such as browser_navigate or open_url.
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 usage guidance: always use this instead of Cmd+L/Cmd+T plus typing. It also explains the new_tab:false case, but it does not state when to use sibling browser navigation tools instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_readRead the current pageARead-only
Title, URL, selected text and readable text of the active tab (capped). Faster and more exact than a screenshot.
| Name | Required | Description | Default |
|---|---|---|---|
| max_chars | No | Raise it (up to 50000) only if the text you need was cut off |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real value beyond that: it discloses the return shape and that content is capped, which warns the agent output may be truncated. No auth, rate-limit, or pagination detail is given, but the cap disclosure is the important behavioral trait here.
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 clauses, front-loaded with the return contents and then the differentiator. No filler sentences; every word carries 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 single-parameter, read-only tool with no output schema, the description enumerates the return fields and notes truncation, and the annotation covers safety. Nothing needed to invoke it correctly is missing.
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% and the max_chars description ('Raise it (up to 50000) only if the text you need was cut off') already explains usage, bounds and default. The description's '(capped)' merely echoes the schema, so baseline 3 is appropriate.
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 (read) and resource (the active tab), then enumerates exactly what is returned: title, URL, selected text and readable text. The comparison to a screenshot implicitly distinguishes it from device_screenshot/look, so an agent can tell it apart from 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?
The clause 'faster and more exact than a screenshot' gives a clear selection signal against the screenshot siblings. It stops short of explicit when-not guidance or naming alternatives such as browser_elements for structured/DOM data, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_scrollScroll the pageC
Scroll the active page.
| Name | Required | Description | Default |
|---|---|---|---|
| where | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does not disclose how far a single scroll moves (viewport, page, pixel amount), whether it waits for lazy content, or whether it ever fails or returns anything. For a browser-interaction tool with zero structured behavioral hints, this is a substantial gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with no wasted words, but it is terse to the point of under-specification rather than genuinely concise. Brevity here costs information rather than saving it.
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 annotations, no output schema, and 0% parameter coverage, the description should compensate but does not. It omits scroll magnitude, return behavior, and any interaction with dynamic content, so an agent cannot predict the effect of invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'where' parameter has 0% schema description coverage, and the description adds nothing about it. The enum values (down/up/top/bottom) are largely self-explanatory, but the description does not clarify semantics such as whether 'down' scrolls by a viewport or a small increment.
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 (scroll) and resource (the active page), which is clear enough to separate it from siblings like browser_click or browser_read. It does not, however, differentiate itself from other navigation-type siblings or explain the scope of 'active page' vs. tabs/windows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to scroll versus using browser_navigate, browser_read, or select_region. There are no prerequisites or exclusions given, leaving the agent to infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_selectChoose a dropdown optionA
Pick an option in a dropdown (native or custom combobox/menu) by its visible text. Use this instead of browser_click for dropdowns. Toggles/switches/checkboxes: use browser_click (browser_elements shows their on/off state).
| Name | Required | Description | Default |
|---|---|---|---|
| option | Yes | Option text | |
| target | Yes | Dropdown id from browser_elements |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the burden. It adds real context (matches by visible text, works on native and custom widgets, sibling routing for checkboxes), but omits failure behavior, whether a custom combobox must be opened/expanded first, viewport auto-scroll, and what happens when option text is ambiguous or absent.
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, zero filler, with the core action front-loaded before the disambiguation rules. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with full schema coverage and no output schema, the description covers purpose, routing, and widget scope adequately. Only edge-case behavior (not-found option, collapsed custom menu) is absent, which is a minor gap at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both params are already documented ('Option text', 'Dropdown id from browser_elements'). The description's 'by its visible text' and 'dropdown' wording only lightly reinforces what the schema states; no added semantics such as matching rules or format expectations.
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 (pick) and resource (option in a dropdown) and explicitly covers both native <select> and custom combobox/menu variants. An agent can distinguish it from browser_click and browser_fill 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?
Explicitly routes: use this instead of browser_click for dropdowns, and use browser_click for toggles/switches/checkboxes, with a pointer to browser_elements for their state. Both the when-to-use and the alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_switch_tabSwitch tabB
Bring a tab (id from browser_tabs) to the front.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure, and it says almost nothing: no mention of what happens on an invalid tab_id, whether the OS window is focused, whether the tab is restored or only made active, or whether it errors. Only the bare effect ('to the front') is stated.
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 with no filler; the action and the parameter provenance are both packed in without waste.
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 (one required param, no output schema, no annotations), so a short description is defensible. Still, for a state-changing view operation it should at least say what a success looks like and what occurs when the id no longer exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema gives only a bare string with no format, so the description nominally does add value by naming browser_tabs as the source of the tab_id. But it does not describe the expected id format or whether ids are stable across sessions, leaving a real 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+resource ('Bring a tab ... to the front') and clarifies the identifier provenance ('id from browser_tabs'), which separates it from the sibling browser_tabs that lists tabs. It does not, however, contrast itself with other navigation siblings like browser_navigate or browser_open.
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?
Usage is only implied: the agent must infer it should call this after identifying a tab via browser_tabs. There is no explicit when-to-use, no conditions under which switching is needed, and no note about behavior when the tab is already active or the id is stale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_tabsList browser tabsARead-only
Open tabs in the front-most Brave/Chrome (ids like t1.3 = window 1, tab 3), marking the active one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description adds real value beyond the annotation by disclosing the id format ('t1.3 = window 1, tab 3') and that the active tab is marked, which shapes how the agent parses 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?
One sentence, front-loaded with the resource and scope, with the id-format detail packed into a parenthetical rather than a separate sentence. Slightly dense but nothing 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 no-param, non-mutating tool with no output schema, the description covers what is returned (tab list with ids) and the active-tab marker. It stops short of describing ordering or how many windows are covered, but that 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?
Zero parameters, so the schema imposes no semantic burden and the baseline is 4. The description correctly avoids restating a nonexistent parameter list.
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: it lists open tabs in the front-most Brave/Chrome window. The scope qualifier 'front-most' implicitly separates it from list_windows and other browser_* siblings, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no mention of browser_switch_tab as the natural follow-up, and no prerequisite stated. The agent must infer that this is the discovery step before acting on a tab.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_taskDo a task on the page (fast)A
Hand a multi-step task on the web page in front of the user's Chrome/Brave to VisionCLI's Jev agent: fill in a form, search this site and open a result, set filters, pick options, add to a cart. It clicks, types and selects in a few seconds (about 0.4 s a step). Put every value to type in the goal: it only types text that's in the goal. Returns each step and where it ended; check the result with browser_read if needed. Open the right page first (browser_open).
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | The whole task, with every value to type, e.g. "search for 'standing desk', sort by price and open the first result" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses that the agent clicks, types, and selects, runs at about 0.4 s per step, only types text present in the goal, and returns each step plus where it ended. It does not discuss failure modes, permissions, or side-effect reversibility, but the operational behavior is unusually well explained.
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?
Front-loads the core action, then supplies examples, timing, input constraint, return behavior, and prerequisite in a compact sequence. Every sentence adds actionable 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?
Covers the essential context for a no-annotation, single-parameter automation tool: what it does, how to prepare the page, how to supply values, and what it returns. It could mention failure handling or confirmation behavior more explicitly, but the definition is complete enough to invoke 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 single goal parameter is fully covered by the schema, and the description adds a crucial constraint beyond the schema: every value to type must be included in the goal because it only types text that is in the goal. That materially changes how an agent should construct the parameter.
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 and resource: hand a multi-step task on the current web page to VisionCLI's Jev agent. The examples (fill a form, search and open, set filters, add to cart) make the scope concrete and distinguish it from atomic siblings like browser_click or browser_fill.
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?
Clearly indicates multi-step tasks and gives prerequisites: open the right page first with browser_open, and check the result with browser_read if needed. It does not explicitly say when to prefer atomic browser_* tools over this one, so the alternative boundary is implied rather than fully stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_typeType into a fieldB
Set the value of a form field (id from browser_elements), optionally submitting the form.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| submit | No | ||
| target | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses one side effect ('optionally submitting the form'), but not whether typing clears the existing value, fires input/change events, waits for navigation, or what happens on a failed submit. Critical mutation behavior is undisclosed.
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 sentence with the core action front-loaded and the sibling reference and optional behavior tucked into a parenthesis. No filler, nothing to trim.
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 mutation tool with zero annotation coverage, no output schema, and 0% parameter documentation, the description leaves significant gaps: field-clearing behavior, event firing, submit side effects, and failure handling are all unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains 'target' (an id sourced from browser_elements) and 'submit' (submitting the form), covering two of three params, but says nothing about whether 'text' appends to or replaces existing content, or any format expectations.
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 ('Set the value') and resource ('form field') and links the target to browser_elements, which distinguishes it from browser_click and browser_read. It stops short of explicitly contrasting itself with sibling tools, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(id from browser_elements)' implies a workflow prerequisite — call browser_elements first to obtain the target id — but no when-to-use/when-not guidance or alternatives are given. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickClickA
Click on the screen: by element id from ui_elements (preferred), or at x/y pixels in the last screenshot (from look, or image N of the voice question). Supports right-click and double-click.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| count | No | 2 = double-click | |
| image | No | x/y are pixels in this attached voice-question image (1-based) | |
| button | No | left | |
| screen | No | x/y are screen points (e.g. from ui_elements) rather than screenshot pixels | |
| element | No | ||
| look_after | No | Return a fresh screenshot of the front window after the action, to check the result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses almost nothing beyond the schema: no focus/activation prerequisites, no failure behavior when an element id does not resolve, no statement of what state the click mutates, and no mention of the look_after screenshot behavior. 'Supports right-click and double-click' largely restates the button enum and the count parameter description already in 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?
A single dense sentence that front-loads the preferred targeting method before the fallback, so the most important selection rule is read first. Nothing is padded, though the parenthetical nesting (ui_elements / look / image N) makes it slightly harder to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, zero-required tool with no annotations and no output schema, the description covers the core targeting semantics but leaves out failure handling, whether it focuses the target window first, and any mention of the look_after return behavior. Adequate to invoke the tool on the happy path, incomplete for the edge cases an agent will hit.
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 only 50% schema description coverage, the description does meaningful work: it explains that element is an id sourced from ui_elements, that x/y are pixels in the last screenshot by default, and how the `image` index reinterprets those coordinates. It omits the `screen` boolean's distinction between screen points and screenshot pixels, which the schema covers but the description does not reinforce.
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 and resource ('Click on the screen') and distinguishes its two targeting modes by naming the sibling tools that supply each input (ui_elements for element ids, look/image for pixels). It stops short of clarifying how this desktop-level click differs from the sibling browser_click, leaving one purpose boundary implicit.
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 marks the element-id path as 'preferred' over raw x/y coordinates and tells the agent where each targeting value originates, which is real selection guidance. It gives no when/when-not guidance against alternatives such as browser_click or drag, so it is clear but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clipboard_imageRead image from clipboardBRead-only
Return the image currently on the user's clipboard (e.g. a screenshot taken with Cmd+Ctrl+Shift+4).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe, non-mutating read, so the description isn't carrying the safety burden. It adds the useful context that the source is typically a screenshot, but says nothing about what happens when the clipboard is empty or non-image, which is the main behavioral risk for a zero-param read.
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 that states the action, the resource, and a concrete example with zero filler. Nothing could be trimmed without losing 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?
With no output schema and no annotations about return format, the description leaves the agent unaware of how the image is delivered and how failure (no image on clipboard) is signalled. Adequate for a trivial zero-param tool, but the primary edge case an agent will hit is unaddressed.
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, so there is nothing for the description to disambiguate; the baseline of 4 applies. No additional parameter meaning could be added.
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 (return) and resource (image on the user's clipboard), so the agent knows exactly what the tool fetches. However, it gives no signal distinguishing it from sibling image-capture tools such as device_screenshot or select_region.
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 parenthetical example (a Cmd+Ctrl+Shift+4 screenshot) implies the context where the clipboard holds an image, but there is no explicit when-to-use guidance and no mention of alternatives like device_screenshot for capturing an image directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
db_queryRun a read-only SQL queryARead-only
Run one SELECT/SHOW/DESCRIBE/EXPLAIN/WITH query against the project's database inside a read-only transaction. Results are capped at 50 rows; use LIMIT.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | A single read-only SQL statement |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds substantial behavior the annotation grid cannot express: execution inside a read-only transaction, exactly one statement, an enumerated allowlist of statement types, and a hard 50-row result cap with the LIMIT workaround. The row cap is the kind of silent-truncation trait an agent must know before calling.
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: the first front-loads the operation and its constraints, the second front-loads the operational gotcha (row cap) with the remedy. No filler or restatement of the title.
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 one parameter and no output schema, the description covers the essentials: allowed statements, single-statement limit, read-only scope, and result cap. It omits error/timeout behavior and the result's column shape, which are minor gaps for a tool this simple.
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 single parameter is already documented as a read-only SQL statement, so the baseline is 3. The description adds genuine meaning by enumerating the accepted statement prefixes (SELECT/SHOW/DESCRIBE/EXPLAIN/WITH) and the one-statement constraint, going beyond the schema's generic phrasing.
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 (run) and resource (SQL query against the project's database) and enumerates exactly which statement classes are accepted. An agent can immediately distinguish this data-query tool from the sibling db_schema introspection tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: one statement per call, read-only only, and 'use LIMIT' because output is capped. It does not, however, explicitly route the agent to db_schema when it needs to discover tables/columns rather than query data, 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.
db_schemaDatabase schemaARead-only
Tables, columns and foreign keys of the project's database (connection read from the project's .env: Laravel DB_* or DATABASE_URL; MySQL, Postgres, SQLite). Pass a table to narrow it. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | Only this table |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered (and 'Read-only' largely repeats it). The description adds real value beyond the annotations by disclosing that the connection is read from the project's .env (Laravel DB_* or DATABASE_URL) and which engines are supported (MySQL, Postgres, SQLite), which tells the agent where the data comes from.
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 clauses, front-loaded with the resource, then the connection detail, then the narrowing option and the read-only guarantee. No filler, and a reader can stop after the first clause and still know what the tool does.
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?
No output schema exists, so the description must describe the return shape, and it does name the returned elements (tables, columns, foreign keys). It could go slightly further on how results are structured or whether foreign keys are nested, but for a single-parameter introspection tool with annotations already covering safety this is nearly 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 100% and the lone parameter is documented as 'Only this table', so the baseline is 3. The description improves on that by clarifying the omitted-parameter default ('Pass a table to narrow it' implies all tables are returned otherwise), which the schema does not state.
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 resource (tables, columns, foreign keys of the project's database) with the verb implied as introspection, so an agent knows exactly what it retrieves. It does not distinguish itself from the sibling db_query tool, which is the most likely source of confusion, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Pass a table to narrow it' implies the exploratory/overview use case, and 'Read-only' signals it is for inspection rather than mutation. However, it never says when to choose this over db_query or when not to use it, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_screenshotScreenshot a simulator or deviceARead-only
Full-resolution screenshot of the booted iOS Simulator (platform ios) or a connected Android device/emulator (platform android), without window chrome. Use it to explain or debug app UI, then find the view in code.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | ios |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already telling the agent this is a safe read, the description adds real behavioural context: full resolution, no window chrome, and the implicit prerequisite that a simulator must be booted or a device connected. It stops short of saying how the image is returned (inline vs file path), which would be the remaining useful 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?
Two tight sentences, front-loaded with the core action and scope, then the usage hint. Every clause earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description covers target, resolution, chrome behaviour and usage intent. The only real gap is how the capture is delivered back (inline image vs saved path), which the absent output schema leaves to the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema only lists the enum values, but the description meaningfully maps them: platform ios = booted iOS Simulator, platform android = connected Android device/emulator. That is genuine semantic value beyond the bare enum, though it omits the default ('ios').
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 (full-resolution screenshot) and its exact resource (booted iOS Simulator or connected Android device/emulator), plus the 'without window chrome' scope qualifier. An agent can distinguish this from browser/window capture siblings such as look or list_windows without opening any 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?
'Use it to explain or debug app UI, then find the view in code' gives clear positive context for when to reach for this tool. It does not name alternatives or state exclusions (e.g., when to prefer browser_* or look instead), so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dragDragB
Drag with the left mouse button from (x1,y1) to (x2,y2): move files, select text, resize, reorder.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | ||
| x2 | Yes | ||
| y1 | Yes | ||
| y2 | Yes | ||
| image | No | x/y are pixels in this attached voice-question image (1-based) | |
| screen | No | x/y are screen points (e.g. from ui_elements) rather than screenshot pixels | |
| look_after | No | Return a fresh screenshot of the front window after the action, to check the result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It discloses that the drag uses the left mouse button and implies a press-move-release gesture, but it does not describe timing, button-release behavior, side effects, permissions, or what happens on failure.
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 definition is a single front-loaded sentence with no wasted words. The core action and coordinate endpoints appear immediately.
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 interaction tool with no annotations and no output schema, the description is too sparse. It omits the optional image/screen/look_after parameters and does not explain the drag lifecycle or result behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description gives meaning to the four required coordinate parameters by identifying them as start and end points. However, with only 43% schema description coverage, the optional parameters image, screen, and look_after are not explained in the description, and the coordinate system/units are left ambiguous.
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 and resource: a left-button drag from (x1,y1) to (x2,y2). It also lists representative outcomes such as moving files and selecting text. However, it does not explicitly distinguish itself from the sibling browser_drag or click 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 examples 'move files, select text, resize, reorder' imply when the tool is useful, but there is no explicit guidance on when to choose drag over click, browser_drag, or other pointer tools. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_windowsList visible windowsARead-only
List on-screen app windows (front-most first) with ids, app names and titles. Use before look when unsure which window the user means.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the result ordering (front-most first) and the fields returned. It does not mention staleness or whether minimized/off-screen windows are excluded, so it falls just short of a 5.
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 first defines output and ordering, the second routes to the correct usage. The key scoping/ordering detail 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?
With no output schema present, the description compensates by naming the returned fields and their order. For a zero-parameter read-only listing, nothing an agent needs in order to invoke or interpret it is missing.
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, so the baseline is 4; there is no argument semantics to explain and the schema is trivially complete. The description correctly implies a no-argument listing rather than suggesting any filtering options.
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 (List) and resource (on-screen app windows) and names the returned fields (ids, app names, titles) plus ordering (front-most first). It also differentiates from the sibling `look`, so an agent can distinguish it without opening any 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 prescribes when to call it: 'Use before `look` when unsure which window the user means.' This names the alternative tool and the exact condition that selects this one, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookLook at the screenARead-only
Take a screenshot of what the user is looking at and return it as an image. By default captures the window under the mouse pointer (or, if that is the terminal, the front-most other window). Use target "screen" for the whole display the mouse is on. Optionally pick a window by app name/title or window id, or a display number.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | App name or window-title substring, e.g. "Xcode", "Simulator", "Chrome" | |
| target | No | Capture a single window or an entire display | window |
| display | No | Display number for target screen (1 = main; default: the one the mouse is on) | |
| window_id | No | Exact window id from list_windows | |
| under_cursor | No | Capture the window under the mouse pointer (default; falls back if it's the terminal). false = front-most window |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries the behavioral load and does it well: it discloses the default capture target, the terminal fallback, and the screen-vs-window mode. It does not describe failure modes (e.g., missing permission, no matching window) or image format/size, leaving a modest gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and return type, followed by default behavior and the optional targeting modes. No filler or 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?
All five parameters are optional and fully schema-documented, and there is no output schema — the description correctly states the return is an image. Defaults and targeting modes are covered; only cross-tool routing and error behavior are absent, which is minor given the schema richness.
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 baseline is 3, but the description adds real meaning on top: it explains the interaction between target and display, and the fallback semantics of under_cursor that the schema only hints at. That is genuine value beyond the structured fields.
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 and resource — 'Take a screenshot of what the user is looking at and return it as an image' — which is concrete and unambiguous. It does not, however, distinguish itself from nearby siblings like device_screenshot or select_region, so it loses the top mark.
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?
Gives clear operational context: default captures the window under the mouse, terminal falls back, target 'screen' captures the whole display, and a window can be picked by app/title or id. It never says when to prefer this over device_screenshot or select_region, so it stops short of explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_appOpen or switch to an appA
Open an app, or bring it to the front if it's running, e.g. "Xcode", "Slack", "Simulator", "Android Studio", "Figma".
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| look_after | No | Return a fresh screenshot of the front window after the action, to check the result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It usefully discloses that a running app is brought to the front rather than duplicated, which is real behavioral value. However, it omits what happens if the app is not installed, whether a screenshot/return value is produced, and any permission requirements.
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 with the core behavior first and examples last. Every clause earns its place; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema and no annotations, the description covers the essential launch-or-focus semantics. The main missing piece is failure behavior when the named app is absent, which is a modest gap rather than a blocking one.
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 50%: 'look_after' is documented in the schema, while 'name' has no schema description. The examples ('Xcode', 'Slack') do clarify that 'name' expects an app name string, partially compensating. This lands at the baseline for a half-documented 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?
States a specific verb+resource ('Open an app') and clarifies the dual behavior (launch vs. bring to front), which is genuinely distinguishing. Concrete examples ('Xcode', 'Slack', 'Simulator') remove ambiguity about what counts as an app. It does not explicitly contrast with the sibling open_url or browser_open, so it falls 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 implies usage through its phrasing but never states when to use this over alternatives like open_url, browser_open, or browser_navigate. An agent must infer the app-vs-URL split from the tool name alone. Adequate but with a clear routing gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_urlOpen a URLB
Open a link or file URL with its default app (browser, Figma, Slack deep links, vscode://, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| look_after | No | Return a fresh screenshot of the front window after the action, to check the result |
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 does disclose the key behavioral trait: the URL is handed to the OS default app (browser, Figma, Slack, vscode://), so this escapes any built-in browser context. It says nothing about return values, whether it blocks/waits, or failure on unsupported schemes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with zero filler; the verb+resource lead and the parenthetical examples earn their place by clarifying supported schemes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter action tool with no output schema and no annotations, the description covers the core action but omits what the call returns, whether it waits for the app, and how failures surface — gaps the agent cannot fill from structured data.
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 50%: look_after is documented inline, but the required url parameter is not. The description partially compensates by enumerating accepted URL forms (file URLs, app deep links, vscode://), which tells the agent what can be passed, but adds no format or validation 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 (open) and resource (link/file URL) plus the mechanism (default app handler) with concrete scheme examples. It is clear what the tool does, but it never contrasts itself with close siblings like browser_open, browser_navigate, or open_app, leaving the agent to infer the distinction.
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 when-to-use or when-not-to-use guidance and no named alternative. The scheme examples hint at deep-link/OS-handoff scenarios, but the agent must infer that this is for external default-app opening rather than the in-page browser_* family.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_keysPress keysA
Press a key or shortcut (not for browser navigation: use browser_open/browser_navigate), e.g. "enter", "cmd+s", "cmd+shift+p", "tab", "esc", "down". Several separated by spaces run in order: "cmd+a delete".
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | App to send the keys to (brought to the front first); default: the app you last worked in | |
| keys | Yes | ||
| look_after | No | Return a fresh screenshot of the front window after the action, to check the result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses execution semantics — space-separated keys run in order, so 'cmd+a delete' is a sequence rather than a literal string — which is behavior the schema does not express. However it says nothing about focus/permission requirements, failure behavior, or side effects, so the disclosure is partial.
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 exclusion is front-loaded in the parenthetical before the examples, and the two-sentence structure is dense with no filler. It is slightly awkward in flow (the routing caveat interrupts the definition), but every clause earns its place by adding either scope or syntax.
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 three-parameter action tool with no annotations and no output schema, the definition covers purpose, syntax, sequencing, and an explicit routing exclusion — enough for correct invocation. It does not mention what happens to non-frontmost apps or error cases, but the schema's 'app' and 'look_after' descriptions cover the surrounding context.
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 67%, and the undocumented parameter is the required 'keys'. The description compensates directly by giving valid string formats and examples of both single keys and space-separated sequences, which is meaningfully more than the bare 'string' type in the schema. The other two parameters are already fully documented in the schema, so no further description is needed there.
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 (press) and resource (key or shortcut) and immediately distinguishes it from the sibling browser-related tools. The inline examples ('enter', 'cmd+s', 'cmd+shift+p', 'tab', 'esc', 'down') make the scope of 'keys' concrete enough that an agent can tell this apart from type_text or browser_navigate without opening any 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?
Provides an explicit when-not rule with named alternatives ('not for browser navigation: use browser_open/browser_navigate'), which is exactly the kind of routing guidance that prevents misfires. It stops short of a full 5 because it doesn't clarify the boundary against text-entry siblings like type_text or click, so some ambiguity remains for non-navigation use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrollScrollB
Scroll at x/y (default: where the mouse is). dy negative = down, positive = up (lines); dx for sideways.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| dx | No | ||
| dy | No | ||
| image | No | x/y are pixels in this attached voice-question image (1-based) | |
| screen | No | x/y are screen points (e.g. from ui_elements) rather than screenshot pixels | |
| look_after | No | Return a fresh screenshot of the front window after the action, to check the result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It usefully discloses the default action point (current mouse location) and the non-obvious direction convention (dy negative = down), but omits scroll magnitude, focus/foreground requirements, and animation/completion 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 tightly packed sentences that front-load position and direction rules with zero filler. Each clause 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 7-parameter, no-annotation, no-output-schema tool this is thin. The direction convention is covered, but an agent still lacks guidance on scroll amount and modality (image vs screen coordinates are left to the schema), leaving gaps 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 only 43%, so the description must compensate. It adds crucial meaning to dy/dx (sign convention, lines unit) that the bare integer schema does not, but dx is only vaguely described as 'for sideways' and x/y, image, screen, and look_after rely entirely on 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?
States a specific verb (Scroll) and the resource/position model (x/y mouse position), which is concrete. It does not differentiate itself from the sibling browser_scroll, but for a low-level input primitive the action 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?
Provides direction semantics but nothing about when to use this scroll vs browser_scroll, how many lines a call scrolls, whether it can be repeated, or whether the target window must be focused. No alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_regionLet the user select a regionARead-only
Show the native crosshair so the user can drag a rectangle around the exact part of the screen they mean (press Space to pick a window instead, Esc to cancel). Blocks until they finish. Tell the user to make the selection.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely useful behavior beyond that: the call blocks until the user finishes, and the Space/Esc escape hatches. It does not say what is returned when the selection completes.
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 tight sentences with zero waste. The core action is front-loaded, with the modifier keys and blocking behavior following in priority order.
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, non-destructive interaction tool with no output schema, the blocking behavior, cancel path, and user instruction cover nearly everything an agent needs. The one gap is what the call yields on success (coordinates, image, or confirmation).
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, so the baseline is 4. There is nothing for the description to clarify, and it does not need to compensate for any undocumented inputs.
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 (show native crosshair) and the exact outcome (user drags a rectangle around the part of the screen they mean). It also distinguishes itself from the window-selection path by noting Space picks a window instead, which separates it from siblings like device_screenshot and list_windows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear in-context guidance: use this to let the user define a region, press Space for window selection, Esc to cancel, and instruct the user to make the selection. It does not explicitly contrast when to prefer this over device_screenshot or look, so it falls short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_voiceStart voice modeA
Launch the voice overlay for this project: the user holds Option (Option+Command with a screenshot), asks a question out loud, and the answer appears in a bubble above their mouse pointer.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose useful runtime behavior: an overlay appears, the answer renders in a bubble above the mouse pointer, and there is a screenshot variant of the shortcut. However, it omits whether the call blocks while the user speaks, whether microphone/accessibility permissions are required, and how voice mode is exited — gaps that matter to an agent deciding to invoke 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?
One sentence, front-loaded with the verb and resource before the colon, with the interaction detail following. Tight overall, though the parenthetical about Option+Command with a screenshot adds detail of marginal value to an agent's decision to call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter mode launcher with no output schema or annotations, the description covers what the tool is and what the user experiences. It is nearly complete; only the blocking/permission semantics and the absence of a return-value expectation keep it from being fully 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 tool takes zero parameters, so the baseline is 4. The description correctly adds nothing about inputs because there are none, and the keyboard-shortcut detail is a user-side interaction rather than a parameter.
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 concrete verb and resource: 'Launch the voice overlay for this project'. No sibling is explicitly named as an alternative, but no other sibling offers a voice mode, so the purpose is unambiguous. Not a 5 because it never contrasts itself with adjacent tools like 'announce' or 'look'.
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 conveys the user-driven interaction model (user holds Option and speaks), which implies when the tool is relevant, but it never states when to call it versus alternatives or what preconditions must hold. Usage is inferable rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_textType textA
Type text with the keyboard into the focused field, or into element (clicked first). replace: true sets the field's whole value instead of typing. Use press_keys for Enter, Tab, shortcuts.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | App to type into (brought to the front first); default: the app you last worked in | |
| text | Yes | ||
| element | No | ||
| replace | No | ||
| look_after | No | Return a fresh screenshot of the front window after the action, to check the result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. It usefully discloses that `element` is clicked first and that `replace: true` overwrites the whole value, but it says nothing about focus prerequisites, timing/waits, or how typing interacts with existing content. Adequate but not rich for a zero-annotation mutation tool.
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, front-loaded with the core action and immediately followed by the mode distinction and the sibling routing rule. 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?
For a 5-param tool with no output schema and no annotations, the description covers the main call semantics and the key ambiguity (typing vs. replacing). It doesn't address return behavior or failure/timing, but look_after is already documented in the schema, so the remaining gap is minor.
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 40%, so the description must compensate. It adds real meaning for `replace` (whole-value overwrite vs typing) and `element` (clicked first), but leaves `app`, `look_after`, and `text` to the schema/name. Partial compensation, so a mid score.
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 and resource ('Type text with the keyboard') plus the two target modes (focused field, or a clicked `element`). It explicitly distinguishes itself from the sibling press_keys, so an agent can tell them apart 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?
Names the alternative tool and the exact condition that selects it: 'Use press_keys for Enter, Tab, shortcuts.' That is an explicit when-to-use-this-vs-that rule, not implied guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_elementsList UI elementsARead-only
List the buttons, fields, menus, links, tabs and text of the front app's focused window (or a named app) via Accessibility, each with an id and its center in screen points. Use the id with click/type_text: it's far more reliable than pixel guessing.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | App name; default is the front app |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, and the description adds genuinely useful context beyond it: the data comes from the Accessibility tree, each element carries an id plus a screen-point center, and the default target is the front app. It omits operational caveats such as the Accessibility permission requirement or what happens when the app/window is unavailable.
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: the first defines scope and return shape, the second gives the actionable follow-up. No filler, and the most decision-relevant content (what you get and what to do with it) 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?
With no output schema, the description carries return-value explanation well by specifying that each element has an id and a center in screen points. It is nearly complete for a one-parameter read tool, missing only failure/permission behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single 'app' parameter, and its schema description already states 'App name; default is the front app'. The description's '(or a named app)' merely restates this, adding no syntax, format, or edge-case detail 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?
States a specific verb (list) and resource (UI elements of the front or named app's focused window), enumerates what is returned (buttons, fields, menus, links, tabs, text) and even names the retrieval mechanism (Accessibility). This distinguishes it from pixel-based siblings like device_screenshot or look, and from browser_elements which targets DOM content.
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 how to consume the result: 'Use the id with click/type_text', and frames the choice against the alternative approach ('far more reliable than pixel guessing'). It stops short of stating when to prefer it over browser_elements or look, so the guidance is clear but not complete on sibling selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
16 tool updates
v0.11.1- Added
announce - Added
browser_drag - Added
browser_fill - Added
browser_hover - Changed
browser_read2 fields changed- changed
Input schema / properties / max_chars / defaultPrevious value: -12000New value: +6000 - added
Input schema / properties / max_chars / descriptionAdded value: +"Raise it (up to 50000) only if the text you need was cut off"
- Added
browser_select - Added
browser_task - Added
click - Added
drag - Changed
look3 fields changed- changed
Input schema / properties / display / descriptionPrevious value: -"Display number for target screen (1 = main)"New value: +"Display number for target screen (1 = main; default: the one the mouse is on)" - changed
Input schema / properties / under_cursor / defaultPrevious value: -falseNew value: +true - changed
Input schema / properties / under_cursor / descriptionPrevious value: -"Capture the window under the mouse pointer instead of the front-most one (falls back if it's the terminal)"New value: +"Capture the window under the mouse pointer (default; falls back if it's the terminal). false = front-most window"
- Added
open_app - Added
open_url - Added
press_keys - Added
scroll - Added
type_text - Added
ui_elements
17 tool updates
v0.4.1- First observed
browser_click - First observed
browser_elements - First observed
browser_navigate - First observed
browser_open - First observed
browser_read - First observed
browser_scroll - First observed
browser_switch_tab - First observed
browser_tabs - First observed
browser_type - First observed
clipboard_image - First observed
db_query - First observed
db_schema - First observed
device_screenshot - First observed
list_windows - First observed
look - First observed
select_region - First observed
start_voice
TDQS
Scored across 31 tools
Descriptions do distinguish the browser_* family (web pages) from the unprefixed desktop tools, which helps, but there are many near-duplicate pairs: browser_click/click, browser_type/type_text, browser_scroll/scroll, browser_drag/drag, and browser_elements/ui_elements. browser_task also overlaps nearly every other browser tool, so an agent must read carefully to avoid misselection.
All names use snake_case, but conventions are mixed: browser_* tools are consistent, while desktop tools swap between noun-only (look), verb (click, scroll, drag), and verb_noun (type_text, press_keys, open_app, open_url). The browser_ prefix scoping is a plus, yet the unprefixed half isn't predictable.
31 tools exceeds the comfortable 15-tool band and sits in the 'heavy' range, but the server genuinely spans browser automation, native app control, database inspection, and device screenshots, so most tools earn their place. A few (e.g. the browser_task meta-tool plus individual browser actions) feel redundant rather than strictly necessary.
The surface covers a broad lifecycle: page discovery, click/type/select/drag/scroll, tab and navigation control, plus desktop input and app launching, with db read and device screenshots. Gaps are minor (db is read-only, no explicit browser_close/tab management beyond switch), and agents can work around them.
Maintenance
Related MCP Connectors
Use your Mac, Windows or Linux computer from ChatGPT, Claude or Codex: files, commands, documents.
Mac & Windows: let ChatGPT, Claude & Cursor use your email, calendar, iMessage, Teams, files.
Screenshot, PDF and HTML-to-image rendering API so Claude and Cursor can see any web page.
Screenshot, PDF and HTML-to-image rendering API so Claude and Cursor can see any web page.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables Claude to see and interact with any macOS application using natural language commands. Perfect for testing Mac applications, UI automation, and app development with AI assistance.33MIT
- AlicenseAqualityDmaintenanceEnables AI agents to capture and analyze screenshots of macOS applications, windows, or the entire screen using local (Ollama) or cloud-based AI vision models, with non-intrusive, fast screen capture via Apple's ScreenCaptureKit.33 npm2MIT
- AlicenseNot gradedqualityCmaintenanceScreenshot and diagram tool for AI agents. Capture and annotate screenshots to show Claude what you mean — or let the agent render Mermaid diagrams and open them for visual review. Approve, annotate, or request changes with text feedback. Built-in review mode with structured responses. CLI and MCP server for Claude Code, Cursor, Windsurf, Cline. macOS, open source, free.1 npm347MIT
- AlicenseNot gradedqualityCmaintenanceProvides AI coding assistants with privacy-first, synchronized screen context including cursor position, active window metadata, and visual verification to aid in building and debugging graphical interfaces.MIT