Argus Web Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Argus Web Mcp (Agent Skill) and scored it 87/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 2 flagged
The text {match} is the classic direct prompt-injection phrasing. Placed in a skill body that the agent reads as trusted instructions, it tries to make the agent abandon its prior rules and follow whatever comes next — a full system-prompt override.
ignore/disregard/forget … previous instructions sentence.The text {match} asks the agent to disclose its hidden system prompt or initial instructions. That is often the first step of a larger attack: knowing the system prompt lets an attacker craft inputs that defeat its constraints by mimicking its own voice.
repeat/reveal/print your system prompt request from the skill.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<div align="center">
<img src="assets/banner.svg" alt="Argus - Self-Hosted Web Intelligence MCP" width="100%" />
<br/>
<a href="https://github.com/jlowin/fastmcp"><img src="https://img.shields.io/badge/MCP-Streamable_HTTP-2dd4bf?style=for-the-badge&logo=anthropic&logoColor=white" alt="MCP"/></a> <img src="https://img.shields.io/badge/tools-20-22c55e?style=for-the-badge" alt="20 tools"/> <img src="https://img.shields.io/badge/tests-1026_passing-3fb950?style=for-the-badge&logo=pytest&logoColor=white" alt="tests"/> <img src="https://img.shields.io/badge/SSRF_coverage-100%25-16a34a?style=for-the-badge&logo=shieldsdotio&logoColor=white" alt="SSRF 100%"/> <img src="https://img.shields.io/badge/python-3.12-3776AB?style=for-the-badge&logo=python&logoColor=white" alt="python"/> <br/> <img src="https://img.shields.io/badge/status-LIVE-22c55e?style=for-the-badge" alt="live"/> <img src="https://img.shields.io/badge/self--hosted-unlimited-0ea5e9?style=for-the-badge" alt="self-hosted"/> <img src="https://img.shields.io/badge/cost-%240%2Frequest-22c55e?style=for-the-badge" alt="zero cost"/> <img src="https://img.shields.io/badge/truncation-none-14b8a6?style=for-the-badge" alt="no truncation"/> <img src="https://img.shields.io/badge/LLM-not_required-8957e5?style=for-the-badge" alt="no LLM needed"/> <img src="https://img.shields.io/badge/owner-SURIOTA-0d9488?style=for-the-badge" alt="SURIOTA"/>
<br/><br/>
<!-- Dynamic repo-stat badges: render once the repo is PUBLIC (shields.io can't read private repos). --> <img src="https://img.shields.io/github/last-commit/GifariKemal/argus-web-mcp?style=flat-square&color=22c55e" alt="last commit"/> <img src="https://img.shields.io/github/languages/top/GifariKemal/argus-web-mcp?style=flat-square&color=2dd4bf" alt="top language"/> <img src="https://img.shields.io/github/languages/count/GifariKemal/argus-web-mcp?style=flat-square&color=14b8a6" alt="languages"/> <img src="https://img.shields.io/github/languages/code-size/GifariKemal/argus-web-mcp?style=flat-square&color=0ea5e9" alt="code size"/> <img src="https://img.shields.io/github/repo-size/GifariKemal/argus-web-mcp?style=flat-square&color=8957e5" alt="repo size"/> <img src="https://img.shields.io/github/commit-activity/m/GifariKemal/argus-web-mcp?style=flat-square&color=d29922" alt="commit activity"/>
<br/><br/>
<img src="https://readme-typing-svg.demolab.com/?font=Fira+Code&weight=600&size=22&pause=900&color=2DD4BF¢er=true&vCenter=true&width=820&lines=The+all-seeing+web+layer+for+Claude+Code+%26+Codex;Replaces+Jina+%2F+Brave+%2F+Firecrawl+%2F+Exa+-+self-hosted;search+%2F+scrape+%2F+read+%2F+research+%2F+unlimited+%2F+owned;Tools%2C+not+a+brain+-+your+agent+does+the+thinking" alt="tagline"/>
</div>
Argus Panoptes - the all-seeing hundred-eyed giant. A self-hosted, unlimited, owned web fetch / scrape / search MCP server for SURIOTA. Mythological sibling to the Hermes AI Server (retired with the old VPS in September 2026). Every Claude Code / Codex CLI connects over remote HTTP -> zero local process on the client.
We surveyed the 12 leading paid/free web tools. All meter requests, truncate content, or cost money. Argus is built on best-in-class OSS, self-hosted on the SURIOTA VPS - so it is unlimited, free per-request, returns full content (no truncation), and is owned end-to-end. It is tools, not a brain: the consuming agent (Claude Code's Opus 4.8 / Codex) does the reasoning - Argus needs no LLM.
| You were paying for... | Argus replaces it with... | Edge |
|---|---|---|
| Brave / Tavily / Exa search | search / smart_search (self-hosted SearXNG) | unlimited, six-engine fan-out measured per host + semantic rerank |
| Jina Reader / Firecrawl scrape | read / scrape / batch_read / crawl | full content, JS render + stealth, no truncation |
| Jina / Firecrawl PDF | read_pdf (pymupdf4llm + Docling) | tables preserved (COT/FOMC) |
| Firecrawl extract / map | extract_structured / map_urls | CSS/XPath, sitemap discovery |
| Exa findSimilar / answer | find_similar / research(deep) | local embeddings, full-content bundle |
| - (no competitor self-hosts) | github_search / scholar_search / trading extractors / watch | structured GitHub / academic / FX moat |
<div align="center"> <img src="assets/architecture.svg" alt="Argus architecture" width="100%" /> </div>
Fetch strategy (cheap -> expensive): httpx static -> trafilatura -> escalate to Crawl4AI/Playwright only when JS/thin -> Patchright stealth on anti-bot -> Wayback archive if the host is unreachable. Every hop is SSRF-guarded.
<details open> <summary><b>Search & discovery</b></summary>
<br/>
| Tool | What it does |
|---|---|
search | Web search via SearXNG - categories (general/news/science/it), domain filters, safesearch, hybrid lexical+semantic rerank, recency boost, per-engine cooldown on throttle. The live fan-out is measured per host, not assumed: bing, brave, google, google cse, duckduckgo web, yandex |
smart_search | Auto-routes a query (deterministic, no LLM) -> github / scholar / news / it / general |
scholar_search | Structured academic search (Semantic Scholar -> CrossRef): citations, DOI, abstract, OA-PDF |
github_search | Structured GitHub repositories/code/issues + stars/language/sort |
map_urls | Discover a site's URLs (sitemap.xml / robots.txt / 1-hop links) |
find_similar | Semantically-related pages via local embeddings (Exa-style, no API) |
</details>
<details> <summary><b>Fetch & read</b></summary>
<br/>
| Tool | What it does |
|---|---|
read | URL -> clean markdown/text/html, no truncation; extract_media adds links+images |
scrape | JS-rendered fetch + screenshot/actions; auto-escalates to Patchright stealth on anti-bot |
batch_read | Parallel read over many URLs, partial-failure tolerant |
read_pdf | PDF -> markdown + tables (pymupdf4llm; mode='quality' -> Docling for scanned/complex) |
crawl | Crawl4AI BFS deep-crawl, robots-respecting, domain-confined |
screenshot | Full-page PNG capture of a rendered URL |
</details>
<details> <summary><b>Extract & research</b></summary>
<br/>
| Tool | What it does |
|---|---|
extract_structured | Pull fields via CSS/XPath selectors (deterministic); optional LLM tier (auto/llm) |
research | One-shot: deep (search -> full-read top-K -> bundle) / quick (hits) / answer (cited, opt-in LLM); highlights=top sentences per source; opt-in max_chars_per_source |
</details>
<details> <summary><b>Monitoring & trading moat</b></summary>
<br/>
| Tool | What it does |
|---|---|
watch / list_watches / unwatch | Poll a page (full or selector) -> POST to a webhook (e.g. Telegram) on change |
forexfactory_calendar | Economic calendar (FairEconomy JSON) -> Aurix calendar_client shape |
cot_report | CFTC Commitments of Traders, structured |
news_sentiment_feed | Ranked news + optional sentiment score |
Trading parsers are validated to >=99% field accuracy (100% on golden files).
</details>
err(code, msg, detail) instead of crashing into the client.CF-Connecting-IP; /metrics stays host-only; secrets live in the Easypanel service env, never in the repo.Argus plus its SearXNG backend and a WARP egress proxy in one stack. Container up = MCP up, container down = MCP down (WARP is optional: Argus goes direct when it is down).
docker compose -f docker-compose.yml -f docker-compose.local.yml up -d --build
# MCP live at http://127.0.0.1:8090/mcp
docker compose down # MCP gone
claude mcp add --transport http argus-local http://127.0.0.1:8090/mcpLoopback-only, no auth token needed (nothing is exposed off-host). Cache lives in the argus-data volume (since 0.4.21; the container runs as uid 10001).
uv venv --python 3.12 && uv pip install -e ".[dev]"
crawl4ai-setup && crawl4ai-doctor # one-time Chromium
# optional extras: ".[semantic]" (find_similar/rerank), ".[pdf-quality]" (Docling)
# SearXNG (search backend) - loopback only
docker compose -f docker-compose.yml -f docker-compose.local.yml up -d searxng
python -m argus.server # stdio (local dev)
# or HTTP: uvicorn argus.server:app --host 127.0.0.1 --port 8090[!TIP] Argus runs fully without an LLM. Leave ARGUS_ENABLE_LLM unset - the consuming agent (Claude Code / Codex) does the synthesis from Argus's full-content bundles.Register with Claude Code:
claude mcp add --transport http argus https://argus.gifariksuryo.xyz/mcp \
--header "Authorization: Bearer ${ARGUS_TOKEN}"Register with Codex (~/.codex/config.toml):
[mcp_servers.argus]
url = "https://argus.gifariksuryo.xyz/mcp"
bearer_token_env_var = "ARGUS_TOKEN"Head-to-head vs Claude Code & Codex native web tools (4-way, n=25, identical queries): discovery parity, but Argus wins decisively on content depth (full content per query vs hits/summaries), freshness, and cost/ownership. In-process research() runs in 3-6s - Argus is not the latency bottleneck (CLI latency is the consuming agent + MCP transport). Claude+Argus stays token-neutral with the deepest synthesis; Codex+Argus trades +72% tokens for that depth. Semantic rerank quantified at +27% nDCG on conceptual queries. Full report: benchmark/reports/RESULTS.md (harness).
| Path | What |
|---|---|
src/argus/ | the package - server.py (20 tools), fetch/, extract/, security/ssrf.py, trading/, semantic.py, cache.py, watch.py |
docs/ | DESIGN / RESEARCH / ROADMAP / TOOL-SPECS / REFERENCES / COMPETITIVE-GAP |
benchmark/ | harness + RESULTS + head-to-head |
deploy/ | Easypanel + Cloudflare runbook (README) / SECURITY-AUDIT / searxng/ settings / systemd + nginx + provision.sh + fail2ban (retired, kept as the panel-less path) |
| root docs | SOUL (identity) / AGENTS (agent guide) / CHANGELOG (history) |
DEPLOYED LIVE. Public HTTPS at https://argus.gifariksuryo.xyz/mcp (bearer auth) on the SURIOTA VPS (<VPS_IP>, Ubuntu 24.04), running as an Easypanel Compose service built from this repo's docker-compose.yml: the argus container serves uvicorn on :8090, the searxng one answers it over the compose network, and the warp one (Cloudflare WARP, compose network only) carries fetches of hosts that block the VPS IP (ARGUS_EGRESS_PROXY_HOSTS: Wayback, Reuters, WSJ, FXStreet), with Easypanel's Traefik terminating Let's Encrypt TLS on :80/:443. The domain is Cloudflare-proxied and Traefik answers the public router only for Cloudflare ranges, so the origin cannot be reached around the edge. /health is public, /metrics host-only. A GitHub push webhook redeploys main.
20 tools / 1026 offline tests (+ browser, slow, and network extras) green / SSRF 100% (line + branch) / ruff clean / security-audited (no Critical/High). Optional and off by default: the LLM tier (ARGUS_ENABLE_LLM) and local-path PDF (ARGUS_ALLOW_LOCAL_PDF). No owner input is open: the Semantic Scholar key (ARGUS_S2_API_KEY) has been set since 2026-09-19. See docs/02-ROADMAP.md.
<div align="center"> <sub>Built for <b>PT Surya Inovasi Prioritas (SURIOTA)</b> / self-hosted / unlimited / owned</sub> </div>
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.