mcpField
P
PageSpeed Insights MCP

PageSpeed Insights MCP

本地服务
considus.com开发工具15 天前更新

关于 PageSpeed Insights MCP

PageSpeed Insights MCP 使用 Google PageSpeed Insights 测量网页,并汇总多次不同分析的中位数、波动范围及可用的 Chrome UX Report 数据,适合需要区分实验室结果与真实用户体验的助手和终端用户。

主要功能

  1. 01汇总不同分析的中位数及范围
  2. 02过滤缓存重放结果
  3. 03提供 Chrome UX Report 数据和历史
  4. 04拆解 LCP 各阶段耗时
  5. 05按范围重叠判断基线差异
  6. 06通过任务编号获取长测量结果

适用场景

  1. 01评估移动端网页表现及测量波动
  2. 02查看是否有 Chrome 用户数据
  3. 03定位延迟 LCP 的阶段
  4. 04将改动与已保存基线比较

MCP 相关

这是一个 MCP 服务,将网页分析、真实用户数据、LCP 解释、基线比较、任务结果和设置检查作为工具提供。也支持在终端使用。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
mcpbpagespeed-insights-mcp-2.0.1.mcpb

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

PageSpeed Insights MCP

使用 Google PageSpeed Insights 测量网页,并报告多次运行结果的中位数及其波动范围,让每个数字都附带不确定性。可通过支持 MCP 的助手使用,也可在终端中运行。

仅使用标准库。无需虚拟环境、无需 pip,也没有编译依赖。克隆后即可运行。

文档 · 安装 · 常见问题

pagespeed-insights-mcp MCP server

为什么还要做一个

目前已经有好几个 PageSpeed MCP 服务。据我们所知,它们每个都只运行一次 Lighthouse,然后把数字交给模型。

单次 Lighthouse 运行的结果噪声很大。对于一个没有任何变化的网页,总阻塞时间在不同运行之间经常会相差三倍,而性能总分是加权综合分,也会继承所有这些波动。只测一次,得到的只是一个没有误差范围的数据,也无从判断这是真实的性能回退,还是测量工具本身的波动。这并非小小的误差,而是测量和自信地猜测之间的区别。

还有一个更根本的问题,而且更糟,因为它无法被察觉。PageSpeed 会按 URL 缓存结果并重复返回。请求五次,可能拿到同一份分析结果五次,这会悄然把中位数变成对 Google 恰好缓存的结果的一次投票。2026 年 7 月 30 日部署后几分钟内,这里就发生了这种情况:3 次运行中有 2 次返回的时间戳与部署前完全一致,把平均分拉回了修复前的水平,而唯有新鲜的那次运行显示修复确实生效了。只报告一次运行的工具会把过时的数字当作当前结果报告,且完全不会提示出了问题。

默认情况下,此工具会取 5 次运行的中位数,在每个数据旁边显示最小值到最大值的波动范围,剔除缓存重放的运行,并告知剔除了多少次。

实验室数据不代表你的用户

以下两项都是事实,测量对象是同一网页,测量时间是同一个下午。

LCP结论
Lighthouse 实验室,移动设备21.36 s性能 27 / 100
真实 Chrome 用户,28 天 p751.20 s快

这是 BBC 首页。实验室数据显示网站慢得不可思议,而真实用户只需 1.2 秒就能打开。

两个数字都没有错,它们回答的是不同的问题。Lighthouse 是在受限硬件上进行的模拟测试,优点是可重复,而且可以用于尚无人访问的网页。现场数据反映真实 Chrome 用户实际经历的情况,也是 Google 排名时唯一使用的数据。无论选择哪一个,只展示其中一个的工具都会误导你。

因此,此工具会分别报告这两项数据,绝不会将它们合并成一个数字。

功能

  • 取 N 次不同分析结果的中位数,并在每个分数和指标旁显示最小值到最大值的波动范围。
  • 持续请求,直到获得 N 个真正不同的分析结果,因为 Google 大约每分钟重新分析一次 URL,并将缓存结果返回给这段时间内的所有请求。连续发出五次请求,相当于把同一次测量重复了五遍。
  • 说明调用次数和耗时;时间耗尽时如实报告较少的分析次数,不会为了凑数而填充结果。
  • 提供来自 Chrome UX Report 的真实用户数据;Google 有数据时,展示当前数据和最长 6 个月的每周历史记录。
  • 如果 Google 没有数据,会明确说明,而不会用实验室分数冒充真实访客的数据。
  • 区分配额耗尽与网页故障,也能将密钥配置错误与两者区分开来。

实际可以问它的问题

以下 4 个问题会用到不同的功能,而且都不需要你知道工具名称。

“considus.com 在移动设备上的速度有多快?你对这个数字有多大把握?” 这正是它存在的全部理由。你得到的是多个真正独立分析结果的中位数及其波动范围,而不是把一次运行的结果当成事实。

“这个网站有真实用户数据吗,还是只有实验室数据?” 它会读取 Chrome UX Report,这是这里唯一能反映真实访客情况的证据,也是 Google 排名时唯一依据的数据。许多小型网站没有这类数据,它会明确说明,而不是让实验室评分冒充真实数据。

“是什么实际拖慢了这个页面的 LCP?” 它会将一个数字拆解为构成该数字的 4 个阶段,让你弄清楚问题出在服务器、发现、下载还是绘制。快速,一次调用,无需取平均值。

“这次改动有帮助吗?” 第一次调用时记录基线,然后在你完成改动后进行比较。只有两个范围不重叠时,它才会认定差异真实存在,这样你就不会因为测量工具本身的波动而庆祝。

开始之前

你需要一个 Google Cloud API 密钥。它免费,申请大约需要 1 分钟,并且要在第 3 步做一个选择。

  1. 打开 console.cloud.google.com 并选择你的账号。
  2. APIs & Services。
  3. 在侧边栏中选择 API Library。搜索 PageSpeed Insights API,选中后点击 Enable。

    就在此处做决定,此时你还在这个页面上。 如果你还想要真实用户数据,也就是实际 Chrome 访客的体验,以及过去 6 个月的变化情况,请搜索 Chrome UX Report API,并在继续之前也启用它。使用同一个密钥,不需要第二个凭据,只需在你当前打开的页面上再搜索一次。如果跳过,其他功能仍然可用,只是你只能获得实验室测量数据。之后再添加的话,就得回到这个页面并重新执行第 7 步,这也是现在就决定是否启用它的唯一原因。

  4. 点击侧边栏中的 Credentials,不要从当前页面进入。
  5. 点击顶部的 Create credentials,然后选择 API key。
  6. 为它命名。
  7. 在 API restrictions 下,勾选 PageSpeed Insights API;如果你在第 3 步启用了 Chrome UX Report API,也要勾选它。
  8. 不要勾选 Authenticate API calls through a service account。
  9. 将 Application restrictions 保持为 None。
  10. 点击 Create,然后复制密钥。

第 4 步最容易让人犯难,我当时也被难住了。进入凭据页面有两条路径,但只有一条能创建 API 密钥。如果从当前页面进入,按钮只会提供 OAuth 客户端和服务账号,完全没有 API 密钥。你会合理地以为 PageSpeed 不支持 API 密钥。其实支持。侧边栏里的入口会打开另一个页面,就在 API Library 下方。

第 9 步看起来不太对,但其实没问题。在那个表单中,看起来最安全的选项是 HTTP 引用来源限制,但它会导致密钥无法用于像这样的程序,因为没有引用网页。第 7 步的 API 限制才是用来限制密钥可访问内容的设置。

安装

无论选择哪种方式,都要把它克隆到一个固定位置,放在 home 目录下的文件夹里就可以。助手的配置会指向那个确切路径,因此之后移动文件夹就会导致连接中断。不要放在 Downloads 或临时文件夹中。

两种方式最后都会以相同的步骤完成。setup.py 会在浏览器中打开一个小页面,该页面由你的机器在随机端口上提供服务,并通过一次性链接访问。完成后它会自行关闭,而且绝不会记录你输入的任何内容。将密钥粘贴进去。它会先向 Google 验证密钥,再保存任何内容,并告知你是否有真实用户数据可用。

你可以随时重新运行它。它会检测到你之前已经完成设置;如果密钥字段留空,就会保留现有密钥。

让助手代劳

将以下内容粘贴到一款可在这台电脑上运行 shell 命令的 AI 助手中。 允许它运行之前,请先查看它准备执行的操作。

Please install the PageSpeed Insights MCP server from
https://github.com/Considus/pagespeed-insights-mcp on this computer, following the
Install section of its README exactly. Clone it into a permanent folder in my home
directory, then run setup.py and tell me the local link it prints so I can finish
setup in my browser. Show me each command before you run it.
或者自行运行命令

Python 3.9 或更高版本,macOS 和大多数 Linux 机器都已预装。在 Windows 上,请从 python.org 安装,或运行 winget install Python.Python.3.12。

git clone https://github.com/Considus/pagespeed-insights-mcp.git
cd pagespeed-insights-mcp
python3 setup.py

将它连接到你的助手

设置完成后,它会提供第二段提示词。将其粘贴到你希望用来测量网页的任意助手中,例如 Claude、Cursor、Windsurf、Zed、Codex CLI、VS Code Copilot,以及任何支持 MCP 的助手。之后重启应用,MCP 服务会在启动时加载。

这样设计是有意为之。每个客户端都将 MCP 配置保存在不同位置,使用不同的键,而且这些位置也会变动。助手本身已经知道自己的配置在哪里,因此询问它比提供一份很快就会过时的路径清单更好。提示词不包含密钥,只有名称、命令和路径。

工具
工具功能
analyse_page一次调用完成所有操作,也是大多数人最需要的工具。返回各项分数及其波动范围、按修复价值排序的故障项、Google 提供的真实用户数据,以及可保存或转发的独立 HTML 页面。只有在每次分析中都出现的故障才会计入,因为审计结果和分数一样都存在波动。include 用于选择所需部分:scores、issues、field_data 和 html;如果不需要全部四项,可以进行选择。一次测量即可提供你所请求的所有部分。返回一个作业 ID。
get_field_data来自 Chrome UX Report 的真实用户数据。一次调用即可立即返回结果。使用 urls 获取数据,使用 history 获取每周 p75 序列。
explain_lcp判断四个阶段中哪一个导致 Largest Contentful Paint 缓慢:服务器响应、浏览器开始获取最大图片前的等待时间、下载时间,以及图片绘制前的等待时间。一次调用即可立即返回结果。
compare_to_baseline判断更改是否确实有效。测量当前情况并与已保存的基线进行比较,仅在两个范围没有重叠时给出结论。返回一个作业 ID。
get_job_result获取以作业 ID 形式返回的测量结果。每次调用都会立即返回。提供 job_id,或不提供任何参数以获取最近一次结果。
check_setup检查密钥是否有效、是否可以访问 Chrome UX Report,以及保存了哪些基线;不会泄露密钥。
超出调用时长的测量

每次耗时较长的检查都会超时,但服务器从始至终都运行正常。它继续测量,妥善完成任务,并将结果发到一个已经没人读取的管道里。

客户端在 60 秒时就放弃了。单次工具调用的硬性上限就是这么久,进度通知也不会延长这个时间,这一点值得注意,因为这个服务器会发送进度通知,看起来似乎应该能延长调用。一次可靠的测量无法在这个时间内完成。Google 大约每分钟才会重新分析一次 URL,因此 5 次不同的分析大约需要 150 秒;反复请求也无济于事,只会把同一份缓存分析结果交给你 5 次。

现在,工作不再在调用期间完成。analyse_page 和 compare_to_baseline 会启动测量,返回一个任务 ID,然后继续运行。你的助手会每隔约 15 秒调用一次 get_job_result 来获取结果,而 get_job_result 总是会立即响应。测量完成后,它会返回与工具原本会返回的内容完全相同的结果,因此下游不会知道它走的是哪条路径。

你什么都不用做。助手会替你轮询。

