Integrates OpenAI's embedding API to enable semantic search functionality, allowing natural language queries to find conceptually similar articles using vector similarity search with pgvector.
Uses PostgreSQL with pgvector extension for efficient storage and retrieval of RSS articles with vector embeddings, enabling fast similarity searches and comprehensive article management.
Provides comprehensive RSS feed management with intelligent search capabilities, semantic search using AI embeddings, article organization with a four-status workflow (unread/read/favorite/archived), daily digest generation, and advanced filtering and pagination for efficient content consumption.

MCP RSS
MCP RSS is a Model Context Protocol (MCP) server for intelligent RSS feed management with advanced search capabilities, semantic search using AI embeddings, and a comprehensive reading workflow.
Features
š° RSS Feed Management - Parse OPML files and automatically fetch articles from RSS feeds
š Advanced Search - Keyword search with date range, category, and status filtering
š¤ Semantic Search - AI-powered natural language search using OpenAI embeddings (optional)
š Smart Organization - Four-status workflow (unread/read/favorite/archived)
š Daily Digest - Get today's unread articles grouped by category
š High Performance - PostgreSQL with pgvector for efficient vector similarity search
š Auto-Deduplication - Prevents duplicate articles and wasted API calls
ā” Token-Efficient - Browse titles/excerpts first, fetch full content only when needed
š Pagination Support - Handle large feed collections (500+) with efficient pagination
Installation
Prerequisites
Node.js (v18 or higher)
Docker & Docker Compose (for PostgreSQL with pgvector)
OpenAI API Key (optional, only for semantic search)
Quick Start with Docker Compose
Clone or install the package:
npm install -g mcp_rss # OR for local development git clone <repository-url> cd mcp_rss npm installStart PostgreSQL with pgvector:
docker-compose up -dConfigure environment variables:
cp .env.example .env # Edit .env with your settingsBuild the project:
npm run build
Database Setup
The project uses PostgreSQL 17 with pgvector extension for vector similarity search.
Using Docker Compose (Recommended):
Manual PostgreSQL Setup:
Configuration
Environment Variables
Create a .env file with the following configuration:
Variable | Description | Default | Required |
Database Configuration | |||
| PostgreSQL host |
| No |
| PostgreSQL port |
| No |
/
| Database username |
| No |
| Database password |
| No |
/
| Database name |
| No |
RSS Configuration | |||
| Path to OPML file with RSS feeds |
| Yes |
| Feed update interval (minutes) |
| No |
OpenAI Configuration | |||
| OpenAI API key for embeddings | - | No* |
* Only required for semantic search feature. All other features work without it.
Claude Desktop Configuration
For local development, use the built dist folder:
For global installation via npm:
MCP Tools Reference
The server exposes 8 powerful tools for RSS feed management:
Token Efficiency Guide
All list/search tools now support ultra-efficient token usage:
Default behavior: Returns ONLY titles and metadata (no excerpts, no content)
Optional excerpts: Set
includeExcerpt: truefor content previews (moderate token usage)Full content: Set
includeContent: truefor complete article text (high token usage)On-demand content: Use
get_article_fullto fetch specific articles by ID (most efficient)
Recommended workflow (90%+ token savings):
Browse titles only with
get_contentorsearch_articles(default settings)Identify interesting articles from titles alone
Optionally fetch excerpts for borderline cases with
includeExcerpt: trueFetch full content with
get_article_fullfor selected articles only
Token Usage Comparison:
Titles only: ~50-100 tokens per article
Titles + excerpts: ~150-300 tokens per article
Titles + full content: ~1,000-5,000 tokens per article
1. get_content
Get articles with basic filtering and pagination. Returns latest articles first (sorted by pubDate DESC).
Use this for:
Browsing recent articles
Checking unread articles
Simple filtering by status or source
Date range filtering for specific time periods
Token Efficiency:
By default, returns ONLY titles and metadata (most token-efficient)
Set
includeExcerpt: trueto add content previewsSet
includeContent: trueto get full article textFor best efficiency: browse titles only, then use
get_article_fullfor specific articles
Parameters:
Parameter | Type | Description | Default |
|
| Filter by statuses:
,
,
,
| All statuses |
|
| Filter by feed source title | All sources |
|
| Number of articles to return |
|
|
| Offset for pagination |
|
|
| Only show articles from favorite blogs |
|
|
| Show favorite blog articles first |
|
|
| Include full article content (uses more tokens) |
|
|
| Include article excerpt/preview |
|
|
| Start date (ISO: YYYY-MM-DD or YYYY-MM-DDTHH:mm:ssZ) | - |
|
| End date (ISO format) | - |
Example (titles only - most efficient):
Example (with date range and excerpts):
Example (favorite blogs with full content):
Response (default - titles only, no excerpt/content):
2. search_articles
Advanced search with keyword matching, date ranges, categories, and status filters. Searches both title and content.
Use this for:
Finding articles on specific topics
Date-based filtering
Complex multi-criteria searches
Category-specific searches
Parameters:
Parameter | Type | Description | Default |
|
| Search term (case-insensitive, searches title + content) | - |
|
| Filter by feed category | - |
|
| Filter by article statuses | All |
|
| Start date (ISO format:
or
) | - |
|
| End date (ISO format) | - |
|
| Number of results |
|
|
| Offset for pagination |
|
|
| Include full article content (uses more tokens) |
|
Example:
3. semantic_search
AI-powered semantic search using OpenAI embeddings. Finds conceptually similar articles even without exact keyword matches.
Use this for:
Natural language queries
Finding related concepts
Research and discovery
Topic exploration
Requirements:
OPENAI_API_KEYmust be setOnly works for articles from 2020 onwards
Automatically disabled if API key is missing (fails gracefully)
Parameters:
Parameter | Type | Description | Default |
|
| Natural language search query (required) | - |
|
| Include full article content (uses more tokens) |
|
|
| Number of results |
|
|
| Filter by article statuses | All |
|
| Filter by feed category | - |
Example:
How it works:
Converts your query into a 1536-dimensional vector using OpenAI
Compares against article embeddings using pgvector cosine similarity
Returns semantically similar articles ranked by relevance
4. get_daily_digest
Get today's unread articles grouped by category. Perfect for daily reading workflows. Filters by publication date (pubDate), not fetch date.
Use this for:
Morning briefings
Daily catch-up
Category-organized reading
Articles published today (based on pubDate)
Parameters:
Parameter | Type | Description | Default |
|
| Max articles per category |
|
|
| Include full article content (uses more tokens) |
|
Example:
Response: Articles grouped by category, with up to N articles per category fetched today.
5. get_weekly_favorites
NEW: Get favorite articles from the last 7 days (titles only). Perfect for weekly review of bookmarked content.
Use this for:
Weekly reading lists
Reviewing saved articles from the past week
Tracking important bookmarked content
Quick overview of what you found valuable recently
Parameters: None
Example: No parameters needed - simply call the tool.
Response:
Features:
Returns articles marked as "favorite" published in last 7 days
Sorted by publication date (newest first)
Ultra token-efficient - titles and metadata only
No excerpts or content by default
Use
get_article_fullto read full content of any article
6. get_article_full
Get full article content by ID. Use this for token-efficient reading: browse titles first, then fetch complete content only for articles you want to read.
Use this for:
Reading full articles after browsing titles
Getting complete content for specific interesting articles
Token-efficient workflow (browse ā select ā read)
Parameters:
Parameter | Type | Description | Required |
|
| Article ID from get_content/search_articles | Yes |
Example:
Response:
Token-Efficient Workflow:
7. get_sources
Get RSS feed sources with pagination and filtering. With hundreds of feeds, pagination is essential to avoid token limits.
Use this for:
Discovering available sources
Finding valid source names for filtering
Exploring feed categories
Browsing favorite blogs
Parameters:
Parameter | Type | Description | Default |
|
| Number of sources to return (max recommended: 100) |
|
|
| Offset for pagination (e.g., 50 for page 2) |
|
|
| Only show favorite blogs |
|
|
| Filter by category (case-insensitive, partial match) | All categories |
Example (first page):
Example (favorites only):
Example (filter by category):
Response:
Pagination Example:
8. set_tag
Update article status to manage your reading workflow.
Use this for:
Marking articles as read
Saving favorites
Archiving old articles
Managing reading queue
Parameters:
Parameter | Type | Description | Required |
|
| Article ID to update | Yes |
|
| New status:
,
,
,
| Yes |
Example:
Article Status Workflow
The server supports a comprehensive 4-status workflow:
Vector Search & Embeddings
How Embeddings Work
Automatic Generation: When fetching RSS articles, the server automatically generates embeddings for articles from 2020 onwards
OpenAI Integration: Uses
text-embedding-3-smallmodel (1536 dimensions)Deduplication: Embeddings are only generated once per article (checked by URL)
Graceful Degradation: If
OPENAI_API_KEYis missing or invalid, the server continues to work normally (embeddings skipped)
Storage
Embeddings stored as
vector(1536)in PostgreSQL using pgvector extensionEnables fast cosine similarity search:
ORDER BY embedding <=> query_vector
Cost Optimization
Only articles from 2020+ get embeddings (configurable in
RssService.shouldGenerateEmbedding())Duplicate articles are skipped (no redundant API calls)
Embedding generation failures don't block article saving
Development
Project Structure
Building
Testing
Troubleshooting
Database Connection Issues
Error:
Ensure PostgreSQL is running:
docker-compose psCheck port 5433 is available:
lsof -i :5433Verify environment variables match docker-compose settings
OpenAI API Errors
Error:
Verify your API key at https://platform.openai.com/api-keys
Ensure you have available credits
Check the key isn't expired
Embeddings not being generated:
Server works fine without API key (embeddings skipped)
Check article dates (only 2020+ articles get embeddings)
Look for errors in console logs
MCP Server Issues
Server not appearing in Claude Desktop:
Check Claude Desktop config path is correct
Verify
dist/index.jsexists (runnpm run build)Restart Claude Desktop after config changes
Check Claude Desktop logs for errors
Performance Tips
Adjust Update Interval: Set
RSS_UPDATE_INTERVALto 60+ minutes for productionLimit Embedding Generation: Embeddings are only for articles from 2020+
Use Pagination: Always use
offsetandlimitfor large result setsDatabase Indexing: PostgreSQL automatically indexes the vector column
License
MIT
Contributing
Contributions welcome! Please ensure:
TypeScript compiles without errors (
npm run build)Environment variables are documented
New features include appropriate error handling
This server cannot be installed
hybrid server
The server is able to function both locally and remotely, depending on the configuration or use case.
Enables intelligent RSS feed management with AI-powered semantic search, advanced filtering, and a comprehensive reading workflow. Supports OPML parsing, article organization with status tracking, and token-efficient browsing of large feed collections.