start
The skill
The SKILL.md that ships with Pluckor — the workflow patterns and gotchas that make an agent reliably good at extraction.
The MCP server gives an agent the tools. The skill gives it the judgment — the golden-path loop, robust selector choices, how to tell a Cloudflare challenge from real content, and the gotchas that otherwise produce empty or garbage results.
SKILL.md ships inside the pluckor npm package and in the plugin repo, which carries it in each tool’s skill location. Install it alongside the MCP server — see Getting started.
The golden path
Almost every task follows this loop. Skipping steps is the #1 cause of empty results.
navigate → wait_for_selector → get_html / run_js → (click / type) → re-extract
navigatefirst, always. It opens the tab, waits for load, and settles past Cloudflare interstitials. Check{ settled, onChallenge }.wait_for_selectorbefore you extract or interact. Pages render content asynchronously; extract too early and you get a skeleton.- Extract, then interact and re-extract as needed.
When to use Pluckor — and when not
Use it when the target blocks normal scraping (Cloudflare, “Just a moment…”, 403s, headless detection), needs a logged-in session, or renders content with client-side JavaScript a plain HTTP fetch won’t see.
Don’t reach for it when there’s a public API or the page is static HTML a simple fetch handles — that’s faster and cheaper. Pluckor opens a real browser window; use it when you actually need a browser.
Core patterns
The skill spells these out in full; the essentials:
- Read with
get_html, compute withrun_js.get_htmlis the stealthy reader (no CDP).run_jsis the convenient structured extractor — but it returns values by value, so they must be JSON-serializable. - Reach for
get_markdownto read prose. For an article, post, or doc,get_markdownreturns clean, token-efficient Markdown of the main content (no CDP) — typically ~10× smaller than the HTML. Useget_html/extractwhen you need specific fields,get_markdownwhen you need to read the page. - Pick robust selectors. Prefer, in order:
<script type="application/ld+json">,[itemprop="…"]microdata,data-*attributes, stable ids — then fall back to classes. Visual class names change. - Act by ref, not guesswork. When you’re driving a page and don’t already know solid selectors,
snapshotfirst — it returns a ref-stamped map of the actionable elements (no CDP). Thenclick/type/hover/press_key/select_optionbyrefinstead of a CSS selector. Refs refresh on every snapshot, so a stale ref means the page changed — snapshot again. - Wait, don’t guess. A skeleton or
0results means the content is async-rendered.wait_for_selectorfor the element that signals real content, then extract. - Multi-page in one session. The browser persists across calls, so do list pages and detail pages in the same session.
- Recover, don’t spin. If a tool fails with
NO_BROWSER/NOT_CONNECTED/ a timeout, the shared daemon may be wedged or outdated — callrestartonce and retry, don’t loop. See Recovery.
See Recipes for worked examples of each.
Where the skill lives
| Agent | Skill location |
|---|---|
| Claude Code | ~/.claude/skills/pluckor/SKILL.md (or via the plugin) |
| Cursor | .cursor/skills/pluckor/SKILL.md |
| Codex | ~/.codex/skills/pluckor/SKILL.md or .agents/skills/pluckor/SKILL.md |
The Claude Code plugin installs the skill automatically. For the others, copy SKILL.md from the npm package or the plugin repo into the location above.