MCP server · real Chrome
Hand an AI agent a real Chrome — one it reads the way a person’s screen does. Extract from sites that block headless, Playwright, and datacenter scrapers. Even Cloudflare.
$npx -y pluckor mcp the problem
Every serious anti-bot stack is tuned to catch exactly what automation looks like. A headless browser or a datacenter request trips them before you read a single row.
Playwright and scrapers run from cloud ranges that get blocked on sight.
navigator.webdriver, HeadlessChrome UA, CDP flags — all detectable.
“Just a moment…” interstitials that never clear for a bot.
Content behind a session a throwaway browser will never have.
Pluckor doesn’t out-trick the wall. It isn’t a robot. It’s a real browser on your machine, driven from the inside.
how it works
The agent decides. The bridge carries the message. The browser does the reaching. Three parts, one clean loop.
navigate, get_html, wait_for_selector run through a content script — no CDP, no automation fingerprint.
run_js, click, type attach chrome.debugger only while they run — trusted input, then detach.
The browser binds to 127.0.0.1 only. It’s never exposed off-box; the window opens on your machine — or run it as a service and drive it remotely →
the surface
Small, sharp, composable. The golden path is
navigate → wait_for_selector → get_html / run_js → click / type → re-extract.
navigate read Load a URL. Waits for load and settles past Cloudflare-style interstitials.
get_html read Rendered HTML of the page or a selector — content script, no CDP, no fingerprint.
get_markdown read Clean, token-efficient Markdown of the page’s main content — auto-detects the article/main root, no CDP. ~10× smaller than the HTML.
wait_for_selector read Wait until a selector appears (optionally visible), or time out.
snapshot read A ref-stamped map of the page’s actionable elements — so the agent acts by ref instead of guessing selectors. Content-script DOM walk, no CDP.
run_js CDP Evaluate JS in the page and get its JSON value back. The structured extractor.
click CDP Trusted click at an element’s center — isTrusted = true.
type CDP Trusted text entry that fires real input events. React and Vue see it.
scroll CDP Scroll for lazy-load and infinite feeds. Wheel by default, gesture on demand.
screenshot read Capture the page as an image a vision agent can see — viewport (no CDP), scroll/fullPage for a long shot, or an element. Pass filename or save:true to save it to disk instead of returning it inline.
extract read Structured data from a field→selector map — no code, no CDP. Add a container for a whole listing of records.
extract_links read Harvest deduped, absolute links (filter by pattern) for list→detail crawling. No CDP.
capture_requests read Inspect the page’s network — request metadata (no CDP), or record response bodies like the JSON an API returned past Cloudflare (CDP).
wait_for_response read Block until a request matching a URL pattern completes — a smarter wait for API-driven pages. No CDP.
wait_for_network_idle read Block until the page’s network goes quiet — the “data loaded” wait when no single request or selector fits. No CDP.
wait_for_human read Hand off to a human for an interactive Cloudflare Turnstile, login, or 2FA — blocks until the challenge clears or an until selector appears. Focuses the window, notifies, shows a banner. No CDP.
capture_console read Read the page's own console output and uncaught errors, buffered since load. No CDP.
press_key CDP Press a key with a trusted keyboard event — Enter to submit, Escape, Tab, arrows, or a character.
select_option read Choose an option in a native <select> by value/label/index. Fires change; no CDP.
hover CDP Move the mouse over an element to reveal menus, tooltips, or hover-lazy content.
go_back read Navigate back in history and wait for load. No CDP.
go_forward read Navigate forward in history and wait for load. No CDP.
reload read Reload the tab (optional bypassCache) and wait for load. No CDP.
wait_for_function CDP Poll a JS expression until it is truthy, or time out — for conditions a selector cannot express.
get_cookies read Read cookies for the page, from the persistent profile. No CDP.
set_cookie read Set a cookie for the page — persists in the profile. No CDP.
get_local_storage read Read the page's localStorage (a key or all). No CDP.
set_local_storage read Write a localStorage item on the page's origin. No CDP.
download read Download a URL to disk and get the file path — a "Download CSV/PDF/export" button target or a media file. Filename is relative to the download folder. No CDP.
save_pdf CDP Render the current page to a PDF and save it to disk, returning the path. Options: landscape, printBackground, filename.
open_tab read Open a new tab and get a handle to drive it — so one agent can work several tabs at once. No CDP.
list_tabs read List your open tabs (handle, url, title, which is default). Lane-scoped — you only see your own. No CDP.
close_tab read Close one of your tabs by its handle. No CDP.
the moat
Detection catches how a browser is driven — automation flags, a throwaway profile, CDP on every call. Pluckor launches Chrome for Testing with none of that and reads from inside the page. There’s simply less to detect.
read how it works →install
The MCP server ships as the pluckor npm package. The skill —
the patterns that make an agent reliably good at extraction — ships with it.
One step. The plugin registers the MCP server and the skill together.
/plugin marketplace add pluckor/pluckor-plugin
/plugin install pluckor@pluckor MCP-only alternative: claude mcp add pluckor -- npx -y pluckor mcp, then copy SKILL.md to ~/.claude/skills/pluckor/.
Add the MCP server, then drop in the skill.
1 — ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):
{ "mcpServers": { "pluckor": { "command": "npx", "args": ["-y", "pluckor", "mcp"] } } } 2 — put SKILL.md at .cursor/skills/pluckor/SKILL.md.
Register the server via the CLI, then add the skill.
codex mcp add pluckor -- npx -y pluckor mcp Skill: put SKILL.md at ~/.codex/skills/pluckor/ (personal) or .agents/skills/pluckor/ (project).
Pluckor speaks plain MCP over stdio — point any host at it.
{
"mcpServers": {
"pluckor": { "command": "npx", "args": ["-y", "pluckor", "mcp"] }
}
} Requires Node ≥ 20.11. The first tool call downloads Chrome for Testing (~150 MB); later runs reuse the cache.
proven
The real session behind the hero: navigate a Cloudflare-gated G2 category, wait out the challenge, and extract a ranked product list — then walk each detail page for precise ratings. One browser, one persistent session.
see the full recipe →navigate { url: "https://www.g2.com/categories/mortgage-crm" }
wait_for_selector { selector: ".product-card" }
run_js { expression:
"[...document.querySelectorAll('.product-card')]
.map(c => c.querySelector('a[href*=/products/]')?.textContent)" }
→ ["Shape MortgageSoft", "Jungo", "BNTouch", …] start
›/plugin marketplace add pluckor/pluckor-plugin