freshrss-mcp
freshrss-mcp
Ein Model Context Protocol-Server für FreshRSS, den selbst gehosteten RSS- und Atom-Feed-Aggregator.
Er spricht die Google-Reader-kompatible API, die FreshRSS unter
/api/greader.php bereitstellt, und verbirgt deren Eigenheiten hinter Tool-Argumenten,
die ein Assistent tatsächlich nutzen kann: numerische Feed-IDs, Kategorie- und Labelnamen,
ISO-Daten und dezimale Artikel-IDs anstelle von user/-/state/com.google/…-Stream-Identifikatoren
und hexadezimalen Item-Tags.
📖 Vollständige Dokumentation: freshrss-mcp.ni-c.de

Voraussetzungen
Node.js 22 oder neuer
Eine FreshRSS-Instanz (entwickelt gegen 1.29) mit
aktivierter API: Einstellungen → Authentifizierung → „API-Zugriff erlauben“
einem API-Passwort für den Benutzer: Einstellungen → Profil → API-Verwaltung. Dies ist ein separates Passwort vom Web-Login.
Related MCP server: Conduit
Konfiguration
Variable | Erforderlich | Beschreibung |
| ja | Stamm-URL der Instanz, z. B. |
| ja | FreshRSS-Benutzername. |
| ja | Das API-Passwort von der Profilseite, nicht das Web-Login-Passwort. |
| nein |
|
| nein |
|
Der Server startet ohne Anmeldedaten, sodass seine Tools auflistbar bleiben; jeder Aufruf schlägt dann mit diesen Einrichtungsanweisungen fehl.
Claude Code
claude mcp add freshrss -- npx -y @ni-c/freshrss-mcpClaude Desktop
{
"mcpServers": {
"freshrss": {
"command": "npx",
"args": ["-y", "@ni-c/freshrss-mcp"],
"env": {
"FRESHRSS_URL": "https://rss.example.com",
"FRESHRSS_USER": "alice",
"FRESHRSS_API_PASSWORD": "…"
}
}
}
}Codex
[mcp_servers.freshrss]
command = "npx"
args = ["-y", "@ni-c/freshrss-mcp"]
env = { FRESHRSS_URL = "https://rss.example.com", FRESHRSS_USER = "alice", FRESHRSS_API_PASSWORD = "…" }Tools
Lesen
Tool | Beschreibung |
| Das authentifizierte Konto – eine schnelle Anmeldeüberprüfung. |
| Jedes Abonnement mit seiner Kategorie und Anzahl ungelesener Beiträge. |
| Kategorien (Ordner von Feeds) und Benutzerlabels (Tags auf Artikeln). |
| Gesamt- und Pro-Feed/Kategorie-Anzahl ungelesener Beiträge, sortiert. |
| Artikel eines Feeds, einer Kategorie, eines Labels oder eines integrierten Streams, mit Auszügen oder begrenztem Volltext. |
| Volltext bestimmter Artikel anhand ihrer ID. |
| Nur IDs – die günstige Methode, um eine Menge für |
| Alle Abonnements als OPML-Dokument. |
Schreiben
Nicht registriert, wenn FRESHRSS_READ_ONLY=true.
Tool | Beschreibung | Bestätigung |
| Lesezeichen setzen, Sterne und Labels auf bestimmten Artikeln setzen. | — |
| Einen gesamten Feed, eine Kategorie, ein Label oder einen Stream als gelesen markieren. | ja |
| Einen Feed oder eine Website-URL abonnieren. | — |
| Einen Feed umbenennen oder in eine andere Kategorie verschieben. | — |
| Einen Feed und alle seine gespeicherten Artikel löschen. | ja |
| Eine Kategorie oder ein Benutzerlabel umbenennen. | — |
| Eine Kategorie oder ein Benutzerlabel löschen. | ja |
| Jeden Feed in einem OPML-Dokument abonnieren. | ja |
Keine Suche
FreshRSS bietet keine Volltextsuche über seine API – die Google-Reader-Endpunkte
filtern nur nach Stream, Lesestatus und Datum. list_articles hat daher
keinen Abfrageparameter; grenzen Sie das Ergebnis mit feed_id/category und
since/until ein und filtern Sie die zurückgegebenen Artikel selbst.
Sicherheit
Artikeltext ist nicht vertrauenswürdige Eingabe. Alles, was dieser Server von FreshRSS zurückgibt, wurde von einem Dritten im Internet geschrieben, daher werden Antworten, die Artikeltext, Titel oder Feednamen enthalten, explizit als Daten und nie als Anweisungen markiert.
Zerstörerische Tools sind zweistufig. Sie geben ein einmalig verwendbares Bestätigungstoken zurück, das an das genaue Ziel gebunden ist; der zweite Aufruf muss es enthalten. Ein einfacher Boolean könnte bereits beim ersten Aufruf gesetzt oder durch in einem Feed versteckten Text dazu überredet werden. Die Bestätigungsnachrichten zitieren bewusst nie Titel oder Namen, die von der API stammen.
Antwortbudgets. FreshRSS gibt bis zu 500.000 Zeichen HTML pro Artikel zurück. Artikeltext wird in Klartext umgewandelt, pro Artikel und gegen ein Pro-Antwort-Budget begrenzt und ist in Auflistungen nur optional.
Anmeldedaten werden einmal gelesen, anschließend aus
process.enventfernt und nie auf die Festplatte geschrieben. Anfragen folgen niemals Weiterleitungen, die den Autorisierungsheader an einen anderen Host senden würden, und die gelockerte TLS-Validierung ist auf diese Verbindung beschränkt, nicht auf den gesamten Prozess.Feed-URLs werden geschwärzt. FreshRSS speichert HTTP-auth-Feeds als
https://user:password@host/feed. Der Benutzerinfo-Teil wird entfernt, bevor eine Feed-URL ein Tool-Ergebnis oder den OPML-Export erreicht, sodasslist_feedsdas Passwort eines kostenpflichtigen oder privaten Feeds nicht in das Transkript drucken kann.subscribe_feedlehnt interne Ziele ab. FreshRSS ruft die URL serverseitig ab, was das Tool zu einer SSRF-Primitive macht, die aus Text in einem Artikel erreichbar ist. Loopback- und Link-Local-Adressen – einschließlich Cloud-Metadaten-Endpunkte – werden abgelehnt. Private LAN-Adressen bleiben erlaubt, da selbst gehostete Installationen legitimerweise Feeds in ihrem eigenen Netzwerk abonnieren.import_opmllehnt ein<!DOCTYPE>ab. In diesem Prozess wird kein XML geparst, aber das Dokument wird an FreshRSS übergeben, wo eine Dokumenttypdeklaration der Träger für Entity-Expansion- und External-Entity-Angriffe ist. OPML benötigt niemals eine.FRESHRSS_READ_ONLY=trueregistriert die Schreib-Tools gar nicht erst, anstatt sie zur Aufrufzeit abzulehnen.
Welche Tools durch ein Bestätigungstoken geschützt sind: mark_all_as_read,
unsubscribe_feed, delete_category_or_label und import_opml. mark_articles
ist bewusst nicht geschützt – der Aufrufer nennt jeden der maximal 100 Artikel
explizit und jedes Feld kann zurückgesetzt werden –, wird aber als zerstörerisch
deklariert, sodass ein Client dennoch eine Bestätigung anfordern kann.
Container
docker run --rm -i \
-e FRESHRSS_URL=https://rss.example.com \
-e FRESHRSS_USER=alice \
-e FRESHRSS_API_PASSWORD=... \
ghcr.io/ni-c/freshrss-mcp:latestDas Image wird für linux/amd64 und linux/arm64 mit einer SBOM und Build-Herkunft
veröffentlicht. Es läuft als unprivilegierter node-Benutzer und enthält kein npm,
sodass sich nur Node, die Laufzeitabhängigkeiten und dist/ darin befinden.
Entwicklung
npm install
npm run lint && npm run build && npm test
npm run test:coverageSiehe CONTRIBUTING.md für eine Wegwerf-FreshRSS-Instanz zum Entwickeln. Die vollständige Dokumentation befindet sich unter freshrss-mcp.ni-c.de.
Veröffentlichung
Verschieben Sie die
[Unreleased]-Einträge in CHANGELOG.md unter die neue Version und erhöhen Sie dieversioninpackage.json.npm run lint && npm run build && npm run test:coverage.Committen, dann taggen:
git tag -s vX.Y.Z -m vX.Y.Z && git push origin main vX.Y.Z.
Der Tag löst release.yml aus, das überprüft, ob der Tag mit package.json
übereinstimmt, über Trusted Publishing
mit Herkunftsnachweis (kein Token erforderlich) auf npm veröffentlicht, die
GitHub-Version aus dem CHANGELOG-Abschnitt erstellt und den Eintrag im
MCP Registry veröffentlicht. Wenn nur der
Registry-Schritt fehlschlägt, beheben Sie ihn auf main und führen Sie
mcp-registry.yml manuell erneut aus – führen Sie niemals den getaggten Job erneut aus,
da dieser den alten Baum auschecken würde.
Lizenz
MIT
Maintenance
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server for RSS feed aggregation and article content extraction, allowing users to subscribe to feeds and extract full article content as Markdown.21915MIT
- Flicense-qualityDmaintenanceA self-hosted RSS reader MCP server that manages RSS subscriptions and fetches live feed content, deployable on AWS.
- Alicense-qualityAmaintenanceMCP server for FreshRSS RSS reader enabling feed reading, subscription management, and item actions via the Google Reader compatible API.MIT
- AlicenseBqualityDmaintenanceAn MCP server that provides RSS feed tools for Claude Desktop, enabling fetching and parsing RSS feeds with configurable feeds and blocklists.6MIT
Related MCP Connectors
A MCP server built for developers enabling Git based project management with project and personal…
MCP server for accessing curated awesome list documentation
A basic MCP server to operate on the Postman API.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ni-c/freshrss-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server