★84 stars on GitHub and counting. Yozh Crawler + Scraper is free, open-source, and built in public — give us a star if it earns its place in your stack.
Yozh Scraper speaks MCP natively. Plug one HTTP endpoint into Claude Desktop, Cursor, or your own agent loop — and your model gets real web tools: scrape, crawl, sessions, presets. No glue code, no custom wrappers.
Claude DesktopCursorClineContinueZedn8nLangChainAnthropic SDKClaude DesktopCursorClineContinueZedn8nLangChainAnthropic SDK
Why custom tool glue fails
Agents need real web tools, not custom Python wrappers
Every team builds the same glue: a Python tool per scrape source, a half-broken session store, a homemade orchestrator that loses context after one call. Three weeks later the agent works once, breaks twice, and nobody remembers which proxy expired. We ship the four pieces every agent-loop needs out of the box — over MCP, with one HTTP endpoint.
If your agent has ever timed out on step three of a multi-step crawl — this is for you.
A custom Python tool per source
The problem. Each new agent capability is another @tool decorator: one for Amazon, one for eBay, one for the company wiki. Schema drift, version skew, and a tool registry that nobody owns. Onboarding a new model means re-implementing the wrappers from scratch.
How Yozh Scraper fixes it. One HTTP MCP endpoint at localhost:8000/mcp auto-exposes every capability — scrape_page, scrape_batch, crawl, sessions, presets. Add one line to Claude / Cursor / Cline config and the model discovers tools at runtime. Same endpoint, every client.
One MCP endpoint
Auto-discovery
Zero glue code
Stateless tool calls lose login context
The problem. Tool calls are stateless — every call starts a new browser, drops cookies, fails the second 2FA step. Agents stuck in a re-login loop chew through tokens and give up on the third retry. Manual cookie storage is brittle and leaks across runs.
How Yozh Scraper fixes it. Sessions API with a sticky session_id the agent passes between calls. Declarative login DSL (goto / fill / click / wait) or paste exported cookies once — storageState persists 24h. Every subsequent tool call reuses the session, no re-auth.
Sticky session_id
Declarative login
24h TTL
Manual auth and proxy plumbing in agent code
The problem. Every agent ends up handling API keys, proxy rotation, country codes, retries — config that has nothing to do with the model's job. Secrets leak into prompts, the agent makes "creative" decisions about retries, and proxy budgets explode in a week.
How Yozh Scraper fixes it.CYBERYOZH_API_KEY in the server's .env — agent code never sees credentials. Pick proxy: {country: "us", type: "mobile"} in the tool call, Yozh handles rotation, fingerprint, and retries server-side. Agent stays focused on reasoning.
Server-side auth
Proxy declarative
No secrets in prompts
Multi-step crawls inside an agent loop
The problem. "Find every product page on this site and pull prices" is one user intent — but in agent code it's 200 tool calls, a queue, a dedup layer, and timeout babysitting. The model wastes a context window on URL bookkeeping it should never see.
How Yozh Scraper fixes it. Yozh Crawler walks the site server-side, streams discovered URLs over SSE, and chains into the scraper on each match. The agent fires crawl_and_scrape once, gets a single stream of structured results. Server keeps the queue, the model keeps its context.
SSE streaming
Server-side queue
One tool call
How it works
From docker compose up to an agent calling tools — in 3 steps
One MCP endpoint, one config line in your client, zero glue code. The same flow works for Claude Desktop, Cursor, Cline, or your own agent loop.
1Spin up the MCP endpoint
Clone the repo and docker compose up. The MCP server is live at localhost:8000/mcp — scraper, crawler, sessions, and presets all auto-exposed as tools.
# one-time setup
git clone
github.com/CyberYozh-data/yozh-scraper
cd yozh-scraper
docker compose up -d
2Wire it into your client
One line in claude_desktop_config.json (or Cursor / Cline equivalent). Restart the client — tools are auto-discovered, no per-source wrappers.
Anything that speaks the Model Context Protocol HTTP transport: Claude Desktop, Cursor, Cline, Continue, Zed, n8n MCP node, LangChain MCP adapter, and the Anthropic SDK's mcp_servers param. The endpoint at localhost:8000/mcp is one URL — you point any of them at it. No per-client wrappers or stdio shims to maintain.
How are tools registered with the agent?
Auto-discovery over MCP. When the client connects to /mcp, the server lists every available tool with its JSON schema: scrape_page, scrape_batch, crawl, create_session, list_presets, generate_preset. The model sees them as native tools at runtime — no decorators, no manual schema. New capabilities in upstream yozh-scraper appear automatically after the next pull.
Can my agent stream a multi-step crawl?
Yes — Yozh Crawler walks the site server-side and streams discovered URLs over SSE. The agent fires crawl once, gets a single event stream of structured results as they arrive. Each crawl supports scope (same-domain / same-host / allow-list), per-domain RPS, and optional chaining into the scraper so each found URL is parsed before it hits the stream. Cancel with DELETE /scrape/{id} — soft stop lets in-flight pages finish; force stop is a second call.
How do sessions persist across tool calls?
Sessions API. Create a session once with declarative login DSL (goto / fill / click / wait) or by pasting exported cookies. Yozh stores cookies + Playwright storageState server-side and gives you a sticky session_id. Every subsequent tool call that passes that ID reuses the same browser state — including 2FA-protected portals, LinkedIn, partner admins. TTL is 24h by default, refreshable. The agent never touches credentials; it just forwards the session ID it got back.
How do I extend with custom tools?
Three options. (1) Custom preset — drop a JSON file in src/presets/custom/ or call POST /api/v1/presets/generate with a sample URL and let an LLM infer the schema. The preset shows up as a parameter on the existing scrape_page tool. (2) Custom MCP tool — register your own handler in src/mcp/tools/, it joins the auto-discovered list. (3) Fork — repo is MIT-licensed, the MCP server lives in one Python module (src/mcp/server.py) and is straightforward to extend.
Open Source · MIT License · 84 ★
Ready to give your agent real tools?
One MCP endpoint, every Yozh capability auto-exposed to Claude, Cursor, Cline, and your own agent loops. Free. Forever. Star us if it helps — every star counts.
Yozh Crawler + Scraper is distributed under the MIT license. Use it. Fork it. Build with it.
Loved by data teams and AI builders
What people building with Yozh say
5.0 / 5 · 5 reviews
GitHub
Swapped our in-house Playwright cluster for Yozh in an afternoon. The MCP endpoint dropped straight into our Claude agent — zero glue code, crawler and scraper just worked.
MRMarcus ReinhardtLead Data EngineerNorthwind Analytics
X
The preset system is the killer feature. We pass a source name and get clean JSON back; the self-heal even caught two Amazon layout changes before we noticed.
PNPriya NairFounderScrapeStack
Reddit
Finally an open-source scraper that treats proxies and sessions as first-class. We run it behind login walls for partner portals — sessions persist and results stay consistent across regions.
DODaniel OseiBackend EngineerLoopfeed
X
Connected it to Cursor over MCP and my agent pulls live web data mid-task now. The streaming crawl over SSE is exactly what agent workflows were missing.
EKElena KovacAI EngineerVektor Labs
GitHub
We moved off a paid scraping API to cut costs and braced for a downgrade — got the opposite. Self-hosted, no per-request billing, and the output schema is cleaner than what we used to pay for.