A Node.js wrapper for Python-based CloudFlare bypass functionality. This library is a JavaScript port of the popular cloudscraper Python library, designed to help developers bypass CloudFlare protection mechanisms in their Node.js applications.
CloudScraper.js provides a seamless way to make HTTP requests to websites protected by CloudFlare, handling JavaScript challenges, CAPTCHAs, and other protection mechanisms automatically. It's particularly useful for:
- Web scraping applications
- API integrations with CloudFlare-protected endpoints
- Automated testing of protected websites
- Data collection from sites with anti-bot protection
- Automatic CloudFlare bypass: Handles JavaScript challenges and CAPTCHAs
- Multi-platform support: Works on macOS, Linux, and Windows
- Safe, explicit setup: no privileged or automatic scripts run on
npm install - Optional install helper:
npm run install-depssets up Python + a venv when you want it - TypeScript support: Full type definitions included
- Multiple HTTP methods: GET, POST, COOKIE, and TOKENS support
This library requires Node.js and Python 3 (with the cloudscraper package).
npm install cloudscraper.js
# Install the Python side (opt-in — nothing privileged runs on `npm install`):
pip install cloudscraper # or: pip install --break-system-packages cloudscraperWhy opt-in? Earlier versions auto-installed Python on
postinstall(includingsudo/ Homebrew /curl | bash). That was removed for safety — installing system packages is now an explicit choice, which keeps the package usable in CI, Docker and locked-down environments. If you'd like the guided helper (detects Python, creates a venv, installscloudscraper), run:npm run install-deps
If the cloudscraper Python package is missing at runtime, the library fails fast with a clear
message telling you how to install it. See INSTALLATION.md for details.
Prefer a container with Node and Python + cloudscraper already wired up? The repo ships a
multi-stage Dockerfile:
docker build -t cloudscraper-js .
docker run -i --rm cloudscraper-js # boots the MCP server on stdio// ES6
import CloudScraper from "cloudscraper.js";
// CommonJS
const CloudScraper = require("cloudscraper.js").default;
const scraper = new CloudScraper({
usePython3: true, // Set to true if using python3, false for python
timeoutInSeconds: 10,
});
// Simple GET request
scraper
.get("https://example.com")
.then((response) => {
console.log("Status:", response.status);
console.log("Data:", response.text());
})
.catch((error) => {
console.error("Error:", error);
});
// POST request with data
scraper
.post("https://api.example.com", {
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ key: "value" }),
})
.then((response) => {
console.log(response.json());
});createScraper() talks to a long-lived daemon that keeps the solved Cloudflare
session hot, so repeated requests skip re-solving the challenge:
import { createScraper } from "cloudscraper.js";
const scraper = await createScraper({ retries: 3, rateLimitPerHost: 1 });
const first = await scraper.get("https://www.irishjobs.ie/"); // solves once
const again = await scraper.get("https://www.irishjobs.ie/jobs"); // reuses session (fast)
console.log(first.status, again.status);
await scraper.close();Supports get/post/put/delete/patch/head/cookies/tokens, plus proxy, retries,
rateLimitPerHost and timeoutMs. Requires Python 3 + pip install cloudscraper.
This API is new in v0.2 and evolving.
Three ways for LLM agents to read anti-bot–protected pages, returning clean markdown by default.
MCP server — point any MCP client (Claude Desktop, IDEs) at the cloudscraper-mcp binary:
{ "mcpServers": { "cloudscraper": { "command": "npx", "args": ["-y", "-p", "cloudscraper.js", "cloudscraper-mcp"] } } }Tools: fetch_protected_url, get_cookies, solve_challenge.
LangChain / LangGraph (optional peer @langchain/core):
import { createScraper, createCloudScraperTool } from "cloudscraper.js";
const tool = await createCloudScraperTool(await createScraper({ format: "markdown" }));
// bind `tool` to your agent / graphFunction calling (OpenAI / Anthropic) — hand functionSchemas to the model, run the handler:
import { createScraper, fetchProtectedUrl, functionSchemas } from "cloudscraper.js";
const scraper = await createScraper();
const { text } = await fetchProtectedUrl(scraper, { url, format: "markdown" });The MCP server dynamically loads the ESM MCP SDK, so it needs Node ≥ 22.12 plus Python 3 +
pip install cloudscraper. Seeexamples/.
Today the SDK spawns a short-lived Python process (running the cloudscraper library)
per request and reads the result back over stdout:
flowchart LR
App[Node App] -->|new CloudScraper| SDK[cloudscraper.js]
SDK -->|spawn python per request| Py[(python + cloudscraper)]
Py -->|stdout| SDK
SDK --> App
v0.2 (in progress) replaces the per-request spawn with a long-lived daemon that keeps solved sessions hot (large speedup on repeated calls), a robust NDJSON IPC protocol, and first-class AI-agent interfaces (an MCP server + a LangChain tool):
flowchart TB
Agent[LLM Agent] -->|MCP| MCP[MCP Server]
Dev[Dev SDK] -->|createScraper| SDK[cloudscraper.js SDK]
MCP --> SDK
SDK <-->|NDJSON over socket| D[Python Daemon: hot session pool]
D -->|clean HTML / Markdown| SDK
This library is currently in early development. While functional, it may have limitations and breaking changes as we continue to improve it. We're actively working on:
- Enhanced error handling
- Better performance optimization
- Additional HTTP methods support
- Improved documentation
- More robust CloudFlare challenge handling
We plan to release regular updates to improve functionality and maintain compatibility with the latest CloudFlare protection mechanisms.
- Installation Guide - Detailed setup instructions
- API Reference - Complete API documentation
- Examples - Usage examples and patterns
- Troubleshooting - Common issues and solutions
This project is based on and inspired by:
- VeNoMouS's CloudScraper - The original Python implementation
- cfbypass - The Python library that powers this wrapper
All credit for the core CloudFlare bypass functionality goes to the original Python project and its contributors.
ISC License - see LICENSE file for details.
Found a bug or have a feature request? Please open an issue on GitHub. Contributions are welcome!
This library is intended for legitimate use cases such as web scraping, testing, and API integration. Please ensure you comply with the terms of service of any websites you interact with and respect rate limits and robots.txt files.