Skip to main content
Glama
visualfusion

Feedkeeper MCP Server

by visualfusion

Feedkeeper

Feedkeeper is a self-hosted RSS/Atom feed manager with a remote-capable MCP server built in. Subscribe to any feed — news sites, blogs, or a Google Alerts RSS feed — and let an MCP client like Claude read, search, and triage new items for you, from anywhere. The web UI is fully translated into English, German, and Japanese, switchable per user at any time.

It's multi-user by design: one instance can serve several people, each with their own subscriptions, read state, and API tokens.

Features

  • Any RSS/Atom feed — not just Google Alerts, though that's what started this project.

  • Multi-user — closed by default; an admin creates accounts (or invites people through the web UI).

  • Remote MCP access — connect Claude Desktop, Claude Code, or any other MCP client over HTTPS from anywhere, authenticated with a personal access token. No SSH tunnel required.

  • Web UI — subscribe/unsubscribe, browse and search items, mark things read, manage tokens and users.

  • Trilingual interface — English, German, and Japanese, with a language switcher; each user can pick their own, independent of the others.

  • Per-feed control — custom label, adjustable check interval (5 minutes to 24 hours), and a "mark all read" button per feed or across everything.

  • Account self-service — change your own password from Settings.

  • Self-hosting first — a single Node process, one SQLite file, no external services.

  • Hardened by default — SSRF-guarded feed fetching, rate limiting, per-user data isolation, closed signup.

Related MCP server: FreshRSS MCP Server

How it fits together

flowchart LR
    WebUI(["Web UI"])
    MCPClient(["MCP client<br/>(e.g. Claude)"])

    subgraph Server["One Node process"]
        direction LR
        API["Express API<br/>session auth"]
        MCPEP["MCP endpoint<br/>token auth"]
        DB[("SQLite +<br/>feed poller")]

        API --- DB
        MCPEP --- DB
    end

    WebUI <--> API
    MCPClient <--> MCPEP

One Node process serves the built web UI, a REST API, and an MCP endpoint (/mcp, using the Streamable HTTP transport) — all backed by the same SQLite database and feed poller.

Quick start (local)

Requires Node.js 20+.

git clone https://github.com/visualfusion/feedkeeper.git
cd feedkeeper
npm install
cp .env.example .env
# edit .env — at minimum, set SESSION_SECRET (see the comment in the file)
npm run dev:server   # terminal 1
npm run dev:web      # terminal 2

Open http://localhost:5173 and follow the onboarding screen to create the first admin account. (Prefer the terminal? npm run setup does the same thing without a browser.)

Deploying

See docs/deployment-uberspace.md for a step-by-step guide to running Feedkeeper on Uberspace. The same steps work on any Linux host with SSH access and Node.js 20+.

For production, build once and run the compiled server:

npm run build
npm run start

Connecting an MCP client

  1. Log in to the Feedkeeper web UI and go to Settings → Personal access tokens.

  2. Create a token and copy it immediately — it's only shown once.

  3. Add an MCP server entry pointing at https://<your-domain>/mcp, sending Authorization: Bearer <token> as a header.

Every tool call is scoped to the token's owner — a client can only see and manage that user's own feeds and items.

Available MCP tools

Tool

Description

list_feeds

List subscribed feeds with unread counts

subscribe_feed

Subscribe to a feed URL

unsubscribe_feed

Remove a subscription

get_new_items

Fetch unread items, optionally filtered

search_items

Full-text search across all items

mark_read

Mark an item as read

Security

  • Closed signup by default (ALLOW_SIGNUP=false). An admin creates additional accounts from Settings.

  • SSRF protection: feed URLs are validated (and every redirect hop re-validated) against private/internal IP ranges before being fetched, so this server can't be used to probe its own host or internal network.

  • Rate limiting on login and the general API surface.

  • Personal access tokens are stored as salted hashes, never in plaintext.

  • Per-user data isolation: every query is scoped to the authenticated user; feeds are deduplicated by URL under the hood, but subscriptions, read state, and tokens are always per-user.

Found a security issue? Please open an issue on GitHub or reach out to the maintainer directly rather than filing a public report for anything sensitive.

Configuration

See .env.example for all available environment variables.

Tech stack

  • Server: Node.js, TypeScript, Express, better-sqlite3, @modelcontextprotocol/sdk

  • Web: React, Vite, Tailwind CSS, react-i18next

Contributing

Issues and pull requests are welcome. This is a young project — expect some rough edges.

License

MIT


Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    MCP server for fetching, parsing, and managing RSS feeds. Features Fetch and parse RSS/Atom feeds In-memory caching with TTL Batch fetching of multiple feeds Monitor feeds for new items Search content across multiple feeds Extract and format feed content
    6
    51 npm
    12
    Apache 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables Claude to fetch, parse, and manage RSS/Atom feeds through the Model Context Protocol. It supports feed registration and retrieval, allowing users to access article summaries and full content from multiple sources via natural language.
    1
    -