Skip to main content
Glama

Steel MCP Server

License: MIT Node

为 Claude、Cursor、VS Code 或其他 MCP 客户端提供一个 Steel 管理的 Chromium 浏览器。使用
Steel 读取阻止简单 fetch 的页面、截图,或通过点击、键入和填写表单来处理交互式网站。

与 v1 的截图加编号框循环不同,v2 将页面读取为 markdown 或无障碍树,通过 MCP 图像块显示小截图(不依赖像素进行交互),并使浏览器会话显式化。

状态: 2.0.0-rc.8。在本地通过 stdio 运行服务器,或者自行运行托管的端点——它包含在包中,并在下文有文档说明。mcp.steel.dev 尚未上线。

示例提示

提示

结果

“阅读此页面并总结定价表。”

一次 steel_scrape。无浏览器会话,无需释放

“在三个商店中查找并比较此产品的价格。”

三次无状态读取,或一个会话(如果某个商店需要 JavaScript 渲染)

“登录我的账户并检查上个月发票上的总额。”

一个会话,一个快照,并允许你在登录墙处接管——服务器不会猜测密码

“用我的简历中的详细信息填写这个申请表。”

代理填写普通字段,然后 steel_session_handoff 让你在同一浏览器中选择本地简历

“为此文章顶部截图,用于幻灯片。”

一次 steel_screenshot,在资源足够小时内联显示,并始终提供下载链接

“展示我上次浏览器会话中发生了什么。”

steel_session_diagnostics 读取最近的已释放会话。不启动新浏览器或新会话

“回放我上次结束的浏览器会话。”

steel_session_replay 返回上次已结束会话的 Steel 仪表盘链接。不启动浏览器

Related MCP server: visual-inspector-mcp

它提供了什么

默认的 browse 配置文件包含十六个工具:

Tool

它做什么

steel_scrape

读取一个已预算页面及有界链接/元数据。不启动浏览器会话

steel_screenshot

捕获一个 URL(供人使用)或一个实时会话(供模型可见的视觉验证)的截图; URL 捕获支持代理

steel_pdf

将页面渲染为 PDF 并返回链接;支持代理

steel_session_create

启动一个你可以与之交互的浏览器会话

steel_session_release

关闭会话并停止计费

steel_navigate

将会话指向一个 URL

steel_snapshot

将页面读取为无障碍树,并带有 @eN 引用

steel_find

通过文本、安全正则表达式或角色定位元素,无需读取整个页面

steel_act

点击、输入、填写表单、选择、悬停、滚动、按键、返回、并关闭叠加层等操作

steel_wait_for

等待命名文本、选择器或 URL

steel_session_diagnostics

不启动浏览器,读取活动或重新发现此凭据的实时句柄

steel_session_handoff

暂停,因为你控制同一浏览器,然后将其返回给代理

steel_session_replay

在明确的观看/重放请求下,返回一个已结束会话的安全仪表盘链接

steel_batch

在一次调用中运行已知的可逆步骤,在登录、付款或最终确认前交接

steel_session_options

计划非默认设置,并安全发现已保存的配置文件 ID 或托管登录命名空间

steel_session_live_view

向内联查看器提供连接详情。宿主将其对模型隐藏

设置 STEEL_PROFILE=scrape 以只暴露三个无状态读取工具。它们从不启动会话。 默认的 browse 配置文件添加上面列出的十三种样本工具。

已保存的标识和非默认会话

使用一个绝对目标 URL、read、interact 或 account 目标以及任务明确要求的需求调用 steel_session_options。简单的读取仍然建议使用 steel_scrape。非默认计划会返回一个短期的签名 configuration 以用于 steel_session_options_create;该令牌绑定到当前 Steel 凭据,并在十分钟后过期。 当请求说“我的配置文件”、“已保存的登录”或“Steel 凭据”时,始终先发现账户选项,而不得猜测向导 UUID 或凭据命名空间。

{
  "url": "https://example.com/account",
  "goal": "account",
  "needs": ["persist_profile", "location"],
  "country": "DE"
}

