Hound Web MCP
About
Hound MCP Servers Gives your agent actually good fetch + Search for 0$, no catch, no api keys or free tiers, fully free
Details
- Author
- dondai1234
- Categories
- Search, Other
Jump to
Setup
Install Hound Web MCP in your MCP client (Claude Desktop, Cursor, Windsurf, and others).
Repository: https://github.com/dondai1234/master-fetch
Follow the installation instructions in the repository README, then restart your MCP client.
Give your AI agent the web. $0. Two commands. No keys.
Fetch · crawl · bypass bot walls · read PDFs (even scanned) · search the web One MCP server · one warm browser · zero accounts · runs on your machine
pip install hound-mcp[all] && playwright install chromium
Install·The 6 tools·Search·Comparison·Gotchas·Honest limits
Same prompt, three tools. Hound does the whole thing on its own, search + fetch + crawl, locally. The others get stuck on the parts they don't do.
BYOK search · intent-aware multi-query fan-out · six-signal ranking · next-gen stealth engine.
- 🔑Bring Your Own Key (BYOK) search: add your own API keys for Serper, Tavily, Exa, Firecrawl, or TinyFish viahound keys add. Keys become the primary search source withkey stacking(multiple keys per provider, auto-rotation on rate limit), automatic fallback to Hound's keyless local engines when all keys are exhausted. CLI key management:hound keys add/list/test/remove/clear.
- 🧠Intent-aware multi-query fan-out: Hound detects query intent (comparison, howto, research, code, reference, news, factual) and generates expanded query variants distributed across diversity engines. Same parallel request count, zero added latency, wider recall. Cross-variant consensus: a URL surfaced by different queries from different engines is a stronger authority signal.
- 📊Six-signal ranking: cross-variant consensus + domain reputation + answer-signal scoring + title relevance + URL relevance + result diversity (max 2 per domain in top results). Source-type detection tags every result as docs/paper/repo/blog/forum/reference/news.
- 🧬Next-gen stealth engine: system Chrome auto-detection, 4 coherent fingerprint profiles, JS-layer patches (HeadlessChrome UA fix,navigator.webdriver=undefined, canvas noise, permissions API), human behavior simulation (Bezier mouse curves, natural scroll), CF Turnstile solver with human-like mouse movement. Passes bot.sannysoft.com, bypasses Cloudflare Turnstile on CanadianInsider (hardest in a 31-site benchmark), Medium, StackOverflow, NowSecure, Glassdoor (DataDome). See thestealth benchmarkbelow.
- 🐍No more scrapling.All scrapling functionality replaced with hound's own modules:fetcher.py(primp-based HTTP),browser.py(patchright-based browser),extractor.py(trafilatura + markdownify). Smaller install, fewer transitive deps, faster cold start.
- 📱Works everywhere.Lean installpip install hound-mcppulls no browser deps. On platforms without playwright (Termux, aarch64), hound runs in HTTP-only mode with graceful degradation.
- 🔒Reliability fixes: universal error detection (error pages no longer look like success), dead Internet Archive fallback removed, self-healing CLI + stale process cleanup, CSS selector errors propagate instead of silently returning[], browser startup failure cleans partial sessions,hound --rollbackworks for pinned older versions,focusandactionsnow forwarded from MCP dispatcher tosmart_fetch.
- 🐳Docker support: multi-stage Dockerfile, docker-compose with shm_size 1gb, non-root user, healthcheck. By @imonlinux.
- 🧪673 tests.
- 🆓$0 forever, MIT: no keys, no accounts, no per-request billing, no data routed to a third-party scraper. Search is keyless and local.
- 🧠Mastered on connect: a one-timeinstructionsblock hands the agent the mental model, the #1 workflow, and the known limits. Effective on turn one.
- 📐~2.9K tokens, 6 tools: hand-crafted tool defs, no Pydantic schema bloat. More capability than tools shipping 5K+.
- 🎯Every response is actionable:content_ok,next_action,summary,page_type,content_age_days/is_stale,source_type/is_official,relevance_score,fetch_relevance. Agents branch on structured fields, not error text. Hard-blocks (404/bot/auth) return clean errors, not fake content.
- 🛡️Production-safe startup + shutdown: cold start under 1s so the MCP handshake never times out; exits 0 with clean stderr, no crash-like teardown noise.
Hound is for the agent itself. You install it once; the agent calls it whenever it needs the web.
pip install hound-mcp[all] # fetch + crawl + keyless search + PDF + OCR + neural rerank playwright install chromium # the anti-detect browser engine
Then point any MCP client at thehoundcommand. No arguments, no keys, no env vars. SeeInstallfor the lean option andTell your agent to install itfor a copy-paste prompt.
hound -v # version + update status hound -u # update to latest (brick-proof, self-healing) hound --doctor # health check + fix advice hound --rollback # undo the last update
Ifhoundever breaks (a failed update, a locked launcher), recover withpython ~/.hound/repair.py, or runhound --doctorto diagnose.
Hound can run in Docker with HTTP mode, ideal for:
git clone https://github.com/dondai1234/master-fetch.git cd master-fetch docker-compose up -d
Hound will be available athttp://<your-host-ip>:8765/mcpas an HTTP MCP server (uselocalhostif running on the same machine).
docker build -t hound-mcp . docker run -p 8765:8765 hound-mcp
For MCP clients that support HTTP (Claude Code, Open WebUI), use your host's LAN IP:
(Orlocalhost:8765/mcpif running on the same machine.)
No API key, no account, no third-party service.smart_searchruns10 keyless backends in parallelon your machine, merges, dedups, and ranks. It returns URLs + ranking,not page content: the agentsmart_fetches whichever results match what it needs (the ranking is a hint, not a directive).
- 🌐10 independent backends: duckduckgo, brave, mojeek, yahoo, yandex, startpage, google, qwant, plus opt-in wikipedia + grokipedia. Six+ independent index families, not the same feed twice.
- 🧠Neural rerank: a local ONNX cross-encoder (ms-marco-MiniLM-L-6-v2, Apache-2.0) running on theonnxruntimeHound already ships for OCR. Exa-style semantic ranking, $0, on your machine. Model downloads once (~80MB, cached, not bundled). Lean installs fall back to cross-engine consensus + engine-position order.
- 🎯Cross-backend consensus: a URL returned by several independent indexes gets a consensus boost: a free authority signal from merging, no extra fetches. Every result carriesrelevance_score(0–1),fetch_relevance(high/med/low), andengines_consensus.
- 🔍find_similar: passurl=; Hound fetches a page you like, derives a query, and reranks candidates against that source page. Exa's find-similar, local.
- 🛡️Never dead: a diversity quorum waits for at least 3 backends to contribute before returning, so a single backend's bias or rate-limit can't dominate. A backend that CAPTCHAs or rate-limits is circuit-broken for 60s and carried by the others.engine_blockedin the response reports which ones cooled down.
- 📊Filters:site/exclude_sites(domain include/exclusion),location/language/region(geo),page(0–10),freshness(day | week | month | year). Default 6 results. A quality filter drops low-relevance results instead of padding to the max with garbage.
- 📈related_queries: follow-up queries mined from result titles + snippets (no LLM). Search one to refine a broad query.
Search is100% HTTP: it never touches the browser (the single Patchright browser issmart_fetch's alone).
Scraping public engines from your IP can be rate-limited or CAPTCHA'd. No keyless local tool is bulletproof against sustained blocking without a proxy: Hound is honest about that, then makes the no-proxy case as reliable as possible for a single user:
Same gray-area posture as SearXNG / ddgs; no search-engine ToS compliance is claimed.
Local keyless search scrapes public engines from your IP. Sustained use can get rate-limited. Hound's proxy rotation lets you add multiple proxies and cycles through them automatically: each search call uses the next proxy, spreading traffic across all IPs. Unhealthy proxies (connection errors) are auto-cooled for 60s and skipped. If all proxies are down, Hound falls back to direct connection so search never fails.
# Add proxies (supports http, https, socks5, socks5h + auth) hound proxy add "http://user:pass@31.59.20.176:6754" hound proxy add "socks5://1.2.3.4:1080" hound proxy add "http://1.2.3.4:8080" "socks5://5.6.7.8:1080" # bulk add # List configured proxies (credentials redacted) hound proxy list # Remove by index or clear all hound proxy remove 0 hound proxy clear
export HOUND_SEARCH_PROXY="http://p1:8080,socks5://p2:1080,http://user:pass@p3:3128"
Max 20 proxies. Config persists in~/.hound/search_proxies.json. Rotation is per-search-call (not per-engine), so all engines in one search share one IP, and the next search rotates to the next proxy.hound doctorshows your proxy pool status.
Webshare's 10 free proxies are dedicated (yours alone, not shared with other scrapers), which is why they achieve 100% success. ProxyScrape's public list is shared and short-lived, but requires no signup. SOCKS5 outperforms HTTP for search engines because it tunnels HTTPS reliably.
# ProxyScrape: grab working SOCKS5 proxies (no signup needed) curl -sL "https://api.proxyscrape.com/v4/free-proxy-list/get?request=display_proxies&proxy_format=protocolipport&format=text" | grep "^socks5://" | head -5 # Add them to Hound's rotation pool # (paste each one: hound proxy add "socks5://ip:port")
Hound's local keyless search works with zero configuration and never goes away. But some users have API keys from search providers, either from free tiers or paid plans. Hound respects that: bring your keys, and Hound makes them first-class citizens with the same reliability guarantees as its own keyless engines.
When keys are configured, those providers become theprimary search sourceand Hound's local keyless engines arecompletely shut off. This is the entire point of BYOK: avoid hitting public search engines from your IP. The local engines run only as a last-resort fallback when every API key is exhausted or rate-limited, so the search never fails.
Hound usesone provider per search. If you have keys for multiple providers, Hound picks the first available one, and only switches to the next provider when the first is exhausted. This means your search capacity scales with how many keys you configure for a single provider, not with how many providers you stack.
Mix and match. Use one provider, use all five, switch providers anytime. Hound treats them as parallel engines in the same ranking pipeline.
Addmultiple keys per provider. Hound stacks them in a rotation pool per provider:
- 🔁Auto-rotation: when a key hits a rate limit (HTTP 429), Hound switches to the next key for thesame providerwithin milliseconds. The search completes without the agent ever knowing a key was rate-limited.
- ⏳Per-key cooldown: a rate-limited key enters a 60-second cooldown. An invalid key (401/403) enters a 300-second cooldown. Hound keeps trying the remaining keys in the pool.
- 🛡️Graceful exhaustion: only whenall keys for all providersare exhausted does Hound fall back to its keyless local engines. The transition is seamless: the agent gets results either way.
- 📊Live key testing:hound keys testmakes a real API call per key and reports which are valid, rate-limited, or invalid. Know before you search.
This means your search capacity scales with how many keys you configure, not with a single key's rate limit.
# Add a key (stack multiple keys for the same provider) hound keys add serper YOUR_SERPER_KEY hound keys add serper ANOTHER_SERPER_KEY # stacked, auto-rotated hound keys add tavily YOUR_TAVILY_KEY # List all configured keys (redacted for safety) hound keys list # Test all keys (live API call per key) hound keys test # Test a specific provider hound keys test serper # Remove a specific key by index (0-based) hound keys remove serper 0 # Remove all keys for a provider hound keys remove serper # Remove all keys across all providers hound keys clear
Keys are stored at~/.hound/search_keys.jsonwith redaction on display. Key rotation state is in-memory only (resets on restart).
For CI/CD, Docker, or ephemeral environments, set env vars instead of the config file. Comma-separated for multiple keys:
export HOUND_SEARCH_SERPER_KEYS=key1,key2,key3 export HOUND_SEARCH_TAVILY_KEYS=key1 export HOUND_SEARCH_EXA_KEYS=key1 export HOUND_SEARCH_FIRECRAWL_KEYS=key1 export HOUND_SEARCH_TINYFISH_KEYS=key1
Env vars override the config file for any provider that has env vars set. Providers without env vars fall back to the config file. Mix both: some providers in the config file, others via env vars.
hound --doctorreports your BYOK configuration status: which providers have keys, how many keys per provider, and whether any are in cooldown. One command to see the full picture.
smart_fetchtries plain HTTP first (~1s). If the site blocks HTTP or serves a JS shell, it auto-escalates to aPatchrightanti-detect browser with Cloudflare challenge solving. Two tiers, nothing to configure.
- 🛡️Built-in Cloudflare bypass: a single stealthy Chrome warms at startup. It closes after 5 min of idleness to free RAM (HOUND_BROWSER_IDLE_TIMEOUT, set0to keep it alive forever) and relaunches in ~2s on the next fetch. Pages close after each fetch, idle memory stays near baseline. One browser total.
- 🧬Stealth engine (v11.1+): system Chrome auto-detection (channel=chromefor real TLS fingerprint), coherent fingerprint profiles, JS-layer patches (HeadlessChrome UA fix,navigator.webdriver=undefined, canvas noise viagetImageData+toDataURLinterception, permissions API), human behavior simulation (Bezier mouse curves, natural scroll, dwell time), and a Cloudflare Turnstile solver with human-like mouse movement. See thestealth benchmarkbelow.
- 🎯Query-focused extraction:smart_fetch(url, focus="...")returns only the BM25-relevant blocks. Cuts context 80%+ on long pages, no re-fetch (runs post-cache). Re-pass the samefocuswhen paginating.
- 🖱️Page interaction:actions=[{click:'button.load-more'},{fill:{selector:'#q',text:'x'}},{press:'Enter'},{wait:500},{scroll:3},{wait_selector:'.item'}]for load-more, search forms, pagination, infinite scroll. Forces stealthy + bypasses cache.
- 🏷️Metadata on every response: title, description, site name, type, image, canonical URL, language, published time, author (OpenGraph + JSON-LD + canonical).
- 🔗Outgoing links:include_links=truepopulatesresponse.linksclassified ascitations(main-content references, the ones worth following) /navigation/external+ aprimary_sourcehint. Follow a page's source chain in one step.
- 🐕Reddit, optimized: Reddit URLs auto-rewrite to old.reddit.com (7× smaller) and skip to the stealthy browser. Subreddit listings parse into structured posts with promoted ads filtered out.
- 💾Smart caching: SQLite (WAL mode), keyed by URL + extraction type +css_selector+pages. Bad content is never cached; a size cap evicts the oldest so a long-lived agent's cache can't grow unbounded.cache_ttl=0forces fresh.
- 📐Pagination: content over 40KB is chunked; the response givesnext_offsetso the agent pages through with one more call (served instantly from cache).
Real-world results from v11.1.0, tested against hard anti-bot targets.
Anti-bot protected sites (content extracted):
Note:Google Search returns 429 (rate limited) as it uses its own bot detection independent of Cloudflare. This is expected.
Memory efficiency (5 sequential fetches):
RSS decreased by 3.5 MB over 5 fetches. No RAM creep. TheMemory.simulatePressureNotificationCDP command triggers Chrome's internal GC + cache drop after each fetch (~5ms, non-disruptive).
smart_crawlwalks same-domain links inbest-firstorder: discovered URLs are scored by focus relevance + content-likelihood (docs/guide/api boosted, login/submit/cart penalized) + shallow depth, so content pages are crawled before junk when the budget is tight.
- 🎯Content-adaptive extraction: article/docs → trafilatura main content; list/index pages (HN, aggregators, directories) → a structured* titlelink list; JS shells → detected and reported honestly.
- 🗺️Sitemap mode:options sitemap=truemaps the whole site fromsitemap.xmlin ONE fetch (full URL list + lastmod, no BFS).sitemap='auto'uses it if the site has one, else falls back to BFS. Collapses a hundreds-of-pages discovery crawl into one call.
- 📍discover_only=true: URL map only (BFS-based). For big sites prefersitemap=trueinstead.
- 🎯focus='query': prioritizes relevant pages within the budget AND focus-filters each page's content.
- 📋crawl_urls=[...]: second-phase selective crawl of a chosen subset (no re-discovery).
- 🛡️Dedup + scoping: URLs normalized so/docsand/docs/are never crawled twice. Same-domain only by default;path_include/path_excludeto scope.
- ⏱️Caps:max_pages(default 10),max_depth(default 2),max_total_chars(token budget),deadline_ms(overall time, default 120000). Each page carriescontent_ok+status+fetched_at;next_actiontells you if the crawl stopped early.
smart_fetchdetects a PDF (by content-typeor%PDFmagic bytes) and extracts it tostructured markdownwithpdfplumber(MIT): multi-column reading order, realtables as markdown tables, font-size headings, de-hyphenated paragraphs, a metadata header, and--- Page N ---markers.
- 📑table_of_contents: the PDF outline as[{level, title, page, end_page}]. PDFs without bookmarks get a heading-based fallback map. Passpages='23-31'to grab one section by range and save tokens.
- 🔍CID-corruption auto-OCR (the flagship trick): academic papers embed font subsets without a Unicode map, so extractors emit(cid:71)(cid:302)...garbage for figures/diagrams/math. But the glyphs render correctly. Hound detects CID-garbage pages, renders them viapypdfium2, and OCRs them withrapidocr, recovering the real text automatically.
- 🖼️Scanned / image-only PDFs(and image-only web pages) are auto-OCR'd too. Pure-pip, no system binary, with[all].
- 📊quality_score(0.0–1.0) + honestcontent_ok: trust PDF content more the closer the score is to 1.0.
- 📎passwordfor encrypted PDFs;include_media=truefor per-page image metadata; a.pdfURL that returns a login/paywall is reported asauth_required.
screenshotcaptures a page as an image. Formultimodal agents only: use when content is rendered as images / canvas / image-of-text or you need visual layout. Text-only agents should usesmart_fetchinstead. A stealthy browser session is auto-managed.
Most free web tools for agents do one thing and miss the rest. Hound is the only one that bolts all of it onto a single local MCP server for $0, no keys.
The short version:Crawl4AI crawls well but has no search and trips on Cloudflare. Parallel Search is remote search-only, no crawl, and runs on their servers. Jina fetches but rate-limits and routes through Jina. Firecrawl keeps the good stuff behind the paid cloud. Hound is the only free tool that combines keyless local search, built-in Cloudflare bypass, best-first crawl, scanned-PDF OCR, page interaction, and query-focused extraction in one local MIT server: $0, no accounts, no keys.
Paid scrapers (Bright Data, ZenRows, Firecrawl paid, Spider.cloud) can beat free tools on the hardest anti-bot (DataDome, Akamai, Cloudflare Turnstile) and on massive scale, because they run large residential-proxy networks. Paid search APIs (Exa, Tavily) offer hosted neural search. They cost $16 to $500+/month, require accounts + API keys, and send your queries + content through their servers. Use Hound for $0 local web research with no accounts and no keys; reach for a paid service only for enterprise scale, sites Hound explicitly can't crack, or hosted neural search at scale.
pip install hound-mcp[all] # recommended: fetch + crawl + keyless search + PDF + OCR + neural rerank playwright install chromium
pip install hound-mcp # fetch + crawl + keyless search (HTTP-only, no stealthy browser)
The lean install works on all platforms (including Termux/Android). It gives you multi-engine keyless search, HTTP fetch with auto-escalation (HTTP tier only, no stealthy browser), crawl, and caching. Stealthy browser escalation and screenshot require browser deps from the[all]extra.
No API keys or accounts are needed for anything: search is keyless and local.
hound -u # update to latest (brick-proof: --no-deps, detached helper, self-heal) hound --doctor # health check: launcher, imports, metadata, deps, PyPI, repair script hound --rollback # reinstall the version from before the last update
hound -uis designed to never brick the install. It updates with--no-deps(no heavy extras that fail mid-install); on Windows it runs pip in a detached helper after the launcher exits (Windows can't overwrite a running .exe), freeing the launcher via the rename trick. If a pip pass leaves the version unchanged, it self-heals with a--force-reinstall --no-depspass.
Ifhoundis ever broken (a failed manual pip while a server held the launcher, a half-finished update), the safety net is a standalone script written outside site-packages on every update:
python ~/.hound/repair.py # stops hound, force-reinstalls hound-mcp from PyPI, verifies
It survives because it is not part of thehound-mcppackage, so a failedpip uninstallnever removes it.hound --doctordiagnoses the install and tells you the right fix.
Install the Hound MCP server on this machine. Follow every step. Do not skip any. 1. Figure out which agent harness you are running on (OpenCode, Hermes, Pi, etc). Then find: (a) where the MCP config file lives, and (b) what format it expects for adding a local MCP server. Read the harness docs if needed. Do not guess. 2. Run: pip install hound-mcp[all] Then run: playwright install chromium (But only if it isnt installed already, verify first about its existence) If either fails, stop and tell the user. 3. Find the MCP config file from step 1 and back it up before editing. Add a new MCP server named "hound" with command "hound", no arguments, in the format your harness requires. No API keys or environment variables are needed (search is keyless and local). 4. Save the file. Tell the user to restart the agent. After restart, smart_fetch, smart_crawl, smart_search, screenshot, cache_clear and version should be available.
Install the Hound MCP server, then the Pi extension:
pip install hound-mcp[all] pi install npm:@houndmcp/hound-mcp-pi
No API keys, no config file, no MCP adapter needed. The extension spawnshoundas a singleton subprocess and registers all 6 tools (web_fetch,web_search,web_crawl,web_screenshot,cache_clear,hound_version) as native Pi tools. Prewarmed at session start. Run/reloadto activate.
hound -u # update the MCP server pi update npm:@houndmcp/hound-mcp-pi # update the extension
The extension checks version sync at session start and warns if the extension and hound diverge by a major version.
Open WebUI v0.6.31+ speaks the streamable HTTP transport natively. Run Hound in HTTP mode and point Open WebUI at it, nomcpoproxy needed:
hound --http --host 127.0.0.1 --port 8765
Then in Open WebUI add an MCP server with URLhttp://127.0.0.1:8765/mcp. Stdio clients (Claude Code, Cursor, OpenCode, Pi, etc.) just usehoundwith no flag.
Things that might surprise you if you don't know them:
No free tool can do everything. Hound is upfront about what it can't:
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.



