A minimal, MCP-first RSS reader for agents.
rss-mcp is a lightweight CLI app whose primary job is to expose your RSS subscriptions through a Model Context Protocol (MCP) server.
- Imports subscriptions from OPML
- Fetches feeds on demand
- Persists data in SQLite
- Exposes agent-friendly MCP tools over stdio
Most RSS tools are UI-first. This one is agent-first.
If your assistant can connect to MCP, it can:
- pull updates from your feeds,
- list and filter entries,
- and track read/unread state.
- MCP server over stdio
- OPML import (
xmlUrl) with upsert by feed URL - Manual refresh model (agent-triggered)
- SQLite storage for subscriptions, entries, and read state
- JSON responses designed for tool use
- Node.js (20+)
- TypeScript
@modelcontextprotocol/sdkbetter-sqlite3rss-parserfast-xml-parserzod
npm installnpm run devnpm run dev -- --opml ./subscriptions.opmlnpm run build
node dist/index.js serve --db ./data/rss-mcp.sqlite --opml ./subscriptions.opmlCLI flags override environment variables.
rss-mcp serve [--db <path>] [--opml <path>]RSS_MCP_DB_PATH(default:./data/rss-mcp.sqlite)RSS_MCP_OPML_PATH(optional)RSS_MCP_LOG_LEVEL(error|warn|info, default:info)
The server runs over stdio, so MCP clients should launch it as a command.
Example command:
node /absolute/path/to/rss-mcp/dist/index.js serve --db /absolute/path/to/rss-mcp/data/rss-mcp.sqliteIf your MCP host supports env config, you can set:
RSS_MCP_DB_PATH=/absolute/path/rss-mcp.sqlite
RSS_MCP_OPML_PATH=/absolute/path/subscriptions.opmlAll tools return JSON in text content with ok: true|false.
Import feeds from an OPML file.
Input:
{ "path": "/absolute/path/subscriptions.opml" }List tracked subscriptions.
Input:
{ "limit": 50, "offset": 0 }Fetch latest items for all feeds or a subset.
Input examples:
{}{ "subscriptionIds": [1, 2, 3] }{ "urls": ["https://example.com/feed.xml"] }Query stored entries with filters.
Input examples:
{ "limit": 20, "offset": 0 }{ "subscriptionId": 2, "isRead": false, "limit": 50 }Get full stored details for one entry.
Input:
{ "entryId": 123 }Mark entry as read/unread.
Input examples:
{ "entryId": 123 }{ "entryId": 123, "isRead": false }subscriptionsentriesentry_states
Designed for PoC simplicity with durable local storage.
npm run typecheck
npm testPoC / early-stage. Focus is correctness and MCP interoperability over broad feature surface.
No license file is currently included.