账户目录仅暴露配置文件 UUID、状态,以及仅凭源确定的凭据命名空间/时间戳。存储的值、cookies、指纹、代理配置、用户名、密码和 TOTP 机密永远不进入模型上下文。按 UUID 选择一个 READY 配置文件并非来自猜测。加载配置文件是只读的,除非已显式计划 persist_profile,否则不会写入。对于持久化模式,Steel 在释放时创建或更新配置文件;它可能变为 UPLOADING 状态,然后变为 READY。通过此 MCP,不能同时让两个持久写入者同属于一个已有配置文件。托管登录使用返回的仅源定义的命名空间,并可自动提交匹配的表单。

STEEL_PROFILE=browse|scrape 选择服务器的工具预设,与保存的浏览器配置文件无关。配置文件发现、持久化、凭据、代理和 CAPTCHA 辅助是 Steel Cloud 功能;自托管措施会返回一个未支持功能的命名结果。

监视和接管

在支持 MCP 应用的宿主(如 Claude)上,steel_session_create 会在对话中内联运行浏览器。通过会话自己的 CDP 录屏将帧绘制到画布上。接管在点击、键入或滚动返回页面之前获得一个可续订的排他租约,使代理和解析用户不能同时交互。交还 返回所有权。在 steel_session_handoff 期间,之后通过接受挂起的交接提示;然后代理在继续前会重新读取页面。 聊天宿主为卡片而不是浏览器设置了内联视图,因此它请求其页面所需的高度并提供 全屏——在宿主允许的时提供;如果宿主不允许,则控件自动移除。

steel_session_handoff 调用该流程用于敏感信息、审查、人工输入、本地文件,或在你任何安静时接管。登录墙和 CAPTCHA 可以自动调用它。该工具返回 input_required,等待交还,并在代理继续前验证当前页面。支持 URL 引导的客户端在无内联应用可用时打开 Steel 外部播放器。

当你在内联查看器控制期间远程文件输入打开时,选择本地文件 会打开一个受信任的本地选择器。确认后,最多 5 MB 通过会话范围的浏览器套接字直接传入页面。模型和 MCP 服务器不接收本地路径或文件字节,并且文件不保存在 Steel 持久文件 API 中。无法内联视图的客户端会将本地上传报告为不可用,而不是假装它可以读取你的电脑。

对于一个已经结束的浏览器会话,明确要求观看或重放,并将 Steel 仪表盘 UID 传递给 steel_session_replay,或省略 UUID 选择最近的已释放会话。此版本返回一个受清理的 Steel 仪表盘链接。内联终了会话的回放被禁用,直到其浏览器资源可以不可变地托管,而无须扩大 MCP 应用的负载。

快速开始

Claude for macOS 或 Windows

构建桌面扩展并打开它——Claude 会安装该扩展,并提示输入你的 Steel API 密钥。无需其他配置,运行时也无需单独的 Node。

git clone https://github.com/steel-dev/steel-mcp-server.git
cd steel-mcp-server
npm install
npm run pack:mcpb
open "build/steel-mcp-$(node -p 'require("./package.json").version').mcpb"    # Windows: double-click it

在替换已安装的捆绑包时,要在安装器完成后完全退出并重新打开 Claude,再开始一个新对话,这样 Claude 会读取新的工具目录,而不是重新使用旧的。

Steel Cloud

需要 Node.js 20 或更新版本,以及一个 Steel API 密钥。它尚未发布到 npm,因此从源代码安装:

git clone https://github.com/steel-dev/steel-mcp-server.git
cd steel-mcp-server
npm install

npm install 也会构建服务器。要与 macOS 上的 Claude Desktop 一起使用,请将其添加到
~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "steel": {
      "command": "node",
      "args": ["/absolute/path/to/steel-mcp-server/dist/stdio.js"],
      "env": {
        "STEEL_API_KEY": "<your-steel-api-key>"
      }
    }
  }
}

或者使用 Claude Code:

claude mcp add steel -e STEEL_API_KEY=your-steel-api-key -- node "$PWD/dist/stdio.js"

自托管 steel-browser