只有一种测量仍会当场返回:调用 analyse_page,将 include 设为 ["scores"],只提供一个 URL,并将 runs 设为 1。这是一次没有离散度信息的单次分析,也正是这个软件包力求拒绝的嘈杂单次测量值;输出中会用明确的文字说明这一点。

已完成的任务会保留一小时,以便你想再看一次时还能读取。正在运行的任务会在服务器重启时失效;客户端闲置一段时间后通常会重启服务器。发生这种情况时,get_job_result 会告诉你,而不会让你一直轮询一个永远不会完成的任务。

如果你的客户端等待时间超过 60 秒,请告知服务器,这样它就会在调用期间多等待一会儿。可在 settings.json 中设置 inline_budget_seconds,或设置 PAGESPEED_INLINE_BUDGET 环境变量。服务器无法自行推断这一点:超时时长不在协议中,服务器继承的少数几个环境变量里也不包含它。

阅读 explain_lcp 的结果前,有两件事值得了解,而且每份结果都会说明这两点。4 个阶段的数值相加并不等于 LCP,差异也不是舍入造成的。在 12 个真实来源中,总和的偏差范围从少 40 ms 到多 2.6 秒不等。每个阶段都是各自的第 75 百分位数,而百分位数不能相加。此外,这些阶段只针对最大元素为图片的访问进行测量;某些网站上,这种访问只占少数。因此,结果总会说明它描述的是多少比例的访问。

这一点往往既是注意事项,也是有用信息。在一个大型网站上,LCP 看起来是令人安心的 1.5 秒,但 LCP 为图片的访问中,有八分之一要等到 3.3 秒后图片才开始下载。标题数字里完全看不出这一点。

compare_to_baseline 回答了分析结果留下的问题:你做的改动有没有效果。首次对某个 URL 调用时,会记录基线,不进行比较,因为还没有可供比较的数据。做出改动后再调用一次,它会重新测量,并报告发生了什么变化。

只有当两个最小值至最大值范围完全没有重叠时,它才会给出结论。这一做法有意保持保守,因此可能会漏掉较小但真实的改进。原因在于两种可能的错误后果并不相同:明明有变化却告诉你没有,只会让你稍微缺乏信心;把噪声说成改进,则会让你得出一个可能转述给客户的结论。如果改动确实有效,它会同时报告中位数差值和两个范围实际能保证的较小数值;应当引用有保证的数值。

基线保存在与设置文件同一目录下的 baselines.json 中,以 URL 和策略为键,除非你主动要求,否则绝不会更改。刻意不对现场数据进行比较,因为 28 天滚动窗口无法反映本周做出的改动。

技能

skills/pagespeed-insights-read/ 教助手如何解读结果。 服务不会在不说明不确定性的情况下给出数字。它无法阻止助手在回答时丢掉这些不确定性,而最常见的错误就是把四项节省时间的估算相加,然后承诺能快 9 秒。

这是可选的。没有它,一切照常运行,而且工具的说明中也包含相同的警告。这个技能的作用,是防止这些警告在形成答案的过程中被改写掉。

每个客户端保存技能的位置都不一样;有些会从账户同步,而不是读取你的磁盘;有些则根本没有这类功能。因此,与其列出某个客户端的路径,不如问问你用的客户端。把下面的内容粘贴进去,并将文件夹路径替换为你克隆项目的位置。

I have a skill folder on this computer and I would like you to install it into
whichever client you are running inside, if that client supports skills.

  Skill folder = /path/to/pagespeed-insights-mcp/skills/pagespeed-insights-read

Please:
1. Work out whether this client supports skills, and where it keeps them on this
   machine.
2. Install the folder there, keeping its folder name unchanged. Most clients take
   the name of the folder as the name of the skill, so renaming it renames the
   skill.
3. Prefer linking to the folder above rather than copying it, if this client
   follows links, so it updates when I next pull. Copy it if not.
4. If this client syncs skills from an account rather than reading this disk, do
   not guess at a path. Tell me where to add it instead.
5. Tell me what you did and whether I need to restart the app.

If this client has no concept of skills, say so plainly and do nothing.
Everything works without it.

设置程序会打印相同的提示词,其中已经填入了你的实际路径。

