Skip to main content

在 Debian 上用 Chrome DevTools MCP 让 AI Agent 调试前端

· 6 min read
timger
timger

前端调试不再只靠人眼和 DevTools 面板。把 Chrome DevTools MCP 接入编程 Agent 后,截图、网络请求追踪、性能录制、Console 日志抓取全变成 Agent 可直接调用的工具——在 Debian 服务器上无头浏览器跑起来就能用。

Debian 安装 Chromium

Debian 12/13 上 Chromium 的安装路径已经统一到 apt 仓库。一行命令装好:

sudo apt-get update && sudo apt-get install -y chromium

装完后验证版本:

chromium --version

Debian 仓库的 Chromium 默认不开启远程调试端口,但 chrome-devtools-mcp 通过 puppeteer 启动时会自动带上 --remote-debugging-port,不需要手动指定。

如果你的环境对 X11 显示有要求,但服务器没有桌面,用 headless 模式即可——后文配置里直接加 --headless

部分 Debian 最小安装缺少字体和中文渲染,补一下:

sudo apt-get install -y fonts-noto-cjk

chrome-devtools-mcp 是什么

chrome-devtools-mcp 是 ChromeDevTools 团队官方维护的 MCP Server。它把 Chrome DevTools 的能力封装成标准 MCP 工具,让任何支持 MCP 的编程 Agent(Claude Code、Codex、Gemini CLI、Cursor 等)都能直接操控浏览器。

核心能力覆盖三大方向:

  • 自动化操作:click、fill、navigate_page、type_text 等 10+ 输入工具,用 puppeteer 驱动,自动等待页面响应
  • 调试与检查:take_snapshot 获取页面 DOM 结构(含 uid)、list_console_messages 抓 console 日志、get_network_request 追踪请求、evaluate_script 执行 JS
  • 性能分析:performance_start_trace / performance_stop_trace 录制 trace,performance_analyze_insight 提取可执行的性能优化建议;还有 lighthouse_audit 一键跑 Lighthouse

和手动打开 DevTools 面板相比,Agent 通过 MCP 拿到的数据是结构化的——不是在 Console 面板里翻日志,而是直接拿到 JSON 格式的错误列表、网络瀑布图、内存快照。

项目地址:https://github.com/ChromeDevTools/chrome-devtools-mcp

debain 配置 chrome 的服务

创建 文件 /etc/systemd/system/chromium-headless.service

[Unit]
Description=Chromium Headless for Chrome DevTools MCP
After=network.target

[Service]
Type=simple
User=root
Group=root
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/chromium \
--headless \
--remote-debugging-port=9222 \
--remote-debugging-address=127.0.0.1 \
--user-data-dir=/data/projects/chrome-profiles/vibecuting-chrome-profile \
--no-first-run \
--no-default-browser-check \
--disable-dev-shm-usage \
--disable-gpu \
--no-sandbox \
about:blank
ExecStop=/usr/bin/pkill -f "chromium.*--remote-debugging-port=9222"
KillMode=process
TimeoutStopSec=15

[Install]
WantedBy=multi-user.target

Codex 配置 MCP

OpenAI Codex 同样支持 MCP Server。CLI 注册方式:

codex mcp add chrome-devtools -- npx chrome-devtools-mcp@latest

或者手动编辑 .codex/config.toml

[mcp_servers.chrome-devtools]
command = "env"
args = [
"-u", "http_proxy",
"-u", "https_proxy",
"-u", "HTTP_PROXY",
"-u", "HTTPS_PROXY",
"-u", "ALL_PROXY",
"-u", "all_proxy",
"-u", "npm_config_proxy",
"-u", "npm_config_https_proxy",
"-u", "npm_config_http_proxy",
"-u", "npm_config_all_proxy",
"-u", "NO_PROXY",
"-u", "no_proxy",
"npx",
"-y",
"chrome-devtools-mcp@latest",
"--browserUrl=http://127.0.0.1:9222",
"--no-usage-statistics",
"--no-performance-crux"
]

startup_timeout_ms 在 Debian 上建议设到 20 秒以上。Chromium 无头模式第一次启动冷启动偏慢,超时太短会让 MCP 连接失败。

Codex 的 MCP 工具调用方式和 Claude Code 基本一致——Agent 识别到页面调试需求时自动调用对应工具。

安装技能

npx skills add https://github.com/chromedevtools/chrome-devtools-mcp --skill chrome-devtools

实战调试流程

配置完成后,在 Agent 里输入调试指令就能触发浏览器操作。以 Claude Code 为例:

1. 页面加载检查

打开 https://your-app.dev 并截图,检查首页是否正常渲染

Agent 会调用 navigate_page → take_screenshot,把截图返回给你。无头模式下截图是 PNG,直接在终端里看到。

2. Console 错误追踪

列出当前页面的 console 错误

Agent 调用 list_console_messages,返回结构化的错误列表,包含 source-mapped 的堆栈信息——比手动翻 Console 面板效率高。

3. 性能录制

录制 https://your-app.dev 的性能 trace 并分析

Agent 调用 performance_start_trace → navigate_page → performance_stop_trace → performance_analyze_insight,输出具体的优化建议(LCP 改善、JS bundle 缩减等)。

4. 网络请求排查

查看首页加载的所有网络请求,找出耗时超过 500ms 的