运行 steel-browser 镜像,然后将服务器指向它。不需要 API 密钥,也不会发送:

{
  "mcpServers": {
    "steel": {
      "command": "node",
      "args": ["/absolute/path/to/steel-mcp-server/dist/stdio.js"],
      "env": {
        "STEEL_LOCAL": "true"
      }
    }
  }
}

对于 Claude Code,从克隆的 steel-mcp-server 目录运行:

claude mcp add steel -e STEEL_LOCAL=true -- node "$PWD/dist/stdio.js"

自托管 Steel 一次运行一种浏览器会话。它不支持 Steel 托管的代理、浏览器配置文件、托管凭据或 CAPTCHA 解决。服务器会为某工具请求云功能的行为返回特定解释。

配置

变量

默认值

含义

STEEL_API_KEY

—

Steel Cloud 必需。自托管部署时不会发送。

STEEL_LOCAL

false

true 时驱动本地 steel-browser 并免除 API 密钥。

STEEL_BASE_URL

https://api.steel.dev

Steel REST 基础 URL。末尾带 /v1 也可以。

STEEL_PROFILE

browse

scrape 或 browse。

STEEL_SESSION_TIMEOUT_MS

900000

默认的会话最长存活时间。创建请求可另选一个值,上限为 24 小时及账户上限。

STEEL_INACTIVITY_TIMEOUT_MS

600000

空闲释放时间。支持正常的交接/延续窗口,但闲置约 10 分钟后可能回收浏览器。

STEEL_MAX_SESSIONS

10

此服务器可同时持有的会话数。

STEEL_CONNECT_URL

wss://connect.steel.dev

CDP 端点。自托管时根据基础 URL 推导。

日志以结构化 JSON 输出到 stderr;stdout 只承载 JSON-RPC。

会话的存续同时受空闲超时和不可变的 expires_at 约束。仅有可见的查看者并不会保留会话。显式交接会暂停本地空闲回收,但只到硬性到期时间为止;真实的人类浏览器输入会重置 Steel 的空闲时钟。完成后请释放会话。

运行托管端点

托管入口需要两个默认安装故意不包含的包,这样桌面版或 npx 用户就不会携带托管栈:

npm install ioredis @modelcontextprotocol/node
# and, only if you want OTLP tracing:
npm install @opentelemetry/sdk-node @opentelemetry/exporter-trace-otlp-http

它们被声明为可选的 peerDependencies。源码检出已包含全部四个包,Docker 镜像也会自行安装它们。

node dist/hosted.js(或 npm run start:hosted)通过 Streamable HTTP 提供相同的工具,路径为 POST /mcp。每个调用者自带自己的 Steel 密钥,可通过 Authorization: Bearer 头或 ?apiKey= 查询参数传递——后者用于无法设置请求头的宿主。一个请求铸造的句柄只能由铸造它的凭证使用。GET /healthz 响应负载均衡器的探针,不检查 Host 允许列表。GET 和 DELETE 对 /mcp 返回 405,符合 2026-07-28 规范的要求。

变量

默认值

含义

STEEL_ALLOWED_HOSTS

—

必需。 此端点应答的逗号分隔主机名列表。没有它,DNS 重绑定就无从阻止,因此服务器拒绝启动。

STEEL_ALLOWED_ORIGINS

—

允许调用它的逗号分隔浏览器来源列表。为空则拒绝所有携带 Origin 的请求;不携带 Origin 的请求仍然通过。

PORT

8080

绑定的端口。0 让操作系统分配一个空闲端口。

HOST

0.0.0.0

绑定的地址。

REDIS_URL

—

在副本之间共享句柄记录,使任何副本都能服务另一个副本铸造的句柄。未设置时,记录只存在于进程内——仅适用于单副本部署。

REDIS_KEY_PREFIX

steel-mcp

键命名空间,使同一存储可容纳多个部署。

STEEL_REQUEST_STATE_SECRET

进程内

用于人工介入交接状态的 HMAC 密钥。设置 REDIS_URL 时必需,且所有副本必须相同:否则重试的交接会落到无法验证另一个副本铸造状态的副本上。用 openssl rand -base64 32 生成。

OTEL_EXPORTER_OTLP_ENDPOINT

—

任何标准的 OTEL_* 变量都会启用 OTLP 追踪;OTEL_SERVICE_NAME 默认为 steel-mcp。未设置则不加载任何导出器。

服务器本身不持有 Steel 密钥,因此自托管部署的职责是在其前面终止 TLS。托管日志以结构化 JSON 输出到 stdout,任何凭证在到达任何输出之前都会被脱敏。

docker-compose.yaml 可将该端点部署到任何支持 Compose 的主机,包括 Coolify:

STEEL_ALLOWED_HOSTS=mcp.example.com docker compose up -d --wait

它从本仓库构建镜像,并将 dist/hosted.js 设为默认命令——因为镜像自身的默认命令是 stdio 服务器——它不绑定任何端口,因此无法覆盖命令的平台会部署出一个永远无法通过健康检查的容器。请将代理指向 8080 端口(而非默认端口),并设置 STEEL_ALLOWED_HOSTS 为代理转发的公共主机名:任何其他 Host 都会被拒绝,而 /healthz 无论主机名如何都会应答,因此对 IP 的探针也能通过。

连接客户端

Claude Code 本身就能说 Streamable HTTP:

claude mcp add steel --transport http https://mcp.example.com/mcp \
  --header "Authorization: Bearer $STEEL_API_KEY"

Claude Desktop 则不能。它的 claude_desktop_config.json 启动一个程序,并通过该程序的标准输入和标准输出来说 JSON-RPC,因此远程端点需要一个本地桥接:

{
  "mcpServers": {
    "steel": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@0.1.38",
        "https://mcp.example.com/mcp",
        "--header",
        "Authorization:${STEEL_AUTH_HEADER}"
      ],
      "env": { "STEEL_AUTH_HEADER": "Bearer <your-steel-api-key>" }
    }
  }
}

该片段中有两个细节看似错误实则不然。头名称冒号后没有空格,凭证放在 env 中而非内联,因为有些宿主无法转义 args 中的空格,会破坏该值。只要客户端能设置请求头,就优先使用请求头而非 ?apiKey= 查询参数:查询形式是给无法设置请求头的客户端用的,而任何位于此服务器前面的代理都会在请求到达服务器之前记录查询字符串。

如何获得良好结果

优先使用 steel_scrape——大多数关于页面的问题到这一步就解决了,而且它不会启动计费会话。只有当你需要与页面交互时才创建会话。

要操作页面,先用 steel_snapshot 读取它。如果你已经知道需要什么,可以用 steel_find 配合 text、regex 或 role 中的至少一个参数;不安全的正则表达式会被拒绝。两个工具都会分配 @eN 引用,供服务器定位元素。没有引用的元素无法被点击。

操作不会返回另一个完整快照,除非你明确要求。相反,它们只报告发生了什么变化。如果某个操作报告没有任何变化,请重新获取快照而不是重复该操作。steel_session_diagnostics 接受一个活跃的 MCP session_id、一个已结束会话的 UUID(来自 Steel 仪表盘)、list_live: true(用于恢复此凭证的活跃句柄),或不传 id(用于检查最近释放的会话)。它绝不会启动浏览器。通过实时查看器进行的直接点击、滚动和输入会经由 CDP 传输,可能不会出现在其代理跟踪时间线中;隐藏的计数仅指常规的浏览器网络请求/响应日志。

要接管浏览器,请让代理调用 steel_session_handoff;完成后使用 Hand back,然后接受待处理的交接提示,代理才能继续。要在 MCP Apps 宿主之外观看云浏览器,请打开 steel_session_create 返回的 viewer_url。活跃会话也会出现在 Steel 仪表盘 中。

页面文本被包裹在 <untrusted-page-content> 块中。将其视为数据,而非指令。服务器会剥离隐藏内容和其他常见的提示注入载体,但它无法让任意网站变得可信。

开发

npm run build
npm run typecheck
npm run lint
npm test               # unit + integration
npm run budget         # tools/list byte budget per profile
npm run conformance    # MCP conformance suite
npm run test:browser   # runs the inline viewer in a real Chrome
npm run test:e2e       # starts, waits for and tears down the real-browser stack