对 2 个 URL 进行 5 次分析需要几分钟,要求得再急也不会加快速度。无论你做什么,Google 大约每分钟才会重新分析一个 URL,因此时间都花在等待真正的新测量结果上,而不是排队等待请求。每次收到新的分析结果时,服务都会发送进度更新,这样客户端就不会中途放弃。如果你的助手提出使用 runs=1 来加快速度,答案是不行,这正是这个技能要防止的情况。

如果发现任何异常,请先运行 check_setup。它能在大约 2 秒内区分配置问题和页面加载缓慢的问题。

从终端运行

在你克隆到的文件夹中,它会作为模块运行:python3 -m pagespeed_insights。如果想让 pagespeed 命令在任何位置都能运行,请将启动器链接到你的 PATH 中。

mkdir -p ~/.local/bin
ln -s "$PWD/pagespeed" ~/.local/bin/pagespeed

如果 ~/.local/bin 不在你的 PATH 中,请在 shell 配置文件中添加 export PATH="$HOME/.local/bin:$PATH"。在 Windows 上无需创建符号链接,只需将该文件夹添加到 PATH,或者继续在该文件夹内使用 python -m pagespeed_insights。

设置程序会显示该命令,但不会运行它。它不会在自身设置之外写入任何内容;而悄悄将可执行文件放进 PATH 目录的工具,正是这条规则要防止的情况。

pagespeed https://example.com/
pagespeed --runs 3 --strategy both https://example.com/
pagespeed --field --history https://example.com/
pagespeed --lcp https://example.com/
pagespeed --findings https://example.com/
pagespeed --compare https://example.com/
pagespeed --baselines
pagespeed --field --report report.html https://example.com/
pagespeed --json https://example.com/

--report 会生成一个独立的 HTML 页面,不含脚本、网络请求或外部依赖。它可以直接从文件打开,也适合通过电子邮件发送。这一点很重要,因为影响最大的问题往往涉及托管服务或第三方决策,而作出检查的人通常无法决定这些事项。

你的助手也可以保存同一个页面。让它生成报告,它会询问你要将文件保存到哪里。服务只会写入你指定的文件夹,而且只有在你提出要求时才会写入;它不会创建文件夹,也绝不会覆盖现有报告,因为有人需要对比前后结果。若不指定文件夹,报告会保存到设置文件旁边的 reports 文件夹中,并会返回完整路径,方便你找到文件。

保存的文件会保留嵌入字体,大小约为 150KB。对话中返回的副本会去掉这些字体,因为 145KB 的 base64 内容会让上下文窗口的大部分空间都耗在排版上。两种方式使用的都是同一个渲染器。

如果没有提供 URL,它会使用你在设置过程中保存的 URL。

退出代码会根据错误类型区分,因此在 CI 中运行它的程序可以区分网站故障和 Google 恰好遇上糟糕的一天。

代码含义
0正常
1发生了其他错误
2参数错误
3配额已用尽,问题出在基础设施而非网站
4凭据被拒绝,问题出在配置而非网站
5页面无法访问,问题出在网站
6无法连接到 Google,问题出在网络而非网站

只有 5 表示页面有问题。因为 3 或 6 而让构建失败,就等于因为 Google 正忙而让构建失败。

出现问题时

每个失败都会附带解决问题的说明,而不是堆栈跟踪;其中大多数问题其实与你的网站无关。了解问题所在,可以避免你去改动原本没有问题的东西。

出现 429,且没有密钥。 你正在使用共享的匿名池,其他人也都在用,而且通常到当天中午就会耗尽。这与正在测量的网页毫无关系。运行设置并添加密钥。

出现 429,且有密钥。 你自己的项目配额当天已经用完。配额会在太平洋时间午夜重置。

PageSpeed Insights 返回 400 或 403。 密钥缺失、错误,或设置了 HTTP 引用来源限制。最后一种情况最常见;这是开始之前的第 9 步带来的问题,因为程序没有引用来源网页,所以每次都会拒绝这种受限密钥。请改用 API 限制,或者不设限制。还要顺便在该页面检查项目是否已启用 PageSpeed Insights API。

