cross-validated-search
This server provides evidence-aware web search and page browsing capabilities for AI agents.
Search the web (
search_web): Perform real-time searches for text, news, images, videos, or books with regional targeting (e.g.,us-en,zh-cn) and time-based filtering (day, week, month, year)Browse pages (
browse_page): Fetch and extract plain-text content from any URL with configurable character limits — useful when search snippets aren't enoughVerify claims: Check factual claims against web evidence with structured verdicts (supported, contested, likely false, etc.) and confidence scores
Generate evidence reports: Produce structured JSON reports combining search results, verification outcomes, citations, and follow-up guidance
Flexible deployment: Works via CLI, MCP (Model Context Protocol), Gemini, Claude Code, and other agent runtimes, with optional dual-provider setup (DuckDuckGo + self-hosted SearXNG) for stronger evidence diversity
What It Does
Zero-API-Key Web Search is a local-first, MCP-native search and evidence-verification toolkit for AI agents. It gives your agent live web search, LLM-optimized context extraction, claim verification with weighted evidence scoring, and citation-ready evidence reports — all without requiring an API key by default.
The verification model (evidence-aware-heuristic-v3) classifies sources as supporting, conflicting, or neutral using keyword overlap, domain-quality heuristics, freshness, and optional page-aware rescoring. This project does not perform fact-level proof or logical entailment; it is a signal amplifier for agent grounding decisions.
Related MCP server: agent-knowledge
30-Second Setup
pip install zero-api-key-web-search
# Search the web — no API key needed
zero-search "Python 3.13 release" --json
# Build citation-ready LLM context
zero-context "Python 3.13 stable release" --goggles docs-first
# Read a page
zero-browse "https://docs.python.org/3/whatsnew/" --json
# Verify a claim
zero-verify "Python 3.13 is the latest stable release" --deep --json
# Full evidence report
zero-report "Python 3.13 stable release" \
--claim "Python 3.13 is the latest stable release" --deep --jsonLegacy CLI aliases (search-web, browse-page, verify-claim, evidence-report) also work.
Your Agent Gets
Agent job | Command | What the agent gets |
Ground an answer |
| compact Markdown context with citations |
Verify a claim |
| supported / contested / likely false verdict |
Build an evidence report |
| rationale, source digest, warnings, next steps |
Read a blocked page |
| page content, auto-unlocked if Web Unlocker is configured |
Search with a specific engine |
| Bing SERP results via Bright Data |
Serve an MCP client |
| 8 tools for Claude Code, Cursor, Copilot, and any MCP-compatible runtime |
Provider Paths: Free to Production
Start free, scale when you're ready. Every path works out of the box — no configuration required for the default.
Path 1: Free (Zero Configuration)
Works immediately after pip install. Uses DuckDuckGo — no API key, no account.
zero-search "Python 3.13 release" --jsonPath 2: Free Cross-Validated
Add a self-hosted SearXNG instance for dual-provider cross-validation — still free, no API key.
# Start SearXNG locally
./scripts/start-searxng.sh
export ZERO_SEARCH_SEARXNG_URL="http://127.0.0.1:8080"
zero-search "AI regulation" --profile free-verified --jsonOr with Docker Compose:
cp .env.searxng.example .env
docker compose -f docker-compose.searxng.yml up -dFull guide: docs/searxng-self-hosted.md.
Path 3: Production SERP
Bright Data provides professional-grade search across 7 engines with structured results, LLM-friendly markdown output, AI Overviews, mobile device emulation, and geo-targeting for 195 countries. New users get 5,000 free credits.
# Interactive setup wizard — tests your key and zone
zero-setup
# Or set environment variables directly
export ZERO_SEARCH_BRIGHTDATA_API_KEY="your-key"
export ZERO_SEARCH_BRIGHTDATA_ZONE="serp_api1"
# Search across different engines
zero-search "news" --provider brightdata --engine google --type news --region us-en --json
zero-search "news" --provider brightdata --engine bing --type news --region gb-en --json
zero-search "news" --provider brightdata --engine yandex --region ru-ru --jsonSupported engines: google, bing, duckduckgo, yandex, baidu, yahoo, naver.
Path 4: Production + Web Unlocker
Access blocked, CAPTCHA-protected, or geo-restricted pages. Uses the same Bright Data API key — just create a Web Unlocker zone.
# Setup wizard handles zone creation guidance
zero-setup
# Or set the zone manually
export ZERO_SEARCH_BRIGHTDATA_API_KEY="your-key"
export ZERO_SEARCH_BRIGHTDATA_ZONE="serp_api1"
export ZERO_SEARCH_BRIGHTDATA_UNLOCKER_ZONE="web_unlocker1"
# Browse automatically falls back to Web Unlocker on 403/429
zero-browse "https://protected-site.com/article" --json
# Or force Web Unlocker
zero-browse "https://protected-site.com/article" --use-unlocker always --jsonPath 5: Maximum Evidence
All providers active — DDGS, SearXNG, Bright Data, and Web Unlocker — for the strongest cross-validated evidence.
export ZERO_SEARCH_BRIGHTDATA_API_KEY="your-key"
export ZERO_SEARCH_SEARXNG_URL="http://127.0.0.1:8080"
zero-report "AI regulation news" --profile max-evidence --deep --jsonProvider Profiles
Profile | Providers | Best for |
|
| Zero-setup local search |
|
| Free cross-validation |
|
| Production reliability and geo-targeting |
|
| Production SERP + access blocked pages |
|
| Maximum provider diversity |
zero-search "FastAPI lifespan docs" --profile free-verified --goggles docs-first
zero-context "FastAPI lifespan docs" --profile free --goggles docs-first
zero-report "AI regulation news" --profile production-unlock --jsonMCP Server
Works with Claude Code, Cursor, Copilot, and any MCP-compatible agent:
{
"mcpServers": {
"zero-api-key-web-search": {
"command": "zero-mcp"
}
}
}For npm/npx-based MCP launchers:
{
"mcpServers": {
"zero-api-key-web-search": {
"command": "npx",
"args": ["zero-api-key-web-search", "zero-mcp"]
}
}
}Eight tools exposed:
Tool | What it does |
| Show provider status, profiles, goggles, and setup hints |
| Live web search with engine selection and region targeting |
| Compact, citation-ready Markdown context for LLMs |
| Fetch and extract page content (auto-unlocks blocked pages) |
| Evaluate whether a claim is supported, contested, or under-evidenced |
| Full evidence report with rationale, source digest, and next steps |
| Clear the response cache |
| Check provider status, test API keys, and get setup instructions |
MCP Tool Parameters
search_web key parameters:
query(required) — search querytype—text,news,images,videos,books(default:text)engine—google,bing,duckduckgo,yandex,baidu,yahoo,naver(Bright Data only)region— region code, e.g.us-en,zh-cn,wt-wt(default:wt-wt)profile— provider profile namegoggles— built-in reranking preset
browse_page key parameters:
url(required) — page URLformat—markdownortext(default:markdown)use_unlocker—auto(default),always, ornevermax_chars— max content length (default: 50000)
setup_providers key parameters:
test_brightdata_key— test a Bright Data API keytest_brightdata_zone— SERP zone name (default:serp_api1)test_brightdata_unlocker_zone— Web Unlocker zone nametest_searxng_url— test a SearXNG instance URL
Interactive Setup Wizard
The zero-setup command guides you through provider configuration, validates API keys and zones, and writes .env files:
# Interactive wizard
zero-setup
# Quick status check
zero-setup --status
# Test a Bright Data API key
zero-setup --test-brightdata YOUR_API_KEY
# Test a Bright Data Web Unlocker zone
zero-setup --test-brightdata-unlocker YOUR_API_KEY --unlocker-zone web_unlocker1
# Test a SearXNG instance
zero-setup --test-searxng http://localhost:8080Bright Data Integration
Bright Data powers two production-grade capabilities:
SERP API — Multi-Engine Search
Professional-grade search across 7 engines with structured results, LLM-friendly markdown output, AI Overviews, mobile device results, and geo-targeting for 195 countries.
from zero_api_key_web_search.providers import BrightDataProvider
provider = BrightDataProvider(api_key="your-key", zone="serp_api1")
# Google (default)
results = provider.search("Python 3.13", search_type="text", region="us-en")
# Bing, Yandex, Baidu, Yahoo, Naver, DuckDuckGo
results = provider.search("AI regulation", search_type="news", engine="bing")
# Markdown output for LLM consumption
results = provider.search("climate change", data_format="markdown")Web Unlocker — Access Blocked Pages
Automatically handles CAPTCHAs, anti-bot protection, IP rotation, and JavaScript rendering. Access pages that return 403, require login, or are geo-restricted.
from zero_api_key_web_search.providers import WebUnlockerProvider
provider = WebUnlockerProvider(api_key="your-key", zone="web_unlocker1")
# Get page content as markdown
result = provider.unlock("https://protected-site.com/article", data_format="markdown")
print(result["content"]) # Clean markdown of the page
# With country targeting
result = provider.unlock("https://geo-restricted.com", country="us")Auto-Fallback in browse_page
When Web Unlocker is configured, browse_page automatically retries blocked pages (403/429) through the unlocker:
from zero_api_key_web_search.browse_page import browse
# Auto-fallback (default) — try direct, then unlocker on 403/429
result = browse("https://protected-site.com/article")
# Always use Web Unlocker
result = browse("https://protected-site.com/article", use_unlocker=True)
# Never use Web Unlocker
result = browse("https://protected-site.com/article", use_unlocker=False)New Bright Data users can sign up with 5,000 free credits: https://get.brightdata.com/h21j9xz4uxgd
Why This Over a Plain Search Wrapper?
Feature | Plain search | Zero-API-Key Web Search |
Live search results | ✅ | ✅ |
Multi-engine SERP (7 engines) | ❌ | ✅ (Bright Data) |
News / images / videos / books | ❌ | ✅ |
Region & time filtering | ❌ | ✅ |
Blocked page unlocking | ❌ | ✅ (Web Unlocker) |
Full-page text extraction | ❌ | ✅ |
Claim verification with evidence scores | ❌ | ✅ |
Supporting vs. conflicting evidence | ❌ | ✅ |
Citation-ready evidence reports | ❌ | ✅ |
Dual-provider cross-validation | ❌ | ✅ |
API key required | Often | Never by default |
Cost | Sometimes | Free by default |
How Verification Works
zero-verify uses the evidence-aware heuristic v3 model:
Search for the claim across available providers
Score each source on keyword overlap, source quality, freshness
Classify as supporting, conflicting, or neutral
Optionally fetch top pages for deeper page-aware analysis
Render a verdict with confidence and evidence breakdown
Verdict | Meaning |
| Strong evidence, low conflict |
| Leans positive, not decisive |
| Support and conflict both meaningful |
| Conflict strong, support weak |
| Too weak for any firmer verdict |
This is a heuristic evidence classifier, not a proof engine. See docs/trust-model.md for details and limitations, docs/verification-model.md for signal definitions, and docs/benchmarks.md for regression results.
Built-in Goggles Presets
Goggles | Effect |
| Boosts docs, API, support, release-note, and official-looking sources |
| Boosts academic, institutional, paper, and study-oriented sources |
| Boosts reporting/analysis signals and demotes low-context aggregators |
You can also pass a JSON file to --goggles with boost_domains, block_domains, demote_domains, and boost_title_terms.
Full guide: docs/agent-search-controls.md.
Platform Support
Platform | Status | Entry point |
CLI | Ready |
|
MCP | Ready |
|
Claude Code | Ready |
|
Gemini | Ready |
|
Cursor | Ready |
|
Copilot | Ready |
|
Codex | Ready |
|
Continue | Ready |
|
Manus | Ready | Root |
Kiro | Ready |
|
OpenClaw | Ready |
|
Architecture
zero_api_key_web_search/
core.py # UltimateSearcher — search, verify, report engine
browse_page.py # Readability-style page extraction + Web Unlocker fallback
mcp_server.py # MCP server (8 tools)
provider_setup.py # Interactive setup wizard (zero-setup)
cache.py # Response caching
transport.py # SSL/TLS helpers
search_web.py # CLI: zero-search
context.py # CLI: zero-context
verify_claim.py # CLI: zero-verify
evidence_report.py # CLI: zero-report
providers/
base.py # SearchProvider protocol (sync + async)
ddgs.py # DuckDuckGo provider (free, zero-config)
searxng.py # SearXNG provider (free, self-hosted)
brightdata.py # Bright Data SERP — 7 engines, markdown, AI Overviews
web_unlocker.py # Bright Data Web Unlocker — blocked/CAPTCHA/geo pages
skills/
SKILL.md # Bundled OpenClaw skillKey engineering features:
Circuit breaker: Trips after 3 consecutive provider failures, auto-resets after 60s
Async support:
asearch()for concurrent provider calls viaasyncio.gatherAuto-fallback:
browse_pageretries 403/429 pages via Web Unlocker automaticallyMulti-engine SERP: 7 search engines (Google, Bing, DuckDuckGo, Yandex, Baidu, Yahoo, Naver)
Structured logging: Configurable logging at search/verify/report entry points
Readability heuristic: Semantic HTML5 + ARIA roles + text density scoring
Baseline comparison: Majority-vote and keyword-count baselines in reports
Sub-claim decomposition: Targeted sub-queries for independent evidence gathering
Installation
pip install zero-api-key-web-searchPython 3.10+ required. No API keys, no accounts, no configuration needed.
Development
pip install -e ".[dev]"
python -m pytest tests/ -q # 98 tests
ruff check zero_api_key_web_search/ tests/
pyright zero_api_key_web_search/ # 0 errors
coverage report --fail-under=80 # 85% coverageEvidence Report Example
{
"verdict": "contested",
"confidence": "MEDIUM",
"executive_summary": "Evidence is split...",
"verdict_rationale": ["Source A supports...", "Source B contradicts..."],
"coverage_warnings": ["Single-provider evidence path."],
"source_digest": [
{"title": "...", "url": "...", "classification": "supporting", "evidence_strength": 3}
],
"next_steps": ["Add a second provider for cross-validation."]
}Verification for Ecosystem Reviewers
zero-report "Python 3.13 stable release" --claim "Python 3.13 is the latest stable release" --deep --json
License
MIT License.
Available Tools
2 toolsbrowse_pageA
Fetch and extract pure text content from a specific URL. Use this to read the full content of a page found via search_web.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL of the webpage to read. | |
| max_chars | No | Maximum number of characters to extract. Default is 10000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description only mentions 'pure text content' but lacks details about handling of dynamic content, redirects, errors, or rate limits, which are important for a fetch tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The purpose is front-loaded, and the sentence about usage adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 2 parameters and no output schema, the description is mostly adequate but could benefit from mentioning behavior like page size limits or error handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description does not add additional meaning to parameters beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Fetch and extract' and the resource 'pure text content from a specific URL', and explicitly differentiates from sibling tool search_web by specifying usage after searching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context for when to use ('to read the full content of a page found via search_web'), though it does not explicitly state when not to use or list all alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_webA
Search the web for real-time information, news, images, books, or videos. Always use this to verify facts or get up-to-date information before answering.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query. | |
| type | No | Type of search. Default is 'text'. Use 'news' for current events. | text |
| region | No | Region code (e.g., 'wt-wt' for global, 'us-en' for US English, 'zh-cn' for China). Default is 'wt-wt'. | wt-wt |
| timelimit | No | Time limit for results: 'd' (day), 'w' (week), 'm' (month), 'y' (year). Leave empty for no limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description only states it searches the web, but does not disclose behavioral traits like rate limits, result format, or any side effects. As a search tool with no annotations, more behavioral context is needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first states purpose, second gives usage guidance. No unnecessary words, front-loaded with key action and context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and description does not explain expected return format (e.g., list of results). While basic search tool expectations may suffice, explicit mention of output would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage for all 4 parameters. Description does not add significant meaning beyond what schema already provides; it summarizes the type parameter briefly. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'search', resource 'web', and enumerates content types (real-time information, news, images, books, or videos). Distinguishes from sibling 'browse_page' which is likely for loading a specific page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Always use this to verify facts or get up-to-date information before answering', giving clear context for when to use. Does not explicitly state when not to use vs. browse_page, but it is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
The two tools have clearly distinct purposes: search_web handles queries, browse_page retrieves page content. No overlap.
Both tools use a consistent verb_noun pattern (browse_page, search_web), making them predictable.
Only 2 tools for a search server is minimal but functional for basic web search and page retrieval. Slightly under-scoped.
Covers search and content retrieval, but lacks specialized search types (images, news, etc.) or filtering options, which are mentioned in search_web description but not provided as separate tools.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Real-time fact-check, citation verification, and source-freshness for AI agents.
Evidence-grounded, graph-connected, correctable memory for agents.
AI agents collaborate on open biomedical problems, citing sources that are machine-checked.
Source-traced evidence research for AI agents. We organise the evidence; you decide.
Related MCP Servers
- AlicenseAqualityAmaintenanceEvidence-backed web research for AI agents. Real-time search with cited claims, confidence scores, and compare mode showing raw LLM hallucination vs evidence-backed answers.520Apache 2.0
- AlicenseAqualityCmaintenanceLong-term memory for AI agents. Compiles conversations into a structured knowledge base with Claim/Evidence model, source provenance, append-only timeline, and contradiction detection. Multi-path retrieval (Exact + BM25 + Graph + weighted RRF + reranker) — 96.6% R@5 on LongMemEval-S, zero vector dependencies.83MIT
- AlicenseNot gradedqualityBmaintenanceVerified memory for AI agents — agents propose memories that are quarantined until verified against evidence, and recall() returns only trusted, fresh, and in-scope facts, preventing poisoned or hallucinated data from spreading.121MIT

auxiliar-mcpofficial
AlicenseAqualityFmaintenanceEval-backed web-access tool discovery for AI agents.4210MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/wd041216-bit/zero-api-key-web-search'
If you have feedback or need assistance with the MCP directory API, please join our Discord server