mcpField
O
Obscura MCP

Obscura MCP

本地服务
github.com/Metadrama浏览器自动化224 周前更新

关于 Obscura MCP

Obscura MCP 是已归档的适配器,曾将 Obscura Rust 无头浏览器提供给 MCP 客户端,用于抓取网页和浏览器自动化。Obscura 上游从 v0.1.4 起支持原生 MCP,该 npm 包已弃用。

主要功能

  1. 01以文本、Markdown、HTML 或链接读取网页
  2. 02在网页上运行 JavaScript
  3. 03点击元素并输入文本
  4. 04维持多步浏览器会话
  5. 05并行抓取多个 URL

适用场景

  1. 01为 Agent 提取网页内容
  2. 02自动执行多步登录流程
  3. 03检查多个 URL 中的网页
  4. 04从网页列表收集数据

MCP 相关

该适配器曾通过 stdio 或 streamable HTTP 将 Obscura 浏览和抓取能力作为 MCP 工具提供。项目已归档;Obscura 上游从 v0.1.4 起提供原生 MCP 支持。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"metadrama-obscura": {
"command": "npx",
"args": [
"-y",
"obscura-mcp"
]
}
}
}
启动命令npx -y obscura-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmobscura-mcp0.1.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

obscura-mcp — 已归档

⚠️ 已归档。 上游从 v0.1.4 起提供原生 MCP(obscura mcp)。npm 包已弃用。

npm version License: MIT

Obscura 的 MCP 服务适配器。Obscura 是一款轻量级的 Rust 无头浏览器,适用于网页抓取和 AI Agent 自动化。

通过简洁的 MCP 接口提供 Obscura 的原生 CDP 功能——无需依赖 Chrome,也无需使用笨重的浏览器自动化工具。

安装

npm install -g obscura-mcp

npm 包本身是一个小型 Node.js 封装(约 20 KB)。浏览器二进制文件(约 80 MB)会在首次使用时自动下载——无需单独安装。

二进制文件缓存在 ~/.obscura/bin/ 中,npm 升级后仍会保留。

预发布版本会发布在 dev 标签下:

npm install -g obscura-mcp@dev

要使用自定义二进制文件路径:

export OBSCURA_PATH=/path/to/obscura

快速开始

# Install
npm install -g obscura-mcp

# Verify
obscura-mcp --version

# Start MCP server (stdio — primary transport)
obscura-mcp --transport stdio

# Or with HTTP transport
obscura-mcp --transport streamable-http

大多数 MCP 客户端(Claude Desktop、Cline、Continue)通过 stdio 连接。自定义集成也支持 streamable-http 传输方式。

工具

四种工具涵盖浏览网页、交互操作、会话持久化和批量抓取。

browse_page — 单次读取页面

一次调用即可获取任意页面的内容。可组合使用输出格式和可选的 JavaScript 求值。

参数类型默认值描述
urlstring—要访问的 URL
format"text" | "markdown" | "html" | "links" | "cookies" | "axtree" | "layout""text"输出格式
evalstring—要执行求值的 JavaScript 表达式(追加到输出中)
cookiesarray—要注入的 Cookie [{name, value, domain?, path?, ...}]
user_agentstring—覆盖浏览器的 user-agent 字符串
headersobject—额外的 HTTP 标头 {key: value, ...}
stealthbooleantrue为兼容性而接受;隐身功能由 Obscura 服务控制

示例:

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")
format返回内容
"text"纯文本——去除 HTML 标签、脚本和样式
"markdown"整洁的 Markdown——使用 Obscura 原生 LP.getMarkdown CDP
"html"原始 HTML 标记
"links"所有 href 值——每行一个
"cookies"Cookie 信息,包括名称、值、域、路径和过期时间
"axtree"无障碍树——所有元素的角色、名称和值
"layout"视口指标——尺寸、滚动偏移量、设备缩放比例

提供 eval 时,JavaScript 的执行结果会追加到格式化输出中,并置于 --- eval --- 分隔符下方。


browse_interact — 单次页面操作

点击页面中的元素,或在页面中输入文本。对于多步骤交互(登录 → 等待 → 提取),请改用 browse_session。

参数类型默认值描述
urlstring—要访问的 URL
action"click" | "type"—要执行的操作
selectorstring—目标元素的 CSS 选择器
textstring—要输入的文本(当 action 为 "type" 时必填)
cookiesarray—要注入的 Cookie [{name, value, ...}]
stealthbooleantrue为兼容性而接受;隐身功能由 Obscura 服务控制

示例:

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")

这两种操作都会新建页面、执行操作并关闭页面。页面上下文不会保留——对于连续交互(在表单中输入内容,然后点击提交),请改用 browse_session。


browse_session — 多步骤持久会话

创建持久浏览器会话,在多次调用中与其交互,然后关闭。会话在闲置 5 分钟后自动关闭。可同时运行多个会话。

参数类型适用操作描述
action"create" | "close" | "list" | "goto" | "wait" | "extract" | "click" | "type"所有操作要执行的操作
session_idstring除 create、list 外的所有操作create 返回的会话 ID
urlstringcreate、goto要导航到的 URL
selectorstringwait、click、typeCSS 选择器
expressionstringwait(未提供选择器时)、extractJavaScript 表达式
textstringtype要输入的文本
timeoutnumberwait(可选)最大等待时间,单位为毫秒(默认值为 30000,最大值为 120000)
user_agentstringcreate、goto覆盖导航时使用的 user-agent 字符串
headersobjectcreate、goto额外的 HTTP 标头 {key: value, ...}
clear_cookiesbooleancreate创建会话时清除所有浏览器 Cookie

会话生命周期:

action操作说明返回值
create打开新的浏览器标签页。可选择清除 Cookie。会话 ID
close释放标签页及其所有资源。可重复调用。确认信息
list显示所有活动会话及其时间戳。会话列表
goto导航到新的 URL。页面保持活动状态。确认信息
wait轮询,直到 CSS 选择器存在或 JS 表达式返回 true。确认信息
extract执行 JavaScript 并返回结果。执行结果
click点击 CSS 选择器指定的元素。坐标
type在输入框中输入文本。确认信息

登录流程示例:

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")

浏览多篇文章示例:

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 — 并行批量抓取

使用相互隔离的工作进程同时抓取多个 URL。每个 URL 都由独立的无头浏览器工作进程处理——基于 Obscura 的原生 scrape 命令和 obscura-worker 构建。

参数类型默认值最大值描述
urlsstring[]—1000要并行抓取的 URL
evalstring——要在每个页面上执行的 JavaScript 表达式
concurrencynumber10100并行工作进程数
timeoutnumber60300每个工作进程的超时时间,单位为秒

示例:

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

输出格式(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
    }
  ]
}

发生错误(超时、网络故障等)时,每个 URL 的结果会包含 "error" 字段,而不是 "eval":

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

这是直接利用 Obscura 相较于无头 Chrome 的核心优势的工具:轻量级并行抓取,并内置隐匿功能。每个工作进程约占用 30 MB 内存,因此 100 个并发工作进程的内存占用低于单个 Chrome 实例。

配置

Claude Desktop / Cline / Continue / 任意 MCP 客户端
{
  "mcpServers": {
    "obscura-mcp": {
      "command": "obscura-mcp",
      "args": ["--transport", "stdio"]
    }
  }
}
VS Code(Cline 扩展)
{
  "servers": {
    "obscura-mcp": {
      "command": "obscura-mcp",
      "args": ["--transport", "stdio"]
    }
  }
}

全局安装 npm 后,obscura-mcp 会位于你的 PATH 中——无需使用绝对路径。

环境变量
变量默认值描述
OBSCURA_PATH—自定义 Obscura 二进制文件的路径
OBSCURA_STEALTH—启用隐身模式(反检测)
OBSCURA_PROXY—所有流量使用的代理 URL
OBSCURA_USER_AGENT—默认 User-Agent 覆盖值
MCP_HTTP_HOST127.0.0.1HTTP 传输主机
MCP_HTTP_PORT3000HTTP 传输端口
MCP_TRANSPORTstdio传输模式:stdio 或 streamable-http
OBSCURA_STARTUP_TIMEOUT_MS15000等待 Obscura CDP 启动的毫秒数
OBSCURA_NAVIGATION_WAIT_MS3000页面导航后等待的毫秒数
CDP_REQUEST_TIMEOUT_MS10000等待 CDP 响应的毫秒数

开发

使用 TypeScript 构建,编译到 dist/,并使用 Vitest 测试。

git clone https://github.com/Metadrama/obscura-mcp
cd obscura-mcp
npm install
npm run build
npm test

所有 36 个集成测试都针对真实的 Obscura 二进制文件运行(首次运行时自动下载)。测试使用 StdioClientTransport,涵盖每个工具、格式和操作。

为什么选择 Obscura?

  • 无需 Chrome — 纯 Rust 实现,无需 200 MB 的浏览器包
  • 原生支持 CDP — 直接公开 Chrome DevTools Protocol
  • 反检测 — 内置隐身功能,适用于具有反爬虫机制的网站
  • 体积小巧 — 二进制文件约 15 MB,启动仅需几毫秒

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。