来源站点没有字段数据。 这不是失败,工具也不会将其报告为失败。Google 只会为流量足够大、可以保持匿名的来源发布真实用户数据,因此小型、新建或尚未上线的网站没有这类数据,而且在有访客之前都不会有。剩下的只有实验室数据;它是一种模拟,并不能证明任何人的真实体验。

Chrome UX Report 显示此项目尚未使用该服务。 可能是 API 尚未启用,也可能是你刚在一分钟前启用,还没有完成传播。我们无法从外部区分这两种情况;而且在你看到这条消息之前,系统已经重试过一次,所以请等几分钟后再运行,然后再考虑更改任何设置。

Chrome UX Report 拒绝了密钥。 密钥本身没有问题,只是它的 API 限制中没有包含 Chrome UX Report API。请在 Google Cloud 控制台的 Credentials 中编辑密钥的 API 限制,将其添加进去。

Lighthouse 无法加载该网页。 与上面所有问题不同,这个问题确实与你的网站有关。请检查匿名访客能否通过该 URL 获得 200 响应,并确认没有登录要求或地域封锁。

完全无法连接 Google。 这是网络、DNS 或超时问题;在报告之前,系统已经采用退避策略重试过。

助手提示请求超时。 现在这里不应该再有任何操作耗时过长,因为超过约一分钟的操作都会改为返回任务 ID。如果你看到这条消息,说明调用中设置了太多操作,超出客户端的等待时长。请检查 settings.json 中的 inline_budget_seconds 和 PAGESPEED_INLINE_BUDGET 变量,并调低它们的值或移除设置。

任务显示已丢失。 测量过程中服务重启了;当服务闲置一段时间后,客户端会执行重启操作。请重新开始测量,并让助手在运行期间持续轮询。

如果你不确定遇到的是哪种情况,可以运行 check_setup 来确认。它会检查密钥是否有效、Chrome UX Report 是否可访问,以及存在哪些基线,而不会泄露密钥。

更新

这里没有软件包,也没有安装程序,因此无需下载任何内容。服务以 mcp_server.py 的形式在你克隆到的目录中运行,因此更新只需拉取代码并重启。

你的密钥和已保存的 URL 不在该目录中,而是存放在平台的配置目录下的 settings.json 中,因此更新不会影响它们,也不会再次提示你输入密钥。

重启这一步最容易让人忽略。stdio MCP 服务是一个长期运行的进程,它会在应用启动服务时读取一次 mcp_server.py。修改正在运行的服务所用的文件不会产生任何影响,因此请正确退出应用,然后重新打开。在 macOS 上,仅关闭窗口还不够;在 Windows 上,如果应用仍留在系统托盘中,仅关闭最后一个标签页也不够。

每个版本都有标签,GitHub 上的发布页面会说明每个版本的更改。运行 pagespeed --version 可以查看你正在使用哪个版本,你的助手也可以从服务握手中读取相同的版本号。git pull 会让你切换到最新的 main,有时它会领先于最新的标签版本。

让助手来操作

将以下内容粘贴到一个能在这台电脑上运行 shell 命令的 AI 助手中。它可以拉取代码,但无法重启其运行所在的应用,因此最后一步仍需你自己完成。

Please update my PageSpeed Insights MCP server. Find where it's installed by
reading the path out of this app's MCP config rather than guessing it, run git
pull in that folder, and tell me what changed. Don't run setup.py and don't edit
my settings.json, my key and saved URLs are already in it. Then remind me to quit
this app completely and open it again, because the server only reads
mcp_server.py at startup.
或者自行运行命令

在你克隆到的文件夹中运行。

cd pagespeed-insights-mcp
git pull

文件所在位置

你的密钥和已保存的 URL 存放在平台配置目录下的 settings.json 中。

  • macOS,~/Library/Application Support/pagespeed-insights-mcp/
  • Linux,~/.config/pagespeed-insights-mcp/
  • Windows,%APPDATA%\pagespeed-insights-mcp\

