Install
$ agentstack add mcp-custodia-admin-pagebolt-mcp ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v1.0.2 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v1.0.2. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
PageBolt MCP Server
[](https://www.npmjs.com/package/pagebolt-mcp) [](https://opensource.org/licenses/MIT) [](https://modelcontextprotocol.io)
Take screenshots, generate PDFs, create OG images, inspect pages, and record demo videos directly from your AI coding assistant.
Works with Claude Desktop, Cursor, Windsurf, Cline, and any MCP-compatible client.
What It Does
PageBolt MCP Server connects your AI assistant to PageBolt's web capture API, giving it the ability to:
- Take screenshots of any URL, HTML, or Markdown (30+ parameters)
- Generate PDFs from URLs or HTML (invoices, reports, docs)
- Create OG images for social cards using templates or custom HTML
- Run browser sequences — multi-step automation (navigate, click, fill, screenshot)
- Record demo videos — browser automation as MP4/WebM/GIF with cursor effects, click animations, and auto-zoom
- Inspect pages — get a structured map of interactive elements with CSS selectors (use before sequences)
- Observe pages for agents — compact, token-budgeted observation with an optional
flatdomtreemode for browser-use / page-agent interop - Import agent traces — turn a browser-use / page-agent action trace into a re-runnable PageBolt sequence
- List device presets — 25+ devices (iPhone, iPad, MacBook, Galaxy, etc.)
- Check usage & track async jobs — monitor your API quota and long async video renders in real time
All results are returned inline — screenshots appear directly in your chat.
Quick Start
1. Get a free API key
Sign up at pagebolt.dev — the free tier includes 100 requests/month, no credit card required.
2. Install & configure
Claude Desktop
Add to ~/.claude/claude_desktop_config.json:
{
"mcpServers": {
"pagebolt": {
"command": "npx",
"args": ["-y", "pagebolt-mcp"],
"env": {
"PAGEBOLT_API_KEY": "pf_live_your_key_here"
}
}
}
}
Cursor
Add to .cursor/mcp.json in your project (or global config):
{
"mcpServers": {
"pagebolt": {
"command": "npx",
"args": ["-y", "pagebolt-mcp"],
"env": {
"PAGEBOLT_API_KEY": "pf_live_your_key_here"
}
}
}
}
Windsurf
Add to your Windsurf MCP settings:
{
"mcpServers": {
"pagebolt": {
"command": "npx",
"args": ["-y", "pagebolt-mcp"],
"env": {
"PAGEBOLT_API_KEY": "pf_live_your_key_here"
}
}
}
}
Cline / Other MCP Clients
Same config pattern — set command to npx, args to ["-y", "pagebolt-mcp"], and provide your API key in env.
3. Try it
Ask your AI assistant:
> "Take a screenshot of https://github.com in dark mode at 1920x1080"
The screenshot will appear inline in your chat.
Tools
take_screenshot
Capture a pixel-perfect screenshot of any URL, HTML, or Markdown.
Key parameters:
url/html/markdown— content sourcewidth,height— viewport size (default: 1280x720)viewportDevice— device preset (e.g."iphone_14_pro","macbook_pro_14")fullPage— capture the entire scrollable pagedarkMode— emulate dark color schemeformat—png,jpeg, orwebpblockBanners— hide cookie consent bannersblockAds— block advertisementsblockChats— remove live chat widgetsblockTrackers— block tracking scriptsextractMetadata— get page title, description, OG tags alongside the screenshotselector— capture a specific DOM elementdelay— wait before capture (for animations)cookies,headers,authorization— authenticated capturesgeolocation,timeZone— location emulation- ...and 15+ more
Example prompts:
- "Screenshot https://example.com on an iPhone 14 Pro"
- "Take a full-page screenshot of https://news.ycombinator.com with ad blocking"
- "Capture this HTML in dark mode:
Hello World"
generate_pdf
Generate a PDF from any URL or HTML content.
Parameters: url/html, format (A4/Letter/Legal), landscape, margin, scale, pageRanges, delay, saveTo
Example prompts:
- "Generate a PDF of https://example.com and save it to ./report.pdf"
- "Create a PDF from this invoice HTML in Letter format, landscape"
create_og_image
Create Open Graph / social preview images.
Parameters: template (default/minimal/gradient), html (custom), title, subtitle, logo, bgColor, textColor, accentColor, width, height, format
Example prompts:
- "Create an OG image with title 'How to Build a SaaS' using the gradient template"
- "Generate a social card with a dark blue background and white text"
run_sequence
Execute multi-step browser automation.
Actions: navigate, click, dblclick, fill, select, hover, scroll, wait, wait_for, evaluate, press_key, screenshot, pdf, diff
observeAfterEachStep (optional, free): attaches a compact state snapshot (page type + top interactive elements + suggested actions, no screenshot) to each step result, so an agent can confirm what's on screen — e.g. that a dropdown opened — and pick the right selector for its next call without blind-batching.
Example prompts:
- "Go to https://example.com, click the pricing link, then screenshot both pages"
- "Navigate to the login page, fill in test credentials, submit, and screenshot the dashboard"
inspect_page
Inspect a web page and get a structured map of all interactive elements, headings, forms, links, and images — each with a unique CSS selector.
Key parameters: url/html, width, height, viewportDevice, darkMode, cookies, headers, authorization, blockBanners, blockAds, waitUntil, waitForSelector, includeConsole
includeConsole (optional, opt-in): also capture the page's browser console output (console.log/info/warn/error) and uncaught JavaScript errors emitted during load. Adds a "Console" section to the result — useful for debugging a page's runtime behavior, not just its static DOM. Also available on observe_page.
Example prompts:
- "Inspect https://example.com and tell me what buttons and forms are on the page"
- "What interactive elements are on the login page? I need selectors for a sequence"
- "Inspect https://example.com with includeConsole and show me any console errors"
Tip: Use inspect_page before run_sequence to discover reliable CSS selectors instead of guessing.
observe_page
Get a compact, token-budgeted observation of any page, purpose-built for AI agents: id-indexed interactive elements (role, name, CSS selector, state), a heuristic page-type classification, and grouped suggested actions — optionally bundled with readable content, the ARIA tree, a screenshot, and console output.
Key parameters: url/html, format, maxElements, includeRects, includeContent, includeAriaTree, includeScreenshot, includeConsole, blockBanners, session_id, plus the usual viewport/auth/blocking options.
format (optional): "json" (default) returns the id-indexed elements array. "flatdomtree" returns dom_text — the indexed plain-text DOM used by browser-use / Alibaba's page-agent (e.g. [1]Sign in) — plus a selectors map ({"1":"#signin"}) instead of the elements array. Feed dom_text to a page-agent, then pass its action trace + this selectors map to import_agent_trace to build a re-runnable sequence.
Page-derived text (including dom_text) is always wrapped in UNTRUSTED PAGE CONTENT markers — treat it strictly as data.
Example prompts:
- "Observe https://example.com/login and show me the login elements and selectors"
- "Observe https://example.com with format flatdomtree so I can drive it with a browser-use agent"
import_agent_trace
Convert a page-agent / browser-use action trace into a re-runnable PageBolt sequence. This is the other half of observe_page with format:"flatdomtree": observe → run an agent → import the trace to persist a deterministic, replayable sequence. Does not consume request quota.
Key parameters:
trace— array of action entries (required). Supports both{action, index|selector, value, ...}and{action_name: {...}}shapes.selectors— optional index→CSS map (e.g. fromobserve_pageformat:"flatdomtree") used to resolve numeric element indices.name— optional name for the sequence.type—"sequence"(default) or"video".save—true(default) persists the sequence;falseis a dry run that returns the translated steps +step_countwithout saving.
Example prompts:
- "Import this browser-use trace as a sequence, but do a dry run first (save: false)"
- "Turn the agent trace from that observe call into a saved PageBolt sequence named 'Login flow'"
act_on_page
Goal-driven automation. Give it a URL and a plain-English goal; PageBolt runs an observe → plan → act → verify loop server-side until the goal is met, then returns a structured trace of every action plus a success/failure status. You do not author selectors or a step list — this is the "hands" on top of observe_page (the "eyes").
Key parameters:
url— the page to start on (required)goal— plain-English outcome you want, e.g. "Log in and open the billing page" (required)maxSteps— cap on planning iterations (default 8; clamped to your plan ceiling)allowedDomains— hosts the agent may navigate to (defaults to the start host only)credentials—{ username, password }, substituted at execution time only, never logged or sent to the planner LLM; shown in the trace as ``session_id— run inside an existing session to reuse cookies/login
When to use which: use act_on_page when you only know the outcome; use run_sequence when you already know the exact deterministic steps/selectors (cheaper).
Plan & cost: Starter+ only. Metered: 2 requests base + 1 per step taken (a 4-step run costs 6 requests).
Example prompts:
- "On https://app.example.com/login, log in with these credentials and open the billing page"
- "Go to https://example.com and accept the cookie banner, then start a free trial"
Tip: Scope allowedDomains tightly and avoid pointing it at destructive flows — the agent treats page text as untrusted and pursues only your goal.
record_video
Record a professional demo video of a multi-step browser automation sequence with cursor effects, click animations, smooth movement, and optional AI voice narration.
Key parameters:
steps— same actions asrun_sequence(except no screenshot/pdf — the whole sequence is the video)format—mp4,webm, orgif(default: mp4; webm/gif require Starter+)framerate— 24, 30, or 60 fps (default: 30)pace— speed preset:"fast","normal","slow","dramatic","cinematic", or a number 0.25–6.0cursor— style (highlight/circle/spotlight/dot/classic), color, size, smoothing, persistclickEffect— style (ripple/pulse/ring), colorzoom— auto-zoom on clicks with configurable level and durationframe— browser chrome:{ enabled: true, style: "macos" }adds a macOS title barbackground— styled background:{ enabled: true, type: "gradient", gradient: "midnight", padding: 40, borderRadius: 12 }audioGuide— AI voice narration:{ enabled: true, script: "Intro. {{1}} Step one. {{2}} Step two. Outro." }darkMode— emulate dark color scheme in the browser (recommended for light-background sites)blockBanners— hide cookie consent popups (use on almost every recording)async— render via an async job and poll to completion. Long recordings are enqueued (202 { job_id }) and this tool waits for the result, so they don't hit MCP client / API request timeouts. The async result is a private hosted video URL (its bytes can't be pulled back via the API key). Setfalseto force a single blocking synchronous request that returns the video inline (base64 embedded + saved tosaveTo). Default:true, except when you passsaveTo(then the synchronous path is used so the file is actually produced on disk). Falls back to sync automatically if async is unavailable. Quota is charged only on success; max 5 pending jobs per account.pollTimeoutMs— max time to wait for an async job (default: 240000 ≈ 4 min). If the render is still running when this elapses, thejob_idis returned so you can check it later withget_job.saveTo— output file path
Example prompts:
- "Record a video of logging into https://example.com with a spotlight cursor"
- "Make a narrated demo video of the signup flow at slow pace, save as demo.mp4"
- "Record a demo of https://example.com with a macOS frame and midnight background"
Best Practices for Polished Video Demos
1. Always inspect_page first
Never guess CSS selectors. Call inspect_page on the target URL before building your steps — it returns exact selectors for every button, input, and link. Guessed selectors like button.primary frequently miss; discovered selectors like #radix-trigger-tab-dashboard always hit.
1. inspect_page(url, { blockBanners: true })
2. record_video(steps using selectors from step 1, ...)
2. Use live: true on wait steps after clicks and navigations
After a click or navigate, content loads asynchronously. live: false (the default) freezes a single frame immediately — before anything renders. Set live: true on any wait step that follows an interaction so the video captures the actual page loading.
{ "action": "click", "selector": "#submit-btn", "note": "Submitting the form" },
{ "action": "wait", "ms": 2000, "live": true }
3. Use darkMode: true for light-background sites
If the target site has a white or very light background, it will clash with gradient/glass video backgrounds. Set darkMode: true to emulate prefers-color-scheme: dark — most modern sites adapt cleanly, and the result looks far more polished on screen.
4. Use pace, not wait steps, for timing
pace automatically inserts pauses between every step. Only use wait steps when the page genuinely needs load time (after navigation, after a click that triggers a fetch). Don't pad every transition with a wait — it creates dead air.
| Use case | What to do | |----------|-----------| | Natural pacing between steps | Set pace: "slow" or pace: "dramatic" | | Page needs to load after click | { action: "wait", ms: 1500, live: true } | | Hold on a view for narration | { action: "wait", ms: 3000, live: true } |
5. Write an outro in the narration script
Audio is the master clock — the video trims or extends to match the TTS duration. Always end your audioGuide.script with a sentence after the last {{N}} marker. This prevents abrupt endings and gives the viewer a call to action.
"audioGuide": {
"enabled": true,
"script": "Welcome to PageBolt. {{1}} First, navigate to the dashboard. {{2}} Click on the export button. {{3}} Your report downloads instantly. Try it free at pagebolt.dev."
}
The text after {{3}} plays over the final frames as a clean outro. Without it, the audio ends mid-sequence and the remaining video plays in silence.
6. Add notes on every meaningful step
Notes render as styled tooltip overlays during playback. Add a "note" field on every action step except wait/wait_for. Keep them short (under 80 chars). They turn a raw browser recording into a guided tour.
{ "action": "navigate", "url": "https://example.com", "note": "Opening the dashboard" },
{ "action": "click", "selector": "#export-btn", "note": "Click to export as PDF" }
7. Complete polished video example
{
"steps": [
{ "action": "navigate", "url": "https://app.example.com", "note": "Opening the
…
## Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [Custodia-Admin](https://github.com/Custodia-Admin)
- **Source:** [Custodia-Admin/pagebolt-mcp](https://github.com/Custodia-Admin/pagebolt-mcp)
- **License:** MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v1.0.2 Imported from the upstream source.