Agent-native search pipeline — intent-aware querying, hybrid ranking, anti-bot extraction, and consensus verification wrapped around SearXNG.
Project description
browser-goat — Production-grade web search for AI agents.
Six-stage search pipeline around SearXNG: query intent detection, hybrid BM25+MMR ranking, anti-bot content extraction, quality-gated retry, adaptive exploration, and multi-rollout consensus verification — running entirely on your own infrastructure.
flowchart TD
Q["Query"] --> L1
subgraph L1["1. Pre-Search"]
A["Intent detection<br/>Browser profiles<br/>Language detection"]
end
L1 --> SX["SearXNG Engine"]
SX --> L2
subgraph L2["2. Post-Search"]
B["URL normalization<br/>RRF + BM25 + MMR"]
end
L2 --> L3
subgraph L3["3. Extraction"]
C["7-tier cascading<br/>Anti-bot bypass<br/>Goal-oriented summary"]
end
L3 --> L4
subgraph L4["4. Reliability"]
D["Give-up detection<br/>Quality-gated retry<br/>Force synthesis"]
end
L4 --> L5
subgraph L5["5. Strategy"]
E["Query classification<br/>Adaptive exploration<br/>Recursive decomposition"]
end
L5 --> L6
subgraph L6["6. Verification"]
F["Multi-rollout voting<br/>Consensus verification<br/>LLM tie-breaking"]
end
L6 --> A["Answer"]
Quick Start
MCP (AI Agents)
{
"mcpServers": {
"browser-goat": {
"command": "npx",
"args": ["browser-goat"],
"env": { "SEARXNG_URL": "http://localhost:8080" }
}
}
}
Requires Python 3.13+ and a running SearXNG instance.
CLI
uvx browser-goat search "latest AI research"
uvx browser-goat search "Python vs Rust" --strategy explore
uvx browser-goat extract "https://example.com/article"
Library
pip install browser-goat
from browser_goat import BrowserGoat
meta = BrowserGoat(searxng_url="http://localhost:8080")
result = await meta.search("quantum computing")
print(result.answer)
MCP Tools
| Tool | Description |
|---|---|
search |
Full pipeline: intent analysis → SearXNG → ranking → extraction → reliability. Supports time_range (day/week/month/year), max_sources, and strategy (default/auto/explore/decompose). |
extract |
Fetch and extract a single URL with anti-bot bypass (Cloudflare Turnstile). Returns title, clean text, and extraction tier. |
Client Configuration
Claude Desktop
{
"mcpServers": {
"browser-goat": {
"command": "uvx",
"args": ["browser-goat-mcp", "--searxng-url", "http://localhost:8080"]
}
}
}
Cursor / VS Code
{
"mcpServers": {
"browser-goat": {
"command": "npx",
"args": ["browser-goat"],
"env": { "SEARXNG_URL": "http://localhost:8080" }
}
}
}
Docker
Bundled SearXNG + Redis sidecar deployment:
docker compose up
SearXNG starts at localhost:8080, browser-goat API at localhost:8000.
docker exec browser-goat uv run browser-goat search "your query"
How It Works
Each search passes through six layers before returning an answer. The diagram above shows the full pipeline. Layers 1-4 run on every query; Layers 5-6 activate when --strategy or --reliability are set.
Development
git clone https://github.com/Im-Busy/browser-goat.git
cd browser-goat
uv sync
uv run pytest # 304 tests (287 unit + 17 integration)
uv run ruff check src/ tests/ # zero violations
uv run mypy src/ # zero errors
Tests require SearXNG at localhost:8080. Skip integration tests:
uv run pytest -m "not integration"
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file browser_goat-0.1.1.tar.gz.
File metadata
- Download URL: browser_goat-0.1.1.tar.gz
- Upload date:
- Size: 65.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c1cf240dbe67f46135954c8a40ab2c19b1095973a42973504b6742b7f3abe80d
|
|
| MD5 |
9c625c18a2f9685ca67fd42c12e92761
|
|
| BLAKE2b-256 |
30f61d0aac6470330133cd35997566cbc04279f181b52964f9e375ef5b6d424a
|
File details
Details for the file browser_goat-0.1.1-py3-none-any.whl.
File metadata
- Download URL: browser_goat-0.1.1-py3-none-any.whl
- Upload date:
- Size: 69.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41c9b1a1aee51344904f8e0978da91c59ae214a1bb9f6708bf745cd827e237bd
|
|
| MD5 |
6a72ff2f9f16f44781108529dab495a2
|
|
| BLAKE2b-256 |
8f9c9ea6993bf8b81e4f1eeeb8b5e8ed11df1df157cd0684c73d22fbb2347b75
|