若要添加、更改或移除已保存的 URL,请在你克隆到的文件夹中再次运行 python3 setup.py。对话框会显示上次保存的内容,你可以编辑列表并提交。清空列表后,每次都需要重新指定网站。除非你输入新的密钥覆盖原有密钥,否则原密钥会保留。这里没有对应的 CLI 参数。该文件很小且格式简单,手动编辑也同样方便;删除该文件则会从这台机器上移除密钥。

在 macOS 和 Linux 上,settings.json 仅所有者可读。在 Windows 上则不会这样,因为 Windows 没有 POSIX 文件模式,而且相关请求会被静默忽略。在 Windows 上,保护来自 %APPDATA% 位于你的用户配置文件中,默认仅限你访问。这确实能提供保护,但它是继承而来,而非由此工具设置,因此值得了解你依赖的是哪种保护方式。

正在运行的测量任务会将状态保存在设置文件旁边的 jobs 文件夹中,每个任务对应一个小文件,任务完成一小时后删除。这样,即使客户端在后台悄悄重启了服务,轮询也能找到任务结果。

PAGESPEED_CONFIG_DIR 可以将配置目录移到你喜欢的位置;PAGESPEED_API_KEY 可覆盖已保存的密钥,适合想将密钥保存在自己的密钥管理器中的用户。PAGESPEED_INLINE_BUDGET 指定单次工具调用内执行工作的秒数上限,超过后会改为返回任务 ID,默认值为 45。

密钥保存在文件中,而不是系统密钥链中;这是有意做出的取舍,我们对此会坦诚说明。要以跨平台方式访问密钥链,需要安装一个软件包;安装软件包需要虚拟环境和一个 pip 步骤,而这会让最需要“克隆并运行”体验的用户失去它所带来的全部优势。请结合凭据的实际用途权衡这一点。按照第 7 步的说明限制权限后,PageSpeed 密钥只能只读访问公开网页的公开测量数据。它不包含个人数据,不会解锁任何账户,也不会产生费用,因为该 API 免费。密钥被盗后最糟糕的情况,是有人用掉每天 25,000 次调用的配额;删除密钥即可解决。这只是麻烦,并非数据泄露。

它不会做什么

它不会将单次运行报告为测量结果。没有这样的标志,将来也不会有。

它不会把实验室数据和现场数据合并成一个数值。在真实网站上,两者相差一个数量级,取平均值会毁掉这里唯一诚实的东西。

如果变化幅度处于波动范围内,它不会将其称为回归。波动范围会打印出来,供你自行判断;范围内的变化并不能证明任何事情。

它不会接触 Google Search Console。Search Console 需要 OAuth 和针对每个资源的授权,因为它提供的是你拥有的资源的私有数据;而 PageSpeed 和 Chrome UX Report 提供的是任何人都可以测量的公开页面的公开数据。这是另一类工具,需要另一种凭据;把它接到这里会让当前只需一个字符串的工具引入一套同意流程。

测试

python3 -m unittest discover -s tests -v

无需 API 密钥,也无需网络。CI 会在 Linux、macOS 和 Windows 上使用 Python 3.9 和 3.12 运行这些测试。

其中两个测试锁定了开发过程中发现的漏洞,这两个漏洞都会产生看似合理的数值,而不是报错。PageSpeed 会将其嵌入的 CLS 乘以 100,因此,如果照字面理解,正常的 0.08 会显示为 8.0;而在这两个数字就是全部意义的指标上,这会是灾难性的得分。Chrome UX Report 返回的 CLS 是字符串,而其他所有指标都是数字,因此直接比较会引发 TypeError。这两种问题都不会自行显现。在测量工具中,看起来正确的错误数值才是唯一重要的漏洞。

隐私政策

这款工具并非仅在本地运行,假装如此是不妥的。测量页面就意味着请 Google 来测量,因此你检查的地址会发送给 Google。这是工具正常工作的方式,而不是数据泄露,但值得一开始就说明,而不是把它埋在后面。

哪些内容会离开这台机器,以及会发送到哪里

你要测量的 URL 会发送给 PageSpeed Insights API;当你请求现场数据时,也会发送给 Chrome UX Report API。如果你有 API 密钥,它也会随这些请求一起发送。除此之外没有其他内容。随后,Google 会从自己的基础设施加载该页面并进行测量,因此页面所有者看到的是来自 Google 而非你的访问。

