为无桌面版的Claude安装Chrome
记录在无桌面的 Linux 服务器上,通过 Playwright MCP 将系统 Chrome 接入 Claude Code,使其能够访问网页、执行 JavaScript、点击页面、读取正文和截图。本文采用 Anolis OS 8.6 环境,不需要安装 Chrome 侧边栏扩展,也不需要部署桌面环境。
方案与环境
组件关系
| 组件 | 职责 |
|---|---|
| Claude Code | 接收任务,调用浏览器工具,整理提取到的内容 |
| Playwright MCP | 将浏览器操作封装为 Claude Code 可以调用的 MCP 工具 |
| Google Chrome | 实际加载网页、执行 JavaScript、渲染页面 |
| Node.js 与 npm | 运行通过 npx 启动的 Playwright MCP |
MCP 是客户端与工具服务之间的连接协议。此处由 Claude Code 启动本机 MCP 子进程,通过标准输入输出通信,再由 MCP 控制 Chrome。
本方案中,Claude Code、Playwright MCP 和 Chrome 都运行在同一台服务器上。不需要提前手动启动 Chrome,也不需要向外开放浏览器调试端口。
方案选择
| 方式 | 适用场景 | 本文处理方式 |
|---|---|---|
| Claude 自带的网页搜索、网页读取 | 查找和读取公开资料 | 不需要真实页面交互时优先使用 |
| Claude in Chrome 扩展 | 在桌面 Chrome 中交互使用 Claude | 不作为无桌面服务器的部署方案 |
| Playwright MCP | 动态网页、点击、滚动、截图、页面内容提取 | 本文主线 |
| Chrome DevTools MCP | 另一种浏览器控制与调试方案 | 与 Playwright MCP 二选一,不需要同时安装 |
本次环境与验证范围
| 项目 | 原记录中的环境 |
|---|---|
| 操作系统 | Anolis OS 8.6 |
| CPU 架构 | x86_64 |
| 使用方式 | SSH 终端,无桌面环境 |
| Claude 客户端 | Claude Code CLI |
| Node.js | v24.14.0 |
| npm | 11.9.0 |
| Chrome 路径 | /usr/bin/google-chrome-stable |
| MCP 配置范围 | user,当前用户的所有项目可用 |
**原记录已确认 Chrome 能输出版本号,且 Playwright MCP 显示 Connected;没有提供实际网页导航与截图成功的结果。**因此,下文将实际浏览作为独立验收步骤,不将连接成功等同于部署全部通过。
第一步检查运行环境
除系统软件安装需要 sudo 外,后续检查、MCP 配置和浏览器运行均使用实际运行 Claude Code 的普通用户。不要在 root 账号下配置后,期待普通用户自动读到同一份配置。
在 Shell 中执行:
1 | cat /etc/os-release |
检查要点:
- 系统为 Anolis OS 8.6,架构为
x86_64,再使用下文的 Google Chrome x86_64 YUM 仓库。 claude、node、npm均可执行。本文以已经安装 Claude Code 和 Node.js 为前提,不重复其安装过程。- 原记录的 Node.js 24 环境满足所核对 Playwright MCP README 的最低要求。重新部署时仍应检查当前发布包的要求。
- 如果 Chrome 已安装,可以跳到第三步。
- 服务器需能访问 npm 包仓库和目标网站;安装 Chrome 时还需可用的软件源或经过验证的离线安装包。
第二步通过YUM安装Chrome
本次实际采用的方式是:配置 Google Chrome 官方 YUM 仓库,通过 yum install google-chrome-stable 安装浏览器并自动解析依赖,不是手动下载 RPM 后本地安装。
安装过程分散在两份对话中,按实际顺序合并为:
- 配置 Google Chrome 仓库,执行 YUM 安装。
- 系统原有
base仓库返回 404,查明内部镜像实际目录,新增独立的 BaseOS 与 AppStream 仓库。 - 限定仓库重新安装,依赖解析与下载通过,但依赖包 GPG 校验失败。
- 切换会话继续处理,确认缺少 CentOS 公钥
8483C65D;核对完整指纹并导入后,重试安装。 - Chrome 能正常输出版本号,再配置 Playwright MCP。
Anolis 使用 RPM 软件包体系,本文沿用实际操作中的 yum 命令。不要照搬 Ubuntu 的 apt-get,也不要将 playwright install --with-deps 作为 Anolis 的通用安装命令。
配置Google Chrome官方仓库
以下为需要系统权限的操作,使用 sudo 执行;已经处于 root Shell 时可省略 sudo。写入前先检查目标文件,已有配置应先备份,不重复覆盖:
1 | sudo ls -l /etc/yum.repos.d/google-chrome.repo |
如果文件已存在,先查看内容,并在需要修改时备份:
1 | sudo cat /etc/yum.repos.d/google-chrome.repo |
新建或确认需要修改后,写入:
1 | sudo tee /etc/yum.repos.d/google-chrome.repo >/dev/null <<'EOF' |
gpgcheck=1 保留 RPM 签名校验,gpgkey 指向 Google 官方公钥。安装过程中如提示导入公钥,核对来源与指纹后再确认,不直接关闭校验。
系统软件源正常时,安装命令为:
1 | sudo yum install google-chrome-stable |
先检查事务中的依赖、安装和升级列表,再确认执行。本次在这里遇到了系统 base 仓库 404,需要继续处理下面的软件源问题;已有正常软件源的环境不必照搬内部镜像配置。
确认系统依赖仓库的正确路径
本次内部镜像的实际布局为:
1 | /centos/8/BaseOS/x86_64/repodata/repomd.xml |
x86_64/ 下直接包含 Packages/ 和 repodata/,后面没有 os/。原先的 /centos/8/os/x86_64/ 和尝试过的 /centos/8/BaseOS/x86_64/os/ 均不适用于这台内部镜像。
下面用 mirror.example.com 代替实际内部域名,使用前必须替换为经过确认的地址。该目录布局只记录本次镜像,不是所有 EL8 软件源的通用布局。
先验证两个元数据入口:
1 | ( |
两项成功后再配置仓库。目录能打开、端口可连接,都不能替代 repomd.xml 与完整元数据验证。
**本次主机是 Anolis OS 8.6,但内部源提供的是 CentOS 8 包,属于跨发行版混源。**以下保留实际安装路径,不代表推荐长期这样部署;重新部署时优先使用管理员认可、与 Anolis 匹配的软件源,不将 CentOS 8 历史包视为持续安全更新来源。
新增默认禁用的依赖仓库
保留原有仓库文件,新增独立仓库 ID,避免影响其他任务。先检查 /etc/yum.repos.d/internal-el8.repo 是否存在,已有文件先查看并备份,再写入以下配置。地址中的占位域名需替换:
1 | [internal-el8-baseos] |
这里先保留原记录中安装失败前的配置:启用了签名检查,但尚未配置 gpgkey。后续根据实际包签名确认公钥,再补全配置,不沿用对话中曾建议过的 gpgcheck=0。
限定仓库建立缓存:
1 | sudo yum --disablerepo='*' \ |
确认元数据缓存建立成功后,限定这两个依赖仓库和 Google 仓库安装:
1 | sudo yum --disablerepo='*' \ |
这会避开原来仍启用的失效仓库,但不会修复它们。后续不带仓库限制的 YUM 命令仍可能报错。
处理依赖包缺少GPG公钥
本次依赖解析与下载通过后,失败点转为依赖包签名校验,随后才切换到浏览器接入那份会话继续处理。
**不是下载的公钥指纹与官方不一致,而是 RPM 信任库中缺少用于验证依赖包的 CentOS 公钥。**Google 密钥不能验证这些系统依赖。
对报错涉及的缓存 RPM 执行检查,实际路径以本机为准:
1 | rpm -Kv /path/to/cached-package.rpm |
本次对应的提示为:
1 | Signature, key ID 8483c65d: NOKEY |
确认软件包来源后,从 CentOS 官方下载公钥,并核对完整指纹:
1 | KEY_DOWNLOAD_DIR="$(mktemp -d "$HOME/chrome-repo-key.XXXXXX")" |
本次核对一致的完整指纹为:
1 | 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D |
确认一致后保存并导入:
1 | sudo install -m 0644 \ |
以上下载与导入命令使用同一个 Shell 中的 KEY_DOWNLOAD_DIR。如果目标公钥文件已存在,先检查其内容和指纹,不直接覆盖来源不明的文件。
gpg --show-keys 只是查看,rpm --import 才会加入 RPM 信任库。重新检查报错包,确认对应签名从 NOKEY 变为 OK:
1 | rpm -Kv /path/to/cached-package.rpm |
再为 /etc/yum.repos.d/internal-el8.repo 的两个仓库段分别补上公钥位置,保留签名检查:
1 | gpgcheck=1 |
该密钥只适用于已确认由它签名的软件包,不是所有 Anolis 或 .el8 包的通用密钥。遇到其他 Key ID 时需重新确认来源,不能仅凭文件名推断。
重试YUM安装并检查结果
不用清空之前已下载的包缓存,直接重试:
1 | sudo yum --disablerepo='*' \ |
检查安装结果:
1 | command -v google-chrome-stable |
原记录已确认可执行路径为:
1 | /usr/bin/google-chrome-stable |
到这里完成的是 YUM 安装与版本查询。下一步切回实际运行 Claude Code 的普通用户,测试无头浏览器,再配置 MCP。
第三步验证无头浏览器
无头模式是不显示浏览器窗口的运行方式,适合 SSH 服务器,不需要桌面环境或 DISPLAY。
在运行 Claude Code 的普通用户下执行:
1 | timeout 30s /usr/bin/google-chrome-stable \ |
输出的 HTML 中包含 chrome-ok,说明浏览器能够启动并完成基本渲染。该测试不依赖外网,便于将浏览器启动问题和网站访问问题分开。
判断结果时注意:
- 单独出现 D-Bus 等日志,不一定表示启动失败,应结合退出状态与实际 DOM 输出判断。
- 如果提示缺少动态库,应通过系统软件源补齐依赖。
- 如果提示沙箱或命名空间错误,先检查运行用户和主机安全策略,不要默认增加
--no-sandbox。 - 如果提示
GLIBC或GLIBCXX版本不满足,属于二进制兼容性问题,不应手工替换系统核心库来迁就浏览器。
第四步注册Playwright MCP
添加用户级配置
在普通用户的 Shell 中执行原记录最终采用的命令:
1 | claude mcp add --scope user playwright -- \ |
参数说明:
| 参数 | 含义 |
|---|---|
--scope user |
配置对当前用户的所有项目生效 |
playwright |
MCP 服务名称,用于后续查看与删除 |
-- |
后面的命令与参数交给 MCP 服务进程 |
npx -y |
运行 npm 包,并自动确认 npx 的安装询问,不代表自动批准 Claude 的工具操作 |
@playwright/mcp@latest |
使用发布时的最新 MCP 包,首次启动需获取依赖 |
--headless |
无界面运行浏览器 |
--browser chrome |
使用 Chrome 浏览器 |
--executable-path |
指定已经安装的浏览器路径 |
用户级 MCP 配置写入 ~/.claude.json,不是 ~/.claude/settings.json。claude mcp add 不指定作用域时默认为 local,不能省略 --scope user 后仍认为配置是用户级。
@latest 便于首次接入,但后续会变化。需要长期复用时,先验证具体包版本,再将 latest 替换为已经验证的版本号,并同时记录 Chrome 和 Node.js 版本。
检查配置和连接
1 | claude mcp get playwright |
原记录中已确认服务命令与上述一致,并显示 Connected。
各阶段的含义不同:
| 结果 | 能说明什么 | 不能说明什么 |
|---|---|---|
Added stdio MCP server |
配置已经写入 | MCP 不一定能启动 |
Connected |
Claude Code 与 MCP 服务连接成功 | Chrome 不一定已启动,目标网站不一定可访问 |
| 实际返回网页标题和正文 | 浏览器启动、导航和页面读取通过 | 不代表所有网站、登录和视频内容均可用 |
| 实际生成截图 | 本次截图操作通过 | 不代表后续所有操作自动通过 |
在新会话中使用
从 Shell 启动新的 Claude Code 会话,确保读取刚写入的配置:
1 | claude |
在 Claude Code 对话输入框中输入:
1 | /mcp |
查看 playwright 的连接状态。/mcp 是会话内的管理命令,不是 Shell 命令,也不要将它理解为一定会重新加载所有外部配置的命令。
第五步验收网页操作
下面的内容是发送给 Claude Code 的提示词,不是在 Shell 中执行的命令。
验证访问正文与截图
1 | 请使用 Playwright MCP 操作浏览器: |
如果出现工具授权请求,核对工具名、目标网址和操作后再允许,不需要为了测试而放开所有工具权限。
验收清单:
- Claude 实际调用了 Playwright 浏览器工具。
- 页面正常打开,返回标题与正文,而不是网络错误页或证书错误页。
- 截图确实生成,并给出实际文件路径。
- 无头浏览器可以运行,不需要手动启动桌面或开放调试端口。
读取JavaScript动态页面
1 | 请使用 Playwright MCP 访问我提供的文章页面。 |
动态页面可能持续发送统计、轮询或长连接请求,因此“等待网络完全空闲”不等于“正文已经可读”。优先让 Claude 检查正文、加载状态和实际页面元素。
第六步按需保存登录状态
Playwright MCP 默认使用持久化浏览器配置。需要明确保存位置时,可以指定独立的 user-data-dir;只读取公开页面时,不必为了接入而额外配置登录。
先在普通用户的 Shell 中创建目录:
1 | mkdir -p "$HOME/.claude-browser-profile" |
关闭占用该服务的会话后,替换用户级配置:
1 | claude mcp remove playwright --scope user |
再启动新会话验证。注意:
- 该目录可能包含 Cookie、Local Storage 和登录状态,应视为敏感数据,不上传仓库或共享。
- 不复用日常浏览器个人配置,优先使用专用账号与专用目录。
- 同一个持久化目录不能被多个浏览器实例同时使用。
- 保存配置目录不会自动完成登录。验证码、扫码和多因素认证仍需人工处理;纯 SSH 环境如需图形交互,应另行准备经过授权的桌面或远程浏览器方案。
- 若希望浏览器会话存储不随浏览器关闭而保留,可使用
--isolated,而不是配置持久化目录。它不等于禁止下载或阻止其他输出文件落盘。
视频页面的能力边界
**能打开视频页面,不等于已经理解完整视频。**浏览器工具可以读取页面上实际提供的标题、简介、章节与字幕,也可以截图;但不能仅凭页面 DOM 得到完整音轨内容。
| 可获取的资料 | 处理方式 |
|---|---|
| 页面正文、简介、章节 | 通过浏览器读取并整理 |
| 网页公开提供的字幕或文字稿 | 优先读取,保留来源及可用的时间标记 |
| 只有音频,没有可读文字 | 另行使用经过授权的音频获取与语音转写流程 |
| 幻灯片、操作演示 | 补充关键画面或截图,与文字资料交叉核对 |
可直接发送给 Claude:
1 | 请使用 Playwright MCP 打开这个视频页面。 |
视频下载、语音模型部署和关键帧处理属于额外流程,本文不将其混入浏览器接入的必装步骤。
常见问题
Playwright依赖安装调用了apt-get
Anolis 不是 Ubuntu。若使用 playwright install --with-deps 后出现 apt-get 不存在等错误,应停止照搬该安装流程。
本文通过 YUM 仓库安装系统 Chrome,再通过 --executable-path 指定它。不要为了安装浏览器而在 Anolis 上强行补一个 apt-get。
软件源返回404
典型现象是 DNF 下载 repodata/repomd.xml 失败,并返回 HTTP 404。
这说明请求的仓库资源不存在或路径不匹配。TCP 端口可连接不代表软件源可用,应检查仓库配置和对应元数据地址。
1 | sudo dnf repolist --all |
处理原则:
- 优先修复或使用与系统发行版匹配、由管理员认可的软件源。
- 临时禁用失效仓库时,仍需确认剩余仓库能提供依赖。
- 已安装依赖齐全时,可尝试禁用所有仓库安装本地 RPM;缺依赖则仍需补齐来源。
- 不将 CentOS Vault 等其他发行版历史源作为 Anolis 的默认长期源,也不将历史镜像视为持续提供安全更新的来源。
- 不使用
--nodeps、替换 glibc 或全局关闭签名检查来掩盖安装问题。
GPG检查失败
本次缺少 CentOS 公钥的处理命令已放在第二步“处理依赖包缺少GPG公钥”中,按安装顺序执行即可。
排查时先区分错误类型:
NOKEY:缺少验证公钥,确认包来源并核对官方完整指纹后再导入。- 公钥指纹不一致:停止导入,重新核查下载来源,不能当作本次缺钥问题直接处理。
- 签名校验失败:核查包完整性、签名和来源,不通过关闭检查来强行安装。
Chrome 包与系统依赖可能由不同密钥签名。不要只导入 Google 公钥,也不要为了解决一个包的错误全局使用 --nogpgcheck。
MCP连接成功但网页打不开
按调用链分层检查:
| 检查项 | 重点 |
|---|---|
| MCP 配置 | claude mcp get playwright 的命令、参数和 Chrome 路径是否正确 |
| 浏览器启动 | 第三步的不依赖外网渲染测试是否通过 |
| 目标网络 | DNS、出口策略、浏览器代理与证书是否正常 |
| 网站自身 | 是否要求登录、验证码,或限制自动化访问 |
| 会话状态 | 修改配置后是否启动了新会话,是否有其他浏览器占用配置目录 |
不要将所有问题都归因于沙箱。即使普通用户因主机策略无法使用沙箱,也应先核查策略,必要时改用经过评估的隔离运行环境;--no-sandbox 会关闭重要隔离,不作为默认部署参数。
修改配置后仍使用旧命令
1 | claude mcp get playwright |
确认是否在正确用户下操作,以及是否存在同名的 local、project 配置。相同名称存在于多个作用域时,优先级为 local、project、user,高优先级项会覆盖低优先级项。
更新时明确使用原来的作用域,不要反复添加不同作用域的同名服务。
安全约束
- 使用普通用户和专用浏览器配置,避免导入个人会话、密码及高权限账号。
- 默认只读取用户指定的网站。访问内网、localhost 或云元数据地址需要明确授权;业务确实需要访问本地服务时再单独允许。
- 网页内容是不可信资料,不执行页面里要求读取服务器文件、运行终端命令或泄露信息的指令。
- 登录、发送消息、提交表单、购买、删除和修改数据前请求人工确认。
- 截图、下载文件与浏览器配置都可能含敏感信息,检查后再分享。
- 本文使用 stdio 接入,不对外部署 MCP HTTP 服务,也不开放 Chrome 调试端口。
特别注意原记录中容易混淆的两个参数:
| 参数 | 实际用途 |
|---|---|
--allowed-hosts |
限制 MCP HTTP 服务接受请求的 Host,不是浏览器可访问网站的白名单 |
--allowed-origins |
对浏览器目标来源进行过滤,但官方明确说明它不是安全边界,且不影响重定向 |
**Playwright MCP 本身不是安全边界。**提示词和目标来源过滤可以降低误操作,但严格限制出站访问仍需配合网络策略、代理或隔离环境,不能仅靠浏览器参数。
部署回顾
| 顺序 | 操作 | 验收标准 |
|---|---|---|
| 一 | 检查 Claude Code、Node.js、npm 与用户身份 | 在实际使用 Claude 的普通用户下可执行 |
| 二 | 配置 YUM 仓库,解决路径与公钥问题后安装 Chrome | RPM 签名校验通过,版本查询正常 |
| 三 | 无头模式加载本地测试内容 | DOM 包含 chrome-ok |
| 四 | 注册 Playwright MCP | 用户级配置正确,连接状态正常 |
| 五 | 实际访问网页、读取正文并截图 | 三项操作均有实际结果 |
| 六 | 按需处理登录状态与视频资料 | 明确授权范围及资料获取边界 |
核心配置只有一条 claude mcp add 命令,但完整验收应覆盖浏览器启动、网页访问、内容读取和截图。Connected 是中间检查点,不是最终验收结论。