Sendblue Browser Mcp

io.github.sendblue-api由 GitHub 账号 sendblue-api 发布v0.2.3更新于 Oct 24, 2026

Drive a stealth-patched Chromium daemon: navigate, screenshot, eval JS, attach over CDP.

已验证STDIO仅桌面浏览器自动化开发者工具

概览

AI 生成的概览

为隐身补丁版 Chromium 守护进程提供 MCP 封装:让助手创建浏览器会话、导航、截图、执行页面 JavaScript 并通过 CDP 接入。

可以做什么
  • 创建、列出、查看和删除命名浏览器会话,含可保留登录状态的持久化配置
  • 导航页面并截图,可按策略自动保存导航截图
  • 在页面上下文中执行 JavaScript 并读取控制台消息
  • 读取和写入 Cookie,并在保留会话 id 的前提下清除 Cookie 与存储
  • 为非持久化会话获取 CDP 地址,供 Playwright、Puppeteer 等 CDP 客户端接入
  • 查询守护进程健康状态与版本
适用场景
适合助手需要驱动真实浏览器来测试或调试自有网页流程、跨多次运行复用已登录会话,或把浏览器交给其他 CDP 客户端时使用。定位是调试与测试,而非大规模抓取。
运行要求
通过 npx 以 stdio 在本地运行,但需要另行启动 sendblue-browser-use 守护进程(Bun 1.3+ 与 Node.js 20+,或 Docker),并通过 BROWSER_USE_URL 指向它。守护进程须以与 BROWSER_USE_API_KEY 相同的令牌启动;除健康检查外所有接口都需要该 Bearer 令牌。
安装前请注意
BROWSER_USE_API_KEY 是守护进程唯一的访问门槛,等同于本地浏览器与网络控制权,可访问 localhost 和私有网络服务,切勿外泄。脚本工具会在页面中执行任意 JavaScript,会话可写入 Cookie 并清除存储。将 HTTP 或 CDP 端口暴露到回环地址之外等于开放浏览器内远程代码执行。持久化配置与截图会写入磁盘。

安装

在 SourceWeft 中

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

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

其他 MCP 客户端

参照 仓库 中的启动说明。

README

sendblue-browser-use

A standalone debug browser for agents. Stealth-patched Chromium behind a tiny HTTP API, with persistent named sessions, an easy purge endpoint, configurable auto screenshots, and CDP attach so any client (Playwright, Puppeteer, undetected-chromedriver, custom scripts) can drive it.

It runs as its own process — not tied to any one Claude / Cursor / Codex session — so multiple agents can share it concurrently, debug each other's flows, and reuse a logged-in session without paying the auth tax every run.

Why this exists

NeedWhat you get
Not coupled to a single agentLong-running HTTP daemon. Any tool with a bearer token can drive it.
Doesn't look automatedChromium patched via patchright: navigator.webdriver is hidden, CDP detection vectors are patched, real Chromium binary (no Playwright fingerprints). Passes typical Cloudflare Turnstile and similar low-friction checks; not for hostile scraping at scale.
Reusable sessionsNamed persistent profiles. Log in once, every subsequent debug run reuses the cookies.
One-click resetPOST /sessions/:name/purge clears cookies + active-page storage but keeps the session id, so your client code keeps working.
Multi-agent friendlyEach session is an isolated BrowserContext (or its own profile). Run 5+ debug sessions in parallel without state bleed.
CDP attachGET /sessions/:name/cdp-url returns the shared browser CDP URL for non-persistent sessions, so Playwright / Puppeteer / any CDP client can connect() to the debug browser.
Auto evidenceNavigation screenshots follow NAV_SCREENSHOT_POLICY (default: headless only). Optional Playwright traces.
HTTP-controlledPlain curl works. No SDK required.
Self-contained deployOne docker compose up on any Mac mini / EC2 / Codespace. No host Chromium needed.

Quick start (local)

Prereqs: Bun >=1.3 and Node.js >=20 on your PATH.

sh
git clone https://github.com/sendblue-api/sendblue-browser-use.gitcd sendblue-browser-usebun installbun --bun x patchright install chromium
cp .env.example .env# generate and set the required tokenTOKEN="$(openssl rand -hex 32)"sed -i.bak "s/^BROWSER_USE_API_KEY=.*/BROWSER_USE_API_KEY=$TOKEN/" .envrm .env.bak
bun run dev

Then in another terminal:

sh
source .envTOKEN="Authorization: Bearer $BROWSER_USE_API_KEY"
# 1. create a persistent session (log in here once, reuse it forever)curl -s -X POST http://127.0.0.1:8787/sessions \  -H "$TOKEN" -H "Content-Type: application/json" \  -d '{"name":"qa","persistent":true}'
# 2. navigatecurl -s -X POST http://127.0.0.1:8787/sessions/qa/navigate \  -H "$TOKEN" -H "Content-Type: application/json" \  -d '{"url":"https://trybloom.so/"}'
# 3. screenshotcurl -s http://127.0.0.1:8787/sessions/qa/screenshot?fullPage=true \  -H "$TOKEN" -o /tmp/qa.png
# 4. wipe state without losing the sessioncurl -s -X POST http://127.0.0.1:8787/sessions/qa/purge -H "$TOKEN"

