Skip to main content
Glama

功能特性

  • 浏览器自动化:导航、点击、输入、填写表单以及执行 JavaScript

  • 默认轻量:内存占用约为 Chromium 的 1/5,快照体积比原始 HTML 小约 25 倍

  • 页面快照:生成紧凑的 YAML 无障碍树快照,带有唯一节点 ID,便于精确定位元素

  • 针对 LLM 优化的上下文:快照仅保留语义核心内容,大幅降低上下文占用,让您能在相同的窗口内处理更多页面和更长的会话

  • 可配置的回退浏览器:双层模型——优先使用轻量浏览器,仅在默认浏览器被检测为机器人、崩溃或超时时,才升级到 有头 Chrome、Browserless 或 Browserbase 云浏览器

  • 速率限制:保持低调。对特定域名的请求强制执行可配置的最小延迟间隔,支持通配符模式(*、*.reddit.com),并可选择添加随机抖动,让您的代理自行控制节奏,而不是被目标网站的反爬机制拦截

  • 代理支持:通过单个 PROXY_SERVER 设置即可将所有请求路由到 HTTP 代理——自动应用于两个浏览器层,确保您的真实 IP 永远不会暴露给目标站点。支持内联基本认证(http://user:pass@host:port)

  • 强大的会话管理:支持按会话序列化、可选的会话上限(MAX_SESSIONS)、会话中途崩溃恢复及历史重放,以及优雅关闭

  • 会话管理:通过唯一会话 ID 在多个操作之间复用会话

  • 跨平台:支持 Linux 和 macOS,并可在需要时配置真实浏览器作为回退方案

Related MCP server: opencode-browser-control

基准测试

SlimAtlas 使用 slim-atlas-bench 与 Playwright MCP(无头和有头 Chromium)进行了对比基准测试——涵盖 5 个类别的 25 个真实网站,每个运行 3 次(共 225 次),全部在 Docker 中运行。

测试设置:每个服务作为 MCP 服务器运行在自己的 Docker 容器中。基准测试工具通过 langchain-mcp-adapters 测量每次工具调用的延迟(导航 + 快照),并通过 Docker stats API 捕获容器内存。快照令牌数按约 4 字符/令牌估算(与原始 HTML 基线采用相同方法)。

指标(中位数)

SlimAtlas

Playwright 无头

Playwright 有头

导航 + 快照(毫秒)

1,383

1,116

687

容器内存(MB)

124

635

815

快照令牌数

414

940

1,843

SlimAtlas 以导航速度换取显著更低的内存占用。Chrome 在页面加载方面更快,但内存占用高出 5–6 倍,每个快照产生的令牌数多出 2–4 倍——这两项正是代理大规模运行时的主要成本。

结果

安装

需要 Bun ≥1.1。

# Install dependencies
bun install

浏览器二进制文件会在首次运行时自动下载。

回退浏览器:第 1 层始终是轻量浏览器。第 2 层由 FALLBACK_BROWSER 决定——可选值为 headful(有头 Chrome)、browserbase(云浏览器)、browserless(云浏览器)或 none(默认,无回退)。当默认浏览器崩溃、超时或被检测为机器人时,会话会切换到配置的回退浏览器。Chrome 由 Puppeteer 内置;Browserbase/Browserless 需要 API 凭据(见下文)。

使用方法

运行 MCP 服务器

# Standalone HTTP server (default)
bun run src/index.ts --port=8080

# Remote, authenticated
MCP_AUTH_TOKEN=s3cret bun run src/index.ts --host=0.0.0.0 --port=8080

SlimAtlas 暴露一个单一的 Streamable HTTP /mcp 端点。每个客户端通过 mcp-session-id 请求头获得自己的会话;MAX_SESSIONS 限制并发会话数。将您的 MCP 客户端指向它:

{
  "mcpServers": {
    "slimatlas": {
      "url": "http://localhost:8080/mcp",
      "transport": "http"
    }
  }
}

使用认证:

{
  "mcpServers": {
    "slimatlas": {
      "url": "http://your-host:8080/mcp",
      "transport": "http",
      "headers": { "Authorization": "Bearer s3cret" }
    }
  }
}

提示:使用 --host=0.0.0.0 可远程暴露服务,但此时务必设置 MCP_AUTH_TOKEN。服务器仅支持纯 HTTP——请在前面部署 TLS 终止(Caddy/nginx),否则 Bearer 令牌将以明文在网络中传输。

Docker

镜像在构建时已捆绑 Lightpanda 二进制文件,因此容器启动时完全自包含,无需重新下载:

docker build -t slimatlas .
docker run -p 8080:8080 -e MCP_AUTH_TOKEN=s3cret slimatlas
# -> http://localhost:8080/mcp

固定 Lightpanda 版本以获得可复现的构建(可使用任意 lightpanda-io/browser 标签——默认为 nightly):

docker build --build-arg LIGHTPANDA_VERSION=0.3.3 -t slimatlas:0.3.3 .

多架构自动处理——构建脚本通过 uname -m 检测容器架构(x86_64 → lightpanda-x86_64-linux,aarch64 → lightpanda-aarch64-linux),确保二进制文件始终与运行平台匹配。

Apple Silicon(M 系列 Mac):请传入 --platform linux/arm64 以原生构建/运行。否则 Docker Desktop 可能默认使用 amd64,导致容器在 Rosetta 下运行,从而无法启动 Lightpanda 二进制文件(rosetta error: failed to open elf …)。

docker build --platform linux/arm64 --build-arg FALLBACK_BROWSER=headful -t slimatlas .
docker run --platform linux/arm64 --name slimatlas -p 8080:8080 -e MCP_AUTH_TOKEN=s3cret -e LIGHTPANDA_POOL_SIZE=10 -e CHROME_POOL_SIZE=10 slimatlas

有头回退变体。默认镜像仅运行 Lightpanda(FALLBACK_BROWSER=none)。如需启用有头 Chrome 回退(仅当您在运行时设置 FALLBACK_BROWSER=headful 时才需要),请构建有头变体——它会额外安装 Chrome 运行时库和 Xvfb(约增加 150MB),并预设 FALLBACK_BROWSER=headful:

docker build --build-arg LIGHTPANDA_VERSION=0.3.3 FALLBACK_BROWSER=headful -t slimatlas:headful .
docker run -p 8080:8080 -e MCP_AUTH_TOKEN=s3cret slimatlas:headful

Xvfb 会在第一个需要升级到有头 Chrome 的会话时在容器内延迟启动——无需入口点或手动执行 xvfb-run。

Stdio 模式

对于以子进程方式启动服务器的 MCP 客户端(本地、单客户端),请使用 stdio 传输:

bun run src/index.ts
{
  "mcpServers": {
    "slimatlas": {
      "command": "bun",
      "args": ["run", "path/to/mcp/src/index.ts"]
    }
  }
}

配置

添加到您的 MCP 客户端配置中:

{
  "mcpServers": {
    "slimatlas": {
      "command": "bun",
      "args": ["run", "path/to/mcp/src/index.ts"]
    }
  }
}

提示:设置 FALLBACK_BROWSER=none 可仅使用轻量浏览器并如实传递错误。使用 headful 或 browserbase 可启用真实浏览器回退。

有关所有环境变量和 CLI 标志,请参阅 docs/configs.md。

回退浏览器

FALLBACK_BROWSER

第 2 层浏览器

说明

none(默认)

—

仅使用轻量浏览器;错误如实传递

headful

有头 Chrome

在 macOS 上显示真实窗口;在无头 Linux 上需要 xvfb

browserbase

Browserbase 云

需要 BROWSERBASE_API_KEY + BROWSERBASE_PROJECT_ID

使用 SKIP_LIGHTPANDA_DOMAINS 跳过已知高难度域名的默认浏览器(逗号分隔,支持子域名匹配)。匹配的主机将直接在回退浏览器上启动。需要 FALLBACK_BROWSER != none(否则该列表将被忽略并发出警告)。

速率限制

为您的代理提供礼貌、防检测的节奏控制。RateLimiter 在服务器范围内对您列出的域名强制执行 browser_navigate 调用之间的最小延迟,并支持可选的随机抖动,使调用节奏不是固定的、可被指纹识别的间隔。限流桶按主机维度在所有会话之间共享(因为目标站点看到的是您的 IP,而不是您的会话),模式支持通配符:

模式

匹配范围

限流桶

*

所有主机

每个主机独立限流

*.reddit.com

仅子域名(www.reddit.com、old.reddit.com)——不包括 reddit.com

所有匹配的子域名共享一个限流桶

g2.com

g2.com 及其子域名

主域名 + 子域名共享一个限流桶

默认禁用。通过设置非空域名列表且非零延迟来启用:

# Via CLI flags
bun run src/index.ts --rate-limit-domains=*.reddit.com,g2.com --rate-limit-min-delay-ms=2000 --rate-limit-jitter-ms=1500

# Or via environment / .env
RATE_LIMIT_DOMAINS=*.reddit.com,g2.com
RATE_LIMIT_MIN_DELAY_MS=2000
RATE_LIMIT_JITTER_MS=1500

代理

保护您的真实 IP 不暴露给目标站点。设置一个 PROXY_SERVER,SlimAtlas 会将两个浏览器层的所有 HTTP 流量都路由到该代理——无需逐浏览器单独配置:

  • 轻量浏览器(第 1 层)——通过其原生 --http-proxy 标志转发。

  • Chrome 回退(第 2 层)——启动时通过 --proxy-server 应用。

# Via CLI flag
bun run src/index.ts --proxy-server=http://host:8080

# Or via environment / .env
PROXY_SERVER=http://user:pass@host:8080

轻量浏览器层支持内联基本认证(http://user:pass@host:port)。对于 IP 白名单代理(无需凭据),两层均可直接使用。(通过 page.authenticate 实现按页面 Chrome 认证的功能已在路线图中。)

CLI 标志

每个环境变量也可以作为小写 CLI 标志以 --flag=value 形式传入。CLI 标志优先于环境变量。未知标志会导致服务器在启动时退出。完整列表请参阅 docs/configs.md。

bun run src/index.ts --fallback-browser=headful --lightpanda-pool-size=3 --skip-lightpanda-domains=g2.com --navigate-timeout=60000

要从 MCP 客户端使用标志,请将其附加到 args 数组中:

{
  "mcpServers": {
    "slimatlas": {
      "command": "bun",
      "args": [
        "run",
        "path/to/mcp/src/index.ts",
        "--fallback-browser=headful",
        "--skip-lightpanda-domains=g2.com,linkedin.com",
        "--chrome-pool-size=3"
      ]
    }
  }
}

使用工作流

# Example: Navigate, snapshot, and interact with a page

# 1. Navigate to a URL (creates a new session automatically)
result = mcp.call("browser_navigate", {"url": "https://example.com"})
# Returns: session_id: abc1, result: Navigated to https://example.com. Title: Example Domain

# 2. Take a snapshot to see the page structure
snapshot = mcp.call("browser_snapshot", {"session_id": "abc1"})
# Returns YAML with node IDs like: 0: {type: div, children: ...}

# 3. Click a node by ID (from the snapshot)
mcp.call("browser_click", {"session_id": "abc1", "nodeId": 2})

# 4. Type into a search box
mcp.call("browser_type", {"session_id": "abc1", "nodeId": 5, "text": "search query"})

# 5. Close the session when done
mcp.call("browser_close", {"session_id": "abc1"})

可用工具

Tool

Description

Value

browser_navigate

使用可配置的等待策略导航到 URL

所有 Web 交互的入口点。支持 load、domcontentloaded、networkidle0、networkidle2

browser_snapshot

获取带有唯一节点 ID 的 YAML 可访问性树

结构化的页面表示,非常适合 LLM 理解。节点 ID 可实现点击/输入的精确目标定位

browser_view_node

按 ID 查看特定节点内容(文本或图像)

无需完整重读页面即可检查单个元素。以 base64 形式返回图像,用于视觉验证

browser_click

按节点 ID 或 CSS 选择器点击元素

建议使用(来自快照的)节点 ID 而非 CSS 选择器,以提高可靠性和简单性

browser_type

向元素输入文本,可设置按键延迟

模拟人类输入。用于搜索框、表单和文本输入

browser_fill

立即用值填充输入元素

对于表单字段,比 browser_type 更快。填充前会清除现有值

browser_go_back

在浏览器历史记录中向后导航

对于多步骤工作流和纠正导航错误至关重要

browser_go_forward

在浏览器历史记录中向前导航

与 browser_go_back 互补,实现双向导航

browser_reload

重新加载当前页面

刷新动态内容或从过期的页面状态中恢复

browser_get_page_info

获取当前页面的 URL 和标题

快速验证导航成功和当前上下文的简便方法

browser_close

关闭浏览器会话并释放资源

对清理很重要。会话会在超时后自动关闭,但建议显式关闭

运行测试

# Run all tests
bun test

# Run tests in watch mode
bun test --watch

要求

  • Bun ≥1.1

  • Linux 或 macOS(自动下载)或 Chrome/Chromium(备用)

许可证

MIT

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers