FreshRSS
CLI or API | MCP | Agent
Version: 0.1.0
Documentation — Installation, deployment, usage across the API, CLI, and MCPinterfaces, the integrated A2A agent server, and guidance for provisioning thebacking platform are maintained in theofficial documentation.
Table of Contents
- Overview
- Key Features
- MCP
- Available MCP Tools
- Environment Variables
- Transport Configuration Examples
- Additional Deployment Options
- Usage
- Installation
- Documentation
Overview
FreshRSS MCP Server + A2A Agent
A connector for the self-hosted FreshRSS RSS reader,wrapping its Google Reader compatible API (GReader). It exposes twoaction-routed MCP tool domains:
freshrss_reader—stream_contents(feed items + continuation),item_contents,unread_count.freshrss_subscriptions—list,subscribe,unsubscribe,label,categories,mark_read,star.
This repository is actively maintained - Contributions are welcome!
Key Features
- Consolidated Action-Routed MCP Tools: Two togglable tool domains group everyGReader operation, minimizing token overhead and tool bloat in LLM contexts.
- Google Reader Compatible: Wraps the FreshRSS GReader API —
ClientLoginauth,transparent re-authentication on401, and automatic write-token handling. - Enterprise-Grade Security: OIDC token delegation (RFC 8693), Eunomia policyenforcement, and per-instance credential resolution.
- Integrated A2A Agent: Built-in Pydantic AI agent server alongside the MCP server.
- Native Telemetry & Tracing: Out-of-the-box OpenTelemetry exports and Langfuse tracing.
MCP
Install the slim
[mcp]extra. All MCP examples below installfreshrss-agent[mcp]— the MCP-server extra that pulls only the FastMCP /FastAPI tooling (agent-utilities[mcp]). It deliberately excludes the heavyagent runtime (the epistemic-graph engine,pydantic-ai,dspy,llama-index,tree-sitter), souvx/container installs are dramatically smaller and faster.Use the full[agent]extra only when you need the integrated Pydantic AI agent(see Installation).
Available MCP Tools
Auto-generated from the live MCP server — do not edit by hand.
| MCP Tool | Toggle Env Var | Description |
|---|---|---|
freshrss_reader |
READERTOOL |
Read FreshRSS streams via the Google Reader API. CONCEPT:FRSS-001 |
freshrss_subscriptions |
SUBSCRIPTIONSTOOL |
Curate FreshRSS feeds, categories and item tags. CONCEPT:FRSS-002 |
2 action-routed tools (default MCP_TOOL_MODE=condensed). Each is enabled unless its toggle is set false; set MCP_TOOL_MODE=verbose (or both) for the 1:1 per-operation surface. Auto-generated — do not edit.
Detailed tool schemas, parameter shapes, and validation constraints are preserved indocs/usage.md.
Environment Variables
Package environment variables
| Variable | Example | Description |
|---|---|---|
HOST |
0.0.0.0 |
|
PORT |
8000 |
|
TRANSPORT |
stdio |
options: stdio, streamable-http, sse |
ENABLE_OTEL |
True |
|
OTEL_EXPORTER_OTLP_ENDPOINT |
http://localhost:8080/api/public/otel |
|
OTEL_EXPORTER_OTLP_PUBLIC_KEY |
pk-... |
|
OTEL_EXPORTER_OTLP_SECRET_KEY |
sk-... |
|
OTEL_EXPORTER_OTLP_PROTOCOL |
http/protobuf |
|
EUNOMIA_TYPE |
none |
options: none, embedded, remote |
EUNOMIA_POLICY_FILE |
mcp_policies.json |
|
EUNOMIA_REMOTE_URL |
http://eunomia-server:8000 |
|
FRESHRSS_URL |
http://localhost:8080 |
|
FRESHRSS_USER |
admin |
|
FRESHRSS_API_PASSWORD |
your_api_password_here |
|
FRESHRSS_SSL_VERIFY |
True |
|
READERTOOL |
True |
|
SUBSCRIPTIONSTOOL |
True |
Inherited agent-utilities variables (apply to every connector)
| Variable | Example | Description |
|---|---|---|
MCP_TOOL_MODE |
condensed |
Tool surface: condensed |
MCP_ENABLED_TOOLS |
— | Comma-separated tool allow-list |
MCP_DISABLED_TOOLS |
— | Comma-separated tool deny-list |
MCP_ENABLED_TAGS |
— | Comma-separated tag allow-list |
MCP_DISABLED_TAGS |
— | Comma-separated tag deny-list |
MCP_CLIENT_AUTH |
— | Outbound MCP auth (oidc-client-credentials for fleet calls) |
OIDC_CLIENT_ID |
— | OIDC client id (service-account auth) |
OIDC_CLIENT_SECRET |
— | OIDC client secret (service-account auth) |
DEBUG |
False |
Verbose logging |
PYTHONUNBUFFERED |
1 |
Unbuffered stdout (recommended in containers) |
MCP_URL |
http://localhost:8000/mcp |
URL of the MCP server the agent connects to |
PROVIDER |
openai |
LLM provider for the agent |
MODEL_ID |
gpt-4o |
Model id for the agent |
ENABLE_WEB_UI |
True |
Serve the AG-UI web interface |
17 package + 14 inherited variable(s). Auto-generated from .env.example + the shared agent-utilities set — do not edit.
Every variable the server reads. A copy-paste template lives in .env.example.
Connection & Credentials
| Variable | Description | Default |
|---|---|---|
FRESHRSS_URL |
Base URL of the FreshRSS instance (e.g. http://freshrss.arpa) |
http://localhost:8080 |
FRESHRSS_USER |
FreshRSS username (GReader Email field) |
— |
FRESHRSS_API_PASSWORD |
FreshRSS API password (Settings → Authentication) | — |
FRESHRSS_SSL_VERIFY |
Whether to verify TLS certificates | True |
MCP server / transport
| Variable | Description | Default |
|---|---|---|
TRANSPORT |
stdio, streamable-http, or sse |
stdio |
HOST |
Bind host (HTTP transports) | 0.0.0.0 |
PORT |
Bind port (HTTP transports) | 8000 |
MCP_TOOL_MODE |
Tool surface: condensed, verbose, or both |
condensed |
Telemetry & governance
| Variable | Description | Default |
|---|---|---|
ENABLE_OTEL |
Enable OpenTelemetry / Langfuse export | True |
EUNOMIA_TYPE |
Authorization mode: none, embedded, remote |
none |
EUNOMIA_POLICY_FILE |
Embedded policy file | mcp_policies.json |
EUNOMIA_REMOTE_URL |
Remote Eunomia server URL | — |
Tool toggles — each action-routed tool domain can be disabled via its toggle env var(set to false): READERTOOL, SUBSCRIPTIONSTOOL (see theAvailable MCP Tools table above).
stdio Transport (local IDEs - Cursor, Claude Desktop, VS Code)
{
"mcpServers": {
"freshrss-mcp": {
"command": "uvx",
"args": ["--from", "freshrss-agent[mcp]", "freshrss-mcp"],
"env": {
"FRESHRSS_URL": "https://service.example.com",
"FRESHRSS_USER": "admin",
"FRESHRSS_API_PASSWORD": "your_api_password"
}
}
}
}
Streamable-HTTP Transport (networked / production)
{
"mcpServers": {
"freshrss-mcp": {
"command": "uvx",
"args": ["--from", "freshrss-agent[mcp]", "freshrss-mcp", "--transport", "streamable-http", "--port", "8000"],
"env": {
"TRANSPORT": "streamable-http",
"HOST": "0.0.0.0",
"PORT": "8000",
"FRESHRSS_URL": "https://service.example.com",
"FRESHRSS_USER": "admin",
"FRESHRSS_API_PASSWORD": "your_api_password"
}
}
}
}
Additional Deployment Options
freshrss-agent can also run as a local container (Docker / Podman / uv) or beconsumed from a remote deployment. TheDeployment guide has full,copy-paste mcp_config.json for all four transports — stdio, streamable-http,local container / uv, and remote URL:
- Local container / uv — launch the server from
mcp_config.jsonviauvx,docker run, orpodman run, or point at a local streamable-http container byurl. - Remote URL — connect to a server deployed behind Caddy at
http://freshrss-mcp.arpa/mcpusing the"url"key.
Usage
Once configured, an LLM (or a direct caller) invokes a tool domain with an actionand a JSON params_json payload. Examples:
// Fetch the 50 most recent unread items, newest first
{
"tool": "freshrss_reader",
"action": "stream_contents",
"params_json": "{\"count\": 50, \"order\": \"n\"}"
}
// Subscribe to a feed and file it under a category
{
"tool": "freshrss_subscriptions",
"action": "subscribe",
"params_json": "{\"feed_url\": \"http://example.com/rss\", \"category\": \"News\"}"
}
// Mark items as read
{
"tool": "freshrss_subscriptions",
"action": "mark_read",
"params_json": "{\"item_ids\": [\"tag:google.com,2005:reader/item/0001\"]}"
}
Invoking a tool with an unknown or omitted action returns the discovery payloadlisting every valid action for that domain.
Installation
Pick the extra that matches what you want to run:
| Extra | Installs | Use when |
|---|---|---|
freshrss-agent[mcp] |
Slim MCP server only (agent-utilities[mcp] — FastMCP/FastAPI) |
You only run the MCP server (smallest install / image) |
freshrss-agent[agent] |
Full agent runtime (agent-utilities[agent,logfire] — Pydantic AI + the epistemic-graph engine) |
You run the integrated agent |
freshrss-agent[all] |
Everything (mcp + agent + logfire) |
Development / both surfaces |
# MCP server only (recommended for tool hosting — slim deps)
uv pip install "freshrss-agent[mcp]"
# Full agent runtime (Pydantic AI + epistemic-graph engine)
uv pip install "freshrss-agent[agent]"
# Everything (development)
uv pip install "freshrss-agent[all]" # or: python -m pip install "freshrss-agent[all]"
After installation two console scripts are available:
freshrss-mcp # run the MCP server
freshrss-agent # run the A2A agent server
Container images (:mcp vs :agent)
One multi-stage docker/Dockerfile builds two right-sized images, selected by --target:
| Image tag | Build target | Contents | Entrypoint |
|---|---|---|---|
knucklessg1/freshrss-agent:mcp |
--target mcp |
freshrss-agent[mcp] — slim, no engine/pydantic-ai/dspy/llama-index/tree-sitter |
freshrss-mcp |
knucklessg1/freshrss-agent:latest |
--target agent (default) |
freshrss-agent[agent] — full agent runtime + epistemic-graph engine |
freshrss-agent |
docker build --target mcp -t knucklessg1/freshrss-agent:mcp docker/ # slim MCP server
docker build --target agent -t knucklessg1/freshrss-agent:latest docker/ # full agent
docker/mcp.compose.yml runs the slim :mcp server; docker/agent.compose.yml runs theagent (:latest) with a co-located :mcp sidecar.
Knowledge-graph database (epistemic-graph)
The full agent ([agent] / :latest) embeds the epistemic-graph engine (pulled intransitively via agent-utilities[agent]). For production — or to share one knowledge graphacross multiple agents — run epistemic-graph as its own database container and point theagent at it instead of embedding it. Deployment recipes (single-node + Raft HA), connectionconfig, and the full database architecture (with diagrams) are documented in theepistemic-graph deployment guide.The slim [mcp] server does not require the database.
Documentation
Full installation, deployment, usage, and platform-provisioning guides live in thedocs/ directory and are published via mkdocs + GitHub Pages at theofficial documentation site:
- Overview · Installation ·Usage · Deployment ·Platform · Concepts