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
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
- Repository check failed: no source repository is declared. See how to fix → View diagnostics → Fail
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 1 days ago).Pass
- Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
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.
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
claude mcp add sbd530-page-scanner -- npx -y @page-scanner/mcp
{
"mcpServers": {
"sbd530-page-scanner": {
"command": "npx",
"args": [
"-y",
"@page-scanner/mcp"
]
}
}
} {
"servers": {
"sbd530-page-scanner": {
"command": "npx",
"args": [
"-y",
"@page-scanner/mcp"
]
}
}
} codex mcp add sbd530-page-scanner -- npx -y @page-scanner/mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"sbd530-page-scanner": {
"type": "local",
"command": [
"npx",
"-y",
"@page-scanner/mcp"
],
"enabled": true
}
}
} openclaw mcp add sbd530-page-scanner --command npx --arg -y --arg @page-scanner/mcp
mcp_servers:
sbd530-page-scanner:
command: "npx"
args: ["-y", "@page-scanner/mcp"] {
"McpServers": {
"sbd530-page-scanner": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"@page-scanner/mcp"
]
}
}
} assistant mcp add sbd530-page-scanner -t stdio -c npx -a -y @page-scanner/mcp
{
"mcpServers": {
"sbd530-page-scanner": {
"command": "npx",
"args": [
"-y",
"@page-scanner/mcp"
]
}
}
} 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.
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 →
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 →
diff_captures Say what changed between two 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.
| Name | Type | Req | Description |
|---|---|---|---|
| newPath | string | yes | The newer capture of the same page, of the same kind. |
| oldPath | string | yes | The older capture: a .md from markdown "beside" or "only", a PNG, or a PDF with its .md beside it. |
| outputPath | string | – | 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 Read a page's design tokens ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| browserId | string | – | 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. |
| components | boolean | – | 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… |
| crawl | string | – | 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… |
| depth | integer | – | With crawl: how many links away from the start address to go. Default 2. |
| maxPages | integer | – | With crawl: how many pages to read at most. Default 10; each takes about 10 s. |
| minUses | integer | – | How many uses make a value an inferred token. Default 2. |
| outputPath | string | – | The directory to write the files into. Defaults to design-<host> in the working directory, or in ~/Downloads where that cannot be written. |
| tabId | integer | – | A tab from list_tabs. Give one of tabId, url or urls. |
| url | string | – | Opens a background tab on this address, reads it, and closes it again. |
| urls | array | – | 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… |
| waitSeconds | number | – | 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 Set up Page Scanner on this computer ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| extensionIds | array | – | 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 List connected 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 List windows and 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.
| Name | Type | Req | Description |
|---|---|---|---|
| browserId | string | – | 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. |
| waitSeconds | number | – | 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 Pair this machine with Chrome ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| rotate | boolean | – | Issue a new token, invalidating the old one. Every browser must be re-paired. |
No output schema declared.
No examples provided.
scan_page Capture a page to a file ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| browserId | string | – | 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. |
| captureWidth | string | – | 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… |
| colorScheme | string | – | 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. |
| fileName | string | – | 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… |
| format | string | – | – |
| hide | array | – | 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… |
| markdown | string | – | 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… |
| openEditor | boolean | – | Leave the capture open in a Page Scanner editor tab as well. |
| outputPath | string | – | 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… |
| pageSize | string | – | 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… |
| quality | number | – | JPEG only, 0.1 to 1. |
| tabId | integer | – | A tab from list_tabs. Give one of tabId, url or urls. |
| url | string | – | Opens a background tab on this address, captures it, and closes it again. Give one of tabId, url or urls. |
| urls | array | – | 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. |
| videoHandling | string | – | What to do with a video: keep its paused frame, or leave the area blank. |
| waitSeconds | number | – | 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. |
| windowId | integer | – | Which window to open `url` in, from list_tabs. Ignored when tabId is given. |
No output schema declared.
No examples provided.
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.