Page Scanner

io.github.sbd530由 GitHub 账号 sbd530 发布v0.4.5更新于 Oct 25, 2026

Capture a web page from your own Chrome as a PDF whose text is still text.

概览

AI 生成的概览

一个本地 MCP 服务器,从用户自己的 Chrome 抓取网页为可选中文字的 PDF 或图片,并提取设计令牌、滚动分镜和差异对比。

可以做什么
安装并配对 Chrome 扩展助手,列出已连接的浏览器配置及其窗口和标签页,以便选定目标。将整页抓取到磁盘,输出为文字可选的 PDF,或 PNG、JPEG 图片,来源可以是已打开的标签页、单个网址或网址列表。读取页面实际呈现的设计——颜色、字体、间距、圆角、阴影、动效、断点和自定义属性——并写出设计令牌、CSS、Tailwind 预设和审计文件。以稳定速度滚动页面,把滚动行为切分为场景并写入 PDF。离线比较两次抓取结果,Markdown 按段落比较,PNG 按像素比较。在引用前核对引文是否逐字出现在抓取结果的 Markdown 中。
适用场景
适合让助手归档或引用你已登录浏览器中的页面、把线上站点的样式转成设计令牌、记录滚动驱动的动画,或查看同一页面两次抓取之间的变化。
运行要求
通过 npx 从 npm 包以本地进程运行,仅限桌面端。需要装有 Page Scanner 扩展的 Chrome 或其他 Chromium 浏览器;install 工具每台机器只需设置一次助手,配对在扩展设置中完成。未声明任何 API 密钥、环境变量或请求头。
安装前请注意
pair 工具会写入并返回端口和令牌;该令牌是密钥,持有者可扫描用户打开的任何标签页,因此优先使用 install 工具,且不要泄露令牌。抓取结果和生成文件会写入磁盘,扫描网址会在用户浏览器中打开该页面。install 工具会更改本机所有 Chromium 浏览器的助手设置。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Page Scanner,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

工具

9

install

Set up Page Scanner on this computer

Sets up Page Scanner's helper, which Chrome starts to connect the extension to this server, in every Chromium browser on this computer. Needs no port and no token, and returns no secret. Only needed once per machine. Afterwards the user opens the Page Scanner settings in Chrome, Local Agents, presses Connect and allows the prompt; tell them that, since you cannot do it for them.

输入参数extensionIds

pair

Pair this machine with Chrome

The older way to connect, for a machine where the install tool cannot set up the helper: writes the port and token the Page Scanner extension needs, and returns them so you can tell the user what to paste. Prefer install. The token is a secret that lets anything holding it scan any tab the user has open, and it will appear in this conversation, so do not repeat it anywhere else.

输入参数rotate

list_browsers

List connected browsers

The Chrome profiles that have Page Scanner paired and connected right now. Each is a separate browser: use its browserId to say which one you mean.

无需输入参数。

list_tabs

List windows and tabs

The windows and open tabs of one browser, so you can pick what to scan. Tabs carry the windowId they belong to, and windows say which one is focused.

输入参数browserIdwaitSeconds

scan_page

Capture a page to a file

Captures a whole web page and writes it to disk. Name a tabId from list_tabs to capture a tab that is already open, a url to open one and capture that, or urls to capture a list of pages one after another. A PDF keeps real, selectable text; PNG and JPEG are images. Returns the absolute path it wrote, and a truncated report when the page was too large to capture whole; for urls, one result per page, each with its path or its error. Set markdown to get the page as text too, which is far easier to read than a PDF. A tall page or a long list can take minutes. When the answer has status "running", the capture is still going in the browser: call this tool again with exactly the same arguments to wait for its result, and do not start another capture of that tab meanwhile.

输入参数urlhideurlstabIdformatslicestablesqualityfileNamemarkdownpageSizewindowId另有 12 个

extract_design

Read a page's design tokens

Reads a page's design as it is drawn: the colors, type, spacing, radii, shadows, motion and breakpoints its elements use, and the custom properties it declares, in both color schemes. Writes tokens.json (W3C design tokens), tokens.css, tailwind.preset.js, audit.md (values nearly equal), contrast.md (WCAG contrast of every text color over its background) and extract.json (the raw measurements) into outputPath, a directory. Give urls for several pages of one site, or crawl with a start address to have the pages found by following its links. A page that answered an HTTP error is not read in, and in a crawl a page that a redirect took to another site or to a page already read is left out (pages[].left says why). Inferred tokens are numbered by use, not named; name them yourself if the user wants names. A tall page or a long list can take minutes. When the answer has status "running", the capture is still going in the browser: call this tool again with exactly the same arguments to wait for its result, and do not start another capture of that tab meanwhile.

输入参数urlurlscrawldepthtabIdminUsesmaxPagesbrowserIdcomponentsoutputPathwaitSecondstimeoutSeconds

storyboard_page

Scan a page's scroll as a storyboard

Scrolls a page from its top at a steady pace, 1.25 screens a second, and records how it behaves: where the screen holds while its content plays, what fades, slides, scales or is uncovered, and whether it glides on or plays once when the scroll stops. The scroll is cut into scenes. Writes a PDF (an overview and a page per scene with six frames from its entry to its exit), a .json beside it with every scene measured, and each scene's six frames as JPEGs in a .frames folder. Use it to rebuild a page's scroll animations, or to show them without a video. The result is that JSON, every frame with its absolute path, and the files' paths. The scan takes up to two minutes; a tabId is scrolled where the user sees it, and their touching the page or the popup's Stop ends it early with what it had (ended says so). A tall page or a long list can take minutes. When the answer has status "running", the capture is still going in the browser: call this tool again with exactly the same arguments to wait for its result, and do not start another capture of that tab meanwhile.

输入参数urltabIdviewportwindowIdbrowserIdoutputPathwaitSecondstimeoutSeconds

diff_captures

Say what changed between two captures

Compares two captures of the same page that scan_page wrote, with no browser needed. Two Markdown files are compared a passage at a time and the answer carries the changed lines and a unified diff; two PNGs are compared pixel by pixel and the newer one is written again with the changed regions outlined. For PDFs, scan with markdown "beside" and pass the PDFs or their .md files. "section" limits a text comparison to one section by its heading. "changed" says whether anything did.

输入参数newPath必填oldPath必填sectionoutputPath

check_quotes

Check quotes against a capture

Before quoting a page in an answer, checks that each quote or value occurs in the capture’s Markdown as written, with no browser and no model. The Markdown’s own markup (escapes, emphasis, link syntax, list and quote prefixes) is undone and line wrapping ignored; a quote never runs across two blocks, and a word or number has to stand apart (4.99 is not in 14.99). Each quote comes back with the line and the section it is under, or, when missing, where the capture parts from it, to correct it by. A match only once curly quotes, dashes and case are folded is reported as "loose" and does not count as found unless loose is set. "allFound" says whether every quote is there.

输入参数pathloosequotes必填markdown

版本历史

4
  1. v0.4.5最新Oct 24, 2026
  2. v0.4.4Oct 2, 2026
  3. v0.4.3Sep 29, 2026
  4. v0.4.2Sep 24, 2026

评分

已满足适用检查项的 65%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分

    请声明包含 README 的 GitHub 仓库,或在 OAuth 受保护资源元数据中提供 resource_documentation。

  • 许可证10 分

    请在仓库或注册中心条目中声明许可证。