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
| Tool | What it does | Status |
|---|---|---|
web_search | Query Brave, DuckDuckGo, Tavily, or Firecrawl. Auto-detects keyed providers with DuckDuckGo fallback. | shipping |
web_fetch | HTML → cleaned markdown, PDF → text. OCR and Jina fallbacks. | shipping |
web_browser | Drive a real Chrome over CDP. Six actions, seven backends. | experimental |
Search
shippingFour 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.
| Provider | Strength | Env var |
|---|---|---|
| DuckDuckGo | Zero-config fallback via the HTML endpoint. No account, no key. | None |
| Brave | General results, straightforward developer plan. | BRAVE_API_KEY |
| Tavily | Agent-focused; returns short summaries with results. | TAVILY_API_KEY |
| Firecrawl | Search plus a crawl/scrape API on the same key. | FIRECRAWL_API_KEY |
web:
search:
provider: brave # brave | tavily | firecrawl | duckduckgoFetch
shippingweb_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_KEYand Glue routes difficult fetches through Jina.
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
experimentalweb_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.
| Action | Use for |
|---|---|
navigate | Open a URL. Waits for the page load event by default; pass wait_until to switch (domcontentloaded | networkalmostidle | networkidle). |
click | Click any selector in the live DOM. |
type | Fill an input. |
screenshot | Full page or a single element, saved to disk. |
extract_text | Cleaned markdown of the current page (capped at ~50k tokens). |
evaluate | Run 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.
| Backend | Runs on | Best for | Status |
|---|---|---|---|
local | Your machine (Puppeteer + Chrome) | Iteration. headed: true lets you watch it work. | shipping |
docker | Local browserless/chrome container | Keeping the browser off your host. Container dies with the session. | shipping |
browserbase | Cloud — browserbase.com | Hosted sessions with replays. | experimental |
browserless | Cloud or self-hosted — browserless.io | Scale and self-hosting. | experimental |
steel | Cloud — steel.dev | Agent-focused cloud sessions. | experimental |
anchor | Cloud — anchorbrowser.io | Agentic browser sessions with live view. | experimental |
hyperbrowser | Cloud — hyperbrowser.ai | Agent-focused cloud sessions with fast launches. | experimental |
web:
browser:
backend: docker # local | docker | browserbase | browserless | steel | anchor | hyperbrowser
docker:
image: browserless/chrome:latest
port: 3000Cloud 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 key | Env var |
|---|---|
| Brave search | BRAVE_API_KEY |
| Tavily search | TAVILY_API_KEY |
| Firecrawl search | FIRECRAWL_API_KEY |
| Jina fetch fallback | JINA_API_KEY |
| Mistral OCR | MISTRAL_API_KEY |
| OpenAI OCR | OPENAI_API_KEY |
| Browserbase browser | BROWSERBASE_API_KEY + BROWSERBASE_PROJECT_ID |
| Browserless browser | BROWSERLESS_API_KEY |
| Steel browser | STEEL_API_KEY |
| Anchor browser | ANCHOR_API_KEY |
| Hyperbrowser browser | HYPERBROWSER_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.
| Goal | Suggested pairing |
|---|---|
| Quick fetch or a search | Host runtime + whatever provider you have. |
| Clicking through an untrusted site | Docker runtime + Docker browser. |
| Reading a scanned filing | Any runtime + fetch with OCR. |
| Scale scraping | planned Cloud runtime + cloud browser. |
Full matrix of runtime × browser combinations lives on the Runtimes page.