Skip to main content
Glama

freshrss-mcp

CI npm version npm downloads node license container docs

一个用于 FreshRSS(自托管的 RSS 和 Atom 订阅聚合器)的 模型上下文协议 服务器。

它使用 FreshRSS 在 /api/greader.php 暴露的 Google Reader 兼容 API 进行通信,并将该 API 的古怪之处隐藏在助手可以实际使用的工具参数后面:数字化的订阅源 ID、类别和标签名称、ISO 日期和十进制文章 ID,而不是 user/-/state/com.google/… 流标识符和十六进制项目标签。

📖 完整文档:freshrss-mcp.ni-c.de

架构:MCP 客户端通过 stdio 与 freshrss-mcp 通信,后者使用 GoogleLogin 认证令牌通过 HTTPS 调用 FreshRSS 的 Google Reader 兼容 API

演示:通过 MCP Inspector CLI 列出工具、已订阅的订阅源和最新文章

要求

  • Node.js 22 或更新版本

  • 一个 FreshRSS 实例(针对 1.29 开发),需满足:

    • 已启用 API:设置 → 认证 → “允许 API 访问”

    • 已为用户设置 API 密码设置 → 个人资料 → API 管理。 这是与 Web 登录密码不同的独立密码。

Related MCP server: Conduit

配置

变量

必需

描述

FRESHRSS_URL

实例的根 URL,例如 https://rss.example.com。API 路径 /api/greader.php 会自动附加。

FRESHRSS_USER

FreshRSS 用户名。

FRESHRSS_API_PASSWORD

来自个人资料页面的 API 密码,而非 Web 登录密码。

FRESHRSS_READ_ONLY

true 仅注册读取工具。

FRESHRSS_INSECURE_TLS

true 仅对此连接接受自签名证书。

服务器启动时不带凭据,因此其工具保持可列出状态;但每次调用都会失败并显示这些设置说明。

Claude Code

claude mcp add freshrss -- npx -y @ni-c/freshrss-mcp

Claude Desktop

{
  "mcpServers": {
    "freshrss": {
      "command": "npx",
      "args": ["-y", "@ni-c/freshrss-mcp"],
      "env": {
        "FRESHRSS_URL": "https://rss.example.com",
        "FRESHRSS_USER": "alice",
        "FRESHRSS_API_PASSWORD": "…"
      }
    }
  }
}

Codex

[mcp_servers.freshrss]
command = "npx"
args = ["-y", "@ni-c/freshrss-mcp"]
env = { FRESHRSS_URL = "https://rss.example.com", FRESHRSS_USER = "alice", FRESHRSS_API_PASSWORD = "…" }

工具

读取

工具

描述

get_user_info

已认证的账户——快速凭据检查。

list_feeds

每个订阅及其类别和未读计数。

list_categories

类别(订阅源文件夹)和用户标签(文章上的标签)。

get_unread_counts

总计及按订阅源/类别的未读计数,已排序。

list_articles

按订阅源、类别、标签或内置流列出文章,包含摘要或受限的全文。

get_articles

按 ID 获取特定文章的全文。

list_article_ids

仅 ID——为 mark_articles 收集集合的廉价方式。

export_opml

所有订阅作为 OPML 文档导出。

写入

FRESHRSS_READ_ONLY=true 时不注册。

工具

描述

确认

mark_articles

设置特定文章的已读状态、星标和标签。

mark_all_as_read

将整个订阅源、类别、标签或流标记为已读。

subscribe_feed

订阅一个订阅源或网站 URL。

update_feed

重命名订阅源或将其移动到另一个类别。

unsubscribe_feed

删除订阅源及其所有存储的文章。

rename_category_or_label

重命名类别或用户标签。

delete_category_or_label

删除类别或用户标签。

import_opml

订阅 OPML 文档中的每个订阅源。

无搜索

FreshRSS 不通过其 API 提供全文搜索——Google Reader 端点仅按流、已读状态和日期过滤。因此 list_articles 没有查询参数;使用 feed_id/categorysince/until 缩小结果范围,并自行过滤返回的文章。

安全性

  • 文章文本是不可信的输入。 此服务器从 FreshRSS 返回的所有内容均由互联网上的第三方编写,因此携带文章文本、标题或订阅源名称的响应可能会将密码或私人订阅源的密码泄露到对话记录中。

  • subscribe_feed 拒绝内部目标。 FreshRSS 在服务器端获取 URL,这使得该工具成为可从文章文本中访问的 SSRF 原语。回环地址和链路本地地址(包括云元数据端点)被拒绝。私有 LAN 地址仍然允许,因为自托管设置合法地订阅自己网络上的订阅源。

  • import_opml 拒绝 <!DOCTYPE> 此过程中不解析 XML,但文档会传递给 FreshRSS,其中文档类型声明是实体扩展和外部实体攻击的载体。OPML 永远不需要它。

  • FRESHRSS_READ_ONLY=true 根本不会注册写入工具,而不是在调用时拒绝它们。

哪些工具受确认令牌保护:mark_all_as_readunsubscribe_feeddelete_category_or_labelimport_opmlmark_articles 故意不受保护——调用者明确指定最多 100 篇文章,并且每个字段都可以重置——但它被声明为破坏性操作,因此客户端仍可能提示确认。

容器

docker run --rm -i \
  -e FRESHRSS_URL=https://rss.example.com \
  -e FRESHRSS_USER=alice \
  -e FRESHRSS_API_PASSWORD=... \
  ghcr.io/ni-c/freshrss-mcp:latest

该镜像发布为 linux/amd64linux/arm64,附带 SBOM 和构建来源。它以非特权 node 用户身份运行,并且不携带 npm,因此其中只有 Node、运行时依赖项和 dist/

开发

npm install
npm run lint && npm run build && npm test
npm run test:coverage

请参阅 CONTRIBUTING.md 了解用于开发的临时 FreshRSS 实例。完整文档位于 freshrss-mcp.ni-c.de

发布

  1. CHANGELOG.md 中的 [Unreleased] 条目移到新版本下,并更新 package.json 中的 version

  2. 运行 npm run lint && npm run build && npm run test:coverage

  3. 提交,然后打标签:git tag -s vX.Y.Z -m vX.Y.Z && git push origin main vX.Y.Z

标签会触发 release.yml,它会验证标签是否与 package.json 匹配,通过 可信发布 发布到 npm(无需令牌,附带来源),从 CHANGELOG 部分创建 GitHub 发布,并将条目发布到 MCP 注册表。如果只有注册表步骤失败,请在 main 上修复并手动重新运行 mcp-registry.yml——切勿重新运行带标签的作业,因为那会检出旧树。

许可证

MIT

Install Server
A
license - permissive license
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)

Related MCP Servers

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ni-c/freshrss-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server