Kloakt

io.github.KultMember6Banger由 GitHub 帳號 KultMember6Banger 發布v0.1.2更新於 Oct 24, 2026

Cloaked headless browser for AI agents — stealth TLS, smart extraction, SPA fallback

概覽

AI 產生的概覽

Kloakt 是本地無頭瀏覽器 MCP 伺服器,讓助理擷取乾淨的 Markdown、抓取網頁、產生頁面結構快照,並操作持久的瀏覽器工作階段。

可以做什麼
Kloakt 提供 12 個 MCP 工具:kloakt_extract 回傳乾淨的 Markdown,或透過 CSS 選擇器 schema 擷取結構化欄位;kloakt_fetch 進行底層 HTML/文字/連結/JS 求值抓取;kloakt_scrape 平行處理多個 URL;kloakt_search 與 kloakt_crawl 用於探索連結與在預算內爬取。它也提供 kloakt_snapshot 產生無障礙/結構樹、kloakt_screenshot 透過系統 Chrome 產生真實 PNG,以及工作階段工具(open、act、read、list、close),在多次呼叫間保留 Cookie 與頁面狀態。
適用情境
當助理需要在本地讀取或操作網頁時使用:擷取文章或文件內容、批次抓取 URL 清單、處理大量 JavaScript 的單頁應用,或在持久工作階段中執行填寫並送出表單等多步驟互動。
執行需求
以本地程序透過 stdio 執行;README 顯示以 python3 加上 mcp_server.py 路徑啟動。可透過預編譯二進位檔、Homebrew、cargo 或原始碼安裝;從原始碼建置需要 Rust 1.75+。截圖需要本地安裝 Chrome/Chromium/Edge,可用 KLOAKT_CHROME 環境變數覆寫。未宣告帳號或 API 金鑰。
安裝前請注意
它會抓取任意 URL,並可能把頁面內容傳送給模型,因此避免指向內部或敏感頁面。預設會阻擋私有、回送、連結本地與雲端中介資料位址,並拒絕 file:// URL;--allow-private 旗標會關閉該 SSRF 防護。工作階段狀態(包括 Cookie)儲存在本地 ~/.kloakt/sessions 下。隱身模式用於反偵測,挑戰偵測只回報機器人牆,並不嘗試破解。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Kloakt,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Kloakt

Cloaked headless browser for AI agents.
Lightweight, stealthy, built in Rust. Based on Obscura.


Kloakt is a headless browser built for AI agents. It runs JavaScript via V8, extracts clean markdown from any page (including SPAs), and exposes tools via MCP for Claude Code and other AI systems.

Beyond one-shot extraction it can drive persistent, stateful sessions (click, type, navigate — cookies and page/JS state persist across calls), emit an accessibility/structure snapshot as an agent-vision substitute, and capture real screenshots via system Chrome — 12 MCP tools in all.

Why Kloakt?

MetricKloaktHeadless Chrome
Memory30 MB200+ MB
Binary size70 MB300+ MB
Anti-detectBuilt-inNone
Page load85 ms~500 ms
StartupInstant~2s
SPA extractYesManual

Install

Prebuilt binary (recommended)

One-line install (Linux & macOS). Downloads the right binary for your OS/arch from the latest GitHub Release and installs it to ~/.local/bin (or /usr/local/bin when run as root):

bash
curl -fsSL https://raw.githubusercontent.com/KultMember6Banger/kloakt/main/install.sh | sh

You can pin a version or override the install dir:

bash
KLOAKT_VERSION=v0.1.2 INSTALL_DIR=/usr/local/bin \  sh -c "$(curl -fsSL https://raw.githubusercontent.com/KultMember6Banger/kloakt/main/install.sh)"

Windows: download kloakt-x86_64-windows.zip from the Releases page and extract kloakt.exe onto your PATH.

Homebrew (macOS)

bash
brew install KultMember6Banger/kloakt/kloakt# or, from a local checkout:brew install --formula ./Formula/kloakt.rb