Quick start (Docker)

sh
echo "BROWSER_USE_API_KEY=$(openssl rand -hex 32)" > .envdocker compose up -d

Same API, exposed on 127.0.0.1:8787. Data persists in ./data/. CDP stays loopback-only inside the container by default; to attach CDP from the host, uncomment CDP_BIND and the 127.0.0.1:9222:9222 port mapping in docker-compose.yml on a trusted machine only.

Install into your agent

The repo ships three packaging layers so any agent can drive the daemon with one line of config.

MCP (Claude Desktop, Codex, Cursor, Antigravity, Cline, Windsurf)

The cross-agent path. Wraps the HTTP API as MCP tools (health, create_session, navigate, screenshot, script, get_cdp_url, purge_session, etc).

json
{  "mcpServers": {    "sendblue-browser": {      "command": "npx",      "args": ["-y", "[email protected]"],      "env": {        "BROWSER_USE_URL": "http://127.0.0.1:8787",        "BROWSER_USE_API_KEY": "<same token you start the daemon with>"      }    }  }}

Drop into ~/.cursor/mcp.json, ~/Library/Application Support/Claude/claude_desktop_config.json, ~/.gemini/config/mcp_config.json, etc. For Codex:

sh
codex mcp add sendblue-browser \  --env BROWSER_USE_URL=http://127.0.0.1:8787 \  --env BROWSER_USE_API_KEY=<daemon-token> \  -- npx -y [email protected]

Wrapper source: mcp/.

Claude Code plugin

/plugin install sendblue-api/sendblue-browser-use

Pulls .claude-plugin/plugin.json + skills/sendblue-browser/SKILL.md from this repo.

Codex / Antigravity / Cline skill

The same skills/sendblue-browser/SKILL.md works as a skill across Codex, Google Antigravity, and Cline. Copy the folder into:

AgentPath
Codex~/.codex/skills/sendblue-browser/
Antigravity~/.gemini/skills/sendblue-browser/
Clineenable Skills in Settings, then drop in its skills directory

AGENTS.md repos

If your repo already follows the agents.md convention, the AGENTS.md in this repo doubles as a copy-pasteable section for any consumer repo that wants to call this daemon.

API

All routes require Authorization: Bearer $BROWSER_USE_API_KEY except /health.

MethodPathBody / QueryReturns
GET/health—{ ok, service, version, sessions, defaultHeadless, navScreenshotPolicy }
GET/sessions—{ sessions: [...] }
POST/sessions{ name, persistent?, headless?, viewport?, userAgent?, locale?, timezone?, traces?, proxy? }{ session }
GET/sessions/:name—session info + current page url/title
POST/sessions/:name/purge—{ session } — clear cookies + active-origin storage, keep session id
DELETE/sessions/:name—{ ok } — close context, remove profile
POST/sessions/:name/navigate{ url, waitUntil?, timeoutMs? }{ url, title, status }
GET/sessions/:name/screenshot?fullPage=true&selector=...image/png
POST/sessions/:name/script{ code, timeoutMs? } (≤200kB){ result } — code runs in page context
GET/sessions/:name/cookies?url=...{ cookies }
POST/sessions/:name/cookies{ cookies: [...] }{ ok }
GET/sessions/:name/console?limit=100{ messages: [...] } (ring buffer)
GET/sessions/:name/cdp-url—{ cdpUrl, targetId } — for non-persistent sessions only

POST /sessions/:name/script passes code directly to Playwright's page.evaluate. Send a JavaScript expression, or wrap statements in an IIFE. Scripts time out after 30s by default; pass timeoutMs up to 120000, or 0 to disable the request timeout.

json
{ "code": "(() => { const x = 1; return x; })()" }

Errors

All non-2xx responses share the same envelope. Failures from Playwright are truncated to one line before being returned; the full message is logged server-side with proxy credentials redacted.

json
{ "error": { "code": "navigate_failed", "message": "net::ERR_NAME_NOT_RESOLVED" } }
StatusCodeMeaning
400empty_bodyrequest body is required but was missing
400malformed_jsonbody was not valid JSON
400invalid_bodybody failed Zod validation (see error.details)
401unauthorizedmissing or wrong bearer token
404not_foundsession does not exist
409already_existsa session with that name is already running
409cdp_unavailable_for_persistent_sessionpersistent sessions don't expose the shared CDP url
422script_failed/script request was valid but the in-page eval threw or timed out
500internal_errorunexpected — check server logs
502navigate_failed screenshot_failed cookie_read_failed cookie_write_failed session_unreachableChromium-side failure

Session options

