Skip to content

Web Tools

Glue ships three web tools by default: web_search, web_fetch, and web_browser. The surface is a little wider than in most coding agents because I use Glue for scraping and automation about as much as for coding — nothing hype, just more practical capability than you'd typically find.

Everything below works out of the box. Providers with API keys light up automatically, and DuckDuckGo gives web_search a zero-config fallback. Browser backends swap with one config line.

The tools at a glance

ToolWhat it doesStatus
web_searchQuery Brave, DuckDuckGo, Tavily, or Firecrawl. Auto-detects keyed providers with DuckDuckGo fallback.shipping
web_fetchHTML → cleaned markdown, PDF → text. OCR and Jina fallbacks.shipping
web_browserDrive a real Chrome over CDP. Six actions, seven backends.experimental
shipping

Four providers, one interface. Glue prefers an explicitly configured provider. Otherwise it tries the first configured provider it finds and falls back to DuckDuckGo, which needs no API key.

ProviderStrengthEnv var
DuckDuckGoZero-config fallback via the HTML endpoint. No account, no key.None
BraveGeneral results, straightforward developer plan.BRAVE_API_KEY
TavilyAgent-focused; returns short summaries with results.TAVILY_API_KEY
FirecrawlSearch plus a crawl/scrape API on the same key.FIRECRAWL_API_KEY
~/.glue/config.yaml — pin a search provider
yaml
web:
  search:
    provider: brave # brave | tavily | firecrawl | duckduckgo

Fetch

shipping

web_fetch reads a URL and returns it in a form the model can use — HTML cleaned to markdown, PDFs as extracted text. It has two fallbacks for the awkward cases:

  • OCR for scanned PDFs. If a PDF has no extractable text layer, Glue passes the pages to a vision model (Mistral or OpenAI) and returns the OCR'd text instead. Useful for government documents, old filings, or anything scanned from paper.
  • Jina Reader for pages that extract poorly with the default cleaner. Set JINA_API_KEY and Glue routes difficult fetches through Jina.
~/.glue/config.yaml — fetch with OCR + Jina
yaml
web:
  fetch:
    jina_api_key: ${JINA_API_KEY} # optional, for hostile pages
  pdf:
    ocr_provider: mistral # mistral | openai
    mistral_api_key: ${MISTRAL_API_KEY}

Browser

experimental

web_browser drives a real Chrome over the DevTools Protocol. The CDP backend is experimental — it works across all providers but is newer than the rest of Glue, and rough edges should be expected.

Actions

Six verbs, all running against a single browser session that persists across tool calls within the same turn. The agent can navigate, fill a form, submit, and read the result without reopening the tab.

ActionUse for
navigateOpen a URL. Waits for the page load event by default; pass wait_until to switch (domcontentloaded | networkalmostidle | networkidle).
clickClick any selector in the live DOM.
typeFill an input.
screenshotFull page or a single element, saved to disk.
extract_textCleaned markdown of the current page (capped at ~50k tokens).
evaluateRun arbitrary JavaScript in page context and return the result.

Backends

All seven implement the same BrowserEndpointProvider interface, so swapping is a one-line config change rather than a code change.

BackendRuns onBest forStatus
localYour machine (Puppeteer + Chrome)Iteration. headed: true lets you watch it work.shipping
dockerLocal browserless/chrome containerKeeping the browser off your host. Container dies with the session.shipping
browserbaseCloud — browserbase.comHosted sessions with replays.experimental
browserlessCloud or self-hosted — browserless.ioScale and self-hosting.experimental
steelCloud — steel.devAgent-focused cloud sessions.experimental
anchorCloud — anchorbrowser.ioAgentic browser sessions with live view.experimental
hyperbrowserCloud — hyperbrowser.aiAgent-focused cloud sessions with fast launches.experimental
~/.glue/config.yaml — switch browser backends
yaml
web:
  browser:
    backend: docker # local | docker | browserbase | browserless | steel | anchor | hyperbrowser
    docker:
      image: browserless/chrome:latest
      port: 3000

Cloud backends need an API key. Prefer env vars or ~/.glue/credentials.json over committing keys into config.yaml.

Credentials

Every API key resolves in the same order: environment first, then ~/.glue/credentials.json, then — if you really insist — config.yaml. Nothing auto-reads project-local config.

What needs a keyEnv var
Brave searchBRAVE_API_KEY
Tavily searchTAVILY_API_KEY
Firecrawl searchFIRECRAWL_API_KEY
Jina fetch fallbackJINA_API_KEY
Mistral OCRMISTRAL_API_KEY
OpenAI OCROPENAI_API_KEY
Browserbase browserBROWSERBASE_API_KEY + BROWSERBASE_PROJECT_ID
Browserless browserBROWSERLESS_API_KEY
Steel browserSTEEL_API_KEY
Anchor browserANCHOR_API_KEY
Hyperbrowser browserHYPERBROWSER_API_KEY

Pairing with runtimes

Web tools compose with Glue's runtime — pair them when the work is risky or you don't want the traffic on your host.

GoalSuggested pairing
Quick fetch or a searchHost runtime + whatever provider you have.
Clicking through an untrusted siteDocker runtime + Docker browser.
Reading a scanned filingAny runtime + fetch with OCR.
Scale scrapingplanned Cloud runtime + cloud browser.

Full matrix of runtime × browser combinations lives on the Runtimes page.

Web tools guide → · Browser automation guide →

Released under the MIT License.