freshrss-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FRESHRSS_URL | Yes | Root URL of the instance, e.g. https://rss.example.com. The API path /api/greader.php is appended automatically. | |
| FRESHRSS_USER | Yes | FreshRSS user name. | |
| FRESHRSS_READ_ONLY | No | true registers only the read tools. | false |
| FRESHRSS_API_PASSWORD | Yes | The API password from the profile page, not the web login password. | |
| FRESHRSS_INSECURE_TLS | No | true accepts self-signed certificates for this connection only. | false |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_user_infoA | Returns the FreshRSS account the server is authenticated as. Useful as a connection and credential check before anything else. |
| list_feedsA | Lists every subscribed feed with its category and unread count. The numeric feedId is what all other tools take as feed_id. Start here to find out what is subscribed before listing articles. |
| get_unread_countsA | Returns how many unread articles are waiting, in total and per feed and category, sorted by count. Only entries with unread articles are listed. |
| list_articlesA | Lists articles from a feed, category, label or built-in stream, newest first. Returns short plain-text excerpts by default; set include_content=true for the article text, or fetch single articles with get_articles. FreshRSS has no full-text search over its API, so there is no way to query by keyword — narrow the result with feed_id/category and since/until instead and filter the returned articles yourself. |
| get_articlesA | Fetches the full text of specific articles by id, as plain text. At most 20 ids per call. |
| list_article_idsA | Lists only the ids of matching articles — the cheap way to collect a set for mark_articles. Same selectors and filters as list_articles. |
| list_categoriesA | Lists the categories (folders that hold feeds) and the user labels (tags that are attached to individual articles), each with its unread count. Both are addressed by name in the other tools. |
| export_opmlA | Exports all subscriptions as an OPML document — the portable backup format for feed readers. For a readable overview of the subscriptions use list_feeds instead. |
| subscribe_feedA | Subscribes to a feed. The URL may point at the feed itself or at a website — FreshRSS discovers the feed and then downloads it, so this call can take a while. A category that does not exist yet is created. |
| update_feedA | Renames a feed and/or moves it to another category. A category that does not exist yet is created. Fields that are not given stay unchanged. |
| unsubscribe_feedA | Deletes a feed together with all of its stored articles, read state and stars. Two-step: the first call returns a confirmation token, the second call with that token performs the deletion. This cannot be undone — re-subscribing starts from whatever the feed currently offers. |
| mark_articlesA | Sets the read state, the star and user labels of specific articles. Starring and labelling are reversible by calling this tool again with the opposite value. Marking as read is not, so read=true asks a person first; where the client cannot show a dialog, call once to receive a token and again with it. At most 100 articles per call; every given change is applied to all of them. FreshRSS answers |
| mark_all_as_readA | Marks every article of a feed, category, label or built-in stream as read. Two-step: the first call returns a confirmation token, the second call with that token performs the change. Which articles were unread before cannot be recovered afterwards. |
| rename_category_or_labelA | Renames a category (folder) or a user label. FreshRSS resolves the name against its categories first and falls back to labels, so one tool covers both. Feeds and articles keep their assignment. |
| delete_category_or_labelA | Deletes a category (its feeds move to the default category, no articles are lost) or a user label (it is detached from every article). FreshRSS matches categories first, so a category and a label of the same name cannot be told apart here. Two-step: the first call returns a confirmation token, the second call with that token performs the deletion. |
| import_opmlA | Subscribes to every feed in an OPML document, creating the categories it names, and then refreshes all feeds — which can take minutes on a large file. There is no bulk undo; every feed would have to be removed individually. Two-step: the first call returns a confirmation token, the second call with that token performs the import. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 16 tools
Each tool has a clearly distinct purpose with no overlapping functionality. For example, 'list_articles' and 'get_articles' are differentiated by scope (list vs. full text), and 'mark_articles' vs 'mark_all_as_read' are distinct in granularity.
Tool names follow a consistent verb_noun pattern (e.g., get_user_info, list_feeds, subscribe_feed, export_opml) with occasional modifiers (all_as_read, category_or_label) but remain uniform and predictable. No mixed conventions like camelCase or inconsistent verbs.
With 16 tools, the set is slightly above the typical 3–15 range but each tool serves a necessary function for a feed reader, covering subscription management, article handling, and OPML operations. The count feels justified rather than bloated.
The tool surface covers the full lifecycle of feed management: reading (list/get), writing (subscribe/update/unsubscribe), marking read states, category operations, and OPML import/export. The absence of search is explicitly noted as an API limitation, and alternatives are provided, so no critical gaps exist.