bangla-news-radar
# bangla-news-radar
Monitor Bangladeshi newspapers from your AI assistant. Ask what the press is saying about a
brand, a person, or a topic — and get back real headlines from real papers, in Bengali or English.
An [MCP](https://modelcontextprotocol.io/) server built with [FastMCP](https://github.com/PrefectHQ/fastmcp).
> **Unofficial.** Not affiliated with any of the newspapers listed. It reads the public RSS feeds
> they already publish for syndication.
## Why
There is no easy way to ask *"which Bangladeshi papers are covering this right now?"* — you open
five tabs and scroll. This turns that into one question.
Useful for PR and brand monitoring, competitor tracking, or seeing how differently outlets frame
the same story.
## Tools
| Tool | What it does |
|---|---|
| `scan_news(keyword, sources, limit)` | Latest articles across every paper, newest first. Filter by keyword to spot mentions. |
| `compare_coverage(topic)` | Which papers are running a story — **and which are staying silent**. |
| `deep_search(query, limit)` | Search Prothom Alo's full archive (hundreds of thousands of articles). |
| `list_sources()` | Which papers are covered, and which are excluded and why. |
Keyword matching is case-insensitive and works in Bengali.
## Sources
| Paper | Language | Coverage |
|---|---|---|
| প্রথম আলো | Bengali | Recent feed + full archive search |
| রাইজিংবিডি | Bengali | Recent feed |
| জাগো নিউজ ২৪ | Bengali | Recent feed |
| The Daily Star | English | Business, Sports, Opinion sections |
Around 250+ current articles per scan, fetched in parallel.
**Deliberately excluded:** Jugantor, Kaler Kantho and bdnews24 return HTTP 403 to automated
requests. That is their choice and this tool respects it — no spoofed headers, no scraping
around the block.
**No working feed found:** Samakal (`/feed` serves HTML), Ittefaq, Bangla Tribune.
## Install
Requires [uv](https://docs.astral.sh/uv/) and Python 3.12+.
```bash
git clone https://github.com/Claudefarid/bangla-news-radar.git
cd bangla-news-radar
uv sync
uv run fastmcp install claude-code server.py:mcp
```
Restart your client, then ask it things like *"Which Bangladeshi papers wrote about bKash this
week?"* No API key or login required.
Verify with `uv run python test_server.py`.
## Notes for anyone building something similar
- **The Daily Star's site-wide `/rss.xml` is stale** — its newest item was over three months old
when this was written. The per-section feeds (`/business/rss.xml`, etc.) are current. Check
freshness before trusting any feed.
- **Only Prothom Alo exposes a search API** (it runs on Quintype, at `/api/v1/search`). The other
papers offer feeds only, which is why `scan_news` searches within recent articles while
`deep_search` reaches one paper's archive. The tool descriptions say so, so the model doesn't
imply archive-wide coverage it does not have.
- **The Daily Star puts HTML inside its `<title>` tags** — headlines arrive wrapped in an
unescaped `<a href="...">`. ElementTree parses that anchor as a child element, so
`findtext("title")` returns an empty string rather than raising. Every Daily Star headline was
blank, and since an empty headline matches no keyword, `compare_coverage` reported the paper as
*not covering* topics it was covering all along. Read descendant text with
`"".join(element.itertext())`. A silent parse failure that looks like a real editorial finding
is the worst kind of bug in a monitoring tool.
- Feeds are fetched concurrently and **one dead feed cannot sink a scan** — failures come back in
an `unreachable` field instead of raising.
## Please be considerate
Headlines and summaries are the copyrighted work of the publishers. This is for monitoring,
research and summarization — not republication. Requests identify themselves by User-Agent.
Keep your volume sane.
## License
MIT — see [LICENSE](LICENSE). Covers this code only, not any content retrieved through it.
TDQS
Scored across 4 tools
scan_news and compare_coverage both deal with current coverage, but one returns article lists while the other groups coverage by newspaper, so their purposes are distinct. deep_search and list_sources are clearly separate. The only minor ambiguity is whether a user wants raw articles or comparative framing.
Most tool names follow a verb_noun snake_case pattern: scan_news, compare_coverage, list_sources. deep_search is a minor stylistic deviation but is still readable and uses the same lowercase underscore convention. Overall the naming is predictable and consistent enough for an agent.
Four tools is well-scoped for a news monitoring server: current scanning, cross-paper comparison, deep archive search, and source listing. Each tool earns its place and there is no redundant or decorative surface area.
The core workflows of monitoring, comparing, and searching coverage are covered. The main gap is the lack of a tool to fetch full article content or retrieve a specific article by ID, but this is workable given the headline/summary focus of the server.