Skip to content

robbyczgw-cla/web-search-plus

v5.1.6MIT

Source-only multi-provider web search and bounded web extraction for agent clients.

Changelog

[Unreleased]

[5.1.6] - 2026-10-30

Fixed

  • Failed extractions say why. A request where no page could be read used to return results: [] with "Provider returned an invalid response". It now returns one row per URL with a reason (page not found (HTTP 404), page removed (HTTP 410), the site refused automated access, the site could not be reached or timed out, <provider> does not support this site) and a summary such as "Could not read the page: page not found (HTTP 404)", or which providers were tried and how many were not tried because of the per-request attempt limit. Reasons come from Tavily, Exa, Parallel, Linkup and Firecrawl signals; provider text is matched, never copied.
  • A missing page costs one call. When a provider reports 404/410 from the site, no other provider is tried for that URL (live: 1 call instead of 3 paid calls).
  • Extract fallback reaches three providers again. With another provider waiting, each provider gets one try; a retry used to spend one of the three attempt units.
  • Firecrawl: a 404 page came back and was cached as content; its HTTP 403 "we do not support this site" counted as an auth failure and blocked Firecrawl for five minutes for all URLs.
  • Research counts only pages actually read in extracted_url_count.

Same engine changes as the Hermes plugin 5.1.7.

[5.1.5] - 2026-10-30

Fixed

  • DonSeTch works again with DonSeTch 4.7.1 and newer. With DonSeTch 4.10.3, 5.1.4 answered every explicit provider: "donsetch" search with "Provider execution failed": DonSeTch folds results into a [meta] text line for clients it does not recognize, and the MCP copy of the adapter had not received the Hermes fixes. The adapter is now the Hermes 5.1.6 one: it asks for the split result shape (DONSETCH_MCP__TEXT_ONLY=false), still reads a folded [meta] answer, reads the child's output with a thread instead of select (which fails on Windows pipes), and sends the Web Search Plus version in the MCP handshake. Tests use recorded DonSeTch 4.7.0 and 4.10.1 answers.
  • WSP_FORCE_SUBPROCESS=1 and the subprocess fallback work. search.py was started as a file and stopped on its package-relative imports, so every call returned "Web Search Plus subprocess failed." It now runs as python -m web_search_plus_mcp.search. The server tests had replaced subprocess.run and never started the real child; a new test does.
  • A tool call no longer moves your config file. Choosing the output detail read the config with a stricter check than the engine uses. A config with "extract_provider_priority": [] (valid, it means the default order) was renamed to config.json.broken-* on the first tool call, and the search then ran without your disabled_providers. Read paths leave the file alone now, and an empty list means the default order, as in the engine. The config command still keeps an invalid file as a .broken-* backup before it writes a new one.

[5.1.4] - 2026-10-30

Fixed

  • Compact web_search output caps each snippet at 1,200 characters (word boundary, with a [TRUNCATED: showing first N of M characters] marker), like the Hermes plugin's display. A real Exa search returned a 21,830-character snippet and made one five-result compact response ~32 KB. detail: "full" keeps the original text. Found in the release smoke test of the built package; a size test with long provider snippets now guards it.

5.1.3 was tagged and released on GitHub but not published to PyPI; 5.1.4 contains all of it.

[5.1.3] - 2026-10-30

Changed

  • MCP responses are compact by default. web_search and web_extract accept the optional detail: "compact" | "full" argument. Compact JSON removes repeated observations and execution diagnostics while preserving source text, short routing/cache/warning summaries, per-URL extraction errors, bounded content and full-text storage references. Failures retain setup guidance and MCP isError: true.
  • Clients parsing the full v3 contract must opt in: pass detail: "full", set WEB_SEARCH_PLUS_MCP_DETAIL=full in the server environment, or add {"mcp": {"detail": "full"}} to the existing config file. Precedence: argument > environment > config > compact. Full output preserves the 5.1.2 projection, including routing receipts, observations and requested quality reports. Tool names, existing arguments and content limits are unchanged; the compact projection itself does not change provider execution.

Fixed

5.1.3 also carries the Hermes 5.1.6 engine fixes (upstream faa0110, 2b7e544, 1eb9b8c):

  • Google /goto source wrappers are dropped by default without Google requests; classic /url?q= wrappers decode locally. serper.resolve_redirects=true opts into the bounded, one-hop resolver. Redirect counts survive fallback, Research and cache hits; compact output includes positive counts only, full mode retains all receipt details.
  • SerpBase defaults to device=mobile, configurable via serpbase.device (mobile or desktop), prefers canonical url over link and sends the WSP user agent. Cache identities separate devices and redirect policies.
  • Every search provider filters corrupt source URLs before ranking, observations and caching, preserving legitimate IRIs and UTF-8 escapes. invalid_urls_dropped is included only when positive in compact output.
  • Security and shopping start with Brave; Serper remains a later fallback, matching the Hermes routing tables.
  • DonSeTch's tested version is 4.10.3; setup documentation and status assertions are updated.

Hermes text headers, Hermes-only output-size tests and unrelated host configuration changes are not ported. MCP compact regression tests cover the new metadata within the existing ≤30% / <6 KB eight-source budget.

[5.1.2] - 2026-10-18

5.1.1 was never released, so this section covers everything since 5.0.1. Synced with the Hermes Web Search Plus 5.1.2 engine (5.0.1 → 5.1.2, including the engine parts of 5.1.0 and 5.1.1). Hermes-plugin-only changes are not ported: profile-scoped keys (catalog rule 11), the native backend, hermes web-search-plus commands, Hermes Desktop settings and the Jev key-file removal. Tool names, input schemas and the .env loading of the MCP server are unchanged.

