A Model Context Protocol (MCP) server that provides tools for reading and discovering RSS and Atom feeds. This server supports RSS 2.0, Atom 1.0, and RSS 1.0 (RDF) feed formats.
- Parse RSS 2.0, Atom 1.0, and RSS 1.0 (RDF) feeds
- Filter items by publication date
- Limit number of items returned
- HTTP Basic Authentication support for protected feeds
- Automatic content truncation (3000 chars per item)
- Extract metadata: titles, links, descriptions, authors, dates, categories, enclosures
- Scan websites for RSS/Atom feed links
- Discover multiple feeds from a single site
- Extract feed titles and types from HTML
- HTTP Basic Authentication support
- Python 3.10+
- pip or uv package manager
- Clone the repository:
git clone <repository-url>
cd rss- Install dependencies:
pip install -r requirements.txtOr with uv:
uv pip install -r requirements.txt- Set up environment variables (for the agent):
cp .env.example .env
# Edit .env and add your OPENROUTER_API_KEY and LOGFIRE_API_KEYThe included PydanticAI agent provides an interactive CLI for testing:
python agent.pyWith a custom model:
python agent.py --model anthropic/claude-3-opusDiscovering feeds:
> Can you find RSS feeds on https://example.com?
Reading a feed:
> Read the latest 5 items from https://example.com/feed.xml
Filtering by date:
> Show me items from https://example.com/rss published after 2024-01-01
Authenticated feeds:
> Read https://protected.example.com/feed with username 'user' and password 'pass'
The MCP server can be run standalone:
python mcp_server.pyOr installed in Claude Desktop by adding to your MCP config:
{
"mcpServers": {
"rss": {
"command": "python",
"args": ["/path/to/rss/mcp_server.py"]
}
}
}rss/
├── src/
│ └── rss_client.py # Core RSS/Atom parsing client
├── agents/
│ └── rss.md # Agent system prompt
├── mcp_server.py # FastMCP server implementation
├── agent.py # PydanticAI agent for testing
├── requirements.txt # Python dependencies
└── README.md # This file
Read and parse an RSS or Atom feed.
Parameters:
url(required): URL of the RSS/Atom feedmax_items(default: 10): Maximum number of items to return (1-100)since_date(optional): Filter items after this date (ISO 8601 format)username(optional): Username for HTTP Basic Authpassword(optional): Password for HTTP Basic Authinclude_content(default: true): Include full content/description
Returns:
- Feed metadata (title, link, description, language, type)
- List of feed items with:
- Title, link, description, content
- Author, publication date, update date
- GUID, categories, enclosures
- Total items count and returned items count
Discover RSS/Atom feeds from a website.
Parameters:
url(required): URL of the website to scanusername(optional): Username for HTTP Basic Authpassword(optional): Password for HTTP Basic Auth
Returns:
- List of discovered feeds with:
- Feed URL
- Feed title (from HTML)
- Feed type (MIME type)
- Total number of feeds found
Use the agent CLI for interactive testing:
python agent.pyLogs are written to logs/rss_mcp_server.log with automatic rotation (10MB max, 5 backups).
- Update the client in
src/rss_client.py - Add or modify tools in
mcp_server.py - Update the agent prompt in
agents/rss.mdif needed - Test with
agent.py
The server handles errors gracefully:
- Network failures (timeouts, connection errors)
- Invalid XML/feed format
- Missing or moved feeds
- Authentication failures
Errors are returned as dictionaries with error and details fields rather than raising exceptions.
- Content truncated to 3000 characters per item
- Maximum 100 items per request
- No support for feed polling/subscriptions (read-only)
- Basic HTML parsing for feed discovery (no JavaScript execution)
httpx- Async HTTP clientpydantic- Data validation and serializationmcp- Model Context Protocol SDKpydantic-ai- Agent framework (for testing)logfire- Logging and observability (for testing)
MIT License
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Test with the agent
- Submit a pull request