Agent 调用 list_network_requests 返回全部请求列表,再从里面过滤慢请求。

5. DOM 结构快照

对登录表单做快照,找到邮箱输入框的 uid

Agent 调用 take_snapshot,返回带 uid 的 DOM 树。拿到 uid 后可以直接 fill 或 click 对应元素,完成自动化表单操作。

整个流程的关键:不需要写 puppeteer 脚本,不需要手动开 DevTools,Agent 直接用自然语言指令驱动浏览器完成调试任务。

chrome-devtools-mcp 把前端调试从手动操作变成 Agent 可编排的工具链。Debian 服务器上装好 Chromium、配上无头模式的 MCP Server,Claude Code 和 Codex 就能直接截图、抓日志、录 trace、分析性能。调试不再依赖人眼盯着 DevTools 面板——Agent 替你盯着,并且给出结构化结果。

GitHub 国内加速指南

· 2 min read
timger
timger

正文草稿

GitHub 国内加速最明显的变化,往往不是某个配置单独生效,而是 clone、pull、raw 和网页访问分别变得稳定。

为什么会慢

国内访问 GitHub 时,DNS、连接建立和静态资源加载常常同时拖慢体感。仓库能打开,不代表 raw 文件和大体积 clone 也一样顺畅。

怎么拆开处理

clone、pull、raw 文件和网页访问本来就是不同路径。把它们分开看,问题就会更像真实故障,而不是一团混在一起的慢。

HTTPS 和边界

域名、证书和跳转一旦串起来,最容易出问题的就是入口一致性。旧链接、新入口和缓存层没有对齐时,体感会一下变差。

最先被感受到的通常是速度和成功率,等这些入口稳定下来,后面的细节才有讨论价值。

easytier多地多机房 混合组网

· 2 min read
timger
timger

简介

如果你在全国多个地方有家, 可以放一些机器可以试下

多地组网时候 有些参数 不配置好 容易漂 所以我记录一下

我的拓扑如下 687

公网中继配置

/usr/local/bin/easytier-core --hostname foldstace-yisu-hub  --network-name=foldspace --network-secret=******   -l tcp://0.0.0.0:11010 -l udp://0.0.0.0:11010 --mtu=1000 --enable-kcp-proxy --relay-network-whitelist="*" --private-mode=false  --relay-all-peer-rpc

其他节点配置

instance_name = "**************"
instance_id = "**********************"
dhcp = false
ipv4 = "192.188.86.40/16"
listeners = ["tcp://0.0.0.0:11010", "udp://0.0.0.0:11010"]
relay_all_peer = false


[network_identity]
network_name = "foldspace"
network_secret = "**********"


[[peer]]
uri = "tcp://{you public hub ip}:11010"

[[peer]]
uri = "tcp://{you public hub ip}:11010"



[flags]
enable_kcp_proxy = true
latency_first = true
keep_alive_interval = 5 # 新增
default_protocol = "tcp"

mac 个人电脑机器配置

instance_name = "my-mac"
instance_id = "4c1a9564-fb8d-4764-aae6-d564854f4377"
dhcp = false
ipv4 = "192.188.86.88/16"
listeners = ["tcp://0.0.0.0:11010", "udp://0.0.0.0:11010"]
relay_all_peer = false # 禁止转发流量给其他节点,这是关键

[network_identity]
network_name = "foldspace"
network_secret = "**********"

[[peer]]
uri = "tcp://{you public hub ip}:11010"

[[peer]]
uri = "tcp://{you public hub ip}:11010"


[flags]
p2p_only = false
mtu = 1000
keep_alive_interval = 1
default_protocol = "tcp"

以上配置 避免了 路由老漂到不合理的位置 导致卡死或者其他

我现在 可以稳定 ping 无太大的波动, 避免了 漂到不正常的链路

在window中 让makefile 自动补全生效

· One min read
timger
timger

以管理员身份打开PowerShell,然后执行:

# 查看当前执行策略
Get-ExecutionPolicy

# 将执行策略设置为 RemoteSigned(推荐)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

# 或者设置为 Bypass(临时解决方案)
Set-ExecutionPolicy Bypass -Scope CurrentUser -Force

# 验证更改
Get-ExecutionPolicy -List

在powershell 中

 notepad $PROFILE

编辑文件

# Make 命令补全函数
function MakeCompletion {
param($wordToComplete, $commandAst, $cursorPosition)

$makefile = Get-ChildItem -File | Where-Object {
$_.Name -in @('Makefile', 'makefile', 'GNUmakefile')
} | Select-Object -First 1

if ($makefile) {
$targets = Get-Content $makefile.FullName |
Select-String '^\s*([a-zA-Z0-9_-]+):' |
ForEach-Object { $_.Matches.Groups[1].Value } |
Sort-Object -Unique

$targets | Where-Object { $_ -like "$wordToComplete*" } |
ForEach-Object {
[System.Management.Automation.CompletionResult]::new(
$_,
$_,
'ParameterValue',
$_
)
}
}
}

# 注册补全
Register-ArgumentCompleter -CommandName make -ScriptBlock $function:MakeCompletion

现在可以了

make 

输入tab 会自动补全

Welcome

· One min read
Sébastien Lorber
Docusaurus maintainer
Yangshun Tay
Front End Engineer @ Facebook

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.