Install
$ agentstack add mcp-skuzu7-csa-obsidian β scanned Β· β verified β works with Claude Code, Cursor, and more.
Security review
β PassedNo issues found. Passed automated security review. Β· v0.1.0 How review works β
- β Prompt-injection patterns
- β Secret / credential exfiltration
- β Dangerous shell & filesystem operations
- β Untrusted network calls
- β Known-malicious package signatures
What it can access
- β Network access No
- β Filesystem access No
- β Shell / process execution No
- β Environment & secrets Used
- β Dynamic code execution No
From automated source analysis of v0.1.0. βUsedβ means the capability is present in the source β more access means more to trust, not that itβs unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README β it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming β see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps β measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work βAbout
π¦ automation-stealth
Undetectable browser automation that an LLM can actually drive.
Camoufox-powered stealth + a full MCP server = give Claude (or any LLM) real hands on a real browser, with human-like behavior that sails past bot detection.
[](https://www.python.org/) [](LICENSE) [](https://github.com/daijro/camoufox) [](https://modelcontextprotocol.io/) [](#-tests) [](CONTRIBUTING.md)
β‘ Why this exists
Most automation gets flagged the second it loads: navigator.webdriver, canvas hashes, robotic mouse paths, instant typing. automation-stealth fixes all of that and wraps it in a Model Context Protocol server, so an LLM can navigate, click, type, and scrape β behaving like a human the whole way.
> Real demo: we pointed Claude at this framework and told it to take the Anthropic Academy "Claude 101" certification quiz on a live, login-gated site. It navigated there, read each question, and scored 10/10 (100%) β driving a real browser end-to-end, undetected. π
β¨ Features
- π΅οΈ True stealth β Camoufox (hardened Firefox) spoofs canvas, WebGL, fonts, and
navigatorproperties; removes automation flags; blocks WebRTC IP leaks. - π§ LLM-native β a 17-tool MCP server turns any MCP client (Claude Code, Claude Desktop, β¦) into a browser operator. Snapshots return indexed, clickable elements an LLM can reason about.
- π€ Human behavior β Gaussian typing cadence, multi-step scroll inertia, and interpolated mouse drags with jitter β no teleporting cursors.
- πͺ Sessions that persist β save/restore cookies +
localStorage, persistent profiles, optional Chrome cookie import via CDP (bypasses v20 app-bound encryption). - π§° Three ways in β a
stealth-browserCLI, the MCP server, or a clean async Python API. - π Proxy & locale aware β authenticated proxies, OS/locale spoofing, configurable window size.
π Quickstart
git clone https://github.com/skuzu7/CSA-Obsidian
cd CSA-Obsidian
python -m venv .venv
.venv\Scripts\activate # Windows
# source .venv/bin/activate # Linux / macOS
pip install -e .
import asyncio
from stealth_browser.browser import BrowserManager
from stealth_browser.config import BrowserConfig
from stealth_browser.snapshot import take_snapshot
async def main():
async with BrowserManager(BrowserConfig(headless=True)) as bm:
page = await bm.get_page()
await page.goto("https://example.com")
snap = await take_snapshot(page)
print(snap.to_llm_text()) # title, URL, indexed interactive elements, markdown
asyncio.run(main())
π€ Plug it into Claude
Start the MCP server (stdio transport, works with any MCP client):
stealth-browser-mcp
Register it in Claude Code:
claude mcp add stealth-browser -- stealth-browser-mcp
β¦then just ask Claude to "open example.com and click the first link." It gets a snapshot, picks a ref, and acts.
The 17 MCP tools
| Tool | What it does | |---|---| | browser_open | Navigate to a URL β snapshot of interactive elements | | browser_snapshot | Snapshot current page (elements + markdown, optional screenshot) | | browser_screenshot | Full-page screenshot as base64 PNG | | browser_navigate_back | Go back β snapshot | | browser_refresh | Reload β fresh snapshot | | browser_click | Click element by ref (human-like) | | browser_type | Type into element by ref, human cadence | | browser_select | Pick a ` option by ref | | browserhover | Hover by ref (tooltips, dropdowns) | | browserscroll | Human-like scroll up/down | | browserpresskey | Press a key (Enter, Tab, β¦) | | browsergettext | Page text as markdown | | browsergetcookies | All cookies for the context | | browserevaluate | Run arbitrary JS, return result | | browsersavesession | Save cookies to a named session | | browserloadsession | Restore a named session | | browserclose` | Close browser, reset state |
π₯οΈ CLI
stealth-browser open-page https://example.com # snapshot to stdout
stealth-browser open-page https://example.com --screenshot # + save screenshot
stealth-browser monitor https://news.site --interval 30 --checks 20
stealth-browser binance-tokens --timeout 90
βοΈ Configuration
Copy env.example β .env and tune:
| Variable | Default | Description | |---|---|---| | STEALTH_PROFILE_DIR | profiles/default | Persistent browser profile path | | STEALTH_HEADLESS | false | Headless mode | | STEALTH_OS_TARGET | windows | Spoofed OS (windows, macos, linux) | | STEALTH_LOCALE | pt-BR,pt | Browser locale | | STEALTH_WINDOW | 1366,768 | Window size (width,height) | | STEALTH_BLOCK_WEBRTC | true | Block WebRTC (prevent IP leaks) | | STEALTH_HUMANIZE | true | Human-like input simulation | | STEALTH_PROXY_SERVER | (unset) | Proxy URL, e.g. socks5://127.0.0.1:1080 | | STEALTH_PROXY_USERNAME / _PASSWORD | (unset) | Proxy auth (optional) |
π Python API β tasks
import asyncio
from stealth_browser.browser import BrowserManager
from stealth_browser.config import BrowserConfig
from stealth_browser.humanize import HumanBehavior
from tasks.trading.binance import BinanceTokenTask
async def main():
cfg = BrowserConfig(headless=True)
async with BrowserManager(cfg) as bm:
page = await bm.get_page()
task = BinanceTokenTask(page, HumanBehavior(cfg), cfg)
print(await task.run(timeout=90))
asyncio.run(main())
π§ͺ Tests
pip install -e ".[dev]"
pytest --cov --cov-report=term-missing -q
61 tests, covering errors, config, snapshot, request interception, the MCP layer, and page ops. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full design.
ποΈ Project structure
automation-stealth/
βββ stealth_browser/ # Core: browser, config, humanize, snapshot, page_ops, intercept, session, errors
βββ mcp_server/ # FastMCP server (17 tools) + concurrency lock + error decorator
βββ cli/ # Click CLI (open-page, monitor, binance-tokens)
βββ tasks/ # BinanceTokenTask, PageMonitorTask, FormFillTask
βββ tests/ # pytest suite (asyncio)
βββ docs/ARCHITECTURE.md
βββ pyproject.toml
π€ Contributing
PRs welcome β see [CONTRIBUTING.md](CONTRIBUTING.md). Run ruff check . and pytest before opening one.
βοΈ Responsible use
Built for legitimate automation: QA, end-to-end testing, accessibility audits, personal data collection, and LLM agents acting on your behalf. Respect each site's Terms of Service, robots.txt, and applicable law. You are responsible for how you use it.
π License
[MIT](LICENSE) Β© Anton (@skuzu7)
If this saved you from another flagged automation run, drop a β β it genuinely helps.
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source β we do not rehost the code.
- Author: skuzu7
- Source: skuzu7/CSA-Obsidian
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet β be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.