MCP server · real Chrome

THE AGENT’S BROWSER

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
reads leave navigator.webdriver = false no CDP on reads real profile · residential IP isTrusted clicks

the problem

The best data sits behind a wall
built to stop robots.

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.

403 datacenter IPs

Playwright and scrapers run from cloud ranges that get blocked on sight.

JS headless tells

navigator.webdriver, HeadlessChrome UA, CDP flags — all detectable.

Cloudflare & DataDome

“Just a moment…” interstitials that never clear for a bot.

🔒 login walls

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

Brain, medium, hands.

The agent decides. The bridge carries the message. The browser does the reaching. Three parts, one clean loop.

brain agent Claude · Cursor · Codex
MCP / stdio
medium bridge plk daemon · localhost
WebSocket
hands chrome real profile · your IP
reads

navigate, get_html, wait_for_selector run through a content script — no CDP, no automation fingerprint.

interactions

run_js, click, type attach chrome.debugger only while they run — trusted input, then detach.

everything local

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

Thirty-three tools. One session.

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.

full reference

the moat

Not stealthier.
Just real.

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 →
false navigator.webdriver
true isTrusted on clicks
0 CDP calls on reads
persistent profile · logins survive

install

Point your agent at it.

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

proven

A Cloudflare-protected listing,
pulled clean.

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

Give your agent
a browser it can’t be caught with.

claude code — one step
/plugin marketplace add pluckor/pluckor-plugin