# Reported issues for PyScrappy

Pod holds 13 of 13 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to [PyScrappy](/mcp/pyscrappy).

## Most discussed

### scrape_stock MCP tool documents quote/profile fields the scraper never returns

The `scrape_stock` MCP tool docstring advertises `quote` and `profile` shapes whose fields the scraper does not emit, so an agent (or user) reading the tool schema is told to read keys that will never be present.

### Where

`src/pyscrappy/mcp/server.py` (the `scrape_stock` docstring):

```
- "quote":   {"symbol", "price", "currency", "change", "change_percent", "market_time"}.
- "profile": {"symbol", "name", "sector", "industry", "country", "website", "summary"}.
```

### What the scraper actua

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/112) · 2026-08-08 · closed · 1 comment

### convert_currency docstring states wrong defaults for base and to

### The bug
The `convert_currency` MCP tool docstring states two defaults that don't match the function signature, so an agent reading the doc is misinformed.

Signature (`src/pyscrappy/mcp/server.py:332`):
```python
async def convert_currency(base: str = "USD", to: str | None = None, amount: float = 1.0)
```

Docstring (`server.py:342-343`):
```
base: Base currency code as a 3-letter ISO 4217 string. Example: "USD". No default (required).
to:   Target currency codes ...; omit or leave empty ...

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/96) · 2026-08-05 · closed · 1 comment

### get_weather docstring promises a 'wind' key but the scraper emits 'wind_speed'

### The bug
The `get_weather` MCP tool docstring promises a `wind` key, but the scraper never emits one — it emits `wind_speed`. A consumer keying `item["wind"]` (per the tool doc) gets a `KeyError`/`None`.

Doc (`src/pyscrappy/mcp/server.py:431`):
> Fetch the current weather … return a dict with keys: temperature (…degrees Celsius), humidity (…percent), **wind** (number, wind speed), condition (…), and location (…).

Scraper output (`src/pyscrappy/scrapers/weather.py:144-148`):
```python
"tempe

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/95) · 2026-08-05 · closed · 1 comment

### GitHubScraper default max_results (30) disagrees with its MCP tool (20)

### The problem
`GitHubScraper` and its MCP tool disagree on the default `max_results`, so the same call returns a different number of results depending on how it's invoked.

- `src/pyscrappy/scrapers/github.py:47` (and `:84`): `max_results: int = 30`
- `src/pyscrappy/mcp/server.py:373`: `search_github(query, max_results: int = 20, ...)`, and the tool docstring (line ~381) says `Default 20`.

So `GitHubScraper().scrape(query="...")` returns up to 30, while the same search through the MCP `search

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/79) · 2026-08-02 · closed · 1 comment

### Make the MCP server's cache TTL configurable (env var)

The MCP server hardcodes its response cache TTL, and the code says so:

```python
# src/pyscrappy/mcp/server.py
# Hardcoded for now; a future version will make this configurable.
_CACHE_TTL = 300.0
```

Different deployments want different freshness/latency tradeoffs, so this should be configurable — e.g. a `PYSCRAPPY_MCP_CACHE_TTL` env var, falling back to 300s.

### Acceptance
- `_CACHE_TTL` reads from an env var (e.g. PYSCRAPPY_MCP_CACHE_TTL) with the current 300s default.
- A test confirms t

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/64) · 2026-07-31 · closed · 1 comment

### Add a --json output option to the pyscrappy CLI agent

The `pyscrappy` CLI (the Ollama agent) prints human-readable output. Adding a `--json` flag that emits the raw `ScrapeResult` as JSON would make it scriptable and CI-friendly (pipe into jq, etc.).

### What
- Add `--json` to the CLI argument parser.
- When set, print `result.to_json()` (already exists on ScrapeResult) instead of the formatted output.

**Good first issue:** small, self-contained, and ScrapeResult already has `to_json()`.

### Acceptance
- `pyscrappy ... --json` prints valid JSON 

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/56) · 2026-07-31 · closed · 1 comment

### Document the fastmcp requirement and pyscrappy[mcp] extra in the README

The MCP server now depends on the standalone `fastmcp` package (Python >=3.10 only), installed via the `pyscrappy[mcp]` extra. The README's MCP section should make this explicit so users know:

- The MCP server needs `pip install pyscrappy[mcp]` (not just `pyscrappy`).
- fastmcp requires Python >=3.10; on 3.9 the core scraping library still works, but the MCP server is unavailable.
- A short note on running `pyscrappy-mcp` (stdio by default, `--http`/`--sse` for remote).

**Good first issue:** d

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/54) · 2026-07-31 · closed · 1 comment

### search_hackernews doc says 'comments' but the scraper emits 'num_comments'

### The bug
The `search_hackernews` MCP tool docstring says each result has a `comments` key, but the scraper emits `num_comments` — so an agent reading `item["comments"]` gets nothing.

Doc (`src/pyscrappy/mcp/server.py:403`):
> ...each with title, url, points, author (username), and **comments** (comment count).

Scraper (`src/pyscrappy/scrapers/hackernews.py:118`):
```python
"num_comments": hit.get("num_comments"),
```
There is no `comments` key.

### What to do
One-word docstring fix: `comme

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/106) · 2026-08-05 · closed · 0 comments

## Most recent

### search_images doc lists keys (image_url/thumbnail_url/source_url) the scraper doesn't emit

### The bug
The `search_images` MCP tool docstring documents result keys that the scraper doesn't emit, so a consumer keying by the documented names gets nothing.

Doc (`src/pyscrappy/mcp/server.py:264`):
> Each result is a dict with keys: **"image_url"**, **"thumbnail_url"**, **"source_url"**, "title", "width", "height".

Actual scraper output (`src/pyscrappy/scrapers/image_search.py:137-140`):
```python
"url": img_url,
"thumbnail": m_data.get("turl", ""),
"title": ...,
"source_page": m_data.ge

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/104) · 2026-08-05 · closed · 0 comments

### search_hackernews MCP tool drops the tags filter the scraper supports

### The problem
`HackerNewsScraper.scrape` supports a `tags` filter (`story`, `comment`, `show_hn`, `ask_hn`, `poll`, …), but the MCP `search_hackernews` tool doesn't expose it — so an agent can only ever get `story` results.

Scraper (`src/pyscrappy/scrapers/hackernews.py:36-49`):
```python
def scrape(self, query, max_results=20, by="relevance", tags="story") -> ScrapeResult:
    ...
```
`tags` is wired into the Algolia query in `_build_url` (`hackernews.py:91-95`, `&tags={tags}`).

MCP tool (`

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/90) · 2026-08-04 · closed · 0 comments

### scrape_stock MCP tool drops the interval param (history locked to daily)

### The problem
`StockScraper.scrape` supports an `interval` parameter for historical data, but the MCP `scrape_stock` tool doesn't expose it, so every history request through MCP is locked to daily bars.

Scraper (`src/pyscrappy/scrapers/stock.py:41-47`):
```python
def scrape(self, symbol, mode="quote", period="1mo", interval="1d") -> ScrapeResult:
    ...
```
`interval` is threaded into the Yahoo chart URL for history (and is already covered by a test that asserts `interval=1wk` in the request

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/89) · 2026-08-04 · closed · 0 comments

### search_images MCP tool advertises a 'duckduckgo' engine that isn't implemented

### The bug
The `search_images` MCP tool advertises a `duckduckgo` engine that the scraper doesn't implement, so `engine="duckduckgo"` silently returns **Bing** results with no error.

MCP tool docstring (`src/pyscrappy/mcp/server.py:266`):
> `engine: String naming the search engine, one of "bing", "google", or "duckduckgo", e.g. "google". Defaults to "bing".`

But the scraper only handles `google`, and anything else falls through to Bing (`src/pyscrappy/scrapers/image_search.py:57-60`):
```pyth

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/88) · 2026-08-04 · closed · 0 comments

### NewsScraper crashes on a network error instead of returning a ScrapeError

### The bug
`NewsScraper` doesn't guard its network fetches, so a network error crashes the whole scrape instead of being returned as a `ScrapeError`. Every other API scraper (crypto, currency, weather, github, hackernews, ikea) wraps its fetch and returns a `ScrapeError` result; News is the outlier.

Unguarded fetches:
- `_scrape_feed` — `src/pyscrappy/scrapers/news.py:82` (`xml_text = self.http.get_html(url)`)
- `_scrape_site` — `src/pyscrappy/scrapers/news.py:102` (`html = self.http.get_html(

[Read the thread](https://github.com/mldsveda/PyScrappy/issues/87) · 2026-08-04 · closed · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/mldsveda/PyScrappy/issues).
