Skip to main content
Glama
rakeshgangwar

FreshRSS MCP Server

FreshRSS MCP Server

A Model Context Protocol server for interacting with FreshRSS feeds via the Fever API.

This TypeScript-based MCP server allows AI assistants to interact with your FreshRSS instance, enabling them to:

  • List and browse your RSS feeds

  • Fetch unread items

  • Mark items as read/unread

  • Get items from specific feeds

Features

Tools

  • list_feeds - List all feed subscriptions

  • get_feed_groups - Get feed groups

  • get_unread - Get unread items

  • get_feed_items - Get items from a specific feed

  • mark_item_read - Mark an item as read

  • mark_item_unread - Mark an item as unread

  • mark_feed_read - Mark all items in a feed as read

  • get_items - Get specific items by their IDs

Related MCP server: FreshRSS MCP Server

Requirements

  • A running FreshRSS instance with API access enabled

  • API endpoint URL, username, and password for your FreshRSS instance

Development

Install dependencies:

npm install

Build the server:

npm run build

For development with auto-rebuild:

npm run watch

Environment Variables

You need to set the following environment variables:

  • FRESHRSS_API_URL: URL to your FreshRSS instance (e.g., "https://rss.example.com")

  • FRESHRSS_USERNAME: Your FreshRSS username

  • FRESHRSS_PASSWORD: Your FreshRSS password

Installation

To use with Claude Desktop, add the server config:

On MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json On Windows: %APPDATA%/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "freshrss": {
      "command": "node",
      "args": ["/path/to/freshrss-server/build/index.js"],
      "env": {
        "FRESHRSS_API_URL": "https://your-freshrss-instance.com",
        "FRESHRSS_USERNAME": "your-username",
        "FRESHRSS_PASSWORD": "your-password"
      }
    }
  }
}

For Cline MCP integration, add to your MCP settings:

{
  "mcpServers": {
    "freshrss": {
      "command": "node",
      "args": ["/path/to/freshrss-server/build/index.js"],
      "env": {
        "FRESHRSS_API_URL": "https://your-freshrss-instance.com",
        "FRESHRSS_USERNAME": "your-username",
        "FRESHRSS_PASSWORD": "your-password"
      }
    }
  }
}

Debugging

Since MCP servers communicate over stdio, debugging can be challenging. We recommend using the MCP Inspector, which is available as a package script:

npm run inspector

The Inspector will provide a URL to access debugging tools in your browser.

Security Note

This server requires your FreshRSS credentials. For security:

  • Never commit your credentials to version control

  • Always use environment variables for sensitive information

  • Consider using a dedicated FreshRSS account with appropriate permissions

License

This project is licensed under the MIT License - see the LICENSE file for details.

Contributing

Contributions are welcome! See CONTRIBUTING.md for details.

Available Tools

8 tools
get_feed_groupsC

Get feed groups

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It merely states the action without revealing whether the operation is read-only, what it returns, any side effects, or required permissions. This is a significant gap for a retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely short ('Get feed groups'), which is under-specified rather than concise. It leaves out essential information and does not earn its place as a helpful description beyond naming the action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the tool's simplicity (no params, no output schema), the description is incomplete. It does not explain what a feed group is, what the response looks like, or how it relates to sibling tools, leaving the agent with insufficient context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is 100% vacuously. Per the baseline for 0 params, a score of 4 is appropriate. The description does not need to add parameter details since none exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Get feed groups' uses a clear verb ('get') and resource ('feed groups'), indicating the action of retrieving feed groups. However, it does not distinguish itself from sibling tools like 'list_feeds', and does not explain what feed groups are in relation to feeds.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as 'list_feeds' or 'get_feed_items'. There is no context, prerequisites, or exclusions, leaving the agent without direction on tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_feed_itemsA

Get items from a specific feed

