Obscura MCP

io.github.Metadrama由 GitHub 账号 Metadrama 发布v0.1.1更新于 Oct 24, 2026

MCP server adapter for Obscura Rust headless browser — web scraping with anti-detection.

概览

AI 生成的概览

面向 Obscura Rust 无头浏览器的本地 MCP 适配器,让助手读取网页、点击输入、维持会话并批量抓取 URL。

可以做什么
以文本、Markdown、HTML、链接、Cookie、无障碍树或布局等形式读取单个页面,可选执行 JavaScript 表达式并注入 Cookie、请求头或 User-Agent。执行一次性页面操作,例如点击元素或输入文本。管理持久浏览器会话,支持创建、关闭、列出、跳转、等待、提取、点击和输入,适合登录等多步流程。并行抓取多个 URL,使用独立工作进程、并发上限和单页超时,返回 JSON 结果或逐 URL 错误。
适用场景
适合助手需要获取或提取网页内容、执行登录表单等简单多步交互,或一次性从大量 URL 收集数据,而又不想安装完整 Chrome 的场景。
运行要求
作为本地 Node.js 进程运行,通过 npm 安装 obscura-mcp,通常使用 stdio 传输。Obscura 浏览器二进制文件(约 80 MB)首次使用时自动下载并缓存在用户主目录;可用 OBSCURA_PATH 指定自定义路径。可选设置包括 OBSCURA_STEALTH、OBSCURA_PROXY、OBSCURA_USER_AGENT 以及 HTTP 传输的主机和端口变量。需要网络访问。
安装前请注意
README 标明项目已归档、npm 包已弃用,上游已提供原生 MCP 支持。浏览器可在真实网站上点击和输入并注入 Cookie 与请求头,操作可能提交表单或改变远端状态。批量抓取会把所列 URL 发送到对应网站,可能被拦截或限流。可选的代理与隐身设置会影响流量走向和检测。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Obscura MCP,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

obscura-mcp — ARCHIVED

⚠️ Archived. Upstream ships native MCP since v0.1.4 (obscura mcp). npm package deprecated.

[npm version] [License: MIT]

An MCP server adapter for Obscura, a lightweight Rust headless browser for scraping and AI agent automation.

Exposes Obscura's native CDP capabilities through a clean MCP interface — no Chrome dependency, no heavyweight browser automation.

Installation

bash
npm install -g obscura-mcp

The npm package itself is a small Node.js wrapper (~20 KB). The browser binary (~80 MB) is downloaded automatically on first use — no separate install step needed.

The binary is cached at ~/.obscura/bin/ and survives npm upgrades.

Pre-release builds are published under the dev tag:

bash
npm install -g obscura-mcp@dev

To use a custom binary path:

bash
export OBSCURA_PATH=/path/to/obscura

Quick Start

bash
# Installnpm install -g obscura-mcp
# Verifyobscura-mcp --version
# Start MCP server (stdio — primary transport)obscura-mcp --transport stdio
# Or with HTTP transportobscura-mcp --transport streamable-http

Most MCP clients (Claude Desktop, Cline, Continue) connect via stdio. The streamable-http transport is also supported for custom integrations.

Tools

Four tools cover browsing, interacting, session persistence, and bulk scraping.

browse_page — one-shot page reading

Get content from any page in a single call. Combine output format with optional JavaScript evaluation.

ParameterTypeDefaultDescription
urlstring—The URL to visit
format"text" | "markdown" | "html" | "links" | "cookies" | "axtree" | "layout""text"Output format
evalstring—JavaScript expression to evaluate (appended to output)
cookiesarray—Cookies to inject [{name, value, domain?, path?, ...}]
user_agentstring—Override the browser user-agent string
headersobject—Extra HTTP headers {key: value, ...}
stealthbooleantrueAccepted for compatibility; stealth is controlled by the Obscura server

Examples:

browse_page(url: "https://example.com")browse_page(url: "https://example.com", format: "markdown")browse_page(url: "https://example.com", format: "axtree")browse_page(url: "https://example.com", format: "layout")browse_page(url: "https://example.com", user_agent: "TestBot/1.0")
formatWhat you get
"text"Plain text — stripped of HTML tags, scripts, styles
"markdown"Clean markdown — uses Obscura's native LP.getMarkdown CDP
"html"Raw HTML markup
"links"All href values — one per line
"cookies"Cookies with name, value, domain, path, expiry
"axtree"Accessibility tree — roles, names, values of all elements
"layout"Viewport metrics — dimensions, scroll offsets, device scale

When eval is provided, the JavaScript result is appended to the format output under a --- eval --- divider.


browse_interact — one-shot page actions

Click an element or type text into a page. For multi-step interactions (login → wait → extract), use browse_session instead.

ParameterTypeDefaultDescription
urlstring—The URL to visit
action"click" | "type"—Action to perform
selectorstring—CSS selector for the target element
textstring—Text to type (required when action is "type")
cookiesarray—Cookies to inject [{name, value, ...}]
stealthbooleantrueAccepted for compatibility; stealth is controlled by the Obscura server

Examples:

browse_interact(url: "https://example.com", action: "click", selector: "a")browse_interact(url: "https://duckduckgo.com", action: "type", selector: "input[name=q]", text: "search query")

Both actions create a fresh page, perform the action, and close. The page context does not persist — for sequential interactions (type into a form, then click submit), use browse_session instead.


browse_session — multi-step persistent sessions

Create a persistent browser session, interact with it across multiple calls, then close. Sessions auto-close after 5 minutes of inactivity. Multiple sessions can run simultaneously.

ParameterTypeRequired forDescription
action"create" | "close" | "list" | "goto" | "wait" | "extract" | "click" | "type"AllWhat to do
session_idstringAll except create, listSession ID from create
urlstringcreate, gotoURL to navigate to
selectorstringwait, click, typeCSS selector
expressionstringwait (if no selector), extractJavaScript expression
textstringtypeText to type
timeoutnumberwait (optional)Max wait in ms (default 30000, max 120000)
user_agentstringcreate, gotoOverride user-agent string for navigation
headersobjectcreate, gotoExtra HTTP headers {key: value, ...}
clear_cookiesbooleancreateClear all browser cookies on session creation

Session lifecycle:

actionWhat it doesReturns
createOpens a new browser tab. Optionally clears cookies.Session ID
closeReleases the tab and all its resources. Idempotent.Confirmation
listShows all active sessions with timestamps.Session list
gotoNavigates to a new URL. Page stays alive.Confirmation
waitPolls until a CSS selector exists or a JS expression returns true.Confirmation
extractEvaluates JavaScript and returns the result.Eval result
clickClicks an element by CSS selector.Coordinates
typeTypes text into an input field.Confirmation

Login flow example:

browse_session(action: "create", url: "https://example.com/login")  → "Created session: session_1"
browse_session(action: "type", session_id: "session_1", selector: "#username", text: "user")browse_session(action: "type", session_id: "session_1", selector: "#password", text: "pass")browse_session(action: "click", session_id: "session_1", selector: "#login-btn")
browse_session(action: "wait", session_id: "session_1", selector: ".dashboard", timeout: 10000)browse_session(action: "extract", session_id: "session_1", expression: "document.title")
browse_session(action: "close", session_id: "session_1")

Multi-article browsing example:

browse_session(action: "create")browse_session(action: "goto", session_id: "session_1", url: "https://en.wikipedia.org/wiki/JavaScript")browse_session(action: "extract", session_id: "session_1", expression: "document.title")browse_session(action: "goto", session_id: "session_1", url: "https://en.wikipedia.org/wiki/Python")browse_session(action: "extract", session_id: "session_1", expression: "document.title")browse_session(action: "close", session_id: "session_1")

browse_scrape — parallel bulk scraping

Scrape multiple URLs simultaneously using isolated worker processes. Each URL gets its own headless browser worker — built on top of Obscura's native scrape command with obscura-worker.

ParameterTypeDefaultMaxDescription
urlsstring[]—1000URLs to scrape in parallel
evalstring——JavaScript expression to evaluate per page
concurrencynumber10100Number of parallel worker processes
timeoutnumber60300Per-worker timeout in seconds

Example:

browse_scrape(urls: ["https://news.ycombinator.com", "https://example.com"], eval: "document.title", concurrency: 25)

Output format (JSON):

json
{  "total_urls": 2,  "concurrency": 25,  "total_time_ms": 1250,  "avg_time_ms": 625.0,  "results": [    {      "url": "https://news.ycombinator.com",      "title": "Hacker News",      "eval": "Hacker News",      "time_ms": 612,      "worker": 0    },    {      "url": "https://example.com",      "eval": "Example Domain",      "time_ms": 638,      "worker": 1    }  ]}

On errors (timeout, network failure, etc.), the per-URL result includes an "error" field instead of "eval":

json
{  "url": "https://slow-site.com",  "error": "timeout",  "time_ms": 60000}

This is the tool that directly leverages Obscura's core advantage over headless Chrome: lightweight parallel scraping with built-in stealth. The ~30 MB per-worker memory footprint means 100 concurrent workers use less memory than a single Chrome instance.

Configuration

Claude Desktop / Cline / Continue / Any MCP client

json
{  "mcpServers": {    "obscura-mcp": {      "command": "obscura-mcp",      "args": ["--transport", "stdio"]    }  }}

VS Code (Cline extension)

json
{  "servers": {    "obscura-mcp": {      "command": "obscura-mcp",      "args": ["--transport", "stdio"]    }  }}

After global npm install, obscura-mcp is on your PATH — no absolute paths needed.

Environment Variables

VariableDefaultDescription
OBSCURA_PATH—Path to custom Obscura binary
OBSCURA_STEALTH—Enable stealth mode (anti-detection)
OBSCURA_PROXY—Proxy URL for all traffic
OBSCURA_USER_AGENT—Default user-agent override
MCP_HTTP_HOST127.0.0.1HTTP transport host
MCP_HTTP_PORT3000HTTP transport port
MCP_TRANSPORTstdioTransport mode: stdio or streamable-http
OBSCURA_STARTUP_TIMEOUT_MS15000Milliseconds to wait for Obscura CDP to start
OBSCURA_NAVIGATION_WAIT_MS3000Milliseconds to wait after page navigation
CDP_REQUEST_TIMEOUT_MS10000Milliseconds to wait for CDP response

Development

Built with TypeScript, compiled to dist/, tested with Vitest.

bash
git clone https://github.com/Metadrama/obscura-mcpcd obscura-mcpnpm installnpm run buildnpm test

All 36 integration tests run against a real Obscura binary (auto-downloaded on first run). Tests use StdioClientTransport and cover every tool, format, and action.

Why Obscura?

  • No Chrome — pure Rust, no 200 MB browser bundle
  • CDP-native — exposes Chrome DevTools Protocol directly
  • Anti-detection — built-in stealth for scraping-resistant sites
  • Tiny footprint — ~15 MB binary, starts in milliseconds

License

MIT

来源:README.md,提交 6321546

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

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

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分