# Page Scanner (npm · @page-scanner/mcp)

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

- Trust score: 62/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-26

## Components

- npm · `@page-scanner/mcp`: 62/100 (this document), [markdown](https://verifymcp.io/servers/sbd530-page-scanner/page-scanner-mcp.md), [page](https://verifymcp.io/servers/sbd530-page-scanner/page-scanner-mcp)

## Channel facts

- Registry: `npm`
- Package: `@page-scanner/mcp`
- Version: `0.4.2`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-26.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 31 of 97 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 19/100
  - Repository check failed: no source repository is declared.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 1 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 61/100
  - AI-judged instruction clarity (excellent).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 99/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 97% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 7 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 7 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**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.

### Claude

```bash
claude mcp add sbd530-page-scanner -- npx -y @page-scanner/mcp
```

### Cursor

```json
{
  "mcpServers": {
    "sbd530-page-scanner": {
      "command": "npx",
      "args": [
        "-y",
        "@page-scanner/mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "sbd530-page-scanner": {
      "command": "npx",
      "args": [
        "-y",
        "@page-scanner/mcp"
      ]
    }
  }
}
```

### Codex

```bash
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
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add sbd530-page-scanner --command npx --arg -y --arg @page-scanner/mcp
```

### Hermes

```yaml
mcp_servers:
  sbd530-page-scanner:
    command: "npx"
    args: ["-y", "@page-scanner/mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "sbd530-page-scanner": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@page-scanner/mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add sbd530-page-scanner -t stdio -c npx -a -y @page-scanner/mcp
```

### Other

```json
{
  "mcpServers": {
    "sbd530-page-scanner": {
      "command": "npx",
      "args": [
        "-y",
        "@page-scanner/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-25 (score 62, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-24 (score 62)

First indexed and scored.

## MCP tools (7)

### `install` (~124 tokens)

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.

Input parameters:

- `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.

### `pair` (~112 tokens)

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.

Input parameters:

- `rotate` (boolean): Issue a new token, invalidating the old one. Every browser must be re-paired.

### `list_browsers` (~40 tokens)

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` (~133 tokens)

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.

Input parameters:

- `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.

### `scan_page` (~951 tokens)

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.

Input parameters:

- `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.

### `extract_design` (~615 tokens)

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.

Input parameters:

- `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.

### `diff_captures` (~192 tokens)

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

Input parameters:

- `newPath` (string, required): The newer capture of the same page, of the same kind.
- `oldPath` (string, required): 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.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/sbd530-page-scanner/page-scanner-mcp#diagnostics

## Score history

- 2026-09-26: 62
- 2026-09-25: 62
- 2026-09-24: 62

## 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.

## Links

- npm package: https://www.npmjs.com/package/@page-scanner/mcp
- Socket report: https://socket.dev/npm/package/@page-scanner/mcp
- Website: https://docs.pagescanner.app/mcp
- Changelog RSS feed: https://verifymcp.io/servers/sbd530-page-scanner/page-scanner-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/sbd530-page-scanner/page-scanner-mcp.json
- HTML version of this page: https://verifymcp.io/servers/sbd530-page-scanner/page-scanner-mcp
