Robin: AI-Powered Dark Web OSINT
Dark web OSINT over Tor: search onion engines, scrape pages, report with your own model.
The deterministic attack-surface perception layer for AI security agents
使っているAIアプリを選んで、設定をコピーしてください。
チェック 3/3 合格 · あなたのパソコンで動きます
まず:どの AI を使っていますか?
使っているアプリを選ぶと、下に手順が表示されます。
Claude につなげますが、先に準備が必要です
先にパソコンへ Node.js を入れてください(1 回だけ) · パソコン版 Claude アプリ(Windows または Mac)のみ。Web やスマホでは使えません
SettingsDeveloperEdit Config
{
"mcpServers": {
"zerodom": {
"command": "npx",
"args": [
"-y",
"@vexralabs/zerodom"
]
}
}
}ZeroDOM を使って、私に何ができるか教えて、1 つやってみせて✓ Claude が ZeroDOM を使っていると言うか、回答に ZeroDOM のツール名が出れば接続成功です
メニュー名は 2026年11月11日 に Anthropic のヘルプページで確認 · アプリのバージョンにより画面が少し違うことがあります
ChatGPT はまだ ZeroDOM につなげません
ZeroDOM はパソコンに入れて使うものですが、ChatGPT は Web 上で動くサーバーにしかつなげません
A · ZeroDOM につなげるアプリを使う
B · サイバーセキュリティ の中で ChatGPT につなげる別のサーバー
同じカテゴリでよく使われているものから、キーなしでアドレスだけでつなげるものを選びました
Claude Code につなげますが、先に準備が必要です
先にパソコンへ Node.js を入れてください(1 回だけ)
Mac:Command+スペースで Terminal と入力 · Windows:PowerShell を開く
claude mcp add --scope user zerodom -- npx -y @vexralabs/zerodomZeroDOM が一覧にあり、接続済みと表示されれば OK です
ZeroDOM を使って、私に何ができるか教えて、1 つやってみせて✓ Claude Code が ZeroDOM を使っていると言うか、回答に ZeroDOM のツール名が出れば接続成功です
メニュー名は 2026年11月11日 に Anthropic のヘルプページで確認 · アプリのバージョンにより画面が少し違うことがあります
Cursor につなげますが、先に準備が必要です
先にパソコンへ Node.js を入れてください(1 回だけ)
ZeroDOM を使って、私に何ができるか教えて、1 つやってみせて✓ Cursor が ZeroDOM を使っていると言うか、回答に ZeroDOM のツール名が出れば接続成功です
メニュー名は 2026年11月11日 に Cursor のヘルプページで確認 · アプリのバージョンにより画面が少し違うことがあります
VS Code につなげますが、先に準備が必要です
先にパソコンへ Node.js を入れてください(1 回だけ)
ZeroDOM を使って、私に何ができるか教えて、1 つやってみせて✓ VS Code が ZeroDOM を使っていると言うか、回答に ZeroDOM のツール名が出れば接続成功です
メニュー名は 2026年11月11日 に VS Code のヘルプページで確認 · アプリのバージョンにより画面が少し違うことがあります
Claude Code
claude mcp add --scope user zerodom -- npx -y @vexralabs/zerodomClaude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"zerodom": {
"command": "npx",
"args": [
"-y",
"@vexralabs/zerodom"
]
}
}
}Cursor (~/.cursor/mcp.json)
{
"mcpServers": {
"zerodom": {
"command": "npx",
"args": [
"-y",
"@vexralabs/zerodom"
]
}
}
}VS Code (mcp.json)
{
"servers": {
"zerodom": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@vexralabs/zerodom"
]
}
}
}この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
pypi: zerodomnpm: @vexralabs/zerodomこのサーバーのつなぎ方と、各アプリの公式ドキュメントに基づきます。2026年11月10日に確認。
パソコン上で動かせるアプリ
ClaudeGooseLM StudioMsty StudioCherry StudioCursorVS Code + GitHub CopilotVisual StudioWindsurf (Devin Desktop)ZedKiroClineContinueJetBrains AI AssistantClaude CodeCodex CLIGemini CLIOpenCodenodecodeWarpLibreChatRaycast
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月12日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント DevHusnainAi で確認済みです
コードの最終更新:10 日前
Apache-2.0を使用
これはパソコンで動くため、インターネット上のエンドポイントはありません
パソコンで動き、代わりにローカルの設定を使います
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
質問、コツの共有、使えないことの報告ができます。「役に立った」の多い順です。
まだレビューはありません
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック3項目のうち3項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
GitHubリポジトリの最終更新は10 日前、最新バージョン(0.1.5)がレジストリに届いたのは10 日前です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにPython (uv), Node.jsも必要です。
同じカテゴリには:Robin: AI-Powered Dark Web OSINT, HOL Guard, SonarQube MCP Server
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
Dark web OSINT over Tor: search onion engines, scrape pages, report with your own model.
Local-first AI agent security evidence and approval workflows through HOL Guard's stdio MCP server.
Analyze code quality and security with SonarQube Server or Cloud directly in AI assistants.
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
ZeroDOM drives your real, logged-in browser as two identities, replays the same requests as each, and flags where one user reaches what another can't — IDOR / broken access control, caught deterministically. Open-core, runs local, no account, no API key, nothing leaves your machine.
Under the hunt is a deterministic, token-lean perception engine for AI agents — the same core powers scan , crawl and any browser-driving task. IDOR is just where it bites hardest.
[Site](https://zerodom.vexralabs.com) · [Docs](https://zerodom.vexralabs.com/docs) · [Playground](https://zerodom.vexralabs.com/playground) · [Discord](https://discord.gg/tVRznUb5Ez) · [Quickstart ↓](#quickstart)
A normal user is denied the admin console (401) — then walks in by flipping one client-controlled cookie. ZeroDOM proves it: same request, two identities, 401 vs 200 . Full recording (mp4) .
compare & sweepTwo audiences, one engine:
scan --js adds DOM-XSS sinks, the callable API surface and header posture; repeat / probe / race turn recon into verification (Repeater, mass-assignment diff, and a TOCTOU burst).aria_snapshot, with handles that resolve 1:1 and don't drift when the page re-renders.Broken access control is the #1 web vulnerability (OWASP A01) and the one automated scanners miss — because catching it means knowing *who should be allowed to do what*, not just fuzzing one session. The usual answer is a human in Burp, clicking through the app as one user, then again as another, diffing by eye.
ZeroDOM does that mechanically. Give it two logged-in sessions; it replays the same request as each and reports the deterministic tells:
200, the other 401/403 on an identical request. If the only difference between them is client-controllable (a cookie, header or param), that's broken access control.No LLM guessing, no "the AI thinks maybe." ZeroDOM surfaces the tell with the exact replay that proves it — a reviewable diff you drop straight into a bug report. You confirm the bug.
It drives your real Chrome (relay mode) over chrome.debugger, so your cookies, MFA and SSO are already done — or a throwaway browser (--stealth) if you'd rather not touch your session. Either way the page's markup never leaves your machine, and it's read-only by default: destructive actions and out-of-scope hosts are refused.
It works equally well as a one-line CLI, a recon pipeline stage, or a native tool an
AI agent drives through MCP. Same deterministic primitives, three front doors.
See it run in 10 seconds — no account, no browser download (bare zerodom is a static fetch, no Chromium needed):
pip install zerodom # or: uvx zerodom · npm i @vexralabs/zerodom
zerodom https://news.ycombinator.com # the interaction graph + a token report
That's the perception engine — a flat, 1:1-addressable graph instead of 12k tokens of HTML.
Now the flagship — find an IDOR. Save two logged-in sessions as Playwright storage_state files (one per account), then diff a protected endpoint across both:
zerodom compare https://app.example.com/api/admin/dashboard \
--as user=user.json --as admin=admin.json
{
"identities": { "user": { "status": 401, "bytes": 2616 }, "admin": { "status": 200, "bytes": 3469 } }, "only_admin": ["Manage users", "Billing & plans", "Overview"], "note": "admin authorized (200) where user denied (401) — broken access control if the only difference is client-controllable" }
That's the whole loop: same request, two identities, a 401-vs-200 split → a lead to confirm. only_admin lists the privileged controls the normal user should never see.
Don't have storage-state files? Capture one with context.storage_state(path="user.json") in Playwright, or export cookies from a logged-in session. Want the whole app, not one URL? → zerodom sweep.
compare & sweepzerodom compare — one endpoint, across identitiesFetch one URL under each saved session and diff the responses. Byte-identical content across two users on a private resource is a cross-tenant IDOR; a 401-vs-200 split is a broken boundary. only_ lists the actionable nodes each identity sees that the other doesn't.
# Sweep a range of object ids through two identities:
seq 1 500 | sed 's#^#https://app.example.com/api/invoice/#' \ | zerodom compare - --as alice=alice.json --as bob=bob.json \ | jq 'select(.identical_body_pairs | length > 0)'
zerodom sweep — the whole app, one commandcompare tests one URL. `sweep` does the entire app: it crawls as one identity to map the GET surface (pages + the API calls the JS fires), then replays every in-scope URL under *all* your identities and reports only the deterministic tells.
zerodom sweep https://app.example.com --as user=user.json --as admin=admin.json --format md
| severity | rule | url |
| -------- | ---------------------- | ------------------------------------- | | medium | access-boundary-split | https://app.example.com/api/admin/... |
Read-only throughout: only GET is replayed, destructive URLs are dropped (--deny). --format md emits a report-ready table (default is JSONL). This is the "point it at an app with two logins and it finds the broken access control" pass.
Both take --proxy (route through Burp/Caido), --header (a program's WAF-bypass token), and a scope you can lock. Challenge pages (Cloudflare / Turnstile / reCAPTCHA / hCaptcha) are detected and climbed by a scope-gated clearance ladder; a wall nothing clears is reported as an honest blocked, never worked around outside an authorized target.
repeat / probe / raceMapping an app surfaces the endpoints; these verbs act on them. repeat is a Repeater over the session (--save writes HAR/.http evidence for a report). probe replays an endpoint with a tampered body and diffs it against the baseline — an accepted, reflected field is a mass-assignment lead. race fires a concurrent burst (one body, or a mix of operations via repeated --body) to flag a check-then-act race (TOCTOU); the stdlib engine is always available, and --engine http2 multiplexes the burst over one connection via the optional zerodom[race] extra.
zerodom race https://app.example.com/api/coupon --body '{"code":"SAVE20"}' -n 30 \
--setup setup.json --check https://app.example.com/api/cart
All three are exposed to agents over MCP as zerodom_repeat / zerodom_probe / zerodom_race.
Standard MCP browser tools hand the model raw pixels (slow, stale on scroll) or an accessibility tree (no stable handles — repeated controls collide). zerodom-mcp gives your agent a flat, token-frugal graph where every click [45] resolves deterministically over CDP to exactly one element — and the same tools do cross-identity IDOR hunting the others can't. Why ↓
ZeroDOM is a native MCP server, so Claude, Cursor or any MCP agent can hunt with the same primitives. Run zerodom setup for a guided first-run (checks Chromium, prints the extension path + chrome://extensions steps, emits the config below, reports relay reachability — print-and-guide, no account, nothing leaves your machine).
// Claude Desktop: claude_desktop_config.json · Cursor: .cursor/mcp.json
{ "mcpServers": { "zerodom": { "command": "uvx", "args": ["--from", "zerodom", "zerodom-mcp"] } } }
Once before first use (so the server never downloads mid-tool-call): uvx --from zerodom playwright install chromium.
Using LangGraph, CrewAI, OpenAI Agents SDK, Pydantic AI, LlamaIndex, Google ADK or AutoGen? Ready-to-run MCP examples — same server, a few lines each — are in examples/integrations/.
The full tool set (click to expand)
| tool | what it does |
|---|---|
zerodom_parse_url(url, verbose=False, frames=False, viewport_only=False, check_occlusion=False) | navigate, return the compact graph; frames=True also reads same- and cross-origin iframes (auth portals, payment fields) |
zerodom_read_page(verbose=False) | re-read the live DOM without navigating |
zerodom_find(query) | return only the nodes matching a phrase |
zerodom_click_node(node_id) | click, then return what changed — flags a same-page no-op shortly after navigation as a possible hydration miss |
zerodom_fill_node(node_id, text) | type via real keystrokes — works in contenteditable editors (Notion, Slack, Discord, Jira) |
zerodom_hover(node_id) | hover, revealing hover-triggered menus/tooltips |
zerodom_press_key(node_id, key) | press a key on a focused node (Enter, Escape, Tab, …) |
zerodom_upload_file(node_id, path) | set a file input's value to a local path |
zerodom_drag(source_node_id, target_node_id) | drag one node onto another |
zerodom_scroll(direction, amount=800) | scroll, return what's newly visible |
zerodom_new_tab(url=None) | open a tab and make it active |
zerodom_list_tabs() | list every open tab, marking the active one |
zerodom_switch_tab(tab_id) | make another open tab active |
zerodom_close_tab(tab_id=None) | close a tab (the active one by default) |
zerodom_screenshot(path=None) | full-page screenshot of the active tab, saved to disk |
| `zerodom_set_viewport(wi