Skip to content

Environment variables

VariableRequiredDefaultDescription
FRESHRSS_URLyesRoot URL of the FreshRSS instance, e.g. https://rss.example.com
FRESHRSS_USERyesFreshRSS user name
FRESHRSS_API_PASSWORDyesThe API password from Settings → Profile → API management
FRESHRSS_READ_ONLYnofalsetrue registers only the eight read tools
FRESHRSS_INSECURE_TLSnofalsetrue accepts a self-signed certificate, scoped to this connection

There is no configuration file and no command-line flag; these are the whole surface. The reasoning behind each is in Configuration.

Validation at startup

ConditionResult
A required variable is missingWarning; the server starts and lists tools
FRESHRSS_URL does not parseExit 1 (the value is logged with credentials redacted)
FRESHRSS_URL scheme is not http/httpsExit 1
FRESHRSS_URL contains user:password@Exit 1
FRESHRSS_URL is plain http to a non-loopback hostWarning about the unencrypted API password
FRESHRSS_INSECURE_TLS=trueWarning that certificate validation is relaxed

A missing credential is deliberately not fatal: the server must be able to complete the MCP handshake and answer tools/list without one, so registries and sandbox inspectors can introspect it. Every tool call then fails with the setup instructions. A malformed URL is fatal — that one could send the API password to the wrong host.

All diagnostics go to stderr, which is where MCP stdio servers must log — stdout carries the protocol.

Notes

  • Only the exact string true enables FRESHRSS_READ_ONLY and FRESHRSS_INSECURE_TLS; anything else, including 1 and yes, leaves them off.
  • Trailing slashes on FRESHRSS_URL are stripped.
  • The API path /api/greader.php is appended automatically — do not include it.
  • FRESHRSS_API_PASSWORD is deleted from process.env once the configuration has been read, on every path including the ones that then exit. It would otherwise stay readable by child processes and in /proc/<pid>/environ.
  • Requests use a 30-second timeout (120 seconds for subscribe_feed and import_opml, which make FreshRSS fetch from the internet first) and refuse to follow redirects.

Limits

Not configurable, but they bound every response:

LimitValue
Articles per listing100 (default 20)
Ids per get_articles20
Articles per mark_articles100
Article text per article20 000 characters (default 2000)
Excerpt length300 characters
Article text per response60 000 characters
Serialised tool result400 000 characters
OPML export200 000 characters
OPML import900 000 characters
Confirmation token lifetime5 minutes, single use

The OPML import limit sits below the 1 048 576 bytes FreshRSS reads from php://input — beyond that it truncates silently, which would arrive as malformed XML.

Released under the MIT License.