关于 FeedKit
FeedKit 是用于收集和搜索 RSS/Atom 订阅源的 Python 包,提供精选目录、命令行、Python API、SQLite 存储和 MCP 工具。
主要功能
- 01精选订阅源目录
- 02订阅订阅源
- 03异步收集内容
- 04SQLite 文章存储
- 05全文搜索文章
- 06命令行和 Python API
适用场景
- 01按主题或语言查找订阅源
- 02收集订阅源中的文章
- 03搜索已收集的文章
- 04通过 MCP 客户端连接订阅源工作流
MCP 相关
其 stdio MCP 服务提供获取订阅源、搜索目录和文章、管理订阅、收集内容及检索最新文章的工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
FeedKit
RSS/Atom 源收集,包含 444 个精选且经过验证的源。CLI + Python API + MCP 服务。
快速入门
pip install feedkit
feedkit search cloudflare # search the built-in catalog
feedkit subscribe-catalog -c technology # subscribe to all 68 tech feeds
feedkit collect # fetch all subscriptions (async parallel)
feedkit find "kubernetes" # full-text search collected articles
安装
pip install feedkit # core (CLI + Python API)
pip install "feedkit[mcp]" # + MCP server
pip install "feedkit[all]" # + MCP + OPML import/export
要求: Python 3.11+
工作原理
flowchart LR
A["📋 Catalog\n444 curated feeds"] --> B["Subscribe\nselect feeds"]
B --> C["🔄 Collect\nfetch new entries"]
C --> D["📦 Store\nSQLite database"]
D --> E["🔍 Query\nfilter & retrieve"]
CLI 参考
目录命令
feedkit search [QUERY]
搜索内置的 444 个精选源目录。
feedkit search aws # search by title or domain
feedkit search --category science # filter by category
feedkit search --language ko # filter by language
feedkit search -c finance -l en -n 50 # combine filters
feedkit search -j # JSON output (for piping)
| 选项 | 简写 | 默认值 | 说明 |
|---|---|---|---|
--category | -c | 按类别筛选 | |
--language | -l | 按语言代码筛选(en、ko、ja、zh) | |
--limit | -n | 20 | 最大结果数 |
--json-output | -j | 以 JSON 格式输出 |
feedkit categories
列出所有可用的目录类别。
$ feedkit categories
academia
finance
pets
science
society
technology
feedkit stats
显示目录和本地订阅统计信息。
$ feedkit stats
Catalog: 444 feeds
academia: 13
finance: 89
pets: 27
science: 128
society: 119
technology: 68
Local: 68 subscriptions, 1,247 articles
订阅命令
feedkit subscribe <URL>
订阅单个源。
feedkit subscribe https://blog.cloudflare.com/rss/
feedkit subscribe https://example.com/rss -c tech -t "My Feed"
| 选项 | 简写 | 说明 |
|---|---|---|
--category | -c | 类别标签 |
--title | -t | 覆盖显示标题 |
feedkit subscribe-catalog -c <CATEGORY>
一次性订阅目录类别中的所有源。
feedkit subscribe-catalog -c technology # subscribe to all 68 tech feeds
feedkit subscribe-catalog -c science # subscribe to all 128 science feeds
feedkit unsubscribe <URL>
移除源订阅及其已收集的文章。
feedkit list
列出所有当前订阅,以及抓取次数和错误次数。
收集命令
feedkit collect
从所有已订阅的源抓取新文章(异步并行)。
feedkit collect # collect all
feedkit collect -c technology # collect only tech feeds
feedkit collect -n 50 # max 50 concurrent requests
| 选项 | 简写 | 默认值 | 说明 |
|---|---|---|---|
--category | -c | 仅从此类别收集 | |
--concurrency | -n | 20 | 最大并发 HTTP 请求数 |
输出:
Collecting from 68 feeds...
67/68 feeds OK, 412 new articles, 8234ms
feedkit latest
显示最近收集的文章。
feedkit latest # latest 20 articles
feedkit latest -n 50 # latest 50
feedkit latest -c finance # latest from finance only
feedkit find <QUERY>
在所有已收集的文章中进行全文搜索(SQLite FTS5)。
feedkit find "kubernetes deployment"
feedkit find "large language model" -n 50
OPML 命令
feedkit import-opml <PATH>
从 OPML 文件导入源(Feedly、Inoreader、NetNewsWire 等)。
feedkit import-opml subscriptions.opml
feedkit export-opml <PATH>
将当前订阅导出为 OPML。
feedkit export-opml backup.opml
Python API
from feedkit import search_catalog, fetch_feed, get_catalog_stats, FeedStore
from feedkit.core import collect
# Search the built-in catalog
feeds = search_catalog("cloudflare")
feeds = search_catalog(category="technology", language="en", limit=50)
# Fetch a single feed (async)
entries = await fetch_feed("https://blog.cloudflare.com/rss/")
for entry in entries:
print(entry.title, entry.url, entry.published)
# Subscribe and collect
store = FeedStore() # SQLite at ~/.feedkit/feedkit.db
store.subscribe("https://blog.cloudflare.com/rss/", category="tech")
result = await collect(store, concurrency=20) # async parallel fetch
print(f"{result.new_articles} new, {result.feeds_ok}/{result.feeds_total} OK")
# Search collected articles (FTS5)
articles = store.search("kubernetes", count=10)
# Latest articles
articles = store.get_latest(count=20, category="tech")
# Feed health
health = store.get_health() # fetch/error counts per feed
# Catalog stats
stats = get_catalog_stats() # {total_feeds, categories, languages}
store.close()
主要类
| 类 | 说明 |
|---|---|
FeedStore | 基于 SQLite 的订阅和文章存储(~/.feedkit/feedkit.db) |
FeedEntry | 从已抓取源获取的单条内容(标题、URL、摘要、发布时间、作者) |
CollectResult | 批量收集结果(feeds_ok、feeds_error、new_articles、duration_ms) |
CatalogFeed | 内置目录中的条目(URL、标题、类别、子类别、语言、域名) |
MCP 服务
pip install "feedkit[mcp]"
feedkit-mcp # starts stdio MCP server
配置
Claude Code(~/.claude/settings.json):
{
"mcpServers": {
"feedkit": {
"command": "feedkit-mcp"
}
}
}
工具参考
| # | 工具 | 参数 | 描述 |
|---|---|---|---|
| 1 | fetch_single_feed | url, count=10 | 从任意 RSS/Atom URL 获取条目(无需订阅) |
| 2 | search_feed_catalog | query, category, language, count=20 | 搜索内置的 444 个订阅源目录 |
| 3 | catalog_stats | 获取目录统计信息(总数、按类别和语言统计) | |
| 4 | subscribe_feed | url, title, category | 订阅订阅源,以便持续收集 |
| 5 | unsubscribe_feed | url | 移除订阅 |
| 6 | list_subscriptions | 列出所有订阅及其状态 | |
| 7 | collect_feeds | category | 从所有订阅中收集新文章 |
| 8 | search_articles | query, count=10 | 对已收集的文章进行全文搜索 |
| 9 | get_latest_articles | category, count=20 | 获取最近收集的文章 |
MCP 工作流示例
User: "What are the latest AI papers on arXiv?"
1. search_feed_catalog(query="arxiv", category="science")
→ finds arXiv cs.AI, cs.LG, cs.CL feeds
2. subscribe_feed(url="https://rss.arxiv.org/rss/cs.AI")
3. collect_feeds(category="science")
→ fetches new entries
4. get_latest_articles(category="science", count=10)
→ returns latest papers
内置目录
涵盖 6 个类别的 444 个已验证订阅源。所有订阅源均经过审核,已移除硬性付费墙(Bloomberg、FT、WSJ)和失效 URL。
| 类别 | 订阅源 | 子类别 | 代表性来源 |
|---|---|---|---|
| technology | 68 | ai_ml, developer, it_news, security, startup, ... | AWS、Cloudflare、Stripe、Netflix、HN、Go Blog、Rust Blog |
| science | 128 | journal, preprint, news, government | Nature、Science、arXiv、bioRxiv、medRxiv、NASA、PLOS |
| society | 119 | news_us, news_ko, news_uk, news_intl, factcheck, ... | BBC、NPR、NYT、NHK、JTBC、PolitiFact、Snopes |
| finance | 89 | markets, central_bank, regulatory, crypto | Fed、BOE、BOJ、SEC、CNBC、CoinDesk、Yahoo Finance |
| pets | 27 | veterinary, community, blog, health | AKC、PetMD、ASPCA、dvm360、r/dogs、r/cats |
| academia | 13 | ai_ml, research, institution | Google AI、DeepMind、Stanford HAI、Hugging Face |
**语言:**英语(381)、韩语(47)、日语(14)、中文(2)
完整订阅源列表:CATALOG.md
为什么选择 FeedKit?
| awesome-rss-feeds (2.1K★) | engineering-blogs (37.5K★) | FeedKit | |
|---|---|---|---|
| 类型 | Markdown 列表 | Markdown 列表 | Python 包 |
| 订阅源 | ~500 | ~600 | 444 |
| 范围 | 综合 | 仅技术博客 | 技术 + 科学 + 金融 + 新闻 + 事实核查 |
| 最近更新 | 2021(已过时) | 2022(已过时) | 持续更新(每日收集) |
| 已验证可用 | 否 | 否 | 是(已收集 778K+ 篇文章) |
| 法律审核 | 否 | 否 | 是(已移除付费墙/服务条款限制较多的订阅源) |
| CLI | 否 | 否 | 是(12 个命令) |
| 程序化 API | 否 | 否 | 是(异步 Python) |
| MCP 服务 | 否 | 否 | 是(9 个工具) |
| OPML | 否 | 否 | 是(导入/导出) |
| FTS 搜索 | 否 | 否 | 是(SQLite FTS5) |
免责声明
此软件包分发的是公开可用的 RSS 订阅源 URL目录,而非订阅源内容本身。RSS 是一种内容联合分发标准——发布 RSS 订阅源,即明确邀请读者订阅。FeedKit 代表用户获取订阅源,不会存储或再分发受版权保护的内容。
目录已移除硬性付费墙后的订阅源(Bloomberg、FT、WSJ、Barron's),以及服务条款限制较多的订阅源。
使用案例
- newswatch — RSS 新闻监控流水线(feedkit → markgrab → embgrep → diffgrab)
许可证
属于 QuartzUnit 生态系统 — 用于数据收集、提取、搜索和 AI Agent 安全的可组合 Python 库。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。