Scraper MCP server
Commit Nov 12, 2026Reduces LLM token usage by converting web content to markdown and applying server-side CSS filtering for optimized web scraping.
Also known as cotdp/scraper-mcp
- Stars
- 8
- Tools
- 6
- Downloads, 30 days
- —
- Latest version
- —
- Last commit
- Nov 12, 2026
- License
- MIT
What is Scraper MCP?
Scraper reduces LLM token usage by converting web content to markdown and applying server-side CSS filtering for optimized web scraping. It exposes 6 tools, such as scrape_url, scrape_url_html, scrape_url_text.
Summary generated from the project's README
About Scraper MCP server
Extracting clean web content for AI models is what scraper-mcp enables by converting HTML into optimized markdown. This server reduces token consumption by 70-90% through server-side CSS filtering and targeted content extraction. It is designed for developers using clients like Claude Code or Claude Desktop, running locally via Docker or as a remote service.
Users can choose from four scraping modes including raw HTML, markdown, plain text, and link extraction. For single-page applications or sites with dynamic content, the server utilizes Playwright to perform JavaScript rendering. The system also includes integrated Perplexity AI tools for web search and complex reasoning, which require a Perplexity or OpenRouter API key.
A built-in monitoring dashboard provides real-time statistics, cache metrics, and an interactive playground for testing tools. To maintain security, the MCP endpoint is intended for trusted clients and should be kept on a loopback address or behind an authenticated gateway. Administration features are protected by a token-based authentication system.
What you can do with it
- 1Reduce LLM token costsConvert web pages to markdown and use CSS selectors to strip away unnecessary HTML elements.
- 2Scrape dynamic single-page applicationsRender content from React or Vue applications that require JavaScript execution to display data.
- 3Perform AI-powered web researchConduct complex searches and reasoning tasks using integrated Perplexity AI capabilities.
- 4Monitor scraping performanceTrack request statistics and cache hit rates through a visual interface.
Written from the project's README. Every use case is checked against a quote from it.
Scraper MCP tools 6
Detected from the READMEscrape_urlscrape_url_htmlscrape_url_textscrape_extract_linksperplexityperplexity_reason
| scrape_url | — | |
| scrape_url_html | — | |
| scrape_url_text | — | |
| scrape_extract_links | — | |
| perplexity | — | |
| perplexity_reason | — |
Configuration
ENABLE_PROMPTSENABLE_RESOURCESOPENROUTER_API_KEYPERPLEXITY_API_KEYPERPLEXITY_PROVIDERPLAYWRIGHT_DISABLE_GPUPLAYWRIGHT_MAX_CONTEXTSPLAYWRIGHT_TIMEOUTSCRAPEOPS_API_KEYSCRAPEOPS_RENDER_JS
| Name | Description | |
|---|---|---|
| ENABLE_PROMPTS | — | |
| ENABLE_RESOURCES | — | |
| OPENROUTER_API_KEY | — | |
| PERPLEXITY_API_KEY | — | |
| PERPLEXITY_PROVIDER | — | |
| PLAYWRIGHT_DISABLE_GPU | — | |
| PLAYWRIGHT_MAX_CONTEXTS | — | |
| PLAYWRIGHT_TIMEOUT | — | |
| SCRAPEOPS_API_KEY | — | |
| SCRAPEOPS_RENDER_JS | — |
Automated checks
Ran Nov 14, 2026Full report →Not verified yet. A server needs a score of 80, no serious finding, and enough data for us to check. How checks work · What to fix for more points
- Source repository linked and reachablecotdp/scraper-mcp is public and reachablegithub.com/cotdp/scraper-mcp ↗Pass
- Package names this repository as its sourceNot checked
- Build provenance (Sigstore attestation)Not checked
- Open source license (OSI)MITspdx.org/licenses/MIT.html ↗Pass
- Commit or release in the last yearLast commit or release 2026-11-12github.com/cotdp/scraper-mcp ↗Pass
- OpenSSF ScorecardNot checked
- Package name not close to a popular packageNot checked
- No critical advisory in the package or its dependenciesNot checked
- No hidden instructions to the model6 tool descriptions and the README read; no override phrases, credential paths or hidden charactersPass
- Destructive tools are labelledNo tool named like delete, drop or execPass
- Remote endpoint answers the MCP handshakeNot checked
README
View on GitHubScraper MCP
A context-optimized MCP server for web scraping. Reduces LLM token usage by 70-90% through server-side HTML filtering, markdown conversion, and CSS selector targeting.
The latest Docker image updates on version tags or a manual Docker publish run.
Quick Start
# Run with Docker (GitHub Container Registry)
docker run -d -p 127.0.0.1:8000:8000 --name scraper-mcp ghcr.io/cotdp/scraper-mcp:latest
# Add to Claude Code
claude mcp add --transport http scraper http://localhost:8000/mcp --scope user
Try it:
> scrape https://example.com
> scrape and filter .article-content from https://blog.example.com/post
Endpoints:
- MCP:
http://localhost:8000/mcp - Dashboard:
http://localhost:8000/
The MCP endpoint is for trusted clients and can scrape private network addresses.
Keep it on loopback or behind an authenticated gateway. To enable the dashboard,
inject SCRAPER_ADMIN_TOKEN into the container (for example, add
-e SCRAPER_ADMIN_TOKEN when the value is already exported) and sign in with
username admin and the token as the password. Administration is disabled without
a token; /healthz remains public. See Security and the
0.5.0 migration notes before upgrading.
Features
Web Scraping
- 4 scraping modes: Raw HTML, markdown, plain text, link extraction
- JavaScript rendering: Optional Playwright-based rendering for SPAs and dynamic content
- CSS selector filtering: Extract only relevant content server-side
- Batch operations: Process multiple URLs concurrently
- Smart caching: Three-tier cache system (realtime/default/static)
- Retry logic: Exponential backoff for transient failures
Perplexity AI Integration
- Web search: AI-powered search with citations (
perplexitytool) - Reasoning: Complex analysis with step-by-step reasoning (
perplexity_reasontool) - Requires
PERPLEXITY_API_KEYand/orOPENROUTER_API_KEY(overridable at runtime) - OpenRouter backend: serve the same Sonar models via OpenRouter — set
PERPLEXITY_PROVIDER=openrouter(or leave onautoto fall back when only an OpenRouter key is present) - Model allowlist (opt-in): only
sonaris enabled by default;sonar-pro,sonar-reasoning,sonar-reasoning-pro, andsonar-deep-researchmust be enabled explicitly to control cost (see docs/CONFIGURATION.md)
Monitoring Dashboard
- Real-time request statistics and cache metrics
- Interactive API playground for testing tools
- Runtime configuration without restarts
- Token authentication and credential-safe configuration responses

See Dashboard Guide for details.
Available Tools
| Tool | Description |
|---|---|
scrape_url |
HTML converted to markdown (best for LLMs) |
scrape_url_html |
Raw HTML content |
scrape_url_text |
Plain text extraction |
scrape_extract_links |
Extract all links with metadata |
perplexity |
AI web search with citations |
perplexity_reason |
Complex reasoning tasks |
All tools support:
- Single URL or batch operations (pass array)
timeoutandmax_retriesparameterscss_selectorfor targeted extractionrender_jsfor JavaScript rendering (SPAs, dynamic content)
Resources
Note: Resources are disabled by default to reduce context overhead. Enable with
--enable-resourcesflag orENABLE_RESOURCES=trueenvironment variable.
MCP resources provide read-only data access via URI-based addressing:
| URI | Description |
|---|---|
cache://stats |
Cache hit rate, size, entry counts |
cache://requests |
List of recent request IDs |
cache://request/{id} |
Retrieve cached result by ID |
config://current |
Current runtime configuration |
config://scraping |
Timeout, retries, concurrency |
server://info |
Version, uptime, capabilities |
server://metrics |
Request counts, success rates |
Prompts
Note: Prompts are disabled by default to reduce context overhead. Enable with
--enable-promptsflag orENABLE_PROMPTS=trueenvironment variable.
MCP prompts provide reusable workflow templates:
| Prompt | Description |
|---|---|
analyze_webpage |
Structured webpage analysis |
summarize_content |
Generate content summaries |
extract_data |
Extract specific data types |
seo_audit |
Comprehensive SEO check |
link_audit |
Analyze internal/external links |
research_topic |
Multi-source research |
fact_check |
Verify claims across sources |
See API Reference for complete documentation.
JavaScript Rendering
For SPAs (React, Vue, Angular) and pages with dynamic content, enable JavaScript rendering:
# Enable JS rendering with render_js=True
scrape_url(["https://spa-example.com"], render_js=True)
# Combine with CSS selector for targeted extraction
scrape_url(["https://react-app.com"], render_js=True, css_selector=".main-content")
When to use render_js=True:
- Single-page applications (SPAs) - React, Vue, Angular, etc.
- Sites with lazy-loaded content
- Pages requiring JavaScript execution
- Dynamic content loaded via AJAX/fetch
When NOT needed:
- Static HTML pages (most blogs, news sites, documentation)
- Server-rendered content
- Simple websites without JavaScript dependencies
How it works:
- Uses Playwright with headless Chromium
- Single browser instance with pooled contexts (~300MB base + 10-20MB per context)
- Lazy initialization (browser only starts when first JS render is requested)
- Semaphore-controlled concurrency (default: 5 concurrent contexts)
Memory considerations:
- Base requests provider: ~50MB
- With Playwright active: ~300-500MB depending on concurrent contexts
- Recommend minimum 1GB container memory when using JS rendering
Testing JS rendering:
Use the dashboard playground at http://localhost:8000/ to test JavaScript rendering interactively with the toggle switch.
Docker Deployment
Quick Run
# Using GitHub Container Registry (recommended)
docker run -d -p 127.0.0.1:8000:8000 --name scraper-mcp ghcr.io/cotdp/scraper-mcp:latest
# With JavaScript rendering (requires more memory)
docker run -d -p 127.0.0.1:8000:8000 --memory=1g --name scraper-mcp ghcr.io/cotdp/scraper-mcp:latest
# With Perplexity AI (direct API)
docker run -d -p 127.0.0.1:8000:8000 -e PERPLEXITY_API_KEY=your_key ghcr.io/cotdp/scraper-mcp:latest
# With Perplexity via OpenRouter
docker run -d -p 127.0.0.1:8000:8000 -e OPENROUTER_API_KEY=your_key ghcr.io/cotdp/scraper-mcp:latest
Docker Compose
For persistent storage and custom configuration:
# docker-compose.yml
services:
scraper-mcp:
image: ghcr.io/cotdp/scraper-mcp:latest
ports:
- "127.0.0.1:8000:8000"
volumes:
- cache:/app/cache
environment:
- PERPLEXITY_API_KEY=${PERPLEXITY_API_KEY:-}
- PLAYWRIGHT_MAX_CONTEXTS=5
deploy:
resources:
limits:
memory: 1G # Recommended for JS rendering
restart: unless-stopped
volumes:
cache:
docker-compose up -d
Production deployment (pre-built image from GHCR):
docker-compose -f docker-compose.prod.yml up -d
Upgrading
To upgrade an existing deployment to the latest version:
# Pull the latest image
docker pull ghcr.io/cotdp/scraper-mcp:latest
# Restart with new image (docker-compose)
docker-compose down && docker-compose up -d
# Or for production deployments
docker-compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up -d
# Or restart a standalone container
docker stop scraper-mcp && docker rm scraper-mcp
docker run -d -p 127.0.0.1:8000:8000 --name scraper-mcp ghcr.io/cotdp/scraper-mcp:latest
Your cache data persists in the named volume across upgrades.
Available Tags
| Tag | Description |
|---|---|
latest |
Latest stable release |
0.5.0 |
Specific version, after the release is published |
Configuration
Create a .env file for custom settings:
# Perplexity AI (optional; either key enables the AI tools)
PERPLEXITY_API_KEY=your_key_here
# ...or via OpenRouter
OPENROUTER_API_KEY=your_key_here
PERPLEXITY_PROVIDER=openrouter # auto | perplexity | openrouter (default: auto)
# JavaScript rendering (optional, requires Playwright)
PLAYWRIGHT_MAX_CONTEXTS=5 # Max concurrent browser contexts
PLAYWRIGHT_TIMEOUT=30000 # Page load timeout in ms
PLAYWRIGHT_DISABLE_GPU=true # Reduce memory in containers
# MCP features (disabled by default to reduce context overhead)
ENABLE_RESOURCES=true # Enable MCP resources
ENABLE_PROMPTS=true # Enable MCP prompts
# Proxy (optional)
HTTP_PROXY=http://proxy.example.com:8080
HTTPS_PROXY=http://proxy.example.com:8080
# ScrapeOps proxy service (optional)
SCRAPEOPS_API_KEY=your_key_here
SCRAPEOPS_RENDER_JS=true
See Configuration Guide for all options.
Claude Desktop
Add to your MCP settings:
{
"mcpServers": {
"scraper": {
"url": "http://localhost:8000/mcp"
}
}
}
Claude Code Skills
This project includes Agent Skills that provide Claude Code with specialized knowledge for using the scraper tools effectively.
| Skill | Description |
|---|---|
| web-scraping | CSS selectors, batch operations, retry configuration |
| perplexity | AI search, reasoning tasks, conversation patterns |
Install Skills
Copy the skills to your Claude Code skills directory:
# Clone or download this repo, then:
cp -r .claude/skills/web-scraping ~/.claude/skills/
cp -r .claude/skills/perplexity ~/.claude/skills/
Or install directly:
# web-scraping skill
mkdir -p ~/.claude/skills/web-scraping
curl -o ~/.claude/skills/web-scraping/SKILL.md \
https://raw.githubusercontent.com/cotdp/scraper-mcp/main/.claude/skills/web-scraping/SKILL.md
# perplexity skill
mkdir -p ~/.claude/skills/perplexity
curl -o ~/.claude/skills/perplexity/SKILL.md \
https://raw.githubusercontent.com/cotdp/scraper-mcp/main/.claude/skills/perplexity/SKILL.md
Once installed, Claude Code will automatically use these skills when performing web scraping or Perplexity AI tasks.
Documentation
| Document | Description |
|---|---|
| API Reference | Complete tool documentation, parameters, CSS selectors |
| Configuration | Environment variables, proxy setup, ScrapeOps |
| Dashboard | Monitoring UI, playground, runtime config |
| Development | Local setup, architecture, contributing |
| Testing | Test suite, coverage, adding tests |
Local Development
# Install
uv pip install -e ".[dev]"
# Run
python -m scraper_mcp
# Test
pytest
# Lint
ruff check . && mypy src/
See Development Guide for details.
License
MIT License
Last updated: December 23, 2025
Scraper MCP questions
What tools does Scraper MCP provide?
It exposes 6 tools, including scrape_url, scrape_url_html, scrape_url_text, scrape_extract_links, perplexity.
How does this server reduce LLM token usage?
It uses server-side HTML filtering, markdown conversion, and CSS selector targeting to strip unnecessary data.
Can I scrape websites that require JavaScript to load content?
Yes, you can enable optional Playwright-based rendering for SPAs and dynamic content using the render_js parameter.