Skip to main content
Glama
TanasiDesigns

fullpageshot-mcp

fullpageshot-mcp

An MCP server that gives an agent the ability to:

  1. open a website (open_url)

  2. take a screenshot of it (screenshot) — full-page by default

  3. read the screenshot back as an image (read_screenshot)

Capture runs in the background by default (headless Chromium), so it needs no open window and no browser extension. It drives a Chromium-based browser you already have via the Chrome DevTools Protocol — zero npm dependencies.

Companion to the FullPageShot browser extension. The extension is for humans clicking the toolbar; this server is for agents and scripts.

Requirements

Node.js

>= 22 (uses the built-in WebSocket and fetch; Node 24 tested)

Browser

Any Chromium-based browser: Google Chrome, Brave, Chromium, Microsoft Edge

OS

macOS, Linux, Windows

Dependencies

none

The server finds a browser automatically. Override with FULLPAGESHOT_CHROME=/path/to/browser.

Related MCP server: webshot-mcp

Install

git clone https://github.com/TanasiDesigns/fullpageshot-mcp
cd fullpageshot-mcp
node src/server.mjs --version      # sanity check, no install step needed

Or run it straight from a checkout in any MCP client config (below). No npm install is required.

Add it to an MCP client

Generic stdio configuration (Claude Desktop, Cursor, Cline, Continue, pi, etc.):

{
  "mcpServers": {
    "fullpageshot": {
      "command": "node",
      "args": ["/absolute/path/to/fullpageshot-mcp/src/server.mjs"]
    }
  }
}

With the optional bin link:

{
  "mcpServers": {
    "fullpageshot": { "command": "fullpageshot-mcp" }
  }
}

Tools

Tool

What it does

open_url

Navigate to a URL. headless:false opens a visible window. Returns the final URL + title.

screenshot

Capture the current page, or a url you pass. Full-page by default. Saves PNG/JPEG/WebP to disk and returns the image.

read_screenshot

Read a saved screenshot file back as image content.

close_browser

Shut the browser down and remove its throwaway profile.

browser_status

Show running/headless/version/output-dir state.

Example agent prompts

  • "Open https://example.com and screenshot it."

  • "Take a full-page screenshot of https://en.wikipedia.org/wiki/Web_browser and tell me what the infobox says."

  • "Screenshot https://stripe.com/pricing at 1440×900 and read it back."

  • "Capture https://github.com and crop-check the footer." (capture, then read_screenshot)

Background capture

Capture is headless by default (--headless=new) so it works with no visible window:

  • screenshot({ url, headless: true }) → background, no window.

  • open_url({ url, headless: false }) → visible window (useful for debugging).

  • Env FULLPAGESHOT_HEADLESS=0 forces a visible window for every call.

Each run uses a throwaway profile under the system temp dir, so it never touches your real browser profile or logins.

Configuration

Env var

Default

Meaning

FULLPAGESHOT_CHROME

auto-detected

Path to the browser binary.

FULLPAGESHOT_HEADLESS

1

0 shows a visible window.

FULLPAGESHOT_OUT

temp dir

Where screenshots are saved.

How it works

MCP stdio  ->  fullpageshot-mcp  ->  launches Chromium (headless)
                                   ->  CDP over WebSocket
                                       Target.createTarget
                                       Page.navigate
                                       Page.getLayoutMetrics
                                       Page.captureScreenshot{captureBeyondViewport}
                                   ->  PNG on disk + base64 image back to the agent

Full-page capture uses captureBeyondViewport with a clip sized to the page's content, scaled down if it would exceed the 16384 px screenshot ceiling. screenshot also scrolls the page once (settle) to trigger lazy-loaded content before measuring.

Security & privacy

  • Runs entirely locally. No telemetry, no accounts, no network calls except the pages you ask it to open.

  • Never attaches to your everyday browser or its profile — it launches a separate throwaway instance.

  • The only "remote control" surface is the browser it starts itself.

Compatibility

Tested with Brave 154.0.8037.93 (Chromium 154) on macOS, headless. The CDP methods used (Target.*, Page.navigate, Page.getLayoutMetrics, Page.captureScreenshot) are long-stable and supported by Chromium 100+; Chrome/Brave/Edge/Chromium all work.

License

MIT — see LICENSE. Do whatever you want with it: use, modify, fork, sell, ship in your own product. Just keep the copyright notice.

Available Tools

5 tools
browser_statusA

Report whether the browser is running, whether it is headless, its version, and the screenshot output directory.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose the returned behavioral facts (running state, headless flag, version, screenshot dir). It does not explicitly state that the call is side-effect-free or whether it launches a browser, but 'Report' strongly implies a passive read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with no filler, and the four returned facts are front-loaded in one clause. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must enumerate return values, and it does so completely for a zero-parameter read tool. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate beyond what the empty schema already conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Report') and enumerates exactly what is reported: running state, headless mode, version, and screenshot output directory. This clearly separates it from the action siblings (open_url, screenshot, read_screenshot, close_browser), though it never names or contrasts those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied – an agent can infer this is the tool to call to check browser state, but the description gives no explicit when-to-use, when-not-to-use, or prerequisite (e.g. call before screenshotting). No alternatives are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

close_browserA

Shut down the controlled browser and clean up its temporary profile.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose a real side effect: the temporary profile is cleaned up (i.e., destroyed). However it says nothing about idempotency or what happens if no browser is running, so behavioral coverage is partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero waste; the primary action and its cleanup side effect are stated together.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless lifecycle tool with no output schema, the description says what it does and the side effect. It is nearly complete, though it omits failure/idempotency behavior for repeated calls.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to document; the baseline for a no-param tool is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (shut down) plus the resource (controlled browser) and an additional effect (clean up its temporary profile). An agent can distinguish this teardown operation from open_url, screenshot, and browser_status without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied — you call this when finished with the browser — but there is no explicit when/when-not guidance or reference to a sibling. The teardown intent is clear enough from the verb to be actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_urlB

Open a website in a controlled Chromium browser. Runs headless (background) by default; set headless=false for a visible window.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL to open (https:// is assumed if no scheme is given).
widthNoViewport width in CSS px.
heightNoViewport height in CSS px.
settleNoScroll through the page first to trigger lazy content. Default true.
headlessNoRun without a visible window. Default true.
timeoutMsNoNavigation timeout in ms. Default 30000.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses the headless default and how to get a visible window, but says nothing about session persistence across sibling calls, whether existing pages are replaced, auth requirements, or side effects. No output schema exists, so return behavior is also undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with zero filler, and the key operational fact (headless by default) is front-loaded after the purpose statement. Slightly terse for a six-parameter tool, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations and no output schema in a multi-tool browser session, the description omits what happens after navigation — whether the session persists for screenshot/close_browser, and what is returned. It covers the core act of opening a URL but leaves session lifecycle behavior to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema. The description repeats the headless default rather than adding new semantics (e.g., how settle interacts with lazy loading, or timeout behavior on failure). Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Open a website in a controlled Chromium browser'), which is unambiguous about what the tool does. It does not explicitly differentiate itself from siblings like screenshot or close_browser, but as the obvious session entry point the distinction is reasonably clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives, no prerequisites, and no mention of the sibling tools (screenshot, read_screenshot, close_browser, browser_status) that share the browser session. Usage is only inferable from the browser-session context, not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_screenshotA

Read a previously saved screenshot file back as image content.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath to a PNG/JPEG/WebP/GIF file.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully discloses the output form ('as image content'), which tells the agent what to expect back, but it says nothing about error behavior for missing files, permission needs, or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler or redundancy. It is efficiently sized, though the terseness leaves room it could have used for behavioral context rather than being bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with no output schema, the description covers what it does and the return form. Minor gaps remain around failure modes (e.g., nonexistent path), but nothing critical to invoking it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single parameter and 100% schema description coverage, the schema already documents the path and its allowed formats (PNG/JPEG/WebP/GIF). The description adds no semantic detail beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Read) and resource (a previously saved screenshot file), and the phrase 'previously saved' implicitly distinguishes it from the sibling 'screenshot' tool that captures new images. It does not name any sibling explicitly, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Previously saved screenshot file' implies this is the follow-up to a capture operation, giving implied usage context. However, there is no explicit when-to-use, when-not-to-use, or naming of alternatives such as the 'screenshot' sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenshotA

Capture a full-page screenshot (default) of the current page or of a URL. Saves a PNG/JPEG/WebP to disk and returns the image so it can be read.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoIf set, navigate here before capturing. Otherwise captures the current page.
pathNoOutput file path. Defaults to the system temp dir.
readNoReturn the image bytes in the response. Default true.
maxPxNoMax image dimension; larger pages are scaled down. Default 16384.
widthNoViewport width in CSS px.
formatNoImage format. Default png.
heightNoViewport height in CSS px.
settleNoScroll through the page first to trigger lazy content. Default true.
qualityNo0-100, JPEG/WebP only.
fullPageNoCapture the whole page beyond the viewport. Default true.
timeoutMsNoNavigation timeout in ms.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose real behavior: it writes a file to disk (a side effect) and also returns the image bytes. However, it omits whether an existing file at 'path' is overwritten, permission/auth requirements, and scaling behavior, leaving meaningful behavioral context unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the default behavior (full-page) and output behavior front-loaded. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, zero-annotation tool with no output schema, the description covers the core action and the disk-write plus image-return behavior, which is solid. It still leaves the read vs read_screenshot relationship and file-overwrite/concurrency semantics unexplained, so it is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 11 parameters are already documented in the schema, setting the baseline at 3. The description only adds light framing ('full-page (default)', format options, image returned for reading) and no syntax or default details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Capture a full-page screenshot') plus the scope (current page or a URL), so the action is unambiguous. It does not differentiate itself from siblings, notably read_screenshot, and the phrase 'returns the image so it can be read' arguably muddies rather than clarifies the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: use when you want to capture the current page or navigate to a URL and grab a screenshot. There is no explicit when-not guidance and no routing against siblings like read_screenshot or open_url, which is the main gap given the potential overlap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedbrowser_status
    • First observedclose_browser
    • First observedopen_url
    • First observedread_screenshot
    • First observedscreenshot

TDQS

A3.6/5.0

Scored across 5 tools

Disambiguation4/5

Each tool targets a distinct action on the controlled browser: open, capture, read file, close, and report status. The only mild overlap is that screenshot can accept a URL directly, which slightly blurs the line with open_url, but otherwise the boundaries are clear.

Naming Consistency4/5

Most tools follow a verb_noun pattern (open_url, read_screenshot, close_browser) which is consistent and readable. screenshot and browser_status deviate (noun-only), but the set is still predictable.

Tool Count4/5

Five tools is a snug, well-scoped set for a headless-browser screenshot server, covering the core lifecycle without bloat. It sits at the lower end but each tool earns its place.

Completeness4/5

The browser lifecycle is well covered: open, capture, read back, close, and status. Minor gaps like page interaction (click, scroll, navigate) exist, but for a screenshot-focused purpose the surface is essentially complete.

Related MCP Connectors

Related MCP Servers