Skip to content

Browser & web tools

Browser automation, text browser, web fetch, web search, and HTTP requests with domain allowlists.

Revka gives your agent several ways to reach the web, ranging from a single click-to-open action to full DOM automation and arbitrary HTTP calls. This page is the reference for all of them: browser, browser_open, browser_delegate, text_browser, web_fetch, web_search_tool, and http_request, plus the [browser], [web_fetch], [web_search], and [http_request] config sections that gate them.

Pick the lightest tool that does the job. For reading a static page, web_fetch or text_browser are faster and cheaper than spinning up a real browser. Reach for browser only when a page needs JavaScript rendering, login, or interaction. For step-by-step setup of the browser backends, VNC debugging, and agent-browser installation, see Browser automation — this page focuses on the tool surface and config keys.

ToolUse it forInteractionConfig gate
browser_openOpening an approved HTTPS URL in the system browserNone (open only)[browser]
browserFull DOM and OS-level automationClick, fill, type, screenshot, scroll, etc.[browser]
browser_delegateCorporate web apps via an external CLINatural-language task[browser_delegate]
text_browserRendering a page as plain text in headless/SSH environmentsNone (read only)[text_browser]
web_fetchFetching a page as clean plain text (GET only)None (read only)[web_fetch]
web_search_toolSearching the web for titles, URLs, and descriptionsNone[web_search]
http_requestArbitrary HTTP calls to external APIsAll HTTP methods[http_request]

Opens an approved HTTPS URL in the system browser. There is no scraping and no interaction — it simply launches the page. Navigation is restricted to the [browser].allowed_domains allowlist, HTTPS only, and local/private hosts are rejected.

{"url": "https://docs.example.com"}
ParameterTypeRequiredMeaning
urlstringyesHTTPS URL to open

browser_open shares the [browser] config section and allowed_domains allowlist with the full browser tool. Both are enabled by [browser].enabled.

Full web automation with three pluggable backends. The browser tool exposes DOM actions plus optional OS-level actions (the latter only on the computer_use backend).

{"action": "open", "url": "https://example.com"}
{"action": "snapshot"}
{"action": "click", "selector": "@e3"}
  • DOM actions: open, snapshot, click, fill, type, get_text, get_title, get_url, screenshot, wait, press, hover, scroll, is_visible, close, find
  • OS-level actions (computer_use backend only): mouse_move, mouse_click, mouse_drag, key_type, key_press, screen_capture
ParameterTypeMeaning
actionstringOne of the actions above (required)
urlstringURL to navigate to (for open)
selectorstringElement selector: @ref, CSS, or text=...
valuestringValue to fill
textstringText to type or wait for
keystringKey to press (Enter, Tab, Escape, etc.)
x, yintegerScreen coordinates for computer_use mouse actions
from_x, from_y, to_x, to_yintegerDrag source/target coordinates
buttonstringleft, right, or middle
backendstringPer-call backend override: agent_browser, native, or computer_use

After open, call snapshot to map interactive elements to stable refs (@e1, @e2, @e3). Pass those refs to click, fill, hover, and similar actions. Selectors also accept CSS (button.submit) and text matchers (text=Accept). Re-run snapshot after the page changes — refs are recomputed each time.

Set the default backend in [browser].backend, or override it per call with the backend parameter:

  • agent_browser (default) — drives Chrome for Testing through the agent-browser CLI; the easiest path on a server or container.
  • rust_native — a built-in WebDriver backend. Requires the browser-native Cargo feature compiled into your build.
  • computer_use — delegates to a computer-use sidecar over HTTP for true OS-level mouse, keyboard, and screenshot actions.
  • auto — lets Revka select an available backend automatically.

See Browser automation for backend installation and debugging.

Hands a natural-language browser task to an external browser-capable CLI subprocess (for example, Claude Code with the claude-in-chrome MCP). It is built for corporate web apps — Teams, Outlook, Jira, Confluence — that have no direct API and are awkward for the headless backends. A persistent Chrome profile can be configured so SSO sessions survive across invocations.