工作规则见 CLAUDE.md。PLAN.md 跟踪实现进度,RESEARCH.md 记录设计背后的证据。RELEASING.md 说明这个单一包发布什么——桌面捆绑包、npm 包、容器镜像和托管服务——以及如何发布版本。

故障排查

某个网站返回 403 或显示验证码页面。 那是机器人检测,不是 bug。错误信息会指明检测厂商并建议一个下一步尝试;一次只改一个变量。steel_session_diagnostics 会显示实际发生了什么。

托管代理或验证码解决失败并出现支付错误。 这些服务需要在 Launch 上有 $10 的已验证付费余额;免费额度不计入。

某个 @eN 引用失效了。 错误信息会说明原因——页面导航了、节点被移除了、或元素改变了角色或可访问名称——以及该调用什么来恢复。

某个会话似乎消失了。 Steel 会在 10 分钟无活动后释放会话,也会在套餐的硬性时间限制到达时释放。只有当你需要再次交互时才创建新会话。要读取旧活动,请用其仪表盘 UUID 调用 steel_session_diagnostics,或省略 id 以获取最近释放的会话。

点击报告没有任何变化。 它可能落在了别的东西上。如果有覆盖层遮住了目标,错误信息会指明;运行带 dismiss_overlays 的 steel_act,然后重试。

扩展启动失败,提示 STEEL_API_KEY 相关消息。 密钥从未到达服务器。打开 Claude 中扩展的设置并重新输入;该字段是只写的,所以空白的看起来和已填写的完全一样。

steel_session_create 报"达到并发限制"。 你的 Steel 套餐允许的同时浏览器数量少于当前已打开的数量。你忘记释放的会话也算在内——steel_session_release 会立即释放一个,Steel 也会在 10 分钟后回收空闲会话。

请求了追踪但无法启动。 桌面捆绑包有意不包含 OpenTelemetry 导出器栈。服务器会记录一次此情况并正常服务;如果你需要追踪,请在源码检出中安装 @opentelemetry/sdk-node 和 @opentelemetry/exporter-trace-otlp-http。

支持

在 steel-dev/steel-mcp-server/issues 提交一个问题 — 包括你调用的工具和错误文本。对于任何与安全相关的内容,请遵循 SECURITY.md,而不是提交公开问题。

隐私

服务器本身不持有任何数据。它将工具调用所指定的 URL 和页面交互发送给 Steel,由 Steel 运行浏览器,并返回页面所说的内容。页面内容会传递到你的 MCP 客户端,并且不会被存储、被记录或转发到任何其他地方;密码和凭据在任何内容到达日志之前都会被删除。不会收集任何关于你对话的信息,并且除非你用标准的 OTEL_* 变量配置一个,否则不会加载任何遥测导出器。

Steel 对其运行的浏览器会话的处理由 Steel 隐私政策 涵盖。

贡献

欢迎贡献。本项目遵循 TDD:先编写失败的测试。完整规则请参阅 CLAUDE.md。

  1. Fork 仓库

  2. 创建功能分支

  3. 提交带有清晰描述和动机的拉取请求

免责声明

网页可能包含提示注入,过滤无法消除每一个。审查可能提交数据、进行购买或更改账户的浏览器操作。威胁模型和当前的缓解措施记录在 RESEARCH.md §7 中。

Maintenance

ActivityStale
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    An MCP server that enables AI assistants to visually inspect and interact with rendered web pages via a persistent headless Chromium browser, supporting navigation, screenshots, clicks, viewport resizing, and console log retrieval.
    8
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server that wraps agent-browser to let LLMs control a real browser, providing tools for navigation, interaction, reading page content, accessibility snapshots, screenshots, and session management.
    1
    -
  • A
    license
    A
    quality
    B
    maintenance
    Browser automation MCP server that uses a real browser to give agents eyes and hands—open pages, click, fill, screenshot, and run scripts via accessibility-tree snapshots.
    22
    10 npm
    MIT