|
| 1 | +# v22.0.0 Feature Coverage |
| 2 | + |
| 3 | +This document maps each domain coverage axis to the features that address it, ensuring full traceability from axes to implementation. |
| 4 | + |
| 5 | +## Coverage Axes |
| 6 | + |
| 7 | +### 1. web-search |
| 8 | +Multi-provider web search via DuckDuckGo (free), SearXNG (self-hosted), and Bright Data (production). |
| 9 | +- `UltimateSearcher.search()` and `UltimateSearcher.asearch()` |
| 10 | +- `search_web` MCP tool |
| 11 | +- Provider profiles: free, default, free-verified, production, max-evidence |
| 12 | + |
| 13 | +### 2. mcp-integration |
| 14 | +Full MCP server exposure via stdio, with 7 tools (search_web, browse_page, verify_claim, evidence_report, llm_context, list_providers, clear_cache). |
| 15 | +- `zero_api_key_web_search/mcp_server.py` |
| 16 | +- Entry points: `zero-mcp`, `cross-validated-search-mcp`, `free-web-search-mcp` |
| 17 | +- Compatible with Claude Code, Cursor, Codex, Continue, OpenClaw, Hermes, Nanobot |
| 18 | + |
| 19 | +### 3. claim-verification |
| 20 | +Evidence-based claim verification with decomposition, source classification, conflict detection, and page-aware augmentation. |
| 21 | +- `UltimateSearcher.verify_claim()` |
| 22 | +- `verify_claim` MCP tool |
| 23 | +- Multilingual conflict markers (EN, ES, FR, DE, ZH) |
| 24 | +- Verdict logic: supported, likely_supported, contested, likely_false, insufficient_evidence |
| 25 | + |
| 26 | +### 4. evidence-reports |
| 27 | +Combined search + verification with executive summary, stance buckets, source digest, and next steps. |
| 28 | +- `UltimateSearcher.evidence_report()` |
| 29 | +- `evidence_report` MCP tool |
| 30 | +- Baseline comparisons: majority-vote and keyword-count |
| 31 | + |
| 32 | +### 5. llm-context |
| 33 | +Compact Markdown-formatted context optimized for LLM prompts with source quality and freshness badges. |
| 34 | +- `UltimateSearcher.llm_context()` |
| 35 | +- `llm_context` MCP tool |
| 36 | +- Configurable max_sources and include_verification flag |
| 37 | + |
| 38 | +### 6. provider-diversity |
| 39 | +Cross-validation across providers: URLs appearing in multiple providers are flagged and ranked first. |
| 40 | +- `UltimateSearcher` cross-validation logic in `search()` |
| 41 | +- Provider profiles for different diversity levels |
| 42 | +- Circuit breaker per provider with 3-failure threshold and 60s reset |
| 43 | + |
| 44 | +### 7. source-quality |
| 45 | +Domain trust tiers (gov/edu, org, com), official marker detection, snippet richness scoring, and quality text markers. |
| 46 | +- `_estimate_source_quality()` in `core.py` |
| 47 | +- `Source.extra["verification"]` dict with evidence_strength, classification, overlap_ratio |
| 48 | + |
| 49 | +### 8. freshness-scoring |
| 50 | +Time-decay scoring in 30-day buckets, date parsing across multiple formats, freshness contribution to evidence strength. |
| 51 | +- `_estimate_freshness()` in `core.py` |
| 52 | +- `timelimit` parameter for day/week/month/year windows |
| 53 | +- Date normalization across 7+ formats |
| 54 | + |
| 55 | +### 9. response-caching (NEW v22.0.0) |
| 56 | +LRU response cache with 15-minute TTL, 50MB size cap, lazy eviction, and hit/miss/eviction statistics. |
| 57 | +- `zero_api_key_web_search/cache.py` — `ResponseCache` class |
| 58 | +- Cache keys for browse (URL-based) and search (query+params hash) |
| 59 | +- `clear_cache` MCP tool for manual invalidation |
| 60 | +- Cache stats exposed via `list_providers` |
| 61 | +- `from_cache` flag in `browse_page` responses |
| 62 | + |
| 63 | +### 10. markdown-extraction (NEW v22.0.0) |
| 64 | +HTML-to-Markdown conversion preserving headings, lists, code blocks, and link structure. |
| 65 | +- `extract_markdown()` in `browse_page.py` using `markdownify` |
| 66 | +- `format` parameter on `browse_page` MCP tool (`markdown` default, `text` fallback) |
| 67 | +- Both `markdown` and `text` fields always returned for backward compatibility |
| 68 | +- Regex fallback when markdownify is not installed |
| 69 | + |
| 70 | +### 11. redirect-safety (NEW v22.0.0) |
| 71 | +Cross-host redirect blocking to prevent silent redirection to untrusted hosts, with max 10 same-host hops. |
| 72 | +- `_SafeRedirectHandler` in `browse_page.py` |
| 73 | +- `_CrossHostRedirect` exception with original_url, redirect_url, status_code |
| 74 | +- Returns structured redirect result: `{"status": "redirect", "original_url": "...", "redirect_url": "...", "status_code": N}` |
| 75 | +- Allows www prefix variations on same host |
| 76 | + |
| 77 | +### 12. domain-filtering (NEW v22.0.0) |
| 78 | +Configurable domain allowlist and blocklist via environment variables. |
| 79 | +- `ZERO_SEARCH_ALLOW_DOMAINS` — comma-separated allowlist (if set, ONLY these domains) |
| 80 | +- `ZERO_SEARCH_BLOCK_DOMAINS` — comma-separated blocklist |
| 81 | +- Domain check supports subdomain matching (e.g., blocking `example.com` also blocks `sub.example.com`) |
| 82 | +- Returns structured blocked result: `{"status": "blocked", "domain": "...", "reason": "..."}` |
| 83 | + |
| 84 | +### 13. multi-agent-integration (NEW v22.0.0) |
| 85 | +First-class configuration for Hermes Agent, OpenClaw, and Nanobot frameworks. |
| 86 | +- `.hermes/plugins/zero-api-key-web-search/` — Hermes plugin with schema definitions |
| 87 | +- `.hermes/mcp-servers.yaml` — Hermes MCP server config |
| 88 | +- `.openclaw/skills/zero-api-key-web-search/SKILL.md` — OpenClaw skill with YAML frontmatter |
| 89 | +- `.openclaw/openclaw.json` — OpenClaw MCP server config |
| 90 | +- `.nanobot/nanobot.yaml` — Nanobot MCP server config + agent definition |
| 91 | +- `.nanobot/agents/researcher.md` — Nanobot research agent with system prompt |
| 92 | +- All frameworks connect via stdio MCP (`command: "zero-mcp"`) |
| 93 | + |
| 94 | +### 14. pdf-extraction (NEW v22.0.0) |
| 95 | +Optional PDF text extraction via pypdf, with graceful fallback when not installed. |
| 96 | +- Optional dependency: `pip install zero-api-key-web-search[pdf]` |
| 97 | +- `_extract_pdf_text()` in `browse_page.py` |
| 98 | +- Detects `application/pdf` content type |
| 99 | +- Returns install instruction message when pypdf is unavailable |
| 100 | +- Page-by-page extraction with newline separation |
0 commit comments