ts
{  name: string;            // required, [a-z0-9_-]  persistent?: boolean;    // default true — profile data survives restarts  headless?: boolean | "new"; // persistent sessions only; non-persistent uses DEFAULT_HEADLESS  viewport?: { width, height };  userAgent?: string;  locale?: string;         // default "en-US"  timezone?: string;  traces?: boolean;        // capture a Playwright trace.zip on session close  proxy?: { server, username?, password?, bypass? };}

Cookie shape

POST /sessions/:name/cookies accepts up to 500 Playwright-style cookies:

ts
{  cookies: Array<{    name: string;    value: string;    url?: string;       // absolute URL, or domain + path    domain?: string;    path?: string;    expires?: number;    httpOnly?: boolean;    secure?: boolean;    sameSite?: "Strict" | "Lax" | "None";  }>;}

Each cookie must include either url or both domain and path.

Persistent vs non-persistent

  • persistent: true (default) — cookies, localStorage, IndexedDB persist under ~/.sendblue-browser-use/profiles/<name>/. After a daemon restart, recreate the same named persistent session to reuse that profile. CDP attach is not available for these sessions because each gets its own private browser instance.
  • persistent: false — shares the central Chromium process via a fresh BrowserContext. State is in-memory only. CDP attach IS available via /sessions/:name/cdp-url, which returns the shared browser-level CDP endpoint plus a targetId for the session page. CDP clients can see the shared debug browser, so keep the CDP port local and trusted and select the returned target before driving.

Pick persistent for "log in once, debug for a week" workflows. Pick non-persistent when you need to attach Playwright / Puppeteer directly.

Examples

Stealth notes

This is built on patchright, a maintained fork of Playwright that:

  • Hides navigator.webdriver
  • Removes CDP runtime markers
  • Drops Playwright-specific extensions and command flags
  • Uses real Chromium so most fingerprint surfaces match a normal user

We deliberately do not pass --disable-blink-features=AutomationControlled or override userAgent/viewport by default — patchright handles those internally and our overrides would defeat its rebrowser patches. Pass an explicit userAgent per session only if you have a reason.

Why patchright over alternatives:

  • vs nodriver / undetected-playwright — patchright is actively maintained, matches Playwright's API surface, and integrates cleanly with the existing TypeScript ecosystem.
  • vs Camoufox — Camoufox uses Firefox with deeper fingerprint randomization, better for hostile scraping at scale. patchright is the right pick for QAing your own auth flows (Clerk, Stripe, Google OAuth, Cloudflare Turnstile) without the maintenance burden.

Storage

~/.sendblue-browser-use/├── profiles/│   └── <session>/          # persistent profile dir└── runs/    └── <session>/        ├── 2026-05-25T...-nav.png   # automatic nav screenshot when policy enables it        └── 2026-05-25T...-trace.zip # if traces:true at create

POST /sessions/:name/purge clears cookies and permissions context-wide, then clears localStorage, sessionStorage, IndexedDB, ServiceWorker registrations, CacheStorage, and the console buffer for currently open pages/origins. It does not enumerate every historical origin in a persistent profile, does not delete the on-disk profile (so the session id stays valid), and does not clear browser-level HTTP cache or HSTS state. To wipe the profile too, DELETE /sessions/:name and recreate.

Automatic navigation screenshots follow NAV_SCREENSHOT_POLICY:

  • headless (default): only effective-headless sessions write *-nav.png, avoiding visible capture flicker in headed browsers.
  • always: preserve legacy behavior and capture every navigation, including headed sessions.
  • off: disable automatic navigation screenshots.

Auto-screenshots are capped at MAX_NAV_SCREENSHOTS per session (default 200, oldest deleted first). Set MAX_NAV_SCREENSHOTS=0 to disable automatic screenshots entirely. Call /screenshot explicitly when you need evidence from a headed browser.

Security

  • The HTTP API binds to 127.0.0.1 by default. Setting BIND=0.0.0.0 exposes you to your LAN — put a reverse proxy with auth in front before doing this. The Docker image sets BIND=0.0.0.0 so host port-publishing works, but docker-compose.yml publishes only to 127.0.0.1. If you docker run -p 8787:8787 directly, you are choosing to expose the HTTP API.
  • CDP is bound to CDP_BIND (default 127.0.0.1; the Docker image default is also loopback-only). The default docker-compose.yml does not publish CDP; if you opt into host CDP attach, publish it to 127.0.0.1 only. Anyone who can reach this port gets full in-browser RCE — keep it on loopback.
  • POST /sessions/:name/script runs arbitrary JS in the page context. The bearer token is the only gate. Don't share the token.
  • Treat the bearer token as local browser/network control. A token holder can navigate Chromium to any http(s) URL reachable from the daemon host, including localhost and private-network services.
  • POST /sessions/:name/navigate only accepts http(s) URLs — file://, chrome://, etc. are rejected.
  • Healthcheck (GET /health) is public so Docker/k8s probes work without a token; it returns service metadata only.

Architecture

HTTP :8787  ──►  Hono router  ──►  session manager  ──►  patchright Chromium                                    │                    └─►  CDP :9222 (loopback; Docker opt-in)                                    └─►  on-disk profiles + runs

Inspired by the Sendblue channel-server pattern (Bun + Hono + bearer auth + simple HTTP surface).

License

MIT. See LICENSE.

来源:README.md,提交 1175379

工具

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

版本历史

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

评分

已满足适用检查项的 50%

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

  • 近 30 天内可连通25 分

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

  • 已声明认证方式10 分

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

  • 已列出工具15 分

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

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