Scrapy MCP

Scrapy MCP

A general-purpose MCP server for crawling and extracting structured data from any website. Supports tools for crawling, single-page extraction, search-and-crawl, and schema extraction.

Category
Visit Server

README

Scrapy MCP — Universal Web Crawling & Scraping

A general-purpose MCP (Model Context Protocol) server for crawling and extracting structured data from any website. Inspired by Scrapy's architecture.

Architecture

User (Claude) → MCP Tools → Engine → Scheduler → Downloader → Spider → Pipeline → Result
                                ↓            ↓           ↓
                             Settings    Middleware    Extractors
  • Engine — Central coordinator (BFS crawl loop)
  • Scheduler — FIFO queue with URL deduplication
  • Downloader — Async HTTP via httpx with middleware chain (retry, UA rotation, rate limiting)
  • Spider — Parses responses using configurable CSS/XPath/regex extractors
  • Pipeline — Post-processing chain (clean, validate, transform, dedup)
  • Middleware — Pluggable hooks for request/response processing

Installation

pip install -r requirements.txt

Register with Claude Code

Edit ~/.claude/mcp.json:

{
  "mcpServers": {
    "scrapy-mcp": {
      "command": "python",
      "args": ["d:/project/scrapy-mcp/server.py"]
    }
  }
}

MCP Tools

1. crawl — Structured crawling

Crawl a website and extract structured data using CSS selectors or XPath.

Parameters:

Param Type Required Description
urls string[] ✅ Starting URLs
spider string ❌ Pre-configured spider name (from spiders/ directory)
item_selector string ❌ CSS/XPath selector for item containers
fields object ❌ Field extraction rules
pagination object ❌ Pagination config
max_pages integer ❌ Max pages to crawl (default: 10)
max_depth integer ❌ Max link depth (default: 2)
output_format string ❌ json / markdown / csv (default: json)
allowed_domains string[] ❌ Restrict to domains

Example:

crawl({
  "urls": ["https://books.toscrape.com"],
  "item_selector": "article.product_pod",
  "fields": {
    "title": {"selector": "h3 a", "attr": "title"},
    "price": {"selector": ".price_color", "regex": "([\\d.]+)"}
  },
  "pagination": {"type": "next_link", "selector": ".next a", "max_pages": 3}
})

2. scrape_page — Single page extraction

Fetch and extract content from a single page. Supports multiple modes.

Parameters:

Param Type Required Description
url string ✅ Target page URL
mode string ❌ auto / markdown / structured / raw (default: auto)
extract_schema boolean ❌ Extract Schema.org / Open Graph (default: true)
extract_links boolean ❌ Extract all links (default: false)
extract_images boolean ❌ Extract all images (default: false)
selectors object ❌ Custom CSS selectors for specific elements

Modes:

  • auto — Smart: returns structured JSON if schema data found, otherwise markdown
  • markdown — Clean readable text with headings, images, links
  • structured — Full JSON with all extracted metadata + schema data
  • raw — Original HTML source

3. search_and_crawl — Search then crawl

Search any website and crawl each result page for details.

Parameters:

Param Type Required Description
search_url string ✅ URL template with {query} placeholder
query string ✅ Search keywords
spider string ❌ Spider name for result pages
result_item_selector string ❌ Selector for result items on search page
result_link_selector string ❌ Selector for links within results
fields object ❌ Fields to extract from each result page
max_results integer ❌ Max results (default: 10)
crawl_each_result boolean ❌ Crawl each result page (default: true)

4. extract_schema — Structured data extraction

Extract Schema.org JSON-LD, Open Graph, Twitter Cards, and meta tags.

Parameters:

Param Type Required Description
url string ❌ Page URL
html string ❌ Or provide raw HTML
schema_types string[] ❌ Filter by type (e.g. ["Product", "Article"])
include_raw boolean ❌ Include raw JSON-LD objects

5. list_spiders — Show available spiders

Lists all pre-configured spider definitions from the spiders/ directory.

Spider Configuration (YAML)

Create YAML files in spiders/ to define reusable spiders without writing code:

name: my-spider
description: "What this spider does"
start_urls:
  - "https://example.com/items"
item_selector: ".item"
fields:
  title:
    selector: ".title"
    type: text
  link:
    selector: "a"
    type: attr
    attr: href
    transform: absolute_url
pagination:
  type: next_link
  selector: ".next a"
  max_pages: 5

See spiders/example.yml for an annotated template and spiders/books_toscrape.yml for a working example.

Field config reference

Key Description
selector CSS or XPath expression
type text (default), attr, html, list
attr HTML attribute to extract (e.g. href, src)
regex Regex to apply after extraction (first group returned)
transform strip, int, float, absolute_url, lower, upper
default Fallback value

Pagination types

Type Description
next_link Follow a "next" link using a CSS selector
url_pattern Generate URLs from a {page} template
scroll Scroll-based (requires JS renderer — not yet supported)

Settings

Default settings (overridable via spider config):

Setting Default Description
DOWNLOAD_DELAY 0.5s Delay between requests to same domain
CONCURRENT_REQUESTS 8 Max simultaneous requests
TIMEOUT 30s Request timeout
MAX_DEPTH 3 Max link depth
MAX_PAGES 50 Max pages to crawl
MAX_ITEMS 500 Max items to collect
RETRY_TIMES 3 Retry attempts on failure
RETRY_HTTP_CODES [500, 502, 503, 504, 408, 429] Codes to retry
ROBOTSTXT_OBEY false Respect robots.txt

Supported Extraction

  • CSS selectors — .class, #id, div > p, a[href]
  • XPath — /html/body/div, //article//h2
  • Regex — Post-process extracted text
  • Schema.org — JSON-LD, microdata
  • Open Graph — og:title, og:description, og:image, etc.
  • Meta tags — description, keywords, etc.
  • Auto-extraction — All links, images, tables from a page

Quick Test

cd d:/project/scrapy-mcp

# Test extraction
python -c "
from mcp_scrapy.extractors import FieldExtractor
import httpx, asyncio

async def test():
    async with httpx.AsyncClient() as c:
        r = await c.get('https://httpbin.org/html')
    ext = FieldExtractor(r.text)
    print('Title:', ext.extract_field({'selector': 'h1'}))
    print('Links:', len(ext.extract_all_links()))

asyncio.run(test())
"

# Test spider loading
python -c "
from mcp_scrapy.spider import SpiderLoader
loader = SpiderLoader(['spiders'])
for s in loader.list_all():
    print(f'{s[\"name\"]}: {s[\"description\"]}')
"

Project Structure

scrapy-mcp/
├── server.py                  # MCP entry point
├── requirements.txt
├── mcp_scrapy/
│   ├── __init__.py
│   ├── engine.py              # CrawlEngine coordinator
│   ├── scheduler.py           # Request queue + dedup
│   ├── downloader.py          # Async HTTP + middleware
│   ├── spider.py              # Spider + YAML loader
│   ├── request.py             # Request/Response/Item types
│   ├── pipelines.py           # Item post-processing
│   ├── middleware.py          # Downloader middleware
│   ├── extractors.py          # CSS/XPath/regex field extraction
│   ├── exporters.py           # JSON/Markdown/CSV output
│   ├── schema_extractor.py    # Schema.org / Open Graph
│   ├── settings.py            # Configuration
│   └── tools/
│       ├── __init__.py
│       ├── crawl.py           # crawl tool
│       ├── scrape_page.py     # scrape_page tool
│       ├── search.py          # search_and_crawl tool
│       ├── extract_schema.py  # extract_schema tool
│       └── list_spiders.py    # list_spiders tool
├── spiders/                   # Spider YAML configs
│   ├── example.yml
│   ├── hackernews.yml
│   └── books_toscrape.yml
└── tests/
    ├── test_extractors.py
    ├── test_pipelines.py
    └── test_scheduler.py

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured