Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Page Scanner

NPM · @PAGE-SCANNER/MCP · SCANNED SEP 26

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

Available components

62 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 97 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency19
Schema Quality & AI Usability61
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 2167 tokens (~309/item across 7 items; 7 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage99
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 97% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 7 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 7 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Install

How do I install the Page Scanner MCP server?

Page Scanner runs locally as an npm package, launched with npx -y @page-scanner/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @page-scanner/mcp

# add to Claude Code
claude mcp add sbd530-page-scanner -- npx -y @page-scanner/mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "sbd530-page-scanner": {
      "command": "npx",
      "args": [
        "-y",
        "@page-scanner/mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "sbd530-page-scanner": {
      "command": "npx",
      "args": [
        "-y",
        "@page-scanner/mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add sbd530-page-scanner -- npx -y @page-scanner/mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "sbd530-page-scanner": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@page-scanner/mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add sbd530-page-scanner --command npx --arg -y --arg @page-scanner/mcp
# ~/.hermes/config.yaml
mcp_servers:
  sbd530-page-scanner:
    command: "npx"
    args: ["-y", "@page-scanner/mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "sbd530-page-scanner": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@page-scanner/mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add sbd530-page-scanner -t stdio -c npx -a -y @page-scanner/mcp
// mcp.json
{
  "mcpServers": {
    "sbd530-page-scanner": {
      "command": "npx",
      "args": [
        "-y",
        "@page-scanner/mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 25 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 24 Sept 26 62

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 26 Sept 2026 · Analysed npm/@page-scanner/mcp@0.4.2

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 97 packages
Packages resolved 97
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 7 exposed · ~2,167 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
diff_captures ~192

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. "changed" says whether anything did.

NameTypeReqDescription
newPathstringyesThe newer capture of the same page, of the same kind.
oldPathstringyesThe older capture: a .md from markdown "beside" or "only", a PNG, or a PDF with its .md beside it.
outputPathstring–For two PNGs, where to write the newer one with the changed regions outlined. Defaults to beside it, as <name>.diff.png.

No output schema declared.

No examples provided.

extract_design ~615

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.

NameTypeReqDescription
browserIdstring–Which browser to act on, from list_browsers. Optional when only one is connected. Chrome runs a separate extension per profile, so a work profile and a personal profile are two different browsers.
componentsboolean–Also find the components: repeated structures and controls, their variants and hover and focus states. Each page is scanned as well, and components.json, components.md and catalog.pdf (each variant c…
crawlstring–A start address to find the pages from, instead of naming them: its same-origin links are followed breadth first, one page per kind of page (so one blog post, not all), honoring robots.txt and nofoll…
depthinteger–With crawl: how many links away from the start address to go. Default 2.
maxPagesinteger–With crawl: how many pages to read at most. Default 10; each takes about 10 s.
minUsesinteger–How many uses make a value an inferred token. Default 2.
outputPathstring–The directory to write the files into. Defaults to design-<host> in the working directory, or in ~/Downloads where that cannot be written.
tabIdinteger–A tab from list_tabs. Give one of tabId, url or urls.
urlstring–Opens a background tab on this address, reads it, and closes it again.
urlsarray–Several pages of one site, read one after another and written as one design: the tokens and reports cover them all, and audit.md lists what only one page uses. A design system is spread over pages, s…
waitSecondsnumber–How long to wait for a browser to connect, in seconds. Chrome retires the extension after about thirty seconds of silence, so the default covers the reconnect. 0 fails immediately.

No output schema declared.

No examples provided.

install ~124

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.

NameTypeReqDescription
extensionIdsarray–More extension ids to allow by hand. Leave out: the Chrome Web Store build and any unpacked copy of Page Scanner loaded in developer mode are allowed without it.

No output schema declared.

No examples provided.

list_browsers ~40

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_tabs ~133

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.

NameTypeReqDescription
browserIdstring–Which browser to act on, from list_browsers. Optional when only one is connected. Chrome runs a separate extension per profile, so a work profile and a personal profile are two different browsers.
waitSecondsnumber–How long to wait for a browser to connect, in seconds. Chrome retires the extension after about thirty seconds of silence, so the default covers the reconnect. 0 fails immediately.

No output schema declared.

No examples provided.

pair ~112

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.

NameTypeReqDescription
rotateboolean–Issue a new token, invalidating the old one. Every browser must be re-paired.

No output schema declared.

No examples provided.

scan_page ~951

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.

NameTypeReqDescription
browserIdstring–Which browser to act on, from list_browsers. Optional when only one is connected. Chrome runs a separate extension per profile, so a work profile and a personal profile are two different browsers.
captureWidthstring–Lay the page out at the width of a sheet before capturing it, the way a narrow window would, so the PDF prints at 1:1. "window" (the default) takes the page at the width the browser has it; "a4" and…
colorSchemestring–Which of a page's two themes to capture. "auto" (the default) is whatever the browser is set to; "light" and "dark" force one. A page with only one version is unchanged.
fileNamestring–The file name inside outputPath, as a template: {n}, {host}, {name}, {date}, {time}, {ext}. {n} is the page's place in urls, {host} its host, {name} the name the browser suggests, {date} and {time} w…
formatstring––
hidearray–Clutter to hide before the capture and put back after: ads, consent (cookie banners), chat (chat widgets), overlays (modals, their backdrop, "open in the app" bars). [] hides nothing. Left out, the e…
markdownstring–The page as Markdown, read from the page itself rather than from the PDF: "inline" returns the text in this result, "beside" writes a .md next to the file, "only" writes the .md and no file. Each als…
openEditorboolean–Leave the capture open in a Page Scanner editor tab as well.
outputPathstring–Where to write the file. A directory keeps the suggested filename, and a leading ~ is the home directory. Defaults to the working directory, or to ~/Downloads when that is the filesystem root or cann…
pageSizestring–PDF only. "a4" and "letter" slice the capture onto printable sheets with a half-inch margin; "auto" is one page the exact size of the capture, which is not printable and which Acrobat clamps past 200…
qualitynumber–JPEG only, 0.1 to 1.
tabIdinteger–A tab from list_tabs. Give one of tabId, url or urls.
urlstring–Opens a background tab on this address, captures it, and closes it again. Give one of tabId, url or urls.
urlsarray–Several addresses, up to 50, captured one at a time into outputPath, which is then a directory. A page that fails is reported and the next one captured. Give one of tabId, url or urls.
videoHandlingstring–What to do with a video: keep its paused frame, or leave the area blank.
waitSecondsnumber–How long to wait for a browser to connect, in seconds. Chrome retires the extension after about thirty seconds of silence, so the default covers the reconnect. 0 fails immediately.
windowIdinteger–Which window to open `url` in, from list_tabs. Ignored when tabId is given.

No output schema declared.

No examples provided.

Common questions

What is the Page Scanner MCP server?

Page Scanner is an MCP server listed in the public MCP registry as io.github.sbd530/page-scanner. Capture a web page from your own Chrome as a PDF whose text is still text. This page covers its npm package (@page-scanner/mcp).

Is the Page Scanner MCP server safe to use?

Page Scanner scores 62 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 26 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Page Scanner MCP server expose?

Page Scanner exposes 7 tools: install, pair, list_browsers, list_tabs, scan_page, and 2 more. Their descriptions and schemas cost roughly 2,167 tokens of context every time the server is loaded.

Is the Page Scanner MCP server still maintained?

Page Scanner is still listed as active in the MCP registry. We last reached this channel on 26 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Page Scanner MCP server under?

Page Scanner declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.