Skip to main content
Glama
luutuankiet

FreshRSS MCP Server

by luutuankiet

FreshRSS MCP Server

A Model Context Protocol (MCP) server for FreshRSS, the self-hosted RSS feed aggregator. This server allows LLMs and other MCP clients to interact with your FreshRSS instance to manage feeds, read articles, and organize your RSS content.

Features

  • 🔐 Authentication: Secure connection to your FreshRSS instance

  • 📁 Folder Management: List and organize feeds in folders

  • 📰 Article Reading: Fetch articles with advanced filtering options

  • Article Management: Mark articles as read/unread, star/unstar

  • 🏷️ Label System: Add labels to articles for organization

  • 📡 Feed Management: Subscribe/unsubscribe from RSS feeds

  • 📊 Unread Counts: Get unread statistics by feed and folder

Related MCP server: FreshRSS MCP Server

Installation

Using pip

pip install freshrss-mcp

From source

git clone https://github.com/yourusername/freshrss-mcp.git
cd freshrss-mcp
python3 -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate
pip install -e .

Configuration

Environment Variables

Create a .env file or set these environment variables:

FRESHRSS_URL=https://your-freshrss-instance.com
FRESHRSS_EMAIL=your-email@example.com
FRESHRSS_API_PASSWORD=your-api-password

Important: The FRESHRSS_API_PASSWORD is NOT your regular FreshRSS password. You need to:

  1. Enable API access in FreshRSS Settings → Authentication

  2. Set an API password in your Profile settings

Running the Server

Transport Modes

The FreshRSS MCP server supports multiple transport protocols:

1. Stdio Mode (Default - for Claude Desktop)

# Activate virtual environment
source venv/bin/activate

# Run with stdio transport (silent, for MCP clients)
freshrss-mcp

# Or explicitly
freshrss-mcp --stdio

2. HTTP Mode (for web integration)

# Activate virtual environment
source venv/bin/activate

# Run streamable HTTP server on port 8000
freshrss-mcp --http

Output:

INFO:freshrss_mcp.server:🚀 FreshRSS MCP Server starting on http://localhost:8000
INFO:freshrss_mcp.server:📋 13 MCP tools loaded for FreshRSS management
INFO:     Uvicorn running on http://localhost:8000 (Press CTRL+C to quit)

Available endpoints:

  • 🌐 HTTP: http://localhost:8000

  • 🔌 WebSocket: ws://localhost:8000/ws

  • ❤️ Health Check: http://localhost:8000/health

3. Server-Sent Events Mode

freshrss-mcp --sse

4. Help

freshrss-mcp --help

Claude Desktop Configuration

Add the FreshRSS MCP server to your Claude Desktop configuration:

{
  "mcpServers": {
    "freshrss": {
      "command": "freshrss-mcp",
      "env": {
        "FRESHRSS_URL": "https://your-freshrss-instance.com",
        "FRESHRSS_EMAIL": "your-email@example.com",
        "FRESHRSS_API_PASSWORD": "your-api-password"
      }
    }
  }
}

For HTTP Mode

{
  "mcpServers": {
    "freshrss": {
      "command": "freshrss-mcp",
      "args": ["--http"],
      "env": {
        "FRESHRSS_URL": "https://your-freshrss-instance.com",
        "FRESHRSS_EMAIL": "your-email@example.com",
        "FRESHRSS_API_PASSWORD": "your-api-password"
      }
    }
  }
}

Available Tools

Authentication

freshrss_authenticate

Authenticate with your FreshRSS instance. Can use environment variables or explicit parameters.

# Using environment variables
await freshrss_authenticate()

# Using explicit parameters
await freshrss_authenticate({
    "base_url": "https://freshrss.example.com",
    "email": "user@example.com",
    "api_password": "your-api-password"
})

Folder Management

freshrss_list_folders

List all folders/categories in your FreshRSS instance.

result = await freshrss_list_folders()
# Returns: {"folders": [{"name": "Tech", "id": "user/-/label/Tech", "type": "folder"}], "count": 1}

freshrss_list_subscriptions

List all subscribed feeds with their folder assignments.

result = await freshrss_list_subscriptions()
# Returns detailed subscription information including folders

Article Reading

freshrss_get_articles

Fetch articles with various filtering options.

# Get unread articles from all feeds
await freshrss_get_articles({"show_read": false, "count": 50})

# Get articles from specific folder
await freshrss_get_articles({"folder": "Tech", "count": 20})

# Get starred articles
await freshrss_get_articles({"starred_only": true})

# Get articles from specific feed
await freshrss_get_articles({"feed_url": "https://example.com/feed.xml"})