(Until a dedicated tap exists, brew tap KultMember6Banger/kloakt https://github.com/KultMember6Banger/kloakt then brew install kloakt.)

cargo install

Builds the CLI from crates.io (requires Rust toolchain; first build compiles V8, ~5 min):

bash
cargo install obscura-cli

This installs the kloakt binary. To build with stealth mode, add --features stealth.

Build from source

bash
git clone https://github.com/KultMember6Banger/kloakt.gitcd kloaktcargo build --release
# With stealth mode (anti-detection + tracker blocking)cargo build --release --features stealth

Requires Rust 1.75+ (rustup.rs). First build takes ~5 min (V8 compiles from source, cached after).

Quick Start

Extract content (AI agent use)

bash
# Clean markdown from any pagekloakt extract https://example.com --main
# Structured JSON with metadatakloakt extract https://example.com --main --json
# Cap output for agent context windowskloakt extract https://en.wikipedia.org/wiki/Rust --main --json --max-chars 3000
# Wait for SPA hydrationkloakt extract https://example.com --delay 2000 --json

Fetch a page

bash
# Get the page titlekloakt fetch https://example.com --eval "document.title"
# Extract all linkskloakt fetch https://example.com --dump links
# Render JavaScript and dump markdownkloakt fetch https://news.ycombinator.com --dump markdown
# Wait for dynamic contentkloakt fetch https://example.com --wait-until networkidle0

Start the CDP server

bash
kloakt serve --port 9222
# With stealth modekloakt serve --port 9222 --stealth

Scrape in parallel

bash
kloakt scrape url1 url2 url3 ... \  --concurrency 25 \  --eval "document.querySelector('h1').textContent" \  --format json

Snapshot page structure (agent vision)

bash
# Indexed accessibility/structure tree — tags, text, roles, what's clickable, visibilitykloakt snapshot https://example.com
# Only the actionable elements (links, buttons, inputs), with id/name/label for targetingkloakt snapshot https://example.com --interactive

kloakt has no rasterizer, so this is the lightweight "what's on the page and what can I act on" view for agents that work from structure rather than pixels.

Screenshot (via system Chrome)

bash
# Real PNG — delegates to a locally-installed Chrome/Chromium/Edgekloakt screenshot https://example.com --output shot.png --width 1280 --height 800

Persistent sessions

Drive a named session whose cookies and page/JS state survive across separate invocations, backed by a running kloakt serve daemon:

bash
kloakt serve --port 9222 &                        # start the daemon once
kloakt session open shop --url https://example.comkloakt session snapshot shop --interactive        # see the page structurekloakt session type shop 'input[name=q]' 'hello'  # fill a fieldkloakt session click shop 'button[type=submit]'   # click an elementkloakt session text shop                          # read the body textkloakt session eval shop 'document.title'         # run JS, get the value backkloakt session close shop                         # tear down (drops cookies + page)

Smart Extraction

The extract command uses a multi-phase pipeline optimized for AI agents:

  1. Noise removal — strips cookie banners, ads, popups, nav, social widgets
  2. Content scoring — text-density algorithm (Readability-like) finds the main content block
  3. Markdown conversion — DOM-to-markdown with absolute URL resolution
  4. SPA fallback — when JS rendering fails, extracts from meta tags, Open Graph, JSON-LD, and noscript content

Works on static HTML, server-rendered pages, and pure client-side SPAs (React, Vue, etc.).

Python API

python
from kloakt import (    extract, extract_fields, fetch, scrape, search, crawl,    snapshot, screenshot, session_open, session_close,)
# Extract clean markdownpage = extract("https://example.com")print(page.title, page.content, page.meta)
# Cap output lengthpage = extract("https://example.com", max_chars=3000)
# Wait for SPA contentpage = extract("https://example.com", delay=2000)
# Structured field extraction via CSS selectorsdata = extract_fields("https://news.ycombinator.com", {    "title": "title",    "stories": ".titleline > a[]",   # [] => list of all matches    "links": ".titleline > a[]@href" # @href => an attribute})print(data["data"]["stories"])
# Raw fetchhtml = fetch("https://example.com", dump="html")title = fetch("https://example.com", eval_js="document.title")
# Parallel scraperesults = scrape(["https://a.com", "https://b.com"], concurrency=5)
# Discover links, or breadth-first crawl a small section of a sitelinks = search("https://news.ycombinator.com", same_domain=True)pages = crawl("https://example.com", max_pages=5, max_depth=1)
# Structure snapshot (agent vision) and a real screenshot via system Chromesnap = snapshot("https://example.com", interactive=True)screenshot("https://example.com", output="shot.png")
# Persistent session — auto-starts a daemon if one isn't running; cookies + page# state persist across calls. (session_nav / _click / _type / _eval / _text / _snapshot)session_open("shop", url="https://example.com")# ... drive the page across calls ...session_close("shop")

MCP Server (Claude Code)

Kloakt includes an MCP server for use as a Claude Code tool:

json
{  "mcpServers": {    "kloakt": {      "command": "python3",      "args": ["/path/to/kloakt/mcp_server.py"]    }  }}

Exposes 12 native tools:

ToolWhat it does
kloakt_extractClean markdown, or structured fields via schema
kloakt_fetchLow-level fetch (html/text/links/markdown, or JS eval)
kloakt_scrapeMany URLs in parallel
kloakt_searchDiscover outbound links on a page
kloakt_crawlBudget/depth-limited breadth-first crawl
kloakt_snapshotAccessibility/structure tree (agent vision)
kloakt_screenshotReal PNG via system Chrome
kloakt_session_openOpen a persistent named session
kloakt_session_actnavigate / click / type / eval within a session
kloakt_session_readRead a session's page as text or snapshot
kloakt_session_listList open sessions
kloakt_session_closeClose a session (drops its cookies + page)

Puppeteer / Playwright

Puppeteer

The CDP server embeds a per-session token in the WebSocket path (like Chrome). Connect via browserURL so the client discovers the token from /json/version automatically — don't hardcode the ws://.../devtools/browser path.

javascript
import puppeteer from 'puppeteer-core';
const browser = await puppeteer.connect({  browserURL: 'http://127.0.0.1:9222', // discovers the tokenized ws endpoint});
const page = await browser.newPage();await page.goto('https://news.ycombinator.com');const stories = await page.evaluate(() =>  Array.from(document.querySelectorAll('.titleline > a'))    .map(a => ({ title: a.textContent, url: a.href })));await browser.disconnect();

Playwright

javascript
import { chromium } from 'playwright-core';
const browser = await chromium.connectOverCDP({  endpointURL: 'http://127.0.0.1:9222', // discovers the tokenized ws endpoint});
const page = await browser.newContext().then(ctx => ctx.newPage());await page.goto('https://en.wikipedia.org/wiki/Web_scraping');console.log(await page.title());await browser.close();

Stealth Mode

Enable with --features stealth.

  • Per-session fingerprint randomization (GPU, screen, canvas, audio, battery)
  • Realistic navigator.userAgentData (Chrome 145, high-entropy values)
  • event.isTrusted = true for dispatched events
  • Native function masking (Function.prototype.toString() → [native code])
  • navigator.webdriver = undefined
  • Realistic Accept-Language + Client Hints (Sec-CH-UA) request headers
  • Per-session randomized navigator.languages
  • TLS fingerprint (JA3) rotation across Chrome 145 Linux / Windows / macOS profiles
  • 3,520 tracker domains blocked

CLI Reference

kloakt extract <URL>

FlagDefaultDescription
--formatmarkdownOutput: markdown, text, or links
--mainoffStrip nav, header, footer, sidebar
--jsonoffStructured JSON: title, URL, content, meta
--max-charsunlimitedTruncate content to N characters
--delay0Extra ms to wait after load
--stealthoffAnti-detection mode
--selector—Wait for CSS selector
--wait-untilloadload, domcontentloaded, networkidle0 (bounded by --wait)
--schema—Extract structured fields as JSON (see below)
--har—Write captured network activity to a HAR file
--cache-ttl0Cache the result on disk and reuse it for N seconds
Structured extraction with --schema

Pass a JSON object mapping field names to CSS selectors. Suffix a selector with [] to return all matches as a list, and with @attr to return an attribute instead of text:

bash
kloakt extract https://news.ycombinator.com \  --schema '{"title":"title","stories":".titleline > a[]","first_link":".titleline > a@href"}'# => { "url": ..., "data": { "title": "...", "stories": [...], "first_link": "..." }, "elapsed_ms": ... }

This is also exposed through the MCP kloakt_extract tool via an optional schema argument.

kloakt fetch <URL>

FlagDefaultDescription
--dumphtmlOutput: html, text, links, markdown
--eval—JavaScript expression to evaluate
--wait-untilloadWait condition
--selector—Wait for CSS selector
--stealthoffAnti-detection mode
--quietoffSuppress banner

kloakt serve

FlagDefaultDescription
--port9222WebSocket port
--proxy—HTTP/SOCKS5 proxy URL
--stealthoffAnti-detection + tracker blocking
--workers1Parallel workers

kloakt scrape <URL...>

FlagDefaultDescription
--concurrency10Parallel workers
--eval—JS expression per page
--formatjsonOutput: json or text

kloakt snapshot <URL>

Emit an indexed accessibility/structure tree (always JSON) — an agent-vision substitute. Each node is compact: i (index), tag, depth, vis (visible), and when present click, role, text, type/value, href, id, name, label.

FlagDefaultDescription
--interactiveoffOnly actionable elements (links, buttons, inputs)
--max-nodes1500Cap on nodes emitted
--stealthoffAnti-detection mode
--delay0Extra ms to wait after load
--wait-untilloadWait condition

kloakt screenshot <URL>

Capture a real PNG by delegating to a locally-installed Chrome/Chromium/Edge (kloakt has no rasterizer). Errors clearly if none is found; override detection with --chrome <path> or the KLOAKT_CHROME env var.

FlagDefaultDescription
--outputscreenshot.pngOutput PNG path
--width1280Viewport width
--height800Viewport height
--chromeauto-detectPath to a Chrome/Chromium/Edge binary

kloakt session <COMMAND>

Drive a persistent, named session against a running kloakt serve daemon. Cookies and page/JS state survive across separate invocations (client state in ~/.kloakt/sessions/<name>.json).

CommandDescription
open <name> [--url URL] [--port]Open (or reattach to) a session and create a page
nav <name> <url>Navigate the session's page
eval <name> <expr>Evaluate a JS expression, print the JSON value
text <name>Print document.body.innerText
snapshot <name> [--interactive]Structure snapshot of the session's page
click <name> <selector>Click the first matching element
type <name> <selector> <text>Focus an element, set its value, fire input/change
list [--port]List open sessions on the daemon
close <name>Close the session (drops its pages + cookies)

Multi-statement JS passed to eval returns null (the daemon evaluates a single expression); wrap it in an IIFE — (function(){ ...; return v })() — to get a value back.

kloakt benchmark <URL...>

Measure load performance per URL — average/min/max load time, request count, bytes, and DOM node count — as a table or --json.

bash
kloakt benchmark https://example.com https://news.ycombinator.com --runs 3
FlagDefaultDescription
--runs1Runs per URL (reports the average)
--jsonoffEmit JSON instead of a table
--wait-untilloadload, domcontentloaded, or networkidle0

Challenge / bot-wall detection

kloakt extract --json includes a "challenge" field reporting a detected captcha or bot wall (recaptcha, hcaptcha, turnstile, cloudflare, datadome, perimeterx) or null. This is detection only — kloakt tells you a page is gated so an agent can stop and back off; it does not attempt to solve or evade challenges. (Also surfaced via the MCP kloakt_extract output and the Python Page.challenge field.)

Global flags

FlagDefaultDescription
--obey-robotsoffRespect robots.txt — refuse to fetch disallowed paths
--allow-privateoffAllow private/internal/loopback hosts (disables the SSRF guard)

Security note: by default kloakt refuses to fetch private, loopback, link-local, and cloud-metadata addresses (SSRF protection), and rejects file:// URLs. Use --allow-private only when you intentionally need to reach internal services. The CDP server binds to 127.0.0.1 and validates the Host header to block DNS-rebinding.

CDP API

Full Chrome DevTools Protocol support for Puppeteer/Playwright compatibility.

DomainMethods
Sessionopen, close, list — named, persistent browser contexts that keep cookies alive
TargetcreateTarget (browserContextName binds a page to a session), closeTarget, attachToTarget, createBrowserContext, disposeBrowserContext
Pagenavigate, getFrameTree, addScriptToEvaluateOnNewDocument, lifecycleEvents
Runtimeevaluate, callFunctionOn, getProperties, addBinding
DOMgetDocument, querySelector, querySelectorAll, getOuterHTML, resolveNode
Networkenable, setCookies, getCookies, setExtraHTTPHeaders, setUserAgentOverride
Fetchenable, continueRequest, fulfillRequest, failRequest
StoragegetCookies, setCookies, deleteCookies
InputdispatchMouseEvent, dispatchKeyEvent

License

Apache 2.0 — Based on Obscura by h4ckf0r0day.

來源:README.md,提交 6159897

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.2最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分