Introduction
"The go-to web for your AI coding agent — local-first search, fetch, crawl & research over MCP. No API keys, no cloud, $0/query."
This is article #127 in the "One Open Source Project a Day" series. Today's project is wigolo — a local-first web intelligence tool built specifically for AI agents, delivering search, crawl, fetch, and research capabilities over MCP with no API keys and zero per-query cost.
Equipping an AI agent with "web search" is a problem that looks simple on the surface but has surprisingly deep layers. Tavily, Exa, and Firecrawl have each carved out mature niches in the cloud space — but they share a fundamental trait: per-query billing, data leaving your machine, and mandatory account registration. wigolo's premise: search engines' raw data is public, ranking and extraction algorithms can run locally, and the agent's query history can be cached into a local semantic index. Why should every agent search cost money and travel to the cloud?
1,218 Stars. Created April 2026. Public beta.
What You'll Learn
- wigolo's 10 tools and the design logic behind each
- What "byte-pinned source provenance" and "explainable scores" mean, and why they matter
- Local-first architecture: what runs on-device, what optionally reaches the cloud
- Head-to-head comparison with Tavily, Exa, Firecrawl — each tool's differentiated positioning
- What scenarios favor wigolo, and where cloud tools are still the better choice
Prerequisites
- Experience with Claude Code or any AI agent
- Basic familiarity with MCP (Model Context Protocol)
- General understanding of AI agent tool-calling mechanics
Project Background
Overview
wigolo is a Node.js process that exposes 10 web-related tools as an MCP server, letting AI agents call search, fetch, crawl, extract, and other functions over the standard MCP protocol.
Core design principles:
-
Local-first: cache, vector index, embedding model, and reranker all run locally (
~/.wigolo/) - No forced API keys: the six core tools — search, fetch, crawl, extract, cache, find_similar — require zero API keys
- Explicit failure: bot blocks, dead engines, and stale cache hits are reported in results rather than silently dropped or disguised as empty results
Project Info
- Author: KnockOutEZ
- Language: TypeScript
- License: AGPL-3.0
- Status: Public Beta
- Website: knockoutez.github.io/wigolo
Project Stats
- ⭐ GitHub Stars: 1,218+
- 🍴 Forks: 83+
- 📄 License: AGPL-3.0
- 📅 Created: 2026-04-12
Quick Setup
# One command: download browser engine and local models, write MCP config
npx wigolo init --agents=claude-code
# Configure multiple agents at once
npx wigolo init --agents=claude-code,cursor,codex
# Check all component health
npx wigolo doctor
Requires Node ≥ 20 and about 1.5 GB of disk space (browser engine + local ML models).
All six core tools work immediately after setup — no API keys needed. If you want research and agent tools to produce a synthesized answer (rather than raw data for the host LLM to process), a free Gemini key is the single biggest quality upgrade:
export WIGOLO_LLM_PROVIDER=gemini
export GEMINI_API_KEY=<free key from aistudio.google.com>
For fully air-gapped operation, use a local Ollama model instead: WIGOLO_LLM_PROVIDER=ollama.
10 Tools, Explained
Core Retrieval Tools
search — Multi-engine parallel search
- 18 direct engine adapters (no intermediate proxy API)
- Rank fusion across engines + ML reranking
- Pass an array of queries to fan out multiple searches in a single MCP call
- Each result includes an explainable score:
semantic+lexical+engine_consensusbroken out separately
fetch — Tiered-routing page retrieval
Plain HTTP request
↓ (fails or detects SPA signals)
Headless browser (handles JS-rendered content)
↓ (encounters bot challenge)
Challenge clearance flow
↓ (clearance fails)
Flags blocked_by_challenge — does NOT pretend it succeeded
wigolo learns which tier each domain requires and skips unnecessary escalations on repeat visits.
crawl — Multi-page crawling
Supports BFS, DFS, sitemap mode, or map-only (just build the site map, don't download content). Respects robots.txt, enforces per-domain rate limits, and deduplicates boilerplate templates.
extract — Structured extraction
Extracts from a page: tables, JSON-LD, metadata, brand assets, named schemas (Article / Recipe / Product / …), or any arbitrary structure via a custom JSON Schema.
Memory and Discovery Tools
cache — Local semantic cache
Every visited page is automatically cached. Supports both keyword and semantic similarity queries, works offline. Also exposes cache stats, clear, and change detection.
find_similar — Similar content discovery
Find pages similar to a given URL or concept, via three-way fusion: keyword + semantic + live web.
Research and Autonomous Tools
research — Deep research
Decomposes a question → fires parallel sub-queries → fetches sources → synthesizes a cited report (or generates a structured summary for the host LLM to write).
agent — Autonomous gather loop
Self-plans → searches → fetches → extracts → synthesizes, with configurable time budget and optional output JSON Schema.
Monitoring Tools
diff + watch — Page change detection
Check what changed on a URL since the last visit; set up recurring monitoring and push changes to a webhook.
Deep Dive: Two Unique Features
Byte-Pinned Source Provenance
This is wigolo's most distinctive technical feature — one that no other tool in the comparison set offers. Each search result carries not just a snippet, but:
{
"excerpt": "Logical replication is a method of replicating data objects…",
"citation_id": "src-1",
"source_span": { "start": 1042, "end": 1305 },
"evidence_score": {
"final": 0.86,
"semantic": 0.91,
"lexical": 0.78,
"engine_consensus": 3
}
}
source_span is a byte-offset range pinning the excerpt to its exact location in the original document — not "somewhere in this article," but a precise, verifiable position.
evidence_score breaks down into three independently interpretable components: semantic relevance, lexical match, and engine consensus (how many engines returned this result). Weak results are flagged as junk by wigolo's own scorer and surfaced in the output rather than silently filtered.
Why it matters: When an AI agent builds a RAG pipeline or answers questions that need citations, byte-level provenance means references are actually verifiable rather than plausibly attributed. The "AI might be fabricating citation locations" uncertainty drops by one layer.
Local-First Architecture
AI agent (any MCP client / REST / SDK)
↓
wigolo process (single Node process)
│
├── Search layer
│ 18 direct engine adapters
│ rank fusion + ML reranking (local model)
│
├── Fetch layer
│ Tiered routing (HTTP → headless browser → challenge clearance)
│ Per-domain learning + cache reuse
│
├── Local storage (~/.wigolo/)
│ Keyword index + vector index (local embedding model)
│ Browser engine + ML models
│
└── Optional cloud (dashed)
LLM API (only for research/agent synthesis)
Aggregator backend (widen search funnel, legacy mode)
What runs locally:
- ✅ Direct search engine adapters
- ✅ ML reranking model
- ✅ Vector embedding model (
all-MiniLM-L6-v2etc.) - ✅ Headless browser engine
- ✅ Local cache (SQLite + vector index)
What's optionally cloud:
- 🔲 LLM synthesis (when
research/agentneeds a synthesized answer) - 🔲 Aggregator backend (widen the search funnel, optional)
Head-to-Head Comparison: wigolo vs Tavily / Exa / Firecrawl
This is the main event. wigolo's README includes a comparison table, but stops short of explaining each tool's actual positioning and optimal use case. Here's a deeper reading.
Feature Matrix
| Capability | wigolo | Tavily | Exa | Firecrawl |
|---|---|---|---|---|
| Multi-engine web search | ✅ | ✅ | ✅ | ✅ |
| Page fetch + structured extract | ✅ | ✅ | ✅ | ✅ |
| Full-site crawl | ✅ | ✅ | — | ✅ |
| Byte-pinned source provenance | ✅ | — | — | — |
| Explainable score decomposition | ✅ | — | — | — |
| Persistent local cache (offline re-query) | ✅ | — | — | — |
| Query data stays on your machine | ✅ | — | — | — |
| API key / account required | None | Required | Required | Required |
| Per-query cost | $0 | Metered | Metered | Metered |
Each Tool's Actual Positioning
Tavily — Purpose-built search API for AI agents; currently the most widely integrated paid service in the "RAG + agent search" space. Strengths: production-grade quality out of the box, native support in LangChain/LlamaIndex and most major frameworks, search quality tuned specifically for agent use cases. Weakness: per-query billing, which can add up quickly in high-frequency agent workflows.
Exa — Positions itself as "semantic web search," designed to understand the intent behind a query rather than just matching keywords. Notable strength: high-quality retrieval of technical documentation and academic content — the benchmark section in wigolo's README notes that Exa successfully rendered the full comparison matrix from an official docs page that other tools missed. Like Tavily: requires registration + metered billing.
Firecrawl — Focused on web crawling and structured extraction, not search. Primary strength: handling complex JS-rendered pages, large-scale crawl jobs, and extracting structured data from arbitrary websites. The right tool for "given a set of URLs, batch-extract structured content" — not for "given a question, search for relevant content."
wigolo — Attempts to combine all three capabilities into a single local tool while eliminating API keys and per-query costs. The differentiated bets: byte-pinned provenance, explainable scores, local cache with offline re-query capability, and $0 core tooling cost.
Scenario Recommendations
Choose wigolo when:
- Frequent technical documentation queries during development (no billing constraints)
- Source traceability matters (byte-level pinning → agent citations are verifiable)
- Privacy requirements prohibit query data leaving the machine
- High agent query volume makes cloud API costs a concern
- Building "memory-enabled" research tasks that benefit from local caching across sessions
Choose Tavily when:
- Production-grade quality out of the box, no local dependencies to maintain
- Already in the LangChain/LlamaIndex ecosystem needing framework-native integration
- Query volume is manageable and per-query billing is acceptable
Choose Exa when:
- Primary use case is technical documentation or academic content (semantic relevance priority)
- Official documentation retrieval quality is critical (strong docs page rendering)
Choose Firecrawl when:
- Batch crawling specific websites to extract structured content (not a search use case)
- Large-scale web content processing pipelines
An Honest Limitation
wigolo's README flags one: data-center IP reputation scores lower than residential IPs on some sites' bot-detection systems, which can reduce challenge-clearance rates when running on a cloud server vs. a local machine. Self-hosted deployments should account for this; the README documents optional proxy configurations.
Other Integration Options
wigolo isn't just a Claude Code plugin. It supports multiple invocation paths:
REST API
wigolo serve # starts on 127.0.0.1:3333
curl -sX POST http://127.0.0.1:3333/v1/search \
-H 'Content-Type: application/json' \
-d '{"query":"local-first software","max_results":5}'
Cross-loopback connections require a bearer token; fail-closed by design.
TypeScript / Python SDKs
from wigolo import local_client
with local_client() as client:
res = client.search(query="local-first web search", max_results=5)
for r in res["results"]:
print(r["title"], r["url"])
The SDK automatically reuses a running daemon, or starts one if needed, and shuts it down as appropriate.
Framework Integrations
| Framework | Package | What it exposes |
|---|---|---|
| LangChain | wigolo-langchain |
Each tool as BaseTool + BaseRetriever for RAG |
| CrewAI | wigolo-crewai |
wigolo_tools() passed directly to a crew |
| LlamaIndex | wigolo-llamaindex |
BaseReader loading pages as Documents |
| Vercel AI SDK | wigolo-vercel-ai-sdk |
Tool factory for generateText/streamText
|
Resources
Official Links
- 🌟 GitHub: KnockOutEZ/wigolo
- 🌐 Website: knockoutez.github.io/wigolo
- 📦 npm: wigolo
- 📄 Docs: docs/README.md
Summary
wigolo's core thesis: an AI agent's web access layer shouldn't be a perpetually-billed cloud API black box. Search engine raw data is public. Reranking and extraction algorithms can run locally. Query history can be cached into a local semantic index that persists across sessions. Put these together and you get a zero-cost, on-device, offline-capable web intelligence layer.
Two design decisions are worth singling out:
Byte-pinned source provenance: Unique among all the tools compared. When an agent cites a search result, source_span provides a byte-offset range that ties the excerpt to its exact position in the source document. For research tasks that require verifiable citations, this removes one layer of "the AI might be fabricating where this came from" uncertainty.
Explicit failure over silent pretense: Bot blocks surface as blocked_by_challenge. Dead engines report themselves. Weak results are scored and flagged by wigolo's own evaluator, then shown in the output rather than quietly discarded. This "always tell you what ground you're standing on" philosophy is significantly more reliable in agent contexts than tools that present silence or empty results when something goes wrong.
If your Claude Code workflow involves heavy documentation querying, technical information search, or if you're building an agent pipeline that needs web search — npx wigolo init --agents=claude-code is currently the lowest-cost entry point in the most literal sense: zero dollars, zero API keys, zero per-query billing.
Explore PrimeSkills — a curated marketplace of AI agents and skills, each validated against real enterprise workflows. No hype, just what actually works.
Visit my personal site for more insights and interesting products.
Top comments (0)