# Pagination
await freshrss_get_articles({"count": 50, "continuation": "continuation_token"})

freshrss_get_unread_count

Get unread article counts organized by feed and folder.

result = await freshrss_get_unread_count()
# Returns total unread count plus breakdowns by feed and folder

Article Management

freshrss_mark_read

Mark one or more articles as read.

await freshrss_mark_read({
    "article_ids": ["tag:google.com,2005:reader/item/..."]
})

freshrss_mark_unread

Mark one or more articles as unread.

await freshrss_mark_unread({
    "article_ids": ["tag:google.com,2005:reader/item/..."]
})

freshrss_star_article

Star one or more articles.

await freshrss_star_article({
    "article_ids": ["tag:google.com,2005:reader/item/..."]
})

freshrss_unstar_article

Unstar one or more articles.

await freshrss_unstar_article({
    "article_ids": ["tag:google.com,2005:reader/item/..."]
})

freshrss_add_label

Add a label to one or more articles.

await freshrss_add_label({
    "article_ids": ["tag:google.com,2005:reader/item/..."],
    "label": "Important"
})

Feed Management

freshrss_subscribe

Subscribe to a new RSS feed.

# Basic subscription
await freshrss_subscribe({
    "feed_url": "https://example.com/feed.xml"
})

# With custom title and folder
await freshrss_subscribe({
    "feed_url": "https://example.com/feed.xml",
    "title": "Example Blog",
    "folder": "Tech"
})

freshrss_unsubscribe

Unsubscribe from a feed.

await freshrss_unsubscribe({
    "feed_url": "https://example.com/feed.xml"
})

Example Usage

Here's a complete example of using the FreshRSS MCP server:

# 1. Authenticate
await freshrss_authenticate()

# 2. List folders
folders = await freshrss_list_folders()
print(f"You have {folders['count']} folders")

# 3. Get unread counts
counts = await freshrss_get_unread_count()
print(f"Total unread: {counts['total_unread']}")

# 4. Fetch unread articles from Tech folder
articles = await freshrss_get_articles({
    "folder": "Tech",
    "show_read": false,
    "count": 10
})

# 5. Mark first article as read
if articles['articles']:
    await freshrss_mark_read({
        "article_ids": [articles['articles'][0]['id']]
    })

# 6. Star an interesting article
await freshrss_star_article({
    "article_ids": [articles['articles'][1]['id']]
})

Development

Quick Start in Virtual Environment

# Clone and setup
git clone https://github.com/yourusername/freshrss-mcp.git
cd freshrss-mcp

# Create and activate virtual environment
python3 -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Install in development mode
pip install -e .

# Configure environment
cp .env.example .env
# Edit .env with your FreshRSS credentials

# Test the installation
python test_direct.py

# Run HTTP server
freshrss-mcp --http

Running Tests

pytest tests/

Code Style

This project uses Black for code formatting and Ruff for linting:

black src/
ruff check src/

Development Commands

# Test all transport modes
freshrss-mcp --help
freshrss-mcp --stdio    # For MCP clients
freshrss-mcp --http     # HTTP server on port 8000
freshrss-mcp --sse      # Server-Sent Events

# Test API client directly
python test_direct.py

# Install development dependencies
pip install -e ".[dev]"

API Implementation

This MCP server implements the Google Reader API as supported by FreshRSS. The implementation includes:

  • Authentication via ClientLogin

  • Stream contents for article fetching

  • Edit tag operations for marking read/starred

  • Subscription management

  • Tag/folder listing

Troubleshooting

