Provides tools for working with blog RSS/Atom feeds, including listing posts, fetching post content, retrieving recent posts, getting blog metadata, and performing full-text search across post content.
Blog RSS MCP Server
A small FastMCP-based service exposing two tools for working with a blog RSS feed:
Blog RSS MCP Server
A minimal Model Context Protocol (MCP) server that exposes tools for working with a blog’s RSS/Atom feed. It lists posts, fetches post content, returns recent posts, basic blog info, and can search post content on-demand.
What’s in here
main_server.py— MCP server with tools:list_blog_posts()→ [{title, slug (url), pubDate}]get_blog_post(slug)→ {slug, url, content} (content extracted from page HTML, preferring )get_recent_posts(count=5)→ recent posts (simple reverse order)get_blog_info()→ blog metadatasearch_full_text(query)→ on-demand search (fetches each post and searches the text directly)
run_local_tests.py— quick local smoke test that exercises the tools without starting the MCP server.Dockerfile— container image for running the server.requirements.txt— Python dependencies.
Requirements
Python 3.10+
Recommended: a virtual environment (e.g.,
.venv)
Install dependencies:
Note for Python 3.13+: feedparser imports the removed stdlib module cgi; this repo includes python-legacy-cgi in requirements to ensure compatibility.
Configuration
Set environment variables as needed:
RSS_FEED_URL(required) → Full URL to your RSS/Atom feed (e.g.,https://example.com/feed.xml)MCP_TRANSPORT(optional) →stdio(default),sse, orstreamable-httpMCP_MOUNT_PATH(optional) → mount path for applicable transports
Example:
Run locally (MCP server)
With a venv:
Local smoke test (no MCP client required)
That script will print blog info, list posts, fetch one post’s content, and run a simple on-demand search.
Docker
Build the image:
Run with stdio transport (for MCP clients that spawn the container and talk over stdio):
Run with basic HTTP transport (optional):
Notes & troubleshooting
Logs go to stderr; stdio transport messages go to stdout (safe for MCP clients).
If HTTPS feed fetches fail in a minimal base image, install system CA certificates in your container.
If
mcp.run()signature changes between versions, inspectFastMCP.runin your installed package and adjust the call accordingly.
Example:
Running locally
Start the server directly with Python (development):
If MCP_TRANSPORT=stdio, the process runs attached to STDIN/STDOUT so a supervising client can manage lifecycle and communicate over stdio.
Docker
Build the image locally:
Run attached to your terminal (stdio transport):
Or run detached with an HTTP/streamable transport (adjust ports as needed):
Search
search_full_text(query)performs a simple case-insensitive substring search on-demand. It fetches each post’s content live and extracts plain text, so results always reflect the current site content.
Custom catalog and client integration
The repo includes
custom_catalog_for_blog_mcp.txt(example YAML you can copy into a client catalog). UseMCP_TRANSPORT=stdiowhen you want the client to spawn the container and communicate over stdio.
Troubleshooting
If you see import errors for
feedparserorbeautifulsoup4, runpip install -r requirements.txtin the same environment.If posts are missing from
list_blog_posts(), verify the feed providespublishedorpubDate; the server is defensive but you can inspect the raw parsed feed:
If
mcp.run()fails due to signature mismatch, inspectmcp.server.fastmcp.FastMCP.runin your installed package and adjust the call inmain_server.py.
Development & tests
Add pytest tests that mock
feedparser.parseto exerciselist_blog_posts,get_blog_post, andsearch_full_text.Consider adding a GitHub Actions workflow to run tests on push.
Security & production notes
Do not expose the server publicly without authentication or a reverse proxy with TLS.
When building/persisting indexes, secure the storage and limit who can trigger a rebuild.
Next steps I can help with
Wire
_build_fulltext_index()to run at startup whenBUILD_FULLTEXT_INDEXis enabled (optionally persist to disk).Add unit tests and a CI workflow.
Add a
HEALTHCHECKto the Dockerfile and/or a small HTTP health endpoint.
Tell me which of those you'd like and I'll implement it.
This server cannot be installed
remote-capable server
The server can be hosted and run remotely because it primarily relies on remote services or has no dependency on the local environment.
Enables interaction with blog RSS/Atom feeds to list posts, fetch content, get recent posts, retrieve blog metadata, and perform full-text search across post content. Supports any blog with an RSS/Atom feed through natural language queries.