关于 Steel MCP Server
Steel MCP Server 是一个 MCP 服务,让 Claude、Cursor 等 MCP 客户端通过 Steel 托管的云端 Chrome 浏览网页。适合需要读取受限页面、填写表单或截图的用户,并可在登录或验证码处将浏览器交给人工接管。
主要功能
- 01读取被普通 fetch 拦截的页面
- 02基于无障碍树的元素引用操作
- 03截图与 PDF 导出
- 04会话诊断与人工接管
- 05提示注入内容过滤与凭据脱敏
适用场景
- 01读取页面并总结价格表
- 02在多个商店之间比较商品价格
- 03登录账户后查看账单并交由人工处理验证码
- 04填写申请表并在本地选择附件
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Steel MCP Server
让 Claude、Cursor 或任何 MCP 客户端都能使用云端真实的 Chrome。读取会阻止普通 fetch 的网页、填写表单、截取屏幕截图;遇到需要人工处理的登录或 CAPTCHA 时,还可以把浏览器交给用户。浏览器由 Steel 运行。
状态: 3.0.0。从 Releases 下载。
此项目尚未发布到 npm。mcp.steel.dev 目前尚未上线。
安装
你需要一个 Steel API 密钥。免费套餐足以供你试用。
Claude for macOS or Windows
下载 steel-mcp-2.0.1.mcpb
并打开。Claude 会安装它并要求你提供 Steel API 密钥。无需安装 Node。
替换已安装的软件包后,请等安装程序完成,再退出并重新打开 Claude,然后开始新对话,以便 Claude 读取新的工具目录。
Claude Code
claude mcp add steel -e STEEL_API_KEY=your-steel-api-key -- npx -y github:steel-dev/steel-mcp-server
首次运行时会克隆并构建服务,大约需要一分钟。之后运行会立即启动。
Cursor、VS Code 和其他 MCP 客户端
将以下内容添加到客户端的 MCP 配置中:
{
"mcpServers": {
"steel": {
"command": "npx",
"args": ["-y", "github:steel-dev/steel-mcp-server"],
"env": { "STEEL_API_KEY": "<your-steel-api-key>" }
}
}
}
如果要从本地检出目录运行,npm install 会构建服务;将 command 指向 node,并将 args 指向 /absolute/path/to/steel-mcp-server/dist/stdio.js。
自托管 steel-browser
运行 steel-browser 镜像,并设置 STEEL_LOCAL=true,而不是使用 API 密钥。无需密钥,也不会发送密钥。自托管 Steel 一次只运行一个浏览器会话,不提供托管代理、浏览器配置文件、托管凭据或 CAPTCHA 求解功能;请求这些功能的工具会给出明确说明。
团队共享端点
dist/hosted.js 通过 Streamable HTTP 提供相同的工具,每位调用者使用自己的 Steel 密钥。Claude Code 可直接连接;Claude Desktop 需要 mcp-remote 桥接程序。部署、Redis、追踪和客户端代码示例见 docs/HOSTING.md。
你可以提出的请求
| 请求 | 处理方式 |
|---|---|
| “读取此网页并总结价格表。” | 调用一次 steel_scrape。无需浏览器会话,也无需释放资源 |
| “比较这款产品在这三家店的价格。” | 执行三次无状态读取;如果某家店需要 JavaScript 来渲染页面,则使用会话 |
| “登录我的账户并查看上个月的发票。” | 创建会话并获取页面快照;遇到登录页面时将浏览器交给你。服务绝不会猜测密码 |
| “根据我的简历填写这份申请。” | Agent 填写普通字段,然后通过 steel_session_handoff 让你在同一浏览器中从本地选择简历 |
| “截取这篇文章顶部的屏幕截图,用于幻灯片。” | 调用一次 steel_screenshot;图片足够小时会内嵌显示,并始终提供下载链接 |
| “上次浏览器会话发生了什么?” | steel_session_diagnostics 会读取最近释放的会话。不会启动新的浏览器 |
工作原理
- 先读取,必要时再浏览。
steel_scrape可以回答有关页面的大多数问题,而且不会启动计费会话。只有在需要交互时才会创建会话,并在任务完成后释放。 - 操作元素,而非像素。
steel_snapshot和steel_find会将页面读取为无障碍树,并为可定位的元素提供@eN引用。steel_act会根据引用点击、输入和填写。截图供人查看和进行视觉检查,绝不用来定位目标。 - 操作会报告发生了哪些变化。 点击操作会返回页面是否发生导航、DOM 是否改变或焦点是否移动。如果没有任何变化,响应会明确说明,而不会声称操作成功。引用失效时,错误会说明原因以及接下来应调用什么工具。
- 敏感环节由人来处理。 在支持 MCP Apps 的宿主中(包括 Claude),运行中的浏览器会内嵌显示在对话中。接管可让你操作浏览器,以完成登录、CAPTCHA 验证、付款或访问本地文件;交还则会把浏览器还给 Agent,随后 Agent 会重新读取页面再继续。遇到登录墙和 CAPTCHA 验证时,会自动触发交接。保存的浏览器配置文件和托管凭据会通过
steel_session_options发现,绝不会猜测。详情请见 docs/SESSIONS.md。 - 页面内容是数据,不是指令。 从页面读取的所有内容都会放在
<untrusted-page-content>块中,其中的隐藏文本和其他提示词注入载体都会被剥除。密码和凭据会在进入响应或日志前进行遮盖。
工具
默认的 browse 配置会公开 16 个工具。STEEL_PROFILE=scrape 只会公开前 3 个工具,这些工具绝不会启动浏览器。
完整列表
| 工具 | 功能 |
|---|---|
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 | 暂停会话,让人独占控制同一浏览器,然后将控制权交还给 Agent |
steel_session_replay | 仅在明确请求时,返回已结束会话的 Steel 控制面板链接 |
steel_batch | 在一次调用中运行已知的可逆步骤;登录、付款或最终确认前会交由人处理 |
steel_session_options | 规划非默认会话,并发现已保存的配置文件 ID 或托管登录命名空间 |
steel_session_live_view | 向内嵌查看器提供连接详情。宿主会将其对模型隐藏 |
| 变量 | 默认值 | 含义 |
|---|---|---|
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 | browse 或 scrape |
STEEL_SESSION_TIMEOUT_MS | 900000 | 默认的不可变会话生命周期。创建请求最长可选择 24 小时,但不得超过账户上限 |
STEEL_INACTIVITY_TIMEOUT_MS | 600000 | 空闲释放时间。足以完成交接,因此闲置的浏览器可运行约 10 分钟 |
STEEL_MAX_SESSIONS | 10 | 每个凭据允许的活动会话数加待创建会话数;使用 Redis 时会跨副本强制执行 |
STEEL_CONNECT_URL | wss://connect.steel.dev | CDP 端点;自托管时根据基础 URL 推导 |
日志以结构化 JSON 格式写入 stderr;stdout 只输出 JSON-RPC。托管端点有自己的变量,详见 docs/HOSTING.md。
故障排除
网站返回 403 或显示质询页面。 这是机器人检测,并非错误。错误信息会指出服务商以及一个后续尝试方案;每次只更改一项。steel_session_diagnostics 会显示发生了什么。
托管代理或 CAPTCHA 求解因付款错误而失败。 在 Launch 计划中,这些功能需要 $10 的已验证付费余额;免费额度不计入。
@eN 引用失效。 错误会说明原因:页面已导航、包含该元素的框架加载了新文档、节点已被移除,或元素的角色或名称发生了变化。错误还会说明应调用什么来恢复。
点击后提示没有任何变化。 点击很可能落在了其他位置。如果覆盖层遮挡了目标,错误会指出覆盖层:使用 dismiss_overlays 调用 steel_act,然后重试。如果目标位于框架内,响应会说明该框架未被观察到;请重新获取快照,而不要再次点击。
会话似乎消失了。 Steel 会在会话 10 分钟没有活动后释放会话,也会在计划规定的硬性时限到达时释放。只有在需要再次交互时才创建新会话;若要读取旧活动记录,请使用其 dashboard UUID 调用 steel_session_diagnostics,或不带 ID 调用以查看最新记录。
调用 steel_session_create 时出现“Concurrency limit reached”。 你的 Steel 计划允许同时运行的浏览器数量少于当前已打开的数量。忘记释放的会话也会计入;steel_session_release 可立即释放一个会话。
扩展启动失败,并显示有关 STEEL_API_KEY 的消息。 密钥没有到达服务端。请在 Claude 中打开扩展的设置并重新输入密钥;该字段为只写,因此空白字段看起来和已填写的字段一样。
请求了跟踪,但无法启动。 桌面端软件包不包含 OpenTelemetry 导出器堆栈。服务端会记录一次此情况,然后正常提供服务;从源码检出后,可以安装 @opentelemetry/sdk-node 和 @opentelemetry/exporter-trace-otlp-http。
安全与隐私
服务端不保留任何自身数据。它会将工具调用指定的 URL 和页面交互发送给运行浏览器的 Steel,并返回页面内容。页面内容会传递给你的 MCP 客户端,不会存储、记录或转发到其他地方。不会收集任何对话信息,除非你使用标准的 OTEL_* 变量配置遥测导出器,否则不会加载任何遥测导出器。Steel 对其运行的浏览器会话的处理方式详见 Steel 隐私政策。
网页可能包含提示词注入,过滤机制无法将其全部移除。请审查会提交数据、进行购买或更改账户的浏览器操作。威胁模型和当前缓解措施见 RESEARCH.md §7。请按照 SECURITY.md 中的说明报告漏洞,不要在公开问题中报告。
开发
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 and the frame snapshot in a real Chrome
npm run test:e2e # starts, waits for and tears down the real-browser stack
CLAUDE.md 记录了工作规则;本项目采用 TDD,因此每项更改都从一个失败的测试开始。RELEASING.md 说明了这个软件包会发布哪些内容:桌面套件、容器映像和托管服务。NOTES.md 记录了针对 Steel API 和 Chrome 的测量结果,RESEARCH.md 则记录了设计背后的决策。
欢迎贡献:请创建分支,然后提交拉取请求,说明更改内容及原因。报告错误时,请创建 issue,并注明你调用的工具和错误文本。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。