Skip to main content
Glama
FeedKeeper RSS/Atom reader and remote MCP Server

FeedKeeper RSS/Atom reader and remote MCP Server

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
ALLOW_SIGNUPNoWhether to allow user signups. Defaults to 'false' for closed signup; set to 'true' to allow open registration.false
SESSION_SECRETYesA secret used to sign session cookies. Set this to a random string; required to run the Feedkeeper server and its MCP endpoint.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

FeedKeeper is a personal RSS reader, article archiver, and news curation service. Use it to read, search, and triage RSS/Atom feeds, fetch full article text, manage reading lists, and read or publish curated newspaper editions.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": true
}
resources
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_feedsA

Lists all RSS/Atom feeds the current user is subscribed to, including subscription settings, unread counts, and polling health status. Safe read-only operation. To inspect a single feed in detail, use get_feed. To discover new feeds, use discover_feeds.

get_feedA

Returns metadata, subscription settings, polling health status, and unread count for a single subscribed feed by its numeric feed ID. Safe read-only operation. Use list_feeds to view all subscribed feeds.

subscribe_feedA

Subscribes the current user to an RSS/Atom feed URL or website URL (auto-discovering the feed link if a website URL is provided). Requires write scope. Idempotent: subscribing to an already subscribed feed returns the existing subscription. Returns the subscription record. For API documentation, see https://github.com/visualfusion/feedkeeper.

discover_feedsA

Inspects a website URL and discovers available RSS, Atom, and JSON feed links from HTML link tags. Safe read-only operation: does NOT subscribe to any feed. Returns a list of discovered candidate feed URLs and titles. Use subscribe_feed to subscribe to one of the discovered URLs. For API documentation, see https://github.com/visualfusion/feedkeeper.

unsubscribe_feedA

Unsubscribes the current user from a feed by its feed ID. Destructive action. Feeds and other users' subscriptions are unaffected. Returns { ok: true } on success.

save_to_inboxA

Saves a web article URL, raw HTML, plain text/markdown clipping, or personal note directly into the user's Universal Inbox. At least one of url, contentHtml, or textContent must be provided. Returns { success: true, itemId: number, title: string, url: string, hasNote: boolean }. For API documentation, see https://github.com/visualfusion/feedkeeper.

list_foldersA

Lists all feed categories/folders created by the current user, including feed counts and unread article counts per folder. Safe read-only operation.

create_folderA

Creates a new category folder to organize feed subscriptions. Requires write scope. Returns the created folder object with its assigned id, name, and position. Folders can be assigned to feeds using move_feed_to_folder.

move_feed_to_folderA

Assigns a subscribed feed to a folder, or removes it from all folders (unfiled) if folderId is null. Requires write scope. Returns { ok: true } on success.

update_feedB

Updates subscription settings for a feed: custom display name, poll interval, full-text extraction policy, push notification preference, badge counter inclusion, or updates the feed URL if the publisher relocated. Returns the updated subscription record. For API documentation, see https://github.com/visualfusion/feedkeeper.

rename_folderA

Renames an existing feed category folder for the current user. Requires write scope. Returns the updated folder record { id, name, position }. Returns error if folderId is not found or name is already taken.

delete_folderA

Deletes a feed category folder. Subscribed feeds inside the folder remain intact and are moved to the root level (unfiled). Destructive action for the folder organization. Returns { ok: true } on success.

get_digestA

Returns recent articles grouped by subscribed feed with short summaries (newest first). This is the fastest and most token-efficient way to scan what is new. Defaults to unread articles. Do NOT use this tool for pagination, full text, or deep filtering—use list_items for cursor pagination or get_new_items for unread filtering, and follow up with get_item for full article bodies.

get_overviewA

Returns account-wide statistics: total subscribed feeds, total unread articles, saved/bookmarked count, top feeds with the most unread items, folder unread counts, and feeds currently experiencing poll failures. Safe read-only overview.

get_new_itemsA

Returns a flat list of unread articles matching specified filters (feed, folder, search query, bookmarked status, date range). Use this tool when you specifically need unread articles as a flat list or need article HTML content. Unlike get_digest, articles are flat rather than grouped. Unlike list_items, this tool returns only unread articles and does not use cursors. Follow up with get_item for individual full articles.

list_itemsA

Lists articles chronologically with bidirectional cursor-based pagination. Use this tool for comprehensive browsing or historical paging through both read and unread articles. Pass nextCursor as 'before' to page backwards into older history, or newestCursor as 'after' to stream newly added items. Do NOT use for quick digests (use get_digest) or unread-only triage (use get_new_items).

get_itemA

Returns full metadata and stored content (HTML or plain text) for a single subscribed article by its numeric itemId. Content is chunked at 40,000 characters; use offset and content.revision to paginate large articles. If an article only has an RSS teaser/summary and full web text is desired, call fetch_full_text.

fetch_full_textA

Downloads and extracts the clean, full-length article text from the original publisher website via Readability, permanently caching it on the server and returning it. Use this tool ONLY when get_item indicates that the feed provided only an excerpt or teaser. If full text is already cached, it returns cached content unless force=true is passed.

search_itemsB

Searches article titles and summaries using SQLite FTS5 full-text search across all accessible items. Returns matching articles matching the query phrase, with optional feed, folder, bookmark, and date filters. Safe read-only search.

mark_readA

Marks one or more subscribed articles as read. Accepts a single itemId or an array of itemIds for batch processing. Idempotent: already-read articles remain read. Returns { ok: true, updated: number } where updated is the count of items that actually transitioned from unread to read.

mark_unreadA

Marks one or more subscribed articles as unread. Accepts a single itemId or an array of itemIds for batch processing. Idempotent. Returns { ok: true, updated: number } where updated is the count of items that actually transitioned to unread.

bookmark_itemA

Bookmarks (stars) one or more articles for permanent retention. Bookmarked articles retain full text and images and survive automatic retention cleanup and feed unsubscription. Idempotent. Returns { ok: true, updated: number }.

unbookmark_itemA

Removes bookmark status from one or more articles. Safely triggers archive pruning for unreferenced cached assets. Idempotent. Returns { ok: true, updated: number }.

mark_all_readA

Marks all unread articles as read in a single operation. Can be scoped to a single feed or an entire folder. Idempotent. Returns { marked: number } with the count of newly read items.

list_muted_keywordsA

Lists all keyword filters configured for the current user. Articles matching any active muted keyword are automatically filtered out from new item views and newspaper editions. Safe read-only.

add_muted_keywordA

Adds a new keyword filter rule. Articles whose title or summary contains this keyword (case-insensitive) will be suppressed from feeds and editions. Requires write scope. Returns the created keyword rule { id, keyword, created_at }.

unmute_keywordA

Removes an existing muted keyword filter by its numeric keywordId. Future and existing articles matching this keyword will once again be visible. Returns { ok: true } on success.

export_opmlA

Exports all subscribed feeds and folder structures of the current user as an OPML 2.0 XML document. Safe read-only operation.

import_opmlA

Imports feed subscriptions and folders from an OPML 2.0 XML string for the current user. Existing subscriptions are preserved. Requires write scope. Returns { imported: number, failed: number, foldersCreated: number }.

refresh_feedA

Requests an immediate poll of a subscribed feed from its origin URL and returns its updated health status, number of new items found, and error state. Respects origin HTTP cache headers and backoff pauses. Returns { success: boolean, newItems: number, error: string | null, deferred: boolean, retryAt: string | null, feed: object }.

get_editionA

Returns the authoritative edition state, publication metadata, article list, and revision number for the user's curated newspaper edition ('Deine Zeitung'). Returns the current revision (even if empty, expired, or dismissed), which must be passed as expectedRevision when calling publish_edition. Safe read-only.

get_edition_candidatesA

Use this tool ONLY when preparing to curate a newspaper edition with publish_edition. Returns a bounded shortlist of unread articles from the last 7 days scored for editorial curation, user reading preferences, and current revision. Do NOT use for general reading or browsing (use get_digest or get_new_items instead).

publish_editionA

Publishes an ordered selection of 1 to 24 article IDs as the user's official curated edition ('Deine Zeitung'). The published edition remains available until the next edition is published or expires. Pass the revision from get_edition as expectedRevision for optimistic concurrency, and a UUID requestId for idempotent retries. Does NOT alter underlying articles. Requires write scope.

dismiss_editionA

Explicitly dismisses the current curated edition so it is no longer shown as active. Requires a UUID requestId and the current revision as expectedRevision for conflict detection. Requires write scope. Returns { ok: true } on success.

Prompts

Interactive templates invoked by user choice

NameDescription
daily_briefingA short briefing of what is new in your feeds, grouped by topic.
catch_up_on_topicFind and summarize what your feeds say about a topic.
saved_reading_listSummarize the articles you saved for later and suggest what to read first.
triage_unreadGo through unread articles, save the keepers and mark the rest as read.

Resources

Contextual data attached and managed by the client

NameDescription
feedsAll subscriptions with unread counts and health.
opmlThe subscription list in OPML 2.0, for backup or migration.
savedThe newest 100 saved articles, without their content.
digestUnread articles of the last 24 hours, grouped by feed.

TDQS

A3.8/5.0

Scored across 34 tools

Disambiguation4/5

Most tools map to a distinct resource+action (feeds, folders, editions, bookmarks, keywords, OPML), and the item-reading cluster (get_digest, get_new_items, list_items, get_item, search_items) is explicitly differentiated with 'do NOT use for...' cross-references. Still, five overlapping item-retrieval tools plus get_edition_candidates vs get_digest create real misselection risk for an agent skimming names.

Naming Consistency4/5

Almost all names follow a consistent snake_case verb_noun pattern (list_feeds, create_folder, publish_edition, mark_all_read). Minor deviations: unmute_keyword breaks the add_muted_keyword/list_muted_keywords family symmetry and fetch_full_text/save_to_inbox drop the object noun convention, but the overall pattern is predictable.

Tool Count3/5

34 tools is heavy for an RSS reader; the edition-curation workflow (get_edition, get_edition_candidates, publish_edition, dismiss_edition) and keyword-filter trio each add surface area. Every tool is individually justified, but the set is at the upper bound of what an agent can hold coherently in one server.

Completeness4/5

Broad lifecycle coverage: feeds (subscribe/discover/update/refresh/unsubscribe), folders (create/rename/delete/move/list), items (read/unread/mark-all/search/full-text), bookmarks, keyword filters, OPML import/export, inbox capture, and a full edition lifecycle. Gaps: no dedicated bookmark-listing tool (only filters on other tools) and no tag/label or item-delete operations, though these are workable around.

Maintenance

ActivityActive
ResponsivenessNo recent community issues