Fixed

  • No provider request starts after the request deadline. Batch extraction (Firecrawl, Linkup, Serper, Keenable, DonSeTch) keeps pages it already fetched and marks the rest not tried: request ran out of time; socket timeouts shrink to the time left; Octen, TinyFish and DonSeTch respect the per-attempt timeout cap; research passes its deadline to every member and to its source extraction (with a short grace to collect pages already returned).
  • A request that runs out of its own time no longer counts against the provider: no circuit opens, no latency sample is recorded and, when nothing was sent, no budget unit is used. A retry starts only with at least 1 s left, and the Brave pacer does not wait past the deadline.
  • Brave's per-second 429 retry moved into the attempt engine. It respects the deadline and shows as its own try in receipts; with another candidate left, automatic routing falls back instead of waiting.
  • The per-request provider-attempt budget no longer depends on SQLite; a configured daily limit fails closed when the ledger cannot be read, and the state store re-probes SQLite 30 s after an I/O error.
  • Half-open circuit probes release their lease when the call is budget-blocked, ends without a verdict on the provider (invalid request, internal or contract error) or is interrupted; a half-open retry no longer blocks itself and the failure history stays until a probe succeeds.
  • web_extract returns exactly one result per requested URL, in request order, also when several providers served the batch. URLs with the same canonical form (?ref=1 / ?ref=2) are no longer collapsed, an unmatched provider item is no longer assigned to the first open URL, and content returned under a rewritten URL (http → https, redirect) is kept instead of paying a second provider.
  • A rate limit, out-of-credit or auth error partway through a web_extract batch keeps the pages already fetched (Hermes 5.1.2, 5b689e2). Firecrawl, Linkup, Serper and Keenable stop the batch at a provider-wide error and mark the URL that failed and the URLs not yet tried with the cause, e.g. not tried: provider rate limit reached. Only those URLs go to the next provider. The attempt is reported as partial, keeps the error in its receipt and opens the circuit; the batch is never retried at the same provider. Partial results are not cached. If the error comes on the first URL, the attempt fails as before. Serper and Keenable now report these errors to the circuit breaker; before, a 429 turned into a per-URL error on every URL. A DonSeTch session failure partway through a batch keeps the pages already fetched.
  • URLs past bounded_context.max_urls (default 10) get their own row (Hermes 5.1.2, 76a0d2f): error: "not tried: limit of 10 URLs per call reached", in request order, in the legacy projection and in the MCP web_extract output. They used to vanish with only a note in limits_applied.
  • The provider that served the pages is named in the header, routing.provider, fallback_used, the receipt and the cache when a fallback provider took over.
  • Extract provider names are case-insensitive; unknown or search-only names return a clean error.
  • The search cache is keyed by the credentials that produced a result (read from the process environment), so a changed key or SearXNG instance no longer serves cached results of the old one.
  • A jev.api_key in config.json is ignored with a warning instead of discarding every routing setting in the file.
  • SearXNG error messages and result metadata keep only the instance origin (scheme, host, port).
  • Brave queries are shortened only past Brave's documented 600 characters and 75 words (5.0.1 used 400 and 50).
  • Research names why a provider was skipped (for example "Out of credits or quota at its last call").
  • DonSeTch: a fetch that runs past the deadline keeps the pages fetched before it, and its child process gets the DONSETCH_* values through the credentials layer.

Added

  • web_extract results carry requested_url, the URL you passed in, next to url (where the page was fetched, after redirects and normalization). Two inputs such as ?ref=a and ?ref=b that end on one url can now be told apart without relying on order. MCP-only and additive: url is unchanged and the canonical v3 response and schemas/v3 are untouched.

Changed

  • New module web_search_plus_mcp.credentials: get_secret reads the process environment (no resolver is installed here) and redact_secrets / redact_url are available for status output. The MCP server still loads its .env files itself.
  • Provider SDK: wsp_sdk exports RequestDeadlineExceeded, deadline_passed(), dispatch_timeout(timeout) and remaining_seconds() for providers with their own transport.
  • A partial extraction warning also carries details.unmatched_count and extract payloads carry unmatched_results for items that answered no requested URL (additive; details.failed_urls is unchanged).

[5.0.1] - 2026-10-10

Synced with Hermes Web Search Plus 5.0.1. Bug fixes for 5.0.0, no breaking changes; routing, providers and config format stay the same.

Fixed

  • Normal queries no longer trip the source-only filter. Searches with words such as "synthesizer" or "verify the claim" failed at Exa, Tavily and Linkup, and docs queries meant for Exa fell through to another provider. The filter now checks only what Web Search Plus itself sends, not your query, URLs or domain filters.
  • One bad URL no longer sinks a web_extract batch. Each blocked, unresolvable or failing URL gets its own error in results[] (also listed in the wsp.extract.partial warning under details.failed_urls); the other URLs are still extracted, and failed ones are retried on the next extraction provider. Error messages no longer reveal internal IP addresses.
  • Empty pages are no longer a success. Blank extractions fall back to the next provider and are not cached.
  • Bounded rate-limit waits. A long Retry-After is not waited out inline (cap 30 s); retries without one back off briefly; malformed values no longer crash the attempt.
  • Long queries work at Brave. Queries are shortened at a word boundary to Brave's 400 characters / 50 words, site: operators kept, instead of being rejected. A provider rejecting a too-long query reads "Query rejected … it may be too long".
  • Auto routing off without a default provider uses the configured provider order instead of failing every search.
  • A private SearXNG URL without SEARXNG_ALLOW_PRIVATE=1 skips SearXNG instead of breaking every automatic search.

[5.0.0] - 2026-10-09

Synced with Hermes Web Search Plus 5.0.

Breaking changes

  • Automatic routing picks the first provider by query type: Brave for general, news, local and community queries, Exa for docs and academic, Serper for security and shopping. In a 294-query test mix with every provider configured, Brave answered 62 % of automatic searches (4.3.5: 14 %). With a Brave key, expect more Brave usage. auto_routing.order: "custom" in config.json makes provider_priority the order for every query. A config that still holds the 4.x default provider_priority gets the new order.
  • Without a configured language, a clearly detected query language is sent to the provider: a German query is searched in German. Set defaults.locale.language to keep one language for every query.
  • Removed: the heuristic router (adaptive_routing and confidence_threshold are accepted and ignored), shadow routing, the source-independence estimator, reading the pre-v3 JSON search cache from the tools, and the Perplexity and Kilo-Perplexity config sections. A defaults.provider set to a removed provider falls back to the default.
  • Code that patched search.search_<provider> or search.make_request patches web_search_plus_mcp.providers; search.QueryAnalyzer and search.get_compatibility_shim_policy() are gone.

Changed

  • Results drop spam and pages beyond two per domain from a larger candidate list, rank the vendor a query names first in docs, security and news results, and show [published YYYY-MM-DD] where the provider returns a date.
  • Research mode merges provider lists with reciprocal rank fusion and returns up to two query-ranked passages per source.
  • Automatic search starts the next provider when the current one fails, returns no results, or exceeds its p75 latency (at least 2.5 s).
  • Snippets in the tool text are cut at 1,200 characters; the JSON payload keeps the full snippet.
  • include_domains accepts a plain string, ports, IDN domains and suffixes such as .gov. A filter without a usable entry is an error instead of an unfiltered search, and search operators can no longer be injected through Firecrawl. Several domains reach Firecrawl joined with OR. Tavily cannot filter by suffix and says so; automatic search skips it for such filters.
  • A provider is blocked only after three failures in a row; a success resets the count. A blocked provider names the reason in words ("Out of credits or quota at its last call …") instead of a bare code.
  • A search every provider answered with no results is no longer cached, a hedged win counts as a normal answer, and [published …] survives cache hits.
  • wsp_sdk.api, wsp_sdk.errors and wsp_sdk.conformance resolve to the same modules the engine uses.
  • A 402, or a 400, 403 or 429 whose body reports no funds (also gzip-encoded), is reported as "Out of credits" instead of a rate limit. A 429 with Retry-After stays a rate limit.
  • The engine is synced module for module from Hermes Web Search Plus 5.0 (intents.py, urls.py and dates.py are new). The bench, extract-bench and operator-receipt tooling stays in the Hermes plugin.

[4.3.5] - 2026-10-08

  • MCP clients see missing-key guidance. The v3 error classification replaced it with Provider configuration is invalid, so 4.3.4's setup hints never reached Claude Desktop, Cursor or other clients. A missing key now returns Missing API key for <provider> with error_v3.details.env_var, how_to_fix and setup_required. Only WSP's own guidance in its exact shape is passed through; other configuration error text stays redacted. Synced with Hermes Web Search Plus 4.3.5.
  • Failed tool calls set MCP isError: true. Before, a failed search or extract returned isError: false with the failure only inside the JSON text.
  • web_extract without a key returns the same setup guidance as web_search.
  • Locale: built-in config no longer ships country/language for Brave, You.com, Firecrawl, SerpBase and SearXNG. The resolver read those defaults as explicit user settings, so defaults.locale and query location hints were ignored for these providers (a German query with locale at reached Brave as US/en). Matches Hermes Web Search Plus; adds the Hermes locale test suite.
  • Research dedup keeps query parameters that identify a page (youtube.com/watch?v=…, news.ycombinator.com/item?id=…) and drops only tracking parameters. Different videos or threads were merged into one result.
  • web_extract no longer repeats the full page in observations[].text. That copy bypassed max_context_chars (a 105k-character page returned 168 KB); the bounded text stays in results[].content and the full page in stored_content.

[4.3.4] - 2026-10-07

  • Missing-key errors suggest web-search-plus-mcp setup, the .env file or the MCP client env block instead of an inline key in config.json. Synced from Hermes Web Search Plus 4.3.4.
  • DonSeTch: closing a session lets the stderr reader finish before the pipe is closed, so the sanitized stderr excerpt is no longer lost and the reader thread no longer raises ValueError.

[4.3.3] - 2026-10-01

  • web_extract converts internationalized hostnames (müller.de, straße.de, 例え.jp) to punycode and validates and fetches the converted URL instead of rejecting them. Mixed-script labels, compatibility characters and invalid IDNA are still rejected. idna is a declared dependency. Synced from Hermes Web Search Plus 4.3.3.
  • Clarified: the same-origin redirect rule covers calls to provider APIs, not the pages you extract.

[4.3.2] - 2026-10-01

  • Security hardening, synced from Hermes Web Search Plus 4.3.2: extract rejects URLs that parse differently across URL parsers and checks literal IPs and DNS answers, including IPv6 embedded-IPv4 forms; the HTTP client follows only same-origin redirects and its urllib opener is http(s)-only; responses are limited to 16 MiB on the wire and after decoding; provider-supplied error text is no longer passed on; DonSeTch runs with an allowlisted environment.
  • include_domains, exclude_domains and urls values that start with - or are empty are refused with an invalid_request error before any run.
  • Redirects across host, port or scheme now fail, and provider errors are less detailed.

[4.3.1] - 2026-09-23

  • web_search and web_extract run the search engine inside the MCP server instead of spawning search.py per call. Same argv, parser, and per-call config reload; error and timeout payloads are unchanged. Live stdio medians: auto routing 1.70 s → 0.99 s, Serper −18 %. WSP_FORCE_SUBPROCESS=1 restores one process per call. Note: .env is now read once at server start, so restart the server after adding a key there.
  • Provider HTTP calls reuse keep-alive connections per host (synced from Hermes Web Search Plus). Proxies and WSP_HTTP_KEEPALIVE=0 keep plain urlopen.
  • search.make_request no longer resets the pooled opener to plain urlopen on every call.

[4.3.0] - 2026-09-23

  • Fix adaptive routing on the v3 engine path, synced from Hermes Web Search Plus. Engine-owned search calls skipped record_provider_outcome, so provider performance samples stopped and routing fell back to static priority. Every real provider call, including research members and each retry, now records a sample. Cache hits and config errors still record nothing.
  • Lock provider_stats.json across processes (POSIX). Concurrent writers lost up to half of the samples.
  • web_search no longer forces --max-results 5 when the client omits count, so defaults.max_results in config.json applies. A count: null argument no longer produces --max-results None, which the search script rejected. An explicit count still wins.

[4.2.1] - 2026-09-21

  • Expose no_cache and cache_ttl on the MCP web_search tool so clients can bypass or shorten the search cache, matching the CLI flags.
  • Pin the optional DonSeTch adapter TESTED_VERSION to 4.2.9. Status reports tested for 4.2.9 and compatible_unverified for any other parsed version, including 3.x. A different major is not treated as broken. DonSeTch stays separately installed. Attribution: dondai44423/donsetch, AGPL-3.0-only.

[4.2.0] - 2026-09-18

  • Align the public MCP version line with Hermes Web Search Plus 4.2.0.
  • Optional Jev, default off: search-type overlay (keyword proposes news, Jev confirms at confidence ≥ 0.95), extract quality, and language fill when WSP inferred none. Enable with setup --jev --jev-key-file PATH. The key is never written to config.json.
  • Credited but not ported: Windows fcntl import fix from Hermes (#129 by @gzwahoo). MCP packaging remains POSIX-oriented; there is no equivalent import.

[4.1.1] - 2026-09-09

  • Prefer Exa highlights over leading page text when both are present.
  • Send Parallel Search max_results and domain filters in advanced_settings instead of site: query stuffing.
  • Forward Tavily time_range from the unified freshness filter; --time-range wins if both are set; MCP search output reports metadata.freshness from the sent value.
  • Carry Exa publication-date bounds from the request into MCP freshness receipts through the v3 warning bridge. time_range=hour is a one-hour window.

[4.1.0] - 2026-09-05

  • Align the public MCP version line with Hermes Web Search Plus 4.1.0.
  • Carry DonSeTch 3.6.1 compact MCP evidence and namespaced diagnostics; retain older structured responses; preserve rank/URL binding; force stdio only for the DonSeTch child process.
  • Document that the opt-in Hermes native wsp backend is Hermes-plugin-only and is not ported into this MCP package. MCP clients keep the existing web_search and web_extract tools.
  • Credit @LugMuad for the Hermes-only native integration direction in hermes-web-search-plus#125, and keep DonSeTch attribution as the separately installed upstream project (dondai44423/donsetch, AGPL-3.0-only).

[4.0.5] - Unpublished candidate, included in 4.1.0

  • Sync DonSeTch 3.6.1 compact MCP evidence and namespaced diagnostics; retain older structured responses.
  • Preserve rank/URL binding and force stdio only for the DonSeTch child process.

[4.0.4] - 2026-09-04

Fixed

  • Preserve queries beginning with - through structured search requests and subprocess adapters. Treat spans_query as data even when it resembles a CLI flag.
  • Reject malformed section shapes in the shared budget-preflight helper.

Changed

  • Share daily-budget settings and adapter-signature validation without removing either enforcement boundary.
  • Replace prose-only compatibility assertions with export and defensive-copy checks; remove the nonexistent search_provider from the compatibility inventory.
  • Remove empty section headers and the pass-through contract-error factory.

Added

  • Grok Build plugin packaging: .mcp.json (pinned uvx stdio server), skills/web-search-plus/SKILL.md, and .grok-plugin/plugin.json. Installable with grok plugin install robbyczgw-cla/web-search-plus-mcp; no provider keys are shipped.

[4.0.3] - 2026-08-25

Changed

  • Bump the tested DonSeTch version to 3.2.1. Live stdio Search and Fetch still work; 2.x binaries now report incompatible_major.

[4.0.2] - 2026-08-22

Added

  • Parallel Search accepts parallel.mode (turbo, fast, basic, advanced). The default is fast; set advanced or use research mode for deeper work.
  • Parallel now joins the default auto-routing pool when a key is configured. Operators can still set auto_allow.parallel=false.

[4.0.1] - 2026-08-17

Fixed

  • Reuse one initialized DonSeTch stdio MCP session for every URL in a single extract request.
  • Reap the DonSeTch child on timeout, initialize failure, tool errors, malformed MCP output, and broken pipes.
  • Report DonSeTch binary readiness from status instead of treating DONSETCH_BIN as an API key.

Changed

  • Bump the tested DonSeTch version to 2.3.1 (live-tested for stdio Search and multi-URL Fetch).
  • Capture a bounded, sanitized DonSeTch stderr excerpt for diagnostics. Successful Search/Extract payloads do not include raw stderr.

[4.0.0] - 2026-08-16

Removed

  • Remove the optional Hound provider and HOUND_MCP_URL configuration.

Added

  • Add DonSeTch 2.1.0 as a separately installed stdio Search/Fetch provider via DONSETCH_BIN.
  • Keep DonSeTch explicit-only by default and document its AGPL-3.0-only separate-install boundary.
  • Normalize DonSeTch initialization, Search, Fetch, and structured errors into the existing MCP envelopes.

Verification

  • Exercise the adapter with DonSeTch 2.1.0 for stdio initialization, Search, Fetch, and structured error handling.
  • Keep browser and anti-bot behavior explicitly environment-dependent.

[3.6.0] - 2026-08-06

Added

  • Add root-level Agent Plugins 1.0 manifests for portable client discovery through the published web-search-plus-mcp package.
  • Add an exact-version uvx stdio launcher that keeps PyPI as the runtime source of truth.

Security and compatibility

  • Keep provider credentials outside both manifests; clients supply them through the process environment.
  • Preserve the stable web_search and web_extract MCP tools and existing SDK-v2 stdio compatibility.

Verification

  • Validate both manifests against the canonical Agent Plugins schemas and exercise the exact mcp.json command without provider requests.
  • Run the full package tests, lint, compilation, source/wheel build, and metadata checks.

[3.5.0] - 2026-08-01

Changed

  • Require the MCP Python SDK v2 line (mcp>=2.0.0,<3) and migrate the low-level stdio boundary to the stateless 2026-07-28 protocol while retaining 2025-11-25 legacy handshake compatibility.
  • Validate tool arguments at the SDK boundary and sanitize unknown-tool, invalid-argument, and unexpected-execution failures.
  • Port the optional Hound sidecar bridge to the SDK-v2 httpx2, two-stream transport, float-timeout, and snake_case result APIs.
  • Keep the stable web_search and web_extract tool surface and the package stdio-only.

[3.4.1] - 2026-07-30

Added

  • Add explicit-only TinyFish source search with BYOK credentials, a fixed official HTTPS origin, redirect refusal, opaque upstream errors, and fail-closed query, domain, URL, response, and aggregate-size bounds.
  • Add native Exa freshness support by converting unified day/week/month/year values into absolute UTC startPublishedDate and endPublishedDate bounds.

Fixed

  • Report explicit Exa start_date and end_date overrides in freshness metadata instead of generated bounds that were not sent upstream.

Security and documentation

  • Keep TinyFish outside automatic routing and fallback by default (auto_allow=false) and disclose its published Customer Data rights for analysis, training, fine-tuning, evaluation, and model improvement.
  • Preserve the stable two-tool MCP surface and 9-provider extraction surface while increasing source-search providers from 14 to 15.

Credits

[3.4.0] - 2026-07-28

Added

  • Add Octen via Monid as a bundled, source-only Search provider through the public Provider SDK. The adapter supports native freshness plus include/exclude-domain filters and remains explicit-only by default (auto_allow=false).

Security and cost controls

  • Send credentials only to Monid's fixed HTTPS API origin, reject redirects, cap response bodies at 8 MiB, sanitize upstream failures, and keep Monid lifecycle errors separate from Octen provider HTTP errors.
  • Keep Octen's answer, Broad Search, image/video, and full-content modes outside this integration. Search highlights are enabled for source snippets while billable full content is explicitly disabled.

Fixed

  • Honor ProviderSpec.supports_freshness for discovered SDK Search providers so a successfully applied canonical freshness filter is no longer reported as unsupported.

Documentation

  • Add a repository-specific contribution guide covering the MCP compatibility boundary, portable-engine syncs, Provider SDK intake, security/privacy requirements, CI commands, packaging, and pull-request evidence.
  • Add regression coverage that keeps the guide, README link, internal links, and CI commands synchronized.

[3.3.0] - 2026-07-24

Added

  • Preserve bounded heading-aware semantic sections in web_extract spans, including query-free body text and deeper subheadings through the next same-or-shallower heading.
  • Add provenance-safe cross-provider snippet aggregation plus additive source_type and explainable fetch_priority result hints.
  • Harvest Research providers in completion order and optionally preempt unfinished providers after a configurable quality quorum; preempted providers remain explicit as preempted_after_quorum diagnostics.

Fixed

  • Preserve snippet_aggregate, source_type, and fetch_priority across the canonical v3 engine to stable MCP result projection instead of silently dropping them.
  • Honor explicit Research-provider lists independently of automatic-routing allowlists while retaining disabled/configuration/cooldown safeguards; expose cooldown omissions in routing and quality receipts.
  • Count unique evidence from every completed provider when evaluating Research quorum, even if the first provider alone fills the public result page.
  • Honor MCP quality_report=true on the canonical v3 path by deriving diagnostics from validated results, routing receipts, provider attempts, source diversity, and cache status without issuing a second provider request.

Changed

  • Realign the standalone MCP package version from 1.2.0 to 3.3.0 so it directly names the portable Web Search Plus 3.3.0 engine generation. The stable web_search and web_extract tool names, arguments, and legacy result fields remain compatible.

Attribution

  • These independently implemented portable improvements adapt product ideas from Hound/Master-Fetch v11.2.0, the independent MIT-licensed project by Bishesh Bhandari (dondai1234). The implementation is reworked for WSP/MCP's own provider, provenance, budget, and receipt contracts; Hound code is neither bundled nor claimed as Robby's code.

[1.2.0] - 2026-07-22

Added

  • Add Hound as an optional production Search and Extract provider through a separately installed MCP Streamable-HTTP sidecar.
  • Expand the public source-only surface to 13 Search providers and 9 Extract providers while preserving the two stable MCP tools.
  • Ship a Hound installation, security, keyless-trade-off, and opt-in routing guide plus dedicated 1.2 release notes in the wheel.

Changed

  • Sync the portable Hound provider and automatic-extraction guard from Web Search Plus v3.2.0.
  • Require mcp>=1.26,<2 and declare httpx>=0.27,<1 explicitly for the loopback MCP client bridge.

Security

  • Accept Hound endpoints only on literal IPv4/IPv6 loopback addresses, without credentials, query strings, fragments, redirects, or proxy-environment inheritance.
  • Keep Hound explicit-only by default for both Search and Extract; automatic participation requires an operator auto_allow override.
  • Disable Hound-side response caching in provider calls so Web Search Plus remains the cache, freshness, policy, and receipt authority.

Fixed

  • Preserve the originating provider in the stable MCP provider field on v3 cache hits, where no current provider attempt exists.

Attribution

Verification

  • Add network-free Hound transport, projection, endpoint-validation, failure, timeout, raw-HTML, cardinality, and automatic-routing regressions.
  • Validate the packaged provider through Search and Extract MCP boundary smokes against hound-mcp 11.1.6.

[1.1.1] - 2026-07-21

Fixed

  • The MCP web_extract projection now preserves spans and span_contract_version on result items; previously the engine computed spans but clients never received them.
  • wsp_sdk imports as a plain package again (its ProviderRequestError import no longer depends on test-only sys.path layout).
  • Extraction requests served by discovered Provider-SDK extraction providers no longer fail closed inside the cache identity; SDK providers contribute a deterministic identity derived from their spec and the non-secret scalar settings of their config section. Unknown providers still fail closed.
  • The providers.d non-production gate acts before module execution: modules declaring a literal production=False are skipped without being imported unless WSP_SDK_ALLOW_NON_PRODUCTION is set.

[1.1.0] - 2026-07-20

Added

  • Sync the portable Web Search Plus v3.1.1 policy layer: budget preflight, diversity scoring/reranking, self-hosted profiles, shadow-policy observations, semantic extraction spans, extraction cache identity v6, and SQLite state schema v3.
  • Add the public wsp_sdk package plus fail-closed providers.d discovery, startup diagnostics, and network-free provider conformance checks.
  • Expose deterministic semantic spans through the MCP web_extract schema and CLI projection.

Changed

  • Generate and ship the current v3 request/response schemas, including budget-preflight receipts and span options.
  • Keep MCP-specific stdio, subprocess, tool names, legacy projections, and auto-fallback behavior authoritative while syncing the portable engine to Web Search Plus v3.1.1.

No-port scope

  • Hermes plugin loading, Operator Console, receipt journals, benchmark/release tooling, and Hermes runtime hooks remain intentionally outside the standalone MCP package.

Verification

  • 265 tests pass, including 73 portable v3.1 feature tests and provider-SDK discovery/conformance subprocess coverage.

[1.0.1] - 2026-07-20

Fixed

  • Restore multi-provider fallback expansion for normal provider=auto Search and Extract requests across the MCP → CLI → v3 projection boundary. The CLI's absent --allow-fallback flag no longer serializes an explicit allow_fallback: false that collapses auto plans to one candidate.
  • Keep explicit provider requests strict by default; they fall back only when --allow-fallback is explicitly requested.

Verification

  • Add issue #27 regressions proving multi-candidate auto plans and an executed second-provider fallback after a simulated 429 for both Search and Extract.
  • Full suite: 187 tests passing locally and on Python 3.10, 3.11, and 3.12 in CI.

[1.0.0] - 2026-07-14

Breaking

  • Align the standalone MCP server with Web Search Plus 3.0's mechanically source-only contract. Native Perplexity and Kilo Perplexity answer endpoints are removed from public provider schemas because they do not expose a verified source-only mode; direct low-level calls fail closed with the typed wsp.provider.source_only_required error before provider dispatch.
  • Reduce the public search surface from 14 mixed providers to 12 source-result providers. The extraction surface remains 8 providers.

Added

  • Port the Web Search Plus v3 request/response contracts, lossless source observations, provider-attempt and routing receipts, typed errors, cache-origin evidence, deterministic compatibility projections, and generated v3 JSON Schemas.
  • Port bounded extraction context with a 10-URL call limit, deterministic inline truncation, local full-text storage, and page-on-demand references.
  • Port marker-owned v3 cache/state storage, dry-run/backup/rollback migration primitives, provider adapter validation, guarded request gates, and source-independence metadata.
  • Add web-search-plus-mcp config set-auto-allow <provider> on|off for explicit guarded-provider participation in auto-routing.
  • Add a 0.x-to-1.0 migration guide covering retired providers, additive response fields, MCP host schema refresh, and rollback.

Changed

  • Keep the two stable MCP tools, web_search and web_extract, while routing both through the canonical --contract-v3 engine path and projecting v3 responses additively onto the established MCP result shape.
  • Keep Classic Routing v2 authoritative, promote Brave into the default auto-pool for independent-index diversity, and preserve deterministic source-only fallback behavior.
  • Update package, server, User-Agent, README, Glama, lockfile, and build metadata to 1.0.0, aligned with the Web Search Plus v3.0.2 engine family.

Fixed

  • Sync the portable Web Search Plus v3.0.2 entrypoint repairs: bounded Research Mode fan-out, immutable timeout/cancellation snapshots, honest provider-attempt evidence, and consistent cache keys across request options.
  • Preserve extracted body text, immutable full-text references, global context bounds, cache provenance, and miss-to-hit semantics across the canonical v3 pipeline.
  • Keep the MCP legacy projection's aggregate provider identity as research while preserving canonical multi-provider attempts, observations, and receipts additively.
  • Advertise the MCP package version in the initialize handshake instead of leaking the installed MCP SDK version as the server version.
  • Give Research Mode subprocesses a fixed grace window beyond the requested inner budget and convert outer timeouts into sanitized, retryable wsp.subprocess.timeout responses.

Security

  • Preserve private/internal extraction-target blocking, credential-free public manifest data, typed provider failures, and fail-closed rejection of answer-only provider modes.
  • Convert malformed subprocess stdout/stderr into controlled typed protocol errors without exposing raw diagnostics, while retaining the additive legacy error string.

MCP-specific scope

  • Keep the standalone stdio/subprocess boundary. The Hermes plugin's in-process lazy loader, Operator Console, setup helpers, and v3.0.1 import-precedence hotfix are intentionally not ported because they do not apply to a normal installed MCP package.

Tests

  • Add contract, provider-surface, bounded-context, source-only rejection, compatibility-projection, schema, documentation, and Glama drift gates.
  • Port the Web Search Plus 3.0 state-migration and SQLite-state suites: dry-run/apply/no-op/rollback, backup integrity, tamper and symlink rejection, WAL initialization, circuit isolation, and atomic concurrent budget reservation.
  • Port the portable v3.0.2 entrypoint regressions and add MCP-boundary coverage for Research Mode identity and extract cache-hit body/provenance preservation.
  • Add GitHub Actions coverage for Python 3.10, 3.11, and 3.12 plus Ruff, compile, wheel, and source-distribution builds.

Attribution

[0.17.0] - 2026-07-10

Security

  • Sync the Web Search Plus v2.9.1 cache-ownership fix: cache stats and clear now recognize only complete WSP search-cache envelopes, preserving provider_stats.json, provider_health.json, host-written usage state, unrelated/corrupt JSON, and invalid UTF-8 files byte-for-byte.

Added

  • Add independent auto_routing.extract_provider_priority configuration for web_extract(provider="auto"), including web-search-plus-mcp config set-extract-priority ... and status/config output. Partial lists append missing extract-capable providers in registry order; search priority remains independent. Synced from upstream #89 by @robbyczgw-cla.

Changed

  • Raise Parallel extraction's default full-content budget from 6k to 60k characters per result and from 12k to 120k total, while preserving explicit config overrides. Synced from upstream #86 by @robbyczgw-cla.
  • Bump package, server, User-Agent, lockfile, README, and build metadata to 0.17.0, aligned with Web Search Plus v2.9.1 plus the post-release extract-priority feature.

Attribution / no-port notes

  • Upstream v2.9.1 release PR #88 by @robbyczgw-cla supplied the cache-safety maintenance and release inventory. Hermes-only release tooling/version surfaces remain intentionally outside the MCP package.

[0.16.0] - 2026-07-03

Synced from Web Search Plus v2.9.0

  • Port registry-aligned provider dispatch updates from upstream PR #79 where applicable to MCP.
  • Add Serper webpage scraper extraction support and include Serper in MCP extraction provider schema/fallback order (upstream PR #80).
  • Add Serper news/search_type and configurable locale defaults/query-aware locale resolution to the MCP search surface (upstream PR #80/#81).
  • Bump MCP package/server/User-Agent surfaces to v0.16.0 and align upstream Web Search Plus User-Agent baseline with v2.9.0 (upstream PR #82).
  • Refresh README/API docs for Serper extraction capability (upstream PR #84).

Attribution / no-port notes

  • Upstream PR #77 golden snapshot recorder is test/eval infrastructure and is credited but not ported wholesale.
  • Upstream PR #83 prepare_release.py is repository-specific release automation; MCP keeps its own version surfaces for now.

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.15.0] - 2026-07-02

Security

  • Sync Web Search Plus v2.8.1 authority-domain matcher hardening from upstream #68: canonical boosts now apply only to exact domains, true subdomains, or explicit label-prefix rules, blocking look-alike domains such as nih.gov.evil.example from inheriting trust.
  • Sync Web Search Plus v2.8.x HTTP provider hardening: corrupted gzip/deflate bodies, non-UTF-8 responses, invalid JSON, read interruptions, socket.timeout, and Retry-After on HTTP 429 are normalized into structured provider errors.

Added

  • Add MCP-specific extract preview/store handling for oversized extraction results. Large content, markdown, text, or raw_content fields are bounded in MCP responses and full text is stored under the local cache with stored_extract metadata.

Fixed

  • Derive DEFAULT_USER_AGENT from the package __version__ so MCP releases cannot drift again; v0.14.0 still advertised ClawdBot-WebSearchPlus-MCP/0.13.0.

Changed

  • Bump package/server version to 0.15.0 and align README/changelog with the Web Search Plus v2.8.1 engine family where applicable.
  • Keep upstream #72 provider bench and #75 Hermes standalone-plugin import fix out of MCP by design: bench is CLI/provider-quota-sensitive and #75 does not apply to a normal installed MCP package.
  • Leave existing MCP time_range search plumbing behavior-preserving; upstream #71 freshness unification is not treated as a breaking schema rewrite in this release.

Tests

  • Add regression coverage for authority look-alike rejection, HTTP hardening and User-Agent version drift, and oversized extract store/preview behavior.

[0.14.0] - 2026-06-30

Security

  • Sync Web Search Plus v2.7.0 private/internal extraction target guard from upstream #61: web_extract now blocks loopback, RFC1918, CGNAT/shared-address ranges, IPv6 ULA/link-local/mapped-private addresses, multicast, cloud metadata hosts, and hostnames resolving to private/internal IPs before provider dispatch. Operator-configured provider endpoints (for example local Firecrawl-compatible backends) remain allowed; trusted intranet extraction requires explicit extract.allow_private_urls: true.

Fixed

  • Sync upstream #63 behavior: provider configuration errors such as missing API keys no longer mark providers unhealthy or place them into cooldown.

Changed

  • Bump package/server version to 0.14.0 and align README/changelog with the Web Search Plus v2.7.0 engine family where applicable.

Notes

  • Upstream #60 by @IlyaGusev added keyless-provider setup wizard and config rewrite preservation to the Hermes plugin. MCP already has its own onboarding/config surface and Keenable keyless semantics from v0.13.0, so no setup-wizard code was ported; attribution is carried forward for the synced release window.
  • Upstream #62 added setup.py fastpath, a public-Hermes diagnostic. That command is Hermes-plugin-specific and not applicable to the standalone MCP package.
  • Upstream #59 README hero/Querit URL cleanup and #64 release-prep changes are credited as release-window context; only MCP-relevant docs/version metadata changed here.

Tests

  • Add extract target safety coverage for private IPv4/IPv6 ranges, CGNAT/Tailscale-style addresses, cloud metadata, DNS rebinding/mixed DNS answers, explicit private-URL escape hatch, and local provider endpoint preservation.
  • Add regression coverage that explicit missing-key search failures do not call provider-health cooldown marking.

[0.13.0] - 2026-06-26

Added

  • Sync Keenable provider support from Web Search Plus v2.6.0: keenable search and extraction via KEENABLE_API_KEY, plus an opt-in keyless public tier that is off by default. Thanks @IlyaGusev for WSP #56.
  • Document GroktoCrawl / local Firecrawl-compatible backend usage through existing Firecrawl api_url and scrape_url overrides, with regression tests for custom endpoints. (#57)

Changed

  • Bump package/server version to 0.13.0 and align README, schemas, provider counts, and User-Agent with the Web Search Plus v2.6.1 engine family.
  • Add Keenable to generated provider metadata, MCP provider enums, auto-routing priority tail, and extraction fallback tail.

Notes

  • Upstream Web Search Plus v2.6.0 also included an in-process Hermes-plugin loader fix (#55 by @maksym-mishchenko). That loader path is not applicable to the standalone MCP server, so no code was ported; it is noted here for release-history completeness.

Tests

  • Add Keenable key/keyless configuration, search, extraction, public-warning, schema, and Firecrawl-compatible endpoint override tests.

[0.12.0] - 2026-06-16

Fixed

  • extract_plus now respects disabled_providers from config.json. Previously only search routing honored the disabled-provider list; extraction used a hardcoded provider order, causing disabled providers to still be called during URL extraction. Explicit provider selection still tries the requested provider first, matching search semantics.

Changed

  • Bump package/server version to 0.12.0 and align metadata/User-Agent with the Web Search Plus v2.5.1 engine family.
  • Update README version note to track v2.5 engine family.

Tests

  • Add tests covering auto-mode extraction skip and explicit-provider fallback behavior when providers are disabled in config.

[0.11.0] - 2026-06-08

Added

  • Sync Web Search Plus v2.4 engine improvements: bounded random retry-backoff jitter (RETRY_JITTER_FRACTION) so concurrent or repeated retries against a recovering provider no longer synchronize into bursts.
  • Guard provider-health read-modify-write with a process lock (_HEALTH_LOCK) so concurrent in-process provider calls (parallel research mode) cannot lose cooldown updates.
  • Research mode now queries its providers concurrently via a thread pool instead of sequentially, so wall-clock cost tracks the slowest provider rather than the sum of all of them. Result ordering stays deterministic (preserved by provider submission order) and the time budget still gates which providers launch and whether extraction runs.

Changed

  • Bump package/server version to 0.11.0 and align metadata/User-Agent with the Web Search Plus v2.4 engine family.

Notes

  • Hermes-plugin-only changes from v2.4.0 (in-process search/extract entry points, ~/.hermes/.env profile loading via env_loader) are intentionally not synced: the MCP package runs search.py as a subprocess and ships its own standalone .env loading and onboarding surface.

[0.10.0] - 2026-05-29

Added

  • Sync Web Search Plus v2.3 provider registry into the MCP package so provider metadata, schemas, defaults, guarded auto-routing, and capability labels share one source of truth.
  • Add provider health/doctor, cache, retry, quality, routing, search, and extraction parity updates from the v2.3 engine family.

Changed

  • Generate MCP provider enums and server metadata from the shared registry instead of hand-maintained static lists.
  • Align provider ordering, auto-routing behavior, and guarded explicit-only providers with Web Search Plus v2.3.
  • Bump package/server version to 0.10.0.

Tests

  • Add/refresh regression coverage for registry-derived schemas, SerpBase/guarded auto-allow behavior, Parallel metadata, HTTP content encoding, and compatibility shims.
  • Release validation includes compileall, Ruff, 44 pytest tests, wheel build, clean-venv install, MCP stdio handshake/list-tools, doctor, no-key error path, and live search/extract smoke tests.

[0.9.0] - 2026-05-19

Added

  • Sync Parallel provider support from Web Search Plus v2.2: explicit parallel search/extract support via PARALLEL_API_KEY.
  • Add Parallel to extraction auto fallback order: Tavily → Exa → Linkup → Parallel → Firecrawl → You.com.

Changed

  • Keep Parallel guarded from automatic routing by default with auto_allow=false; direct provider="parallel" calls still work.
  • Preserve user routing priority order while appending newly introduced default providers during config normalization.

Tests

  • Add regression coverage for Parallel search normalization, extraction normalization, explicit-only routing, MCP schemas, and provider metadata.

[0.8.0] - 2026-05-16

Changed

  • Sync MCP surface with Web Search Plus v2.1: remove the beta web_answer tool and keep the stable MCP surface to web_search + web_extract.
  • Switch extraction auto fallback order to Tavily → Exa → Linkup → Parallel → Firecrawl → You.com based on the v2.1 extraction benchmark.
  • Update package metadata, README, and Glama manifest for the v2.1 engine family.

Migration

  • Remove WSP_ENABLE_WEB_ANSWER; it is ignored because web_answer is no longer exposed. Use web_search for source discovery and synthesize in the MCP host.

[0.7.0] - 2026-05-15

Added

  • Sync Routing v2 from Web Search Plus v2.0.0: class-aware query routing, multilingual/current detection, answer-mode recommendations, and routing_policy diagnostics.
  • Add regression tests for guarded defaults, legacy auto_allow migration, multilingual routing, arXiv/docs/security classes, and answer/synthesis hints.

Changed

  • Update the default auto-routing pool to You.com, Serper, Exa, Firecrawl, Tavily, and Linkup.
  • Keep Brave, SerpBase, Querit, native Perplexity, and Kilo Perplexity explicit-only by default with auto_allow=false.
  • Update MCP presets so starter uses You.com + Serper + Linkup, lean uses You.com + Linkup, and minimal uses You.com.

Migration

  • Existing config files are still valid. Missing auto_allow entries inherit the new guarded defaults while explicit user overrides remain intact.
  • Explicit provider calls still work for guarded providers; auto_allow=false only blocks automatic provider="auto" selection.

[0.6.0] - 2026-05-15

Added

  • Sync SerpBase provider support from Hermes Web Search Plus v1.10.0, including explicit serpbase selection, SERPBASE_API_KEY, and SerpBase result normalization.

Changed

  • Add auto_allow routing gates so SerpBase and Querit stay explicit-only by default while remaining available for direct provider calls.
  • List explicit-only SerpBase and Querit last in general provider docs and MCP schemas.
  • Align MCP package with the Web Search Plus v1.10.x engine family.

Tests

  • Add regression coverage for explicit-only auto-routing gates, direct SerpBase calls, MCP schema ordering, and server auto-allow metadata.

[0.5.1] - 2026-05-14

Fixed

  • Split native perplexity from kilo-perplexity so direct Perplexity uses PERPLEXITY_API_KEY, https://api.perplexity.ai/chat/completions, and sonar-pro.
  • Keep Kilo gateway routing under the distinct kilo-perplexity provider using KILOCODE_API_KEY, https://api.kilo.ai/api/gateway/chat/completions, and perplexity/sonar-pro.
  • Normalize kilo_perplexity to kilo-perplexity without aliasing it to native perplexity.

Migration

  • Existing Kilo gateway users who previously selected perplexity with only KILOCODE_API_KEY should switch explicit provider config to kilo-perplexity or set a native PERPLEXITY_API_KEY.

Docs

  • Add Web Search Plus logo assets used by the README and directory listings.

Tests

  • Add regression coverage for provider defaults, env-key lookup, missing-key errors, aliases, auto-routing preference, cache separation, and MCP server metadata.

Contributors

  • Robby Czesany / robbyczgw-cla

[0.5.0] - 2026-05-09

Added

  • Add persistent routing preference CLI: config show, set-default, set-routing, set-priority, set-fallback, disable/enable, set-threshold, and reset --yes.
  • Add WEB_SEARCH_PLUS_CONFIG and --config-path support for isolated MCP host installs.
  • Add routing preference fields to status --json without exposing provider secrets.

Changed

  • Align MCP package with the Web Search Plus v1.9.x engine family.
  • Make fixed-provider mode strict when auto-routing is disabled: provider="auto" uses only the configured default provider.
  • Validate and quarantine malformed or semantically invalid config files at runtime.

Tests

  • Add coverage for config commands, alias normalization, strict fixed-provider routing, and invalid config quarantine.

[0.4.0] - 2026-05-09

Added

  • Add optional beta web_answer MCP tool for source-backed cited briefs.
  • Gate web_answer behind WSP_ENABLE_WEB_ANSWER=1 so the default tool surface stays stable and small.
  • Add MCP-native onboarding CLI: status, list providers, list presets, and setup.
  • Add setup presets: minimal, lean, starter, and all.
  • Add tests for beta tool gating, answer command mapping, and onboarding dry-run/status behavior.

Changed

  • Bump MCP package to 0.4.0 and align docs with the Web Search Plus v1.8.x engine family.
  • Keep web_search as the recommended default for source discovery, current events, prices, weather, sports lineups, and schedules.
  • Set web_answer freshness default to none to avoid over-triggering recency filters.
  • Update the console entrypoint so web-search-plus-mcp runs the server by default but also supports onboarding subcommands.
  • Prefer Linkup first in extraction provider docs/metadata.

Notes

  • web_answer is intentionally beta. Promote only after real MCP host dogfooding shows the contract is stable.
  • Hermes plugin users know this capability as web_answer_plus; the MCP-native tool name is web_answer.
  • Locale/language expansion and Routing v2 remain out of scope for this release.

[0.2.1] - 2026-05-07

Fixed

  • Fix Brave Search failures when urllib receives gzip-compressed API responses.
  • Add shared compressed-response handling for normal and HTTP error bodies.
  • Add regression coverage for gzip/deflate response decoding.

[0.2.0] - 2026-05-03

Added

  • Sync MCP server with the Web Search Plus v1.7 Python engine
  • Add web_extract MCP tool with Linkup, Firecrawl, Tavily, Exa, and You.com extraction providers
  • Add 10-provider search schema: Serper, Brave, Tavily, Exa, Querit, Linkup, Firecrawl, Perplexity, You.com, SearXNG
  • Expose depth, time_range, domain filters, quality_report, opt-in research mode, and research_time_budget

Changed

  • Update README and package metadata for search + extraction MCP usage

[0.1.2] - 2026-03-14

Fixed

  • Entry point now correctly wraps async main() with asyncio.run() via a run() function
  • Fixes coroutine 'main' was never awaited error when running via uvx, pip install, or Docker
  • Previously only worked when invoked directly as __main__; now works in all environments

[0.1.1] - 2026-03-13

Added

  • Dockerfile for containerized deployment
  • glama.json metadata for Glama MCP directory listing
  • Support for all 7 search providers: Serper, Tavily, Exa, Perplexity, You.com, SearXNG, Querit
  • Intelligent auto-routing based on query intent

Changed

  • Improved README with installation and configuration instructions

[0.1.0] - 2026-03-13

Added

  • Initial release
  • MCP server with web_search tool
  • Auto-routing between Serper (facts/news), Tavily (research), and Exa (discovery)
  • Support for uvx web-search-plus-mcp installation
  • Environment variable configuration for API keys