ParametersJSON Schema
NameRequiredDescriptionDefault
feed_idYesFeed ID

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must convey behavioral context. It only restates the function name without disclosing details such as read-only nature, return format, pagination, or error handling. There is no added context beyond the basic action, so it fails to provide meaningful behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is concise and front-loaded. There is no verbiage or repetition; every word contributes to the meaning. It earns its place without wasting tokens.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with one parameter and no output schema, the description is minimally sufficient but lacks completeness. It does not explain what 'items' means, whether any filtering or sorting occurs, or what the response contains. Given the absence of annotations and output schema, a richer description would aid completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents the single parameter 'feed_id' as 'Feed ID' with high coverage (100%). The description's 'from a specific feed' reinforces this mapping but adds no new semantic detail beyond what the schema provides. Baseline 3 is appropriate given the full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get items') and the scope ('from a specific feed'), which distinguishes it from the sibling tool 'get_items' that likely retrieves items in a broader context. The verb and resource are specific, leaving no ambiguity about the tool's function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'from a specific feed' implies the tool is intended when the user has a feed_id in mind, but it does not explicitly state when to prefer this over alternatives like 'get_items' or 'get_unread'. No exclusions or alternative recommendations are provided, so guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_itemsA

Get specific items by their IDs

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idsYesArray of item IDs to get

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It only states that it retrieves items, omitting any details about read-only behavior, handling of invalid IDs, pagination, or response structure. The term 'Get' hints at a safe operation, but the lack of elaboration leaves significant gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence of seven words, front-loaded with the key verb and object. It contains zero redundancy and efficiently communicates the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a simple getter with one parameter and no output schema, so the description need not be long. However, it does not state what the response looks like or what happens when IDs are missing/invalid. It is minimally complete for the task but lacks edge-case detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully describes the only parameter (item_ids as array of strings), and the tool description adds no extra meaning beyond that. Since schema coverage is 100%, a baseline score of 3 is appropriate, but no additional semantic value is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'Get' is specific, the resource 'items' is clear, and the qualifier 'by their IDs' distinguishes it from sibling tools like get_feed_items or list_feeds. This removes ambiguity about the tool's function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'specific items by their IDs' implies the tool is for fetching items when you already know their IDs, which provides some context. However, it does not mention alternatives or explicitly state when not to use it, leaving the agent to infer the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_unreadB

Get unread items

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full burden of behavioral disclosure. 'Get' implies a read-only operation, but the description doesn't explicitly state this, nor does it disclose whether the tool modifies read status, the return format, or any other behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded phrase with no wasted words. It efficiently communicates the core action and target, though it might be under-specified for context. However, brevity alone is not penalized when the structure is clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool lacks an output schema, and sibling tools include get_items and get_feed_items, creating ambiguity about what 'unread items' refers to. The description doesn't clarify the scope, return format, or relationship to siblings, leaving significant gaps in completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description doesn't need to explain parameter meanings. According to the rubric, a baseline of 4 applies when there are no parameters, and this description satisfies that baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action 'Get' and the resource 'unread items', establishing a basic purpose. However, it doesn't distinguish from siblings like get_items or get_feed_items, leaving ambiguity about the type of items being retrieved.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives such as get_items or get_feed_items. No contexts, exclusions, or conditions are mentioned, leaving the agent without direction for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_feedsA

List all feed subscriptions

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full responsibility for disclosing behavior. It only states 'List all feed subscriptions,' which implies a read-only operation but does not mention return format, pagination, ordering, or side effects. This is minimally transparent for a listing tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with no superfluous words. It is perfectly concise and front-loaded, stating exactly what the tool does without any filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters, no annotations, and no output schema, the description is minimally viable. It lacks information about return fields, whether all feeds are returned at once, or any limits. The presence of sibling tools like get_feed_groups suggests more context could be useful, but the description is not grossly incomplete for a simple list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema is trivially 100% covered. The description does not need to explain parameter meaning, and the baseline for zero-parameter tools is 4. No additional information is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'List all feed subscriptions' uses a specific verb ('list') and identifies the exact resource ('feed subscriptions'). It clearly distinguishes from siblings like get_feed_items or get_unread, which focus on items or unread counts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. There is no mention of what differentiates it from get_feed_groups or get_items, and no exclusions or context. The implied usage is simply to list feeds, but no explicit direction is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_feed_readA

Mark all items in a feed as read

ParametersJSON Schema
NameRequiredDescriptionDefault
feed_idYesFeed ID to mark as read

TDQS

A4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must convey behavioral characteristics. It indicates a write operation ('mark') but does not disclose potential side effects, reversibility, or required permissions. This leaves the agent without information on mutation impact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that directly states the action and scope. Every word contributes, with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation with no output schema, the description covers the core behavior and target. It would benefit from mentioning idempotency or return value, but the simple scope makes it adequately complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only provides 'Feed ID to mark as read' with a generic description. The tool description adds the key insight that the operation affects 'all items' within the feed, clarifying the scope that the schema alone does not fully convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Mark' with the resource 'all items in a feed' and the outcome 'as read'. This distinguishes it from sibling mark_item_read, which targets individual items.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for bulk-marking a feed's items, contrasting with item-level tools among siblings. However, it does not explicitly name alternatives or provide exclusions, so it's clear but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_item_readB

Mark an item as read

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYesItem ID to mark as read

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the action without detailing idempotency, side effects, failure modes, or reversibility. This is insufficient for an agent to understand the tool's full behavioral profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence that is perfectly front-loaded and contains no filler. It earns its place by immediately conveying the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity, the description is minimal but lacks critical context such as differentiation from siblings and behavioral caveats. The absence of usage guidelines and behavioral transparency makes it incomplete for an AI agent deciding which tool to use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool description adds no information about the item_id parameter beyond what the input schema already provides, which has 100% coverage with a clear description. The baseline of 3 is appropriate since the schema fully documents the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Mark an item as read' – a specific verb ('mark') and resource ('item'). It distinguishes from siblings like mark_feed_read (feed vs item) and mark_item_unread (read vs unread) by its specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives such as mark_item_unread or mark_feed_read. There is no mention of prerequisites, exclusions, or typical invocation scenarios. This is a complete lack of usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_item_unreadB

Mark an item as unread

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYesItem ID to mark as unread

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries full burden. It only states the action 'mark as unread' without disclosing idempotency, permissions, side effects, or return behavior—critical gaps for a mutating tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one short sentence with zero wasted words. It is appropriately sized for the tool's simplicity and front-loads the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though the tool is simple with one well-described parameter and no output schema, the absence of annotations and lack of guidance about effects or prerequisites leaves the description minimally complete but with clear gaps in behavioral context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully covers the single parameter item_id with a clear description, and the tool description adds no additional semantic detail. Since schema coverage is 100%, baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'mark' and resource 'item' with the target state 'unread', clearly conveying the tool's function. It distinguishes from siblings by being the opposite of mark_item_read and targeting items rather than feeds, though it doesn't explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like mark_item_read or mark_feed_read. The description only states the action, leaving the selection context to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.1.0
    • First observedget_feed_groups
    • First observedget_feed_items
    • First observedget_items
    • First observedget_unread
    • First observedlist_feeds
    • First observedmark_feed_read
    • First observedmark_item_read
    • First observedmark_item_unread

TDQS

A3.5/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a clear, distinct purpose: listing feeds, retrieving items by different criteria, and toggling read state. The three retrieval tools (get_unread, get_feed_items, get_items) are differentiated by their filters, and the mark operations are unambiguous.

Naming Consistency4/5

Most tools follow a get_<resource> or mark_<resource>_<state> pattern, but list_feeds uses 'list' instead of 'get', and get_unread omits the noun 'items'. These minor deviations are still readable and predictable.

Tool Count5/5

Eight tools is well-scoped for an RSS reader, covering the core read and mark operations without excessive granularity. Each tool earns its place in the set.

Completeness3/5

The read and mark workflows are well covered, but the server lacks feed management operations (add, update, delete feeds) and has no search capability. These gaps limit the toolset to a read-only consumer rather than a full FreshRSS manager.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers