Available tools
The 22 MCP tools exposed by the PyScrappy server.
The server exposes 22 tools. Every tool returns a ScrapeToolResult with the same
shape: data (the items), count, scraper, source_urls, and errors.
| Tool | Description |
|---|---|
scrape_url | Scrape any URL: text, links, images, tables, metadata |
scrape_wikipedia | Fetch a Wikipedia article (full / paragraphs / headers) |
scrape_stock | Yahoo Finance quotes, history, and profiles |
scrape_news | RSS/Atom feeds, auto-discovered site feeds, or a single article |
search_images | Image search (returns URLs + metadata) |
search_youtube | YouTube video search |
search_linkedin_jobs | Public LinkedIn job listings |
search_github | GitHub repository search (stars, language, …) |
search_hackernews | Hacker News story search (points, comments) |
search_books | Book search via Open Library (title, author, year) |
get_weather | Current weather for a place (no key) |
get_crypto | Cryptocurrency prices and market data (CoinGecko) |
convert_currency | Exchange rates and currency conversion |
define_word | Word definitions and examples |
search_amazon | Amazon product search |
search_newegg | Newegg electronics / computer hardware search |
search_ikea | IKEA furniture / home search |
search_soundcloud | SoundCloud track search (uses the browser backend) |
lookup_movie | Movie/TV info from IMDB by title or id (via OMDb; needs OMDB_API_KEY) |
scrape_zomato | Restaurant listings by city |
search_ubereats | Uber Eats restaurants by city |
get_ubereats_menu | An Uber Eats restaurant's full menu (from its store URL) |
The result envelope
Every tool returns the same typed structure, which gives agents a stable schema:
{
"data": [ { "...": "item fields depend on the source" } ],
"count": 5,
"scraper": "crypto",
"source_urls": ["https://api.coingecko.com/..."],
"errors": []
}data: the scraped items. The item shape depends on the source (a movie, a stock quote, an article), so it's a list of free-form objects.errors: non-fatal problems, each with aurland amessage.
JavaScript-rendered pages
scrape_url does a fast static fetch by default: it reads the HTML the server sends and
does not run JavaScript. Many modern pages (GitHub's contribution graph, dashboards,
infinite-scroll feeds) ship an almost-empty HTML shell and build their content with JS in
the browser, so a static scrape comes back with little or no data.
When that happens, scrape_url adds a hint to errors telling you the page looks
JS-rendered. You have two ways to handle it:
-
Render the JavaScript. Pass
render_js=trueso PyScrappy loads the page in a headless browser first, then scrapes the rendered result:{ "url": "https://github.com/torvalds", "render_js": true }This needs the browser extra on the server (
pip install 'pyscrappy[browser]'plusplaywright install chromium). If it isn't installed,render_jsreturns an error. -
Scrape the data endpoint directly. JS pages fetch their data from an API or a dedicated URL that is static. For example, GitHub's contribution graph lives at
https://github.com/users/<name>/contributions, whichscrape_urlreads with a plain fetch, no browser needed. This is usually faster and more reliable than rendering.
24 scrapers, 22 tools?
Two scrapers aren't exposed as MCP tools because they're blocked without a proxy
(Instagram, Twitter/X, Spotify), and the Uber Eats scraper provides two tools
(search_ubereats + get_ubereats_menu). The net is 22. See the
scraper catalog for the full mapping.