Skip to main content
Glama
README.md
# deutschlandfunk-mcp πŸ“»

mcp-name: io.github.mohammad-abbasi-sh/deutschlandfunk-mcp

Unofficial **read-only** MCP server for **[deutschlandfunk.de](https://www.deutschlandfunk.de)** β€” Deutschlandfunk news & radio from its official RSS feeds: rolling news, latest contributions, topic feeds, keyword search, full article text and the live stream link. No key, no login. No key, no login.

> Built by Mohammad Abbasi as part of the "Germany MCP factory". Not affiliated with deutschlandfunk.de.

## For AI agents

Add to your MCP client config (stdio):

```json
{
  "mcpServers": {
    "deutschlandfunk": {
      "command": "uvx",
      "args": ["deutschlandfunk-mcp==0.1.0"]
    }
  }
}
```

Or run locally: `python -m deutschlandfunk_mcp.server` (needs `mcp<2`, `httpx`).

## Tools

| Tool | Description |
|------|-------------|
| `dlf_latest_news` | Rolling DLF news headlines β€” `limit` 1..50 |
| `dlf_latest_contributions` | Latest DLF contributions (articles & audio features) β€” `limit` 1..50 |
| `dlf_news_by_topic` | DLF news by topic β€” `topic` (europa/gesellschaft/wirtschaft/wissen/kultur/sport/politik), `limit` 1..50 |
| `dlf_search_news` | Keyword search over recent DLF items β€” `query`, `limit` 1..50 |
| `dlf_get_article` | Full text of one DLF article β€” `url` (a deutschlandfunk.de article link) |
| `dlf_listen_live` | Deutschlandfunk live stream link (verified reachable) β€” no arguments |
| `dlf_health` | Reachability probe (ok / blocked / error) β€” one polite request |

## Notes

- All data comes from **Deutschlandfunk's official RSS feeds** (free, no key, no login).
- DLF pages are JS-app shells: article text is extracted from embedded `js-client-queries` JSON blobs (`Article` with `ParagraphText` blocks) β€” there is no JSON-LD and the visible `<p>` tags are navigation/topic descriptions, not the article body.
- The live stream URL 302-redirects to a signed CDN URL; `dlf_listen_live` reports the canonical URL plus its HEAD reachability.
- Podcast show listing is not a tool: the podcasts page's `pathPodcast` fields are section navigation links, not per-show feeds (show feeds exist per show as `<slug>-100.rss` but are not reliably enumerable from the page).

Tests: 23/23 green (16 offline + 7 live, 2026-11-10).

## Development

```bash
python3 -m venv .venv && .venv/bin/pip install "mcp<2" httpx pytest
.venv/bin/pip install -e .
.venv/bin/python -m pytest tests/ -q
```

## License

MIT

---

Built by [Mohammad Abbasi](https://github.com/mohammad-abbasi-sh) β€” [Almanibama](https://almanibama.ir) Β· [mabbasi.ir](https://mabbasi.ir)

TDQS

A3.8/5.0

Scored across 7 tools

Disambiguation4/5

Each tool has a reasonably distinct role: latest headlines, latest contributions, topic-filtered news, keyword search, full-article fetch, live stream, and health probe. The main potential confusion is among the three list-style news tools (latest_news, latest_contributions, news_by_topic), but the descriptions make the different axes (recency, content type, topic) clear enough.

Naming Consistency4/5

All names use a consistent dlf_ prefix and snake_case. Most follow a recognizable noun/verb pattern (search_news, get_article, listen_live), though some are noun-only (latest_news, news_by_topic, health), which is a minor deviation but still readable and predictable.

Tool Count5/5

Seven tools are well-scoped for a news-reading server: four discovery/listing tools, one content-fetch tool, one stream tool, and one diagnostic. Nothing feels redundant or missing at the count level.

Completeness4/5

Coverage is strong for the read-only news domain: headlines, topic browsing, keyword search, full article text, live audio, and connectivity check. Minor gaps existβ€”no dedicated audio/contribution retrieval by ID or topic-listing endpoint, and search is explicitly limited to recent items rather than the full archive.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues