docs: nest 19 files into audit/ clients/ infrastructure/ monitoring/ projects/ super-search/

This commit is contained in:
root
2026-08-08 13:04:55 -04:00
parent 11a1110b81
commit a522d11c35
20 changed files with 927 additions and 0 deletions
@@ -0,0 +1,55 @@
# OSINT Person MCP -- Super Search Integration
**Created:** 2026-08-08
**Service:** OSINT Person MCP (Core, port 8902)
**Integration:** Super Search MCP (Core, port 8899)
---
## Overview
The OSINT Person MCP now integrates with Super Search via a dedicated client module. This mirrors the IntelSight pattern: an MCP server that calls Super Search tools through the local MCP endpoint at `http://127.0.0.1:8899/mcp`.
## Architecture
```
OSINT Person MCP (port 8902)
-> super_search.py (MCP client module)
-> http://127.0.0.1:8899/mcp (Super Search MCP endpoint)
-> Super Search tools (web_search, web_extract, etc.)
```
## Files
| File | Purpose |
|------|---------|
| `/root/docker/osint-person-mcp/super_search.py` | MCP client module (5.6K) |
| `/root/docker/osint-person-mcp/server.py` | Main OSINT Person server |
| `/root/docker/super-search/server.py` | Super Search MCP (referenced as dependency) |
## Client Module (super_search.py)
The module provides MCP client wrappers for Super Search tools:
- Call Super Search via `http://127.0.0.1:8899/mcp`
- Tool passthrough: any Super Search tool is available to OSINT Person
- Pattern mirrors IntelSight's `intelsight_api.py`
## Clients
| Client | Role |
|--------|------|
| `hermes` | Hermes Agent skip tracing tasks |
| `dre-osint` | DRE background research |
## Service Status
```
systemctl is-active osint-person-mcp -> active
ss -tlnp | grep 8902 -> 127.0.0.1:8902
```
## Related
- Super Search v2.4.0: `/root/projects/itpp-infrastructure/docs/super-search-v2.4.0-client-tracking.md`
- IntelSight API: Core :8099
- DRE MCP: Core :8900
@@ -0,0 +1,64 @@
# Super Search — Cloudflare Bypass
**Added:** July 21, 2026
**Version:** 2.1.0
## Extraction Chain
| Tier | Provider | What it handles | Fallback Trigger |
|---|---|---|---|
| 1 | Trafilatura | Normal sites | Error OR CF challenge detected |
| 2 | Browserless Chrome | CF-protected sites | Chrome render + Trafilatura |
| 3 | Firecrawl | Everything else | API-based extraction |
## CF Detection
Nine detection markers for caught challenge pages (from Hound's code + additional):
- cf-turnstile, challenges.cloudflare.com/turnstile
- cf_chl_opt, __cf_chl
- cf-browser-verification, challenge-platform, cf-mitigated
- "Checking your browser", "Just a moment"
## Infrastructure
- Browserless Chrome on app1 (152.53.36.131), port 3005
- Caddy proxy: app1:3006 → localhost:3005
- Firewall: only Core (152.53.192.33) can reach port 3006
- Super Search: `/root/docker/super-search/server.py`
## Verify
```bash
# Test CF bypass
cd /root/docker/super-search && source venv/bin/activate
python3 -c "
from server import _extract_one
import asyncio
r = asyncio.run(_extract_one('https://nowsecure.nl'))
print(r['provider']) # Should be 'trafilatura' or 'browserless'
"
```
---
## v2.1 Features (Added July 21, 2026)
### 13 Tools
| # | Tool | Description |
|---|---|---|
| 1-10 | Original 10 | Search, extract, lookup, suggest, images |
| 11 | `web_search_fast` | Parallel racing: all providers fire simultaneously |
| 12 | `screenshot` | Browserless Chrome → base64 PNG |
| 13 | `circuit_status` | Provider health states (closed/open/half-open) |
### Circuit Breaker
- 8 provider circuits: 3 failures → open for 60s
- Prevents hammering dead providers
- Auto-recovers when provider comes back
### Parallel Racing
- `web_search_fast`: SearXNG ∥ Exa ∥ DuckDuckGo ∥ Wikipedia
- First successful result wins — others cancelled
- Typically 2-3x faster than sequential fallback
### Screenshot
- Browserless Chrome on port 3006 (Caddy HTTP proxy)
- Full-page or viewport capture
- Base64-encoded PNG in JSON response
@@ -0,0 +1,336 @@
# Super Search MCP Enhancement Execution Plan
**Created:** 2026-08-07
**Source:** Super Search Enhancement Scanner (cron, Aug 7 2026)
**Status:** OPEN
---
## Overview
16 actionable enhancements identified for Super Search MCP (http://127.0.0.1:8899). Current stack: FastMCP 2.x, SearXNG Docker, Exa API, Firecrawl API, Trafilatura, DuckDuckGo fallback.
---
## HIGH Priority (Execute First -- Weeks 1-2)
### 1. Upgrade FastMCP 2.x -> 3.x
**Why:** Provider architecture, component versioning, OpenTelemetry, tool timeouts, concurrent execution. Current 2.x is aging out.
**Steps:**
- [ ] Pin current FastMCP version to freeze baseline
- [ ] Review breaking changes in FastMCP 3.x changelog (v3.0 Feb 2026 -> v3.3.0 May 2026)
- [ ] Upgrade in venv: `pip install --upgrade fastmcp`
- [ ] Test all 14 Super Search tools individually
- [ ] Test fallback chain behavior (SearXNG -> Exa -> DDG -> Firecrawl)
- [ ] Verify health_check and circuit_status still work
- [ ] Deploy and monitor for 48h
**Risk:** Medium -- API surface is largely compatible but component versioning may affect tool registration
**Effort:** 3-4 hours
**Dependencies:** None
---
### 2. Add Brave Search API to Fallback Chain
**Why:** Independent 40B+ page index (no Google/Bing dependency). $5/1K queries. LLM Context endpoint returns pre-formatted results for AI use.
**Steps:**
- [ ] Sign up for Brave Search API free tier (2,000 queries/month)
- [ ] Store API key in `.env`
- [ ] Add `search_brave(query, limit)` to server.py using Brave Web Search endpoint
- [ ] Insert between SearXNG and DuckDuckGo in fallback chain
- [ ] Add to circuit_status tool
- [ ] Add `web_search_llm_context` tool using Brave's LLM Context endpoint
- [ ] Test with 20 queries and compare result quality vs Exa/SearXNG
**Risk:** Low -- independent API, no shared infra
**Effort:** 2-3 hours
**Dependencies:** Brave API key (free signup)
---
### 3. Fix Exa API Deprecations
**Why:** Exa deprecated `pdf`, `github`, `tweet` categories and replaced `livecrawl` with `maxAgeHours`. `research paper` -> `publication`.
**Steps:**
- [ ] Audit server.py for all Exa category references
- [ ] Replace `category: "research paper"` -> `category: "publication"` in `web_search_academic`
- [ ] Remove `pdf`, `github`, `tweet` from category mapping logic
- [ ] Replace `livecrawl` -> `maxAgeHours` in `web_extract` Exa path
- [ ] Test academic search with new `publication` category (350M papers)
- [ ] Test extraction with `maxAgeHours` parameter
**Risk:** Low -- straightforward replacements, Exa docs are clear
**Effort:** 1 hour
**Dependencies:** None
---
### 4. Add Crawl4AI as Self-Hosted Extraction Backend
**Why:** Free, no rate limits, stealth mode (undetected browser), JS rendering, parallel crawling. 77K GitHub stars. Handles bot-protected pages that Trafilatura and Firecrawl can't reach.
**Steps:**
- [ ] Install Crawl4AI: `pip install crawl4ai`
- [ ] Add `web_extract_stealth(url)` tool -- uses Playwright stealth mode for JS-heavy/bot-protected pages
- [ ] Add `web_extract_bulk(urls)` tool -- parallel extraction for batch jobs
- [ ] Wire into fallback chain: Trafilatura -> Firecrawl -> Crawl4AI
- [ ] Test on known-bot-protected URLs (VRBO, Expedia, etc.)
- [ ] Document Playwright dependency (may need `playwright install chromium`)
**Risk:** Medium -- adds Chromium/Playwright dependency (~300MB), may increase RAM usage
**Effort:** 3-4 hours
**Dependencies:** `pip install crawl4ai playwright`, `playwright install chromium`
---
## MEDIUM Priority (Plan Next -- Weeks 3-4)
### 5. Migrate SSE -> Streamable HTTP Transport
**Why:** MCP spec (2026-07-28) deprecated SSE. Streamable HTTP works with standard CORS, auth, and load balancers.
**Steps:**
- [ ] Verify FastMCP 3.x supports Streamable HTTP natively (it does)
- [ ] Update server.py transport configuration
- [ ] Test with Hermes Agent as MCP client
- [ ] Verify Caddy reverse proxy still works
- [ ] Update any client configurations pointing to SSE endpoint
**Risk:** Medium -- transport change affects all MCP clients
**Effort:** 2 hours
**Dependencies:** **FastMCP 3.x upgrade (Item #1)**
---
### 6. Add `web_extract_document` Tool
**Why:** Currently Super Search only handles URLs. Firecrawl `/parse` handles PDFs, Word docs, spreadsheets up to 50MB -> clean markdown.
**Steps:**
- [ ] Add `web_extract_document(file_url)` tool wrapping Firecrawl `/parse`
- [ ] Support PDF, DOCX, XLSX, PPTX formats
- [ ] Return clean markdown with structured data where available
- [ ] Add file size validation (max 50MB)
- [ ] Test with sample PDF, Word doc, and spreadsheet
**Risk:** Low -- wraps existing Firecrawl endpoint
**Effort:** 1-2 hours
**Dependencies:** None
---
### 7. Add Firecrawl Lockdown Mode
**Why:** Zero-outbound-request extraction from Firecrawl cache. Critical for sensitive/sandboxed use cases.
**Steps:**
- [ ] Add `lockdown: true` parameter to `web_extract` when using Firecrawl
- [ ] Document that Lockdown Mode means no live outbound requests
- [ ] Test that Lockdown Mode returns only cached/indexed content
**Risk:** Low -- feature flag on existing Firecrawl API
**Effort:** 30 minutes
**Dependencies:** None
---
### 8. Add Exa Agent as `web_research_deep` Tool
**Why:** Multi-step agentic research for complex queries. Exa Agent does recursive search + extraction + synthesis.
**Steps:**
- [ ] Review Exa Agent API docs and pricing ($0.10/ACU + $0.005/search)
- [ ] Add `web_research_deep(query, effort="medium")` tool
- [ ] Support `outputSchema` for structured outputs
- [ ] Add cost estimation before execution (warn if >$0.50 estimated)
- [ ] Test with complex multi-step research query
**Risk:** Medium -- cost per query is higher, needs rate limiting
**Effort:** 2-3 hours
**Dependencies:** None
---
### 9. Add Result Deduplication Across Providers
**Why:** When multiple backends return the same URL, we serve duplicate results. Simple URL normalization + content hash dedup.
**Steps:**
- [ ] Implement URL normalization (strip tracking params, trailing slashes, www prefix)
- [ ] When merging results from multiple providers, hash URLs and deduplicate
- [ ] Keep the best snippet/metadata per unique URL (prefer richer provider)
- [ ] Add `dedup_summary` to response metadata (count of duplicates removed)
- [ ] Test with queries that hit multiple providers
**Risk:** Low -- purely additive, no breaking changes
**Effort:** 2 hours
**Dependencies:** None
---
### 10. Evaluate 4get-hijacked for SearXNG
**Why:** Community project that proxies ~30 search engines into SearXNG-compatible format. Sidesteps broken major engine scrapers.
**Steps:**
- [ ] Clone and review `cra88y/4get-hijacked` repo
- [ ] Test integration with our SearXNG Docker instance
- [ ] Benchmark result quality vs current engine pool
- [ ] Decide: add to search engine list or pass
**Risk:** Low -- evaluation only, no commitment
**Effort:** 1-2 hours
**Dependencies:** None
---
### 11. Add Tavily as `web_search_ai` Tool
**Why:** Purpose-built AI search with relevance scores. Not for general fallback chain (higher cost/latency) but excellent for AI-optimized results.
**Steps:**
- [ ] Sign up for Tavily free tier (1,000 queries/month)
- [ ] Add `web_search_ai(query, depth="advanced")` as standalone tool
- [ ] Return relevance-scored results with confidence markers
- [ ] Do NOT add to fallback chain (keep as separate tool for explicit use)
- [ ] Test against SearXNG/Exa for quality comparison
**Risk:** Low -- standalone tool, no chain impact
**Effort:** 1.5 hours
**Dependencies:** Tavily API key (free signup)
---
## LOW Priority (Nice to Have -- Weeks 5+)
### 12. Add Exa Monitors Integration
**Why:** Scheduled searches with webhook delivery, deduplicated against previous runs.
**Steps:**
- [ ] Review Exa Monitors API
- [ ] Add `web_monitor(query, schedule, webhook_url)` tool
- [ ] Could replace or augment custom monitoring scripts
**Effort:** 2 hours
**Dependencies:** Webhook endpoint for delivery
---
### 13. Add Brave Goggles for Custom Reranking
**Why:** Only search API that lets you boost/promote specific domains at query time.
**Steps:**
- [ ] Create Goggles config for IT Pro Partner preferred domains
- [ ] Add `goggles` parameter to Brave search calls
- [ ] Test domain boosting effectiveness
**Effort:** 1 hour
**Dependencies:** Brave Search API (Item #2)
---
### 14. Add LLM Metadata Enrichment
**Why:** Generate one-line semantic descriptions of extracted pages for better downstream RAG retrieval.
**Steps:**
- [ ] Add `enrich_metadata: true` option to web_extract
- [ ] Use cheap local model or Firecrawl's built-in summarization
- [ ] Tag results with semantic descriptions
- [ ] Benchmark retrieval improvement
**Effort:** 3-4 hours
**Dependencies:** None (can use Firecrawl's question format or local model)
---
### 15. Evaluate Kagi Search API
**Why:** Premium search quality. Worth a trial key for comparison benchmarking.
**Steps:**
- [ ] Sign up for Kagi trial
- [ ] Run 50 side-by-side comparisons: Kagi vs Exa vs Brave vs SearXNG
- [ ] Score relevance, freshness, and coverage
- [ ] Decide: add to chain or pass
**Effort:** 2 hours
**Dependencies:** Kagi API trial key
---
### 16. Add OpenTelemetry Tracing
**Why:** FastMCP 3.x has native OTEL -- spans for every search call, fallback path taken, extraction step.
**Steps:**
- [ ] Install OpenTelemetry packages
- [ ] Run with `opentelemetry-instrument fastmcp run server.py`
- [ ] Configure export to local collector or file
- [ ] Analyze fallback chain behavior
**Effort:** 1 hour
**Dependencies:** FastMCP 3.x upgrade (Item #1)
---
## Execution Order (Dependency-Aware)
```
Phase 1 (Week 1):
Day 1: Items #1 (FastMCP 3.0) + #3 (Exa deprecations) -- can run in parallel
Day 2: Item #2 (Brave Search API) -- independent
Day 3: Item #4 (Crawl4AI) -- independent, longest install
Day 4: Testing + burn-in of Phase 1 changes
Phase 2 (Week 2):
Item #5 (SSE -> Streamable HTTP) -- depends on #1
Items #6 + #7 (extract_document + Lockdown Mode) -- parallel, both Firecrawl
Item #9 (result dedup) -- independent
Phase 3 (Week 3):
Items #8 (Exa Agent) + #11 (Tavily) -- parallel, both new API integrations
Item #10 (4get-hijacked eval) -- independent
Phase 4 (Week 4+):
Items #12-#16 -- low priority, pick up as time allows
```
---
## Risk Register
| Risk | Likelihood | Impact | Mitigation |
|------|-----------|--------|------------|
| FastMCP 3.x breaking API changes | Medium | High | Pin 2.x, test exhaustively before deploy |
| Crawl4AI RAM usage with Chromium | Medium | Medium | Monitor RAM, consider Docker isolation |
| Exa Agent cost overruns | Low | Medium | Per-query cost estimate cap |
| Brave API rate limits | Low | Low | Free tier sufficient for testing |
| Streamable HTTP transport issues | Low | High | Test with Hermes Agent before cutting over |
---
## Success Metrics
- All 14 existing tools continue working post-upgrade
- Brave API adds independent fallback source (no Google/Bing dependency)
- Crawl4AI handles 3+ known-bot-protected sites that previously failed
- Result dedup eliminates >=80% of cross-provider duplicates
- Zero regressions in Hermes Agent's use of Super Search tools
---
## Reference
- Super Search server: `/root/docker/super-search/server.py`
- Systemd service: `super-search.service`
- Venv: `/root/docker/super-search/venv/`
- Health endpoint: `http://127.0.0.1:8899/health`
- Full audit: Aug 1, 2026 -- zero breaking patterns for FastMCP 4.0
@@ -0,0 +1,76 @@
# Super Search v2.4.0 -- Client-ID Metrics Tracking
**Created:** 2026-08-08
**Service:** Super Search MCP (Core, port 8899)
**Feature:** Client-ID tracking via Prometheus metrics + Grafana dashboard
---
## Overview
Super Search v2.4.0 adds per-client usage tracking. A Starlette middleware intercepts the `X-Client-Id` header on every MCP call and increments Prometheus counters per client and per tool. Metrics are exposed at `:8899/metrics` and scraped by Prometheus every 30s. A Grafana dashboard visualizes usage.
## Architecture
```
Client (hermes/intelsight/dre-osint/verdicttank)
-> X-Client-Id header
-> Super Search Middleware (intercepts, increments Prometheus counter)
-> MCP tool handler
-> :8899/metrics (Prometheus endpoint)
-> Prometheus (Docker, scrapes 172.17.0.1:8899/metrics every 30s)
-> Grafana (Dashboard: "Super Search - Client Tracking" at /d/ffuktvmgcpkhse)
```
## Clients Tracked
| Client | Purpose |
|--------|---------|
| `hermes` | Hermes Agent's own Super Search usage |
| `intelsight` | IntelSight product backend |
| `dre-osint` | Debt Recovery Experts skip tracing |
| `verdicttank` | VerdictTank research |
Fallback: calls without `X-Client-Id` header are logged as `anonymous`.
## Key Changes
### Super Search (server.py)
- Middleware added: intercepts `X-Client-Id` header on `/mcp` POST
- Prometheus counters: `ss_tool_calls_total{client, tool}`, `ss_tool_duration_seconds{client, tool}`
- `/metrics` endpoint exposed on port 8899
### Prometheus (prometheus.yml)
- Job: `super-search`
- Target: `172.17.0.1:8899` (Docker bridge to host)
- Scrape interval: 30s
- Config: `/root/docker/monitoring/prometheus/prometheus.yml`
### Grafana
- Dashboard UID: `ffuktvmgcpkhse`
- Title: "Super Search - Client Tracking"
- Access: `https://core:3002/d/ffuktvmgcpkhse`
- Panels: tool calls per client, duration distribution, top tools
### Firewall (UFW)
- Rule: allow 172.17.0.0/16 to port 8899/tcp
- Reason: Prometheus Docker container needs host access
### Super Search Binding
- Changed from `127.0.0.1:8899` to `0.0.0.0:8899`
- Required because Docker containers (Prometheus) cannot reach 127.0.0.1 on the host
## Verification
```
ss -tlnp | grep 8899 -> 0.0.0.0:8899 (bound to all interfaces)
curl -s 172.17.0.1:8899/metrics | grep ss_tool -> counters present
ufw status | grep 8899 -> ALLOW 172.17.0.0/16
```
## Related Docs
- Super Search Enhancement Plan: `/root/projects/itpp-infrastructure/docs/super-search-enhancement-plan.md`
- Server: `/root/docker/super-search/server.py`
- Systemd: `super-search.service`
- Prometheus config: `/root/docker/monitoring/prometheus/prometheus.yml`