Authentication Issues

  1. "No auth token in response": Make sure you're using the API password, not your regular password

  2. HTTP 404 errors: Check that your FreshRSS URL is correct and includes the protocol (https://)

  3. API not enabled: Ensure API access is enabled in FreshRSS Settings → Authentication

Performance Tips

  • Use pagination with continuation tokens for large article lists

  • Filter by folder or feed to reduce response size

  • Set appropriate count values (max ~1000 per request)

Contributing

Contributions are welcome! Please:

  1. Fork the repository

  2. Create a feature branch

  3. Add tests for new functionality

  4. Submit a pull request

License

MIT License - see LICENSE file for details

Acknowledgments

Available Tools

18 tools
freshrss_add_labelC

Add label to articles.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior2/5

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

No annotations are provided, so the description has the full burden of explaining side effects. It only states the action and does not disclose whether adding the same label twice is idempotent, whether a missing label is created, or what side effects occur. For a mutating tool this is a meaningful gap.

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

Conciseness3/5

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

The description is a single, front-loaded sentence with no filler, so it is concise. However, it is so terse that it forces the other dimensions to carry missing behavioral, usage, and parameter context, making it not fully appropriately sized for a tool with no annotations.

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?

For a mutating tool with no annotations and no behavioral detail, the description is incomplete. An agent can infer the basic action but not the label lifecycle, error behavior, idempotency, or when this tool is the right choice relative to the many sibling article-management tools.

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

Parameters2/5

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

Schema description coverage is 0% per the context signal and the tool description adds no parameter-level guidance. Although the nested schema has brief property descriptions for 'label' and 'article_ids', the main description does not help an agent understand formats, required relationships, or constraints beyond the bare schema names.

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 names the operation ('Add') and the target ('label' on 'articles'), so an agent can tell that this tool associates a label with articles. It is clear and no sibling tool does exactly this, though it does not explicitly compare itself to siblings like freshrss_star_article or freshrss_mark_read.

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?

There is no guidance about when to use this tool, when not to use it, or which alternative to prefer. It also does not mention prerequisites such as whether the label must already exist or whether authentication is required, so usage context must be inferred entirely from the name and schema.

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

freshrss_authenticateA

Authenticate with FreshRSS instance and save credentials to environment for subsequent calls.

Uses provided parameters or falls back to environment variables:

  • FRESHRSS_URL

  • FRESHRSS_EMAIL

  • FRESHRSS_API_PASSWORD

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/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 explicitly reveals the state-changing behavior: saving credentials to the environment. It also lists the exact environment variables used as fallback. It does not discuss failure modes or credential validation, but the primary side effect is clearly disclosed.

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 two tight sentences plus a bulleted list. The main purpose and side effect are front-loaded, and every sentence adds value without repetition or padding.

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?

The tool is simple, has an output schema, and the description covers input strategy, environment fallback, and the prerequisite role. It stops short of an explicit 'call this before all other FreshRSS tools' instruction, but the meaning is strongly implied by 'for subsequent calls', so the context is sufficient.

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?

Schema description coverage is 0%, so the description must compensate. It adds meaning by naming the environment variables (FRESHRSS_URL, FRESHRSS_EMAIL, FRESHRSS_API_PASSWORD) and stating that provided parameters take precedence over those variables. This is a useful behavioral detail beyond the schema's nullable parameter declarations, even though it could map each parameter to its env var more explicitly.

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 uses a specific verb ('Authenticate') with a specific resource ('FreshRSS instance') and a clear side effect ('save credentials to environment for subsequent calls'). This distinguishes it from the sibling tools, which are all FreshRSS operations that would follow authentication.

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 phrase 'for subsequent calls' clearly frames this as a prerequisite step before using other FreshRSS tools. It does not name alternatives or when-not conditions, but no sibling auth tool exists to confuse it with, so the context is sufficiently clear.

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

freshrss_get_article_detailA

Get full content for specific articles by ID.

Use after scanning headlines to deep-dive into interesting articles. Max 10 articles per call to control token usage.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does disclose a meaningful constraint: 'Max 10 articles per call to control token usage.' However, it does not mention auth prerequisites, behavior for invalid/unknown IDs, or any rate-limit implications, leaving some behavioral uncertainty.

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?

Three short sentences, each earning its place: purpose, usage timing, and an important limit. The key information is front-loaded, and there is no redundant or vague wording.

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?

The tool is simple, has an output schema, and the description covers what the tool does, when to use it, and the key parameter constraint. The only minor gap is that it does not explicitly state that article IDs come from headline-scanning tools, though the usage sentence strongly implies this workflow.

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?

Schema description coverage is 0%, so the description must compensate. It does by naming the key parameter concept ('specific articles by ID') and by stating the max of 10 articles per call, which matches the article_ids parameter. It could additionally explain where IDs come from, but for a single-parameter tool this is sufficient.

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 states a specific action and resource: 'Get full content for specific articles by ID.' This clearly distinguishes the tool from siblings like freshrss_get_headlines, which only provide headline-level content, making it easy for an agent to select the right tool.

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 explicitly says 'Use after scanning headlines to deep-dive into interesting articles,' providing clear workflow context. It does not explicitly name alternatives or exclusions, but the intended use case is unambiguous given the sibling tools.

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

freshrss_get_articlesC

Fetch articles with various filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says "fetch", which implies a read operation, but it does not describe pagination behavior, continuation token semantics, default read-state filtering, or any side effects or limitations. There is no contradiction, but there is also very little disclosure.

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 sentence with no filler. It communicates the core action efficiently. It is terse to the point of under-specification, but as conciseness/structure it is clean and well-organized.

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 appears to be a complex filterable list endpoint with 8 nested parameters, pagination support, and a read-state toggle, yet the description gives none of that context. It does not mention continuation, ordering, folder/feed filtering, starred-only mode, or the trim_content behavior. Even though an output schema exists, the description is not sufficient for an agent to safely invoke this tool among many similar sibling tools.

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

Parameters2/5

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

With the top-level schema showing 0% description coverage and the description adding no parameter-level meaning beyond "various filters", the description does not compensate for the missing top-level parameter semantics. While the nested schema contains field descriptions, the tool description itself contributes almost nothing to understanding how to structure the required "params" object or what filters are available.

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 says exactly what it does: "Fetch articles" with a general mechanism, "various filters". This is a clear verb+resource statement. However, it does not distinguish this from siblings like freshrss_get_headlines or freshrss_get_article_detail, so it stops short of full differentiation.

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?

There is no guidance on when to use this tool versus freshrss_get_headlines, freshrss_get_article_detail, or freshrss_get_diverse_digest. The description names no alternatives, no exclusions, and no conditions that would help an agent choose between the many fetching tools.

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

freshrss_get_digest_compactA

Get an ultra-compact category-balanced digest as plain text.

Returns ~10 tokens per article vs ~100 for JSON format. Each line: [short_id] Title (Feed) Grouped by category with counts.

Designed for agent curation workflows where token efficiency matters. After selecting articles, use mark_stream_read + mark_unread to keep only your picks.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses the plain text output, token count (~10 vs ~100), line format, and grouping. It does not mention side effects (since it's a get, that's implied) or any other behavioral caveats, but it adds useful context about the workflow. This is adequate but not comprehensive.

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 five sentences, starting with the primary purpose and then adding concise details. It front-loads the core functionality and keeps each sentence informative, with minimal waste. It could be slightly tighter, but it's well-structured and efficient.

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?

The description covers the output format, a concrete use case, and the suggested follow-up actions, making it sufficient for a simple retrieval tool. It doesn't mention default behaviors (e.g., show_read defaults to false) but those are in the schema. For the tool's complexity, it's complete enough.

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 provides full descriptions for all four parameters (show_read, categories, per_category, include_uncategorized), so the description doesn't need to repeat them. The description's mention of 'category-balanced' indirectly relates to categories and per_category, but it adds no explicit parameter-level meaning beyond the schema. Baseline of 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 clearly states 'Get an ultra-compact category-balanced digest as plain text', giving a specific verb and resource. It further specifies the output format and token efficiency, which helps distinguish it from general article retrieval. However, it doesn't explicitly name a sibling tool to differentiate from, so it falls short of a 5.

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?

It says 'Designed for agent curation workflows where token efficiency matters', which provides a clear context for when to use. It also suggests a follow-up workflow with mark_stream_read and mark_unread. But it does not explicitly state when NOT to use this tool or name alternative tools for different scenarios, leaving some inference required.

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

freshrss_get_diverse_digestA

Get a category-balanced digest of recent unread articles.

Fetches N articles from EACH category to ensure topic diversity. Returns headlines only (token-efficient). Use get_article_detail to deep-dive into selected articles.

This is the primary tool for daily curation — ensures you see security, business, world news, etc., not just AI/ML.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the safety/behavior burden and does a solid job: it discloses the category-balancing strategy, headline-only output, and token-efficiency rationale. It stops short of confirming there are no side effects on read state or describing ordering/pagination, though the name and 'get' language imply a read-only digest.

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?

Four short sentences, front-loaded with the core purpose and then filling in the sampling behavior, output format, and sibling navigation. There is no filler or repetition of the tool name.

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?

The definition is nearly complete: it explains the digest's purpose, output shape, and follow-up path, and the presence of an output schema covers return structure. The main gaps are implicit auth dependency and lack of explicit no-side-effect confirmation, which matter more because annotations are absent.

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 description clarifies the meaning of per-category sampling ('N articles from EACH category') and the overall input expectation, but it does not explain show_read, categories, or include_uncategorized; those are left to the schema. Given the reported 0% schema description coverage, the description only partially compensates for parameter semantics.

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 opens with a precise verb and resource: 'Get a category-balanced digest of recent unread articles,' and expands with a concrete algorithm ('N articles from EACH category'). It also distinguishes itself from siblings by noting it returns headlines and pointing to get_article_detail for deep dives.

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

Usage Guidelines5/5

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

It explicitly labels the tool as 'the primary tool for daily curation' and gives a concrete condition for switching to get_article_detail ('to deep-dive into selected articles'). This is enough for an agent to decide when this digest is the right sibling.

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

freshrss_get_headlinesA

Get article headlines only — ultra token-efficient.

Returns only: id, title, feed_title, folder, published, url. ~10x fewer tokens than get_articles. Use this for scanning/triage, then call get_article_detail for articles you want to read in full.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It clearly discloses that the tool returns only a specific subset of fields, is ~10x more token-efficient than get_articles, and is meant for scanning. It does not mention authentication, rate limits, or side effects, but the read-only nature is implied by 'Get' and the return-only statement, so it is adequately transparent for the tool's simplicity.

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?

Three crisp sentences with no filler: the purpose is front-loaded, the efficiency claim is first, the exact return fields are listed, and the usage flow is given. Every sentence earns its place.

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?

Given the 7 parameters (all optional with defaults) and an output schema declared, the description is quite complete: it covers the return shape, the purpose, and the usage context. It omits authentication prerequisites, but the presence of freshrss_authenticate among siblings makes that implicit. The lack of parameter details and pagination behavior is a minor gap, but the overall context is sufficient for an agent to call the tool correctly in most scenarios.

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

Parameters2/5

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

Despite schema properties having descriptions, the given signal reports 0% schema description coverage, so the tool description must compensate, but it does not detail any parameters such as count, order, filters, or pagination. It only implies filtering by folder/feed and reading state through the field list, leaving an agent to rely on the schema alone. With no explicit parameter guidance in the description, this dimension is weak.

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 opens with a specific verb and object — 'Get article headlines only' — and immediately sets it apart from the sibling get_articles by emphasizing token efficiency and a restricted field set. It also names get_article_detail for full reads, making its scope unmistakable.

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

Usage Guidelines5/5

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

Explicitly states the intended workflow: 'Use this for scanning/triage, then call get_article_detail for articles you want to read in full.' This tells the agent when to choose this tool and when to switch to an alternative, leaving no ambiguity.

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

freshrss_get_tokenA

Get edit token for write operations. Usually called automatically when needed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It adds the behavioral note that the tool is 'usually called automatically when needed,' which tells the agent this is primarily an internal helper. It does not mention prerequisites such as prior authentication or any side effects, but for a simple zero-parameter getter this is a minor gap.

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?

Two short sentences with no wasted words. The core operation is front-loaded, and the second sentence provides useful usage context without 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 zero-parameter helper tool with an output schema, this description is mostly complete. It could be more explicit about when manual invocation is warranted, but the automatic-call note sufficiently covers typical usage.

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 has no parameters, so there is nothing for the description to add. The zero-parameter baseline of 4 applies.

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 states a specific verb ('Get') and resource ('edit token'), and identifies the purpose as supporting write operations. It does not explicitly differentiate from freshrss_authenticate, but 'edit token' is reasonably distinct from authentication.

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 'Usually called automatically when needed' implies that direct invocation is normally unnecessary, which is useful context. However, it does not specify when a manual call would be appropriate or explicitly contrast this tool with siblings like freshrss_authenticate.

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

freshrss_get_unread_countA

Get unread counts by feed and folder.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

There are no annotations, so the description must carry the burden of behavioral disclosure. It only states the operation and scope; it does not disclose authentication requirements, whether the operation is guaranteed read-only, or the exact semantics of the returned counts beyond what the output schema may provide.

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, front-loaded sentence with no filler. For a zero-parameter read tool, this length is appropriate.

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 simple and has an output schema, so the description need not be lengthy. However, it leaves auth expectations and the precise meaning of 'by feed and folder' implicit, which a fully self-contained description would clarify.

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 there is nothing for the description to add beyond the schema. The baseline of 4 for no-parameter tools applies.

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 a specific verb ('Get'), a specific resource ('unread counts'), and the grouping dimension ('by feed and folder'). This distinguishes it from the sibling tools that retrieve articles, manage read state, or list folders/subscriptions.

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 gives no guidance about when to use this tool versus alternatives such as get_articles, get_headlines, or list_subscriptions. There is no mention of preferred use cases or exclusions.

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

freshrss_list_foldersB

List all folders/categories/tags in FreshRSS.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

Annotations are none provided, so the description carries the full burden of behavioral disclosure. The description 'List all...' implies a read-only operation, but it does not explicitly state that it does not modify data or require specific permissions. It also does not mention whether it returns empty lists or any error behavior. This is a minimal statement of function without behavioral context.

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, free of fluff, and directly states the function. It is appropriately front-loaded, with the action and resource stated immediately. There is no wasted wording, making it an exemplary concise description.

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?

Given the tool's simplicity (no parameters) and the presence of an output schema (likely defining the return structure), the description is arguably sufficient for a basic list operation. However, it lacks any mention of authentication requirements or behavioral notes like read-only status, which would be expected given the absence of annotations. The wording 'folders/categories/tags' is slightly ambiguous (are they the same?), but overall the description covers the core purpose. It is minimally adequate but not fully 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 has zero parameters, so the baseline for parameter semantics is 4. The description's 'List all' implicitly confirms that no filtering or arguments are needed, which aligns with the schema. Since there are no parameters to document, the description does not need to add extra parameter details, and the baseline score stands.

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 states the action (List) and the resource (all folders/categories/tags in FreshRSS). It distinguishes from siblings like freshrss_list_subscriptions by mentioning folders/categories/tags instead of subscriptions, but it does not explicitly name the alternative. The purpose is unambiguous and adequately specific.

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. The description only states what it does, with no mention of prerequisites (e.g., authentication), exclusions, or context where calling this tool would be inappropriate. With siblings like freshrss_get_unread_count and freshrss_get_articles, the lack of usage context is a gap.

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

freshrss_list_subscriptionsA

List all subscribed feeds with their folders.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavior. 'List' communicates a read-only, non-mutating operation, and 'all subscribed feeds with their folders' defines the scope. It does not mention authentication or pagination, but the verb and output schema mitigate that gap.

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, front-loaded sentence with no filler. Every word contributes to understanding the tool's purpose and scope.

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

Completeness5/5

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

This is a simple zero-parameter listing tool with an output schema present. The description states the returned entity and scope clearly. Any missing detail, such as authentication, is minor and predictable given the sibling tool set.

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 has zero parameters, so the baseline is 4. The description still adds meaning by stating exactly what data the tool returns. No parameter details are needed.

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 uses a specific verb ('List') with a precise resource ('all subscribed feeds') and adds 'with their folders,' which differentiates it from sibling tools like freshrss_list_folders. An agent can immediately identify this as a read-only feed-subscription listing operation.

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 description clearly implies when to use the tool—when you need all subscribed feeds and their folders—but it does not explicitly contrast it with alternatives such as freshrss_list_folders or explain when not to use it. The usage context is understandable but left to inference.

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

freshrss_mark_readC

Mark articles as read.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/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 'Mark articles as read' without mentioning side effects, reversibility, auth requirements, or any state changes. This is minimal disclosure for a mutation tool.

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 concise sentence with no fluff, making it highly efficient. However, its extreme brevity borders on under-specification, lacking essential context that would make it front-loaded in a useful way. It scores well on conciseness but not on structure relative to the tool's complexity.

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 mutation nature, no annotations, and a single required parameter, the description is incomplete. It does not explain the tool's behavior, the article_ids parameter, or how it differs from freshrss_mark_stream_read. The presence of an output schema (not provided) slightly mitigates, but the description alone is insufficient for correct usage.

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

Parameters2/5

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

Schema description coverage is 0%, so the description should compensate by explaining the article_ids parameter. It does not mention the parameter at all, nor its format, requirement, or purpose beyond the implicit action. The schema itself has a minimal description for article_ids, but the tool description adds no value.

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 states the action 'Mark articles as read' with a specific verb and resource. It differentiates from siblings like freshrss_mark_unread and freshrss_mark_stream_read by implying per-article marking, though it could be more explicit about the scope (e.g., 'mark the provided articles as read').

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 like freshrss_mark_unread or freshrss_mark_stream_read. It does not mention any context, exclusions, or selection criteria.

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

freshrss_mark_stream_readA

Mark all articles in a stream/folder as read in one call.

MUCH more efficient than marking individual articles. Use 'all' to mark everything, or a folder name like 'tech', 'ML', 'security'.

Common pattern: mark_stream_read(all) then mark_unread([5 keeper IDs]).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the behavioral burden. It discloses that the tool mutates read state for an entire stream/folder in one operation and even shows a recovery pattern: mark all read, then mark keepers unread. This is meaningful behavioral context beyond the tool name and schema.

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 compact and well-structured: action, efficiency rationale, parameter guidance, then a workflow pattern. Every sentence earns its place, and the main bulk-scope fact is front-loaded.

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 bulk mutation tool with no annotations, the description covers the action, the target selection, and a recommended follow-up workflow. An output schema exists, so return-value details are not required. The only small gap is that older_than_hours is left entirely to the schema rather than reinforced in the prose.

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 description adds practical examples for the stream parameter ('all', 'tech', 'ML', 'security') and reinforces the default behavior. However, it does not mention older_than_hours at all; the nested schema supplies that parameter's semantics. This reaches the baseline but does not go beyond what the schema already provides.

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 uses a specific verb and resource: 'Mark all articles in a stream/folder as read in one call.' The bulk scope is explicit, and the efficiency note differentiates it from marking individual articles, allowing an agent to distinguish it from sibling freshrss_mark_read.

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 clearly signals when to prefer this tool by saying it is 'MUCH more efficient than marking individual articles.' It also gives concrete invocation guidance with 'all' or folder names, and a common pattern with mark_unread. It does not explicitly name freshrss_mark_read as the single-article alternative, but the context is clear enough.

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

freshrss_mark_unreadC

Mark articles as unread.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It indicates a mutation (marking unread) but does not mention authentication requirements, idempotency, behavior with already-unread articles, or what the response looks like. This is a minimal disclosure for a state-changing tool.

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 short sentence with no wasted words. It is front-loaded and easy to parse. However, it is so terse that it omits useful context that another sentence could have supplied, so it earns a 4 rather than a 5.

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?

For a tool with no annotations, an output schema, and minimal description, important context is missing: when to use it vs siblings, prerequisites like authentication, behavior on invalid IDs, and return value semantics. The description is not enough for an agent to invoke the tool confidently in all expected situations.

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

Parameters2/5

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

Schema description coverage is reported as 0%, so the description must compensate for undocumented parameters. It does not mention article_ids, its required status, or its format. The only hint is the field name and the generic schema note 'List of article IDs', but the main description adds no parameter-level meaning.

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 'Mark articles as unread.' is a clear, specific verb+resource statement. It states exactly what the tool does, and the action is unambiguous. However, it does not explicitly differentiate from siblings like freshrss_mark_read or freshrss_mark_stream_read, relying on the tool name for contrast.

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?

There is no guidance about when to use this tool versus alternatives such as freshrss_mark_read, freshrss_mark_stream_read, or freshrss_star_article. The description simply states the action, leaving the agent to infer selection criteria from the tool name and sibling list.

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

freshrss_star_articleC

Star articles.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral transparency. 'Star articles' conveys the intended state change but does not disclose whether starring is idempotent, whether authentication is required, how already-starred articles are handled, or what side effects occur.

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

Conciseness3/5

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

The description is concise and front-loaded with the action, containing no wasted words. However, it is so terse that it skips all structural context such as prerequisites or usage examples, making it minimal rather than appropriately helpful.

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?

Although the operation is simple and the output schema exists, the complete lack of annotations and usage guidance makes this description insufficient on its own. An agent still cannot tell whether prior authentication is required, whether the operation is reversible, or how the sibling unstar tool differs in practice.

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

Parameters2/5

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

With a reported schema description coverage of 0%, the description was expected to compensate for missing parameter documentation, but it does not mention article_ids, their format, or any constraints. 'Star articles' only loosely implies that the provided IDs identify the articles to be starred; it adds minimal semantic value beyond the parameter name.

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 states a specific verb ('Star') and a clear resource ('articles'), making the tool's basic function immediately understandable. It does not explicitly differentiate from siblings like freshrss_mark_read or freshrss_add_label, but the action is unambiguous enough to avoid confusion with freshrss_unstar_article.

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 freshrss_unstar_article, freshrss_mark_read, or freshrss_add_label. There is no mention of prerequisites, exclusions, or routing conditions, leaving the agent to infer usage from the name alone.

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

freshrss_subscribeB

Subscribe to a new feed.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Subscribe to a new feed' only implies a state change; it does not mention auth requirements, duplicate handling, folder creation, failure behavior, or other side effects.

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 sentence with no filler, making it easy to parse. It is concise rather than incomplete to the point of being tautological, unlike a bare 'Process' description.

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 one-action tool with a well-defined schema and an output schema, the description is minimally viable. However, without annotations it still leaves gaps around authentication, duplicate subscriptions, and what happens on failure.

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

Parameters2/5

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

Schema description coverage is 0% and the description adds no parameter-level detail beyond the word 'feed.' The schema itself documents feed_url, title, and folder clearly, but the description does not compensate for the low coverage or clarify how these parameters interact.

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 ('Subscribe') and a resource ('a new feed'), making the intended action clear and distinguishable from sibling operations like freshrss_unsubscribe and freshrss_list_subscriptions. It does not elaborate on the feed format or subscription details, but the core purpose is unambiguous.

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 intended use case is implied by the description: call when the user wants to add a new feed subscription. However, there is no explicit guidance about when not to use it, prerequisites such as authentication, or alternatives among the listed sibling tools.

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

freshrss_unstar_articleC

Unstar articles.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Unstar articles' names the action but does not disclose side effects, idempotence, required authentication, permissions, or what happens to already-unstarred articles. It is minimally transparent but not informative about behavior beyond the operation itself.

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

Conciseness3/5

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

The description is extremely short and front-loaded, which is beneficial, but it is also under-specified for a tool that operates on a parameterized list of articles. It is not overly verbose, but the terseness leaves little useful guidance.

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 existence of freshrss_star_article and other article-manipulation siblings, and the absence of annotations, the description should at least note the inverse relationship and any operational context. An output schema exists, but the description still omits usage context and behavioral clarification, making it only partially complete.

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 description adds no parameter-level detail, but the single required parameter is named article_ids and the schema property already describes it as 'List of article IDs.' The tool name also makes the role of the parameter obvious, so the lack of description-level parameter semantics is a minor gap rather than a severe one.

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 states a specific verb and resource: 'Unstar articles.' It inherently contrasts with the sibling freshrss_star_article, and the operation is obvious from the name and description. It lacks additional precision about what counts as an article, but it is not vague or tautological.

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?

There is no guidance on when to use this tool versus alternatives such as freshrss_star_article or freshrss_mark_read. The sibling list implies a contrast, but the description itself provides no contextual or conditional usage direction.

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

freshrss_unsubscribeB

Unsubscribe from a feed.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are present, so the description carries the full burden of behavioral disclosure. It conveys the core action but does not mention consequences, irreversibility, authentication requirements, or what happens if the feed is not currently subscribed. For a mutating/destructive tool, this is a meaningful transparency gap.

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 phrase with no filler or redundancy. It is front-loaded and every word contributes to the meaning.

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 one-parameter tool with an output schema, the information is mostly sufficient. However, it does not mention the need to be authenticated or the effect of unsubscribing beyond the basic action, leaving some operational context implicit.

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 required parameter feed_url with a clear description. The tool description adds no additional parameter meaning, but the schema covers the necessary semantics, so a baseline score of 3 is appropriate.

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 states a specific action ('Unsubscribe') and a specific resource ('from a feed'), which clearly distinguishes it from the sibling subscribe tool. Even without additional detail, an agent can tell exactly what this tool does and how it contrasts with freshrss_subscribe.

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 gives no explicit guidance about when to use this tool versus alternatives, such as requiring an existing subscription or needing authentication first. The intended use is broadly implied by the name and the sibling list, but no context or exclusions are provided.

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. 18 tool updatesv0.2.5
    • First observedfreshrss_add_label
    • First observedfreshrss_authenticate
    • First observedfreshrss_get_article_detail
    • First observedfreshrss_get_articles
    • First observedfreshrss_get_digest_compact
    • First observedfreshrss_get_diverse_digest
    • First observedfreshrss_get_headlines
    • First observedfreshrss_get_token
    • First observedfreshrss_get_unread_count
    • First observedfreshrss_list_folders
    • First observedfreshrss_list_subscriptions
    • First observedfreshrss_mark_read
    • First observedfreshrss_mark_stream_read
    • First observedfreshrss_mark_unread
    • First observedfreshrss_star_article
    • First observedfreshrss_subscribe
    • First observedfreshrss_unstar_article
    • First observedfreshrss_unsubscribe

TDQS

A3.5/5.0

Scored across 18 tools

Disambiguation4/5

Most tools have clearly distinct purposes, especially the write operations (mark_read vs mark_stream_read, star vs unstar). However, the five article retrieval tools (get_articles, get_headlines, get_article_detail, get_diverse_digest, get_digest_compact) overlap considerably; their descriptions distinguish use cases well, but an agent could still confuse get_diverse_digest with get_digest_compact or get_articles with get_headlines.

Naming Consistency5/5

All tools follow a consistent freshrss_verb_noun pattern, e.g., list_folders, subscribe, mark_read, get_article_detail. Even compound nouns like stream_read and digest_compact are consistently formatted with underscores. The naming is predictable and uniform across the entire set.

Tool Count4/5

18 tools is slightly above the ideal range but justified for a full-featured RSS reader covering authentication, subscription management, article retrieval, read/unread/star/label operations, and summaries. A few tools like get_token are auxiliary and could be implicit, but the count is not excessive for the scope.

Completeness4/5

The surface covers core FreshRSS workflows well: authentication, subscribe/unsubscribe, listing folders/subscriptions, fetching articles with various token-efficiency levels, and marking read/unread/starred/labeled. Minor gaps include no folder creation/deletion/renaming and no subscription update (e.g., moving feeds between folders), but these are not critical for typical agent curation workflows.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers