|
| 1 | +# Fortress MCP — a stealth browser for AI agents |
| 2 | + |
| 3 | +> **Beta** · 26 tools · runs **local & free** · **hosted cloud coming soon** |
| 4 | +
|
| 5 | +An [MCP](https://modelcontextprotocol.io) server that gives any AI agent the **Fortress |
| 6 | +stealth engine** the moment it gets blocked. When a fetch hits Cloudflare, DataDome, |
| 7 | +PerimeterX, a 403, or a CAPTCHA, the agent calls these tools and gets the page — driving a |
| 8 | +real, recompiled Chromium on your own machine and IP. |
| 9 | + |
| 10 | +<p align="center"><img src="demo.gif" alt="Same site, same prompt: a vanilla browser is blocked by PerimeterX while an agent with the Fortress MCP returns clean JSON" width="760"/></p> |
| 11 | + |
| 12 | +<sub><i>Real, dated run against <b>stockx.com</b> (PerimeterX). A stock browser gets <b>HTTP 403 — “Access denied”</b>; an agent with the Fortress MCP returns clean JSON. Reproduce with the demo scripts in the framework repo.</i></sub> |
| 13 | + |
| 14 | +## Install |
| 15 | + |
| 16 | +```bash |
| 17 | +pip install "tilion[mcp]" # pulls the Fortress engine (tilion-fortress) automatically |
| 18 | +tilion-mcp # or: python -m tilion.mcp (stdio transport) |
| 19 | +``` |
| 20 | + |
| 21 | +The MCP server is a thin, open wrapper (BSD-3) over the `tilion` framework, which drives the |
| 22 | +Fortress engine. The stealth Chromium downloads on first run and is cached locally. |
| 23 | + |
| 24 | +## Add to your client |
| 25 | + |
| 26 | +**Claude Desktop / Cursor** — add to the MCP config: |
| 27 | + |
| 28 | +```json |
| 29 | +{ "mcpServers": { "fortress": { "command": "tilion-mcp" } } } |
| 30 | +``` |
| 31 | + |
| 32 | +**Cline / Windsurf** (VS Code settings → MCP servers): |
| 33 | +```json |
| 34 | +{ "fortress": { "command": "tilion-mcp" } } |
| 35 | +``` |
| 36 | + |
| 37 | +If `tilion-mcp` isn't on PATH, use `"command": "python", "args": ["-m", "tilion.mcp"]`. |
| 38 | + |
| 39 | +## The 26 tools |
| 40 | + |
| 41 | +| Tool | What the agent uses it for | |
| 42 | +|---|---| |
| 43 | +| `fetch_protected_page` | get a page behind Cloudflare / DataDome / 403 / CAPTCHA | |
| 44 | +| `read_page` | clean reader-mode **markdown of any page** (+ tables) | |
| 45 | +| `extract_page` | markdown + tables + metadata (or a schema-shaped record) | |
| 46 | +| `extract_document` | extract a PDF/DOCX/XLSX/CSV/HTML file (path or URL) → markdown | |
| 47 | +| `page_elements` | the page's buttons / links / fields / headings | |
| 48 | +| `click_button` · `fill_field` · `press_key` | drive a form by visible text / selector / key | |
| 49 | +| `current_page` · `get_page_html` · `evaluate_js` · `wait_for` | inspect / script / wait on the working page | |
| 50 | +| `crawl_site` | crawl a whole site (auto-handles SPA/JS) → pages + sitemap | |
| 51 | +| `recon_site_apis` | reverse-engineer a site's private XHR/JSON API (secret-scrubbed) | |
| 52 | +| `run_browser_task` · `list_browser_tasks` | 20 multi-step flows: login, paginate, infinite-scroll, checkout… | |
| 53 | +| `search_web` | web search through the stealth browser (no SERP API) | |
| 54 | +| `screenshot_page` · `save_page` · `download_file` | capture PNG / export pdf·html·text / download a file | |
| 55 | +| `get_cookies` · `save_profile` · `load_profile` | read cookies · persist/restore an authenticated session | |
| 56 | +| `list_tabs` · `close_tab` | manage open tabs | |
| 57 | +| `get_stealth_cdp_endpoint` | a CDP url to point your OWN browser-use / Playwright / Puppeteer at | |
| 58 | + |
| 59 | +Tools are **annotated** (`readOnlyHint` / `destructiveHint`) so clients auto-approve reads |
| 60 | +and gate writes. Every tool is **timeout- and SSRF-guarded**, caps its output, and returns a |
| 61 | +structured error instead of hanging. The browser is **pre-warmed at startup**, so the first |
| 62 | +call is ~100 ms. |
| 63 | + |
| 64 | +## Why reach for it — benchmarks |
| 65 | + |
| 66 | +Real head-to-head — an agent with only its built-in web fetch vs. the same task through the |
| 67 | +Fortress MCP: |
| 68 | + |
| 69 | +| Task | Built-in web fetch | **Fortress MCP** | |
| 70 | +|------|--------------------|------------------| |
| 71 | +| Reddit r/programming titles | ✗ 0 items | **✓ 26 titles** | |
| 72 | +| JS-rendered page (quotes) | ✗ 0 quotes | **✓ 10 quotes** | |
| 73 | +| Wikipedia article | ✗ 403 to bots | **✓ 52 k markdown** | |
| 74 | +| Hacker News top stories | ✓ 30 · 24 s | **✓ 30 · 2 s** (~12× faster) | |
| 75 | + |
| 76 | +Fingerprint suites: **Sannysoft all-green · CreepJS 0% headless · BrowserScan “Normal.”** |
| 77 | + |
| 78 | +## Configuration (env) |
| 79 | + |
| 80 | +| Env var | Default | Effect | |
| 81 | +|---|---|---| |
| 82 | +| `TILION_MCP_PREWARM` | `1` | boot the browser at startup; `0` = lazy | |
| 83 | +| `TILION_MCP_HEADLESS` | `1` | `0` to show a visible window | |
| 84 | +| `TILION_ALLOW_PRIVATE_EGRESS` | `0` | `1` to allow localhost / private IPs (SSRF guard off) | |
| 85 | +| `TILION_MCP_TOOL_TIMEOUT` | `120` | per-tool wall-clock cap (seconds) | |
| 86 | +| `TILION_BASE_URL` / `TILION_API_KEY` | — | hosted mode (**coming soon**) | |
| 87 | + |
| 88 | +## How it works |
| 89 | + |
| 90 | +`tilion-mcp` → the `tilion` framework (local mode) → attaches over CDP to the Fortress |
| 91 | +engine. Stealth is applied **natively in the C++ engine**, so there's no detectable JS |
| 92 | +injection. One warm browser backs every tool for the server's lifetime. |
| 93 | + |
| 94 | +Registry manifests: [`server.json`](server.json) (MCP registry) · [`smithery.yaml`](smithery.yaml) (Smithery). |
| 95 | +Agent skill: [`skill/SKILL.md`](skill/SKILL.md). |
| 96 | + |
| 97 | +## License |
| 98 | + |
| 99 | +BSD-3-Clause (the MCP server and framework funnel). The engine binary ships via |
| 100 | +`tilion-fortress`. Hosted cloud with residential egress is coming soon. |
0 commit comments