MCP server for AI-controlled browser automation with support for browser control, page analysis, element interaction, playbook execution, and challenge handling (CAPTCHA, MFA, login)
Oya Browser MCP has 34 well-named tools with clear action verbs (click, navigate, analyze, etc.). Most tools have descriptions (194 char baseline met), but quality varies: some are detailed (analyze_page: 280+ chars with format options), others are terse (screenshot, list_tabs: <50 chars). Input schemas are present and mostly typed, but 8 tools lack parameter descriptions or have incomplete schemas. Output schemas are undocumented, LLMs cannot predict response structure. Error handling is minimal; no recovery guidance or actionable error messages visible. Security is strong (no credentials in params, server-side injection for sign_in/complete_mfa). Tool composition is excellent: single-responsibility design, clear chaining (analyze_page → click/type), idempotent reads. However, parameter descriptions are sparse (e.g., 'format' in analyze_page lacks enum explanation), and several tools (press_key, scroll, wait) have minimal guidance on when to use them vs. alternatives.
Analyze the current page. Returns its content and every interactive element with an id to use with click/type tools, plus page facts (url, title, viewport, scroll, and when they apply: panelScroll, modal, covered, truncated) and each element's state (off-screen, disabled, checked, a field's hint). format picks how it is written: markdown (default) or toon (one table of blocks, fewer tokens).
Click an interactive element by its ID number (from analyze_page results).
Click at specific x,y pixel coordinates on the page. Use when you know the exact position (e.g. from a screenshot).
Fill and submit a one-time code (MFA / 2FA) the page asks for, from the persona's authenticator, email or SMS. Call it on a code prompt after signing in.
Double-click an element by ID or at specific x,y coordinates.
Output schemas undocumented. LLMs cannot predict response structure for any of the 34 tools. No documented return types, field names, or pagination hints.
Minimal error handling. No recovery guidance, actionable error messages, or error classification (retryable vs. fatal). Agents cannot self-correct on failures.
Sparse parameter descriptions. 8 tools (screenshot, list_tabs, read_console, read_network, go_back, go_forward, reload, find) have descriptions under 50 chars. LLMs lack context for when to use them vs. similar tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | 2026-07-28+ | v2 |
Drag from one point to another. Useful for sliders, drag-and-drop, or selecting text.
Find elements on the page matching a text description, returning their IDs and details.
Navigate back in browser history.
Navigate forward in browser history.
Handle a browser dialog (alert, confirm, prompt) by accepting or dismissing it, optionally with text for prompts.
Move the mouse over an element by its ID number (from analyze_page results), triggering hover states and tooltips.
Type text using the keyboard without targeting a specific element. Types into whatever is currently focused.
List the playbooks saved on this key: recorded flows that replay without a model, with their variables.
List all open tabs in the browser. Returns tab ID, title, URL, and which is active.
Move the mouse cursor to specific x,y coordinates without clicking. Useful for triggering hover states, tooltips, or dropdown menus.
Navigate the browser to a URL.
Open a new browser tab, optionally navigating to a URL.
Press a safe navigation key. Allowed: Enter, Escape, Tab, ArrowDown, ArrowUp, ArrowLeft, ArrowRight, Backspace, Delete, Space, Home, End, PageUp, PageDown. Do NOT use for F-keys, Meta, Control, Alt, or Shift.
Read the browser console logs (errors, warnings, info, debug messages).
List interactive elements on the page, with the same ids analyze_page gives. Lighter than analyze_page: the element index without the page markdown.
Read the browser network logs (HTTP requests and responses).
Reload the current page.
Replay a saved playbook on this browser with the given variables. Much faster and cheaper than doing the task step by step; a step that no longer fits the page is finished by the agent.
Run a read-only script in the page's context and return its result as JSON. The script cannot mutate the page, make requests, or navigate.
Hand a whole task to Oya's own browser agent on this browser and get its report back (DONE: or FAILED:). Uses this key's configured model; the run can be saved as a playbook afterwards.
Capture a screenshot of the visible browser tab as an image.
Scroll the page up or down.
Select an option in a dropdown or select element by its ID number (from analyze_page results).
Sign in on the current page with the credentials stored for this site in the browser's persona. You never see them. Call it on a login form you were not given values for.
Solve a CAPTCHA (reCAPTCHA, hCaptcha, Turnstile) on the current page with the configured solver. Call it when a CAPTCHA blocks you, then analyze_page again.
Switch to a different browser tab by its tab ID (from list_tabs).
Type text into an input element by its ID number (from analyze_page results). Clears existing content first.
Wait for an element matching a CSS selector to appear on the page.
Wait for text to appear, a URL to be reached, or the network to become quiet.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without explicit hints.
Parameter descriptions lack format/constraint guidance. E.g., 'format' in analyze_page lists enum values in description but not as formal enum constraint; 'timeout' in wait lacks min/max bounds.