Google 对这些请求的处理由 Google 自行负责,并受其隐私政策和 API 条款约束;Considus 无法为此作出任何承诺。

哪些内容不会离开

这里没有 Considus 服务器。没有账户、遥测、崩溃报告、使用次数统计,也没有许可证检查。我们永远不会知道你测量了什么、何时测量,甚至不知道你是否运行过它。我们这边没有任何东西可以用来查看这些信息。

它会写入什么,以及写到哪里

settings.json 会在你平台的配置目录中保存 API 密钥和你保存的任何 URL;你也可以通过 PAGESPEED_CONFIG_DIR 将它移到任意位置。

基线数据用于让之后的运行判断变化是真实变化还是噪声,会保存在同一位置。

HTML 报告会写入这些设置旁边的 reports 文件夹,或者写入你在对话中指定的文件夹。它不会写入尚不存在的文件夹,也绝不会覆盖任何内容。

正在运行的测量会将进度及最终结果写入设置旁边的 jobs 文件夹中的一个小文件,因为轮询请求和它所查询的测量不一定发生在同一个服务器进程中。这些文件只保存公开页面的测量数据,不含其他内容,并会在任务完成一小时后删除。

所有内容都保存在你自己的磁盘上,也都由你自行处置。删除 settings.json 即可从这台机器上移除密钥。

关于密钥存储在文件中

在 macOS 和 Linux 上,文件仅允许所有者读取。在 Windows 上,这一要求会被忽略,因为 Windows 没有 POSIX 文件模式;在 Windows 上,保护来自 %APPDATA% 位于你的用户配置文件中。这种保护确实存在,但由系统继承而来,并非由此工具设置,因此保障力度较弱,值得了解。

密钥存储在文件中,而不是密钥链条目中,因为要以可移植的方式访问密钥链,需要安装一个软件包;这又需要虚拟环境和一个 pip 步骤,这样就失去了“克隆并运行”的全部优势。请结合凭据本身的性质权衡这一点。按照设置说明限制访问范围的 PageSpeed 密钥,只能只读访问公开网页的公开测量数据。它不包含个人数据,不能解锁任何账户,也不会产生费用,因为该 API 免费。密钥被盗的最坏情况是耗尽配额,而你可以通过删除密钥来重置配额。如果你对这种权衡有不同看法,可以通过自己的密钥管理器设置 PAGESPEED_API_KEY,这样就完全不会存储密钥。

数据保留及数据会提供给谁

我们不持有任何数据,因此没有数据需要保留,也没有数据需要代你删除。我们不会与任何人共享数据,因为没有任何数据会传到我们这里。唯一涉及的第三方是 Google,且仅用于上述测量请求。

如果你想咨询相关事宜

请发送邮件至 [email protected],或在 github.com/Considus/pagespeed-insights-mcp/issues 提交问题。适用于 considus.com 网站本身的政策见 considus.com/privacy,它是单独的文件,因为适用范围不同。

支持

本项目免费,并将一直免费。Apache 2.0 许可意味着你可以使用、改进并将其用于商业用途发布,无需支付任何回报,这是我们有意为之。

如果遇到故障,或者不相信某个数值, 请提交问题。 任何可被利用的问题,请通过 GitHub 的私密报告渠道或发送邮件至 [email protected],而不要公开提交问题;详情请参阅 SECURITY.md。 如果你的事宜不属于以上情况,包括媒体咨询和许可问题,请联系 [email protected];其他联系方式见 considus.com/support。

如果它帮你避免追查一个根本不存在的回归问题,不妨 请我喝杯咖啡。如果没有,告诉 我它哪里出错,比请喝咖啡更有价值;能报告一个看似合理、实则错误的数值, 是任何人都能提供的最有用帮助。

许可证

Apache 2.0。请参阅 LICENSE 和 NOTICE。

非官方社区项目。与 Google LLC 无关联,未获其认可或赞助。本项目调用两个 Google 公共 API,不包含任何 Google 代码,也不再分发任何 Google 数据。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。