{"task": "Check my unread Teams messages"}
ParameterTypeRequiredMeaning
taskstringyesNatural-language task description

Renders a web page as plain text using an installed text-based browser (lynx, links, or w3m). It is ideal for headless and SSH environments without a graphical browser, and best for simple HTML pages. JavaScript-heavy sites usually need web_fetch with the Firecrawl fallback instead.

{"url": "https://example.com"}
ParameterTypeRequiredMeaning
urlstringyesURL to fetch and render as text

If [text_browser].preferred_browser is unset, Revka auto-detects whichever of lynx, links, or w3m is installed.

Fetches a web page and returns clean plain text. HTML is converted to readable text; JSON and plain text are returned as-is. It is GET only and follows redirects. When the standard fetch fails — an HTTP error, an empty body, or a body shorter than 100 characters (suggesting a JavaScript-only page) — it can fall back to the Firecrawl API for stealth content extraction, if Firecrawl is enabled.

{"url": "https://docs.anthropic.com/en/api/getting-started"}
ParameterTypeRequiredMeaning
urlstringyesHTTPS URL to fetch

web_fetch is opinionated — GET only, output normalized to text. When you need other HTTP methods, custom headers, or a request body, use http_request instead.

Searches the web and returns titles, URLs, and descriptions of relevant results. It supports multiple provider backends with fallback routing. By default it uses DuckDuckGo, which requires no API key; you can switch to Brave (API key required) or a self-hosted SearXNG instance.

{"query": "Rust async runtime comparison 2026"}
ParameterTypeRequiredMeaning
querystringyesSearch query

Makes arbitrary HTTP requests to external APIs. It supports GET, POST, PUT, DELETE, PATCH, HEAD, and OPTIONS. Navigation is restricted to the [http_request].allowed_domains allowlist, and local/private hosts are rejected unless explicitly allowed.

{
"url": "https://api.example.com/v1/data",
"method": "POST",
"headers": {"Authorization": "Bearer REPLACE_WITH_TOKEN"},
"body": "{\"key\": \"value\"}"
}
ParameterTypeRequiredDefaultMeaning
urlstringyesTarget URL
methodstringnoGETHTTP method
headersobjectno{}Key-value HTTP headers
bodystringnoRequest body for POST/PUT/PATCH

All of these tools are configured in ~/.revka/config.toml. See Config: channels, tools & integrations for the complete key reference.

Every web tool enforces a domain allowlist with the same semantics:

  • ["*"] allows all public domains, but local and private hosts (RFC 1918, loopback, link-local, .local) are still blocked for SSRF protection.
  • An empty list ([]) on web_fetch and http_request denies all requests (deny-by-default).
  • Specific entries use exact or subdomain matching.
  • For web_fetch and browser_delegate, blocked_domains always takes priority over allowed_domains.

To reach a private or internal host, add it to web_fetch.allowed_private_hosts, or set http_request.allow_private_hosts = true.

Gates both browser and browser_open.

[browser]
enabled = true
allowed_domains = ["*"]
backend = "agent_browser"
native_headless = true
KeyTypeDefaultMeaning
enabledboolfalseMaster switch for browser and browser_open
allowed_domainsarray[]Navigation allowlist; "*" allows all public domains
session_namestringunsetNamed browser session (persists auth state)
backendstring"agent_browser"agent_browser, rust_native, computer_use, or auto
native_headlessbooltrueHeadless mode for the rust-native backend
native_webdriver_urlstringhttp://127.0.0.1:9515WebDriver endpoint for the rust-native backend
native_chrome_pathstringunsetOptional Chrome/Chromium executable path

The [browser.computer_use] sub-section configures the OS-level sidecar:

KeyTypeDefaultMeaning
endpointstringhttp://127.0.0.1:8787/v1/actionsSidecar endpoint for OS-level actions
api_keystringunsetOptional bearer token (stored encrypted)
timeout_msinteger15000Per-action request timeout
allow_remote_endpointboolfalseAllow a non-loopback endpoint
window_allowlistarray[]Window title/process allowlist forwarded to sidecar policy
max_coordinate_x / max_coordinate_yintegerunsetOptional coordinate boundaries
[browser_delegate]
enabled = true
cli_binary = "claude"
chrome_profile_dir = "~/.config/chrome-corp-profile"
allowed_domains = ["teams.microsoft.com", "outlook.office.com"]
blocked_domains = []
task_timeout_secs = 120
KeyTypeDefaultMeaning
enabledboolfalseEnable the browser_delegate tool
cli_binarystring"claude"CLI binary to spawn for browser tasks
chrome_profile_dirstring""Chrome user-data directory for persistent SSO sessions; empty uses a fresh profile each run
allowed_domainsarray[]Navigation allowlist; empty permits all non-blocked domains
blocked_domainsarray[]Denylist; takes precedence over allowed_domains
task_timeout_secsinteger120Per-task timeout in seconds
[text_browser]
enabled = true
preferred_browser = "lynx" # optional; auto-detects if unset
timeout_secs = 30
KeyTypeDefaultMeaning
enabledboolfalseEnable the text_browser tool
preferred_browserstringunsetlynx, links, or w3m; auto-detects when unset
timeout_secsinteger30Request timeout in seconds
[web_fetch]
enabled = true
allowed_domains = ["*"]
blocked_domains = []
allowed_private_hosts = []
max_response_size = 500000
timeout_secs = 30
[web_fetch.firecrawl]
enabled = false
api_key_env = "FIRECRAWL_API_KEY"
api_url = "https://api.firecrawl.dev/v1"
mode = "scrape"
KeyTypeDefaultMeaning
enabledboolfalseEnable the web_fetch tool
allowed_domainsarray["*"]Allowlist; ["*"] = all public hosts, [] = deny all
blocked_domainsarray[]Denylist; always takes priority over allowed_domains
allowed_private_hostsarray[]Private/internal hosts allowed to bypass SSRF protection
max_response_sizeinteger500000Maximum response size in bytes (500 KB)
timeout_secsinteger30Request timeout in seconds

The [web_fetch.firecrawl] sub-section enables the JavaScript/bot-blocked fallback. Set the API key via the env var named by api_key_env (default FIRECRAWL_API_KEY). Only mode = "scrape" is implemented today; crawl is reserved for future use.

[web_search]
enabled = true
provider = "duckduckgo" # duckduckgo (free), brave, searxng
max_results = 5
timeout_secs = 15
# brave_api_key = "REPLACE_WITH_KEY" # required for the brave provider
# searxng_instance_url = "https://searx.example.com" # required for searxng
KeyTypeDefaultMeaning
enabledbooltrueEnable the web_search_tool
providerstring"duckduckgo"duckduckgo (free), brave (API key), or searxng (self-hosted)
brave_api_keystringunsetBrave Search API key (required for brave)
searxng_instance_urlstringunsetSearXNG instance URL (required for searxng)
max_resultsinteger5Maximum results per search (1–10)
timeout_secsinteger15Request timeout in seconds

Web search is enabled by default with DuckDuckGo, which needs no API key. These keys also have environment-variable equivalents: WEB_SEARCH_ENABLED, WEB_SEARCH_PROVIDER, WEB_SEARCH_MAX_RESULTS, WEB_SEARCH_TIMEOUT_SECS, BRAVE_API_KEY, and SEARXNG_INSTANCE_URL.

[http_request]
enabled = true
allowed_domains = ["api.example.com", "api.github.com"]
max_response_size = 1000000
timeout_secs = 30
allow_private_hosts = false
KeyTypeDefaultMeaning
enabledboolfalseEnable the http_request tool
allowed_domainsarray["*"]Allowlist; ["*"] = all public hosts, [] = deny all
max_response_sizeinteger1000000Maximum response size in bytes (1 MB; 0 = unlimited)
timeout_secsinteger30Request timeout in seconds
allow_private_hostsboolfalseAllow requests to private/LAN hosts (SSRF protection when false)