关于 Nexus AI News
Nexus AI News 汇集多个来源的 AI 行业资讯,去重后按领域和事件类型分类。其 MCP 信息流支持抽取式搜索与浏览,请求处理路径中不使用生成式模型。
主要功能
- 01采集 arXiv、Hacker News、GitHub、X 和 RSS 资讯
- 02跨来源去重
- 03分类标注相关性、领域、事件类型和重要性
- 04搜索并浏览按时间倒序排列的信息流
- 05按领域、事件类型、来源和日期筛选
适用场景
- 01查找特定领域的近期 AI 资讯
- 02浏览发布、融资、论文或收购消息
- 03使用短语和排除词搜索资讯
- 04查看各领域或事件类型的信息流数量
MCP 相关
公开只读 MCP 服务通过 Streamable HTTP 提供,地址为 https://nexus.carapace.bot/mcp。它提供 search_news、get_latest_news 和 get_feed_stats;结果为抽取式内容,不调用模型。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://nexus.carapace.bot/mcpclaude mcp add --transport http 99darwin-nexus https://nexus.carapace.bot/mcp{"mcpServers":{"99darwin-nexus":{"type":"http","url":"https://nexus.carapace.bot/mcp"}}}在 Cursor 中打开{"servers":{"99darwin-nexus":{"type":"http","url":"https://nexus.carapace.bot/mcp"}}}在 VS Code 中打开{"mcpServers":{"99darwin-nexus":{"type":"http","url":"https://nexus.carapace.bot/mcp"}}}{"mcpServers":{"99darwin-nexus":{"serverUrl":"https://nexus.carapace.bot/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
3| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | integer | 否 | 返回的最大条目数(默认值为 20)。 |
| query | string | 是 | 搜索词,例如 'open-weight reasoning model'。 |
| since | string | 否 | ISO 8601 日期或时间戳;仅包含在此时间或之后发布的项目。 |
| source | string | 否 | 限制为单个来源,例如 'arxiv'、'hackernews'、'github'。 |
| vertical | enum | 否 | 限制为单个 AI 垂直领域。foundation_models | inference | training | agents | code_generation | multimodal | safety_alignment | evaluation | developer_tooling | enterprise_platforms | data_infrastructure | open_source | hardware | consumer_products | creative_tools | search_retrieval | robotics | healthcare | finance | research | governance_policy |
| event_type | enum | 否 | 限制为一种赛事类型。launch | funding | release | acquisition | paper | update | shutdown |
详细介绍
Nexus
由 Jev 驱动的 AI 新闻动态。
Nexus 从多个来源采集 AI 新闻,对内容去重,通过一次 Jev(TypeSafe System One)调用对每条内容进行分类,并以按时间倒序排列的动态流形式提供结果,支持筛选和带防护的抽取式聊天搜索。没有图数据库,请求处理路径中也没有生成式大模型。
Sources (arxiv, hackernews, github, twitter, rss)
│
▼
dedup.ts (URL → title → arXiv-id → Jaccard + entity fingerprints)
│
▼
PostgreSQL raw_items
│
▼
Jev enrichment (TypeSafe System One, model jev-latest, 1 call/item)
relevant? (Noul) · vertical (Choice) · event_type (Choice) · significance (Score)
│
▼
PostgreSQL feed_items (reverse-chron, indexed)
│
▼
Fastify API — GET /api/feed · GET /api/feed/meta · POST /api/chat
│
▼
React feed client — ActivityFeed, FilterBar, HotCards, guarded ChatBox
快速开始
# 1. Start infrastructure (PostgreSQL)
docker compose up -d
# 2. Install dependencies
pnpm install
# 3. Build all packages
pnpm build
# 4. Start API and client dev servers (separate terminals)
pnpm dev:api
pnpm dev:client
# 5. Run the agent (source polling + Jev enrichment) separately
pnpm --filter @nexus/agent start
客户端将在 http://localhost:5173 打开,API 服务于 http://localhost:3001。
Monorepo 目录结构
| Package | Path | Description |
|---|---|---|
@nexus/shared | packages/shared | TypeScript 接口、枚举、常量、验证——供所有包导入 |
@nexus/agent | packages/agent | 来源适配器 + 去重 + Jev 增强 |
@nexus/api | packages/api | 为动态流和聊天搜索提供服务的 Fastify REST 服务 |
@nexus/client | packages/client | React 动态流界面(Vite) |
添加来源适配器
主要的贡献方式是添加新的数据来源。每个适配器都会将原始内容送入去重 + Jev 增强流水线,由该流水线自动进行分类并插入动态流。
RawItem 接口
// packages/agent/src/sources/types.ts
interface RawItem {
source: string; // adapter name, e.g. "arxiv"
source_url: string; // canonical URL for deduplication
title: string; // headline / paper title
content: string; // body text (Jev classifies, excerpt is sliced from here)
published_at: string; // ISO 8601 timestamp
raw_metadata: Record<string, unknown>; // source-specific fields
}
编写适配器
扩展 BaseAdapter 并实现 fetchItems()。适配器自带速率限制、带退避的指数重试和基于 URL 的去重。
// packages/agent/src/sources/my-source.ts
import type { RawItem } from "./types.js";
import { BaseAdapter } from "./base-adapter.js";
export class MySourceAdapter extends BaseAdapter {
name = "my-source";
priority = "P1" as const;
constructor() {
super({
pollIntervalMs: 30 * 60 * 1000, // how often to poll
rateLimitMs: 2000, // min delay between requests
});
}
protected async fetchItems(): Promise<RawItem[]> {
const response = await fetch("https://api.example.com/items");
if (!response.ok) throw new Error(`Fetch failed: ${response.status}`);
const data = await response.json();
return this.dedupeByUrl(
data.map((item: any) => ({
source: this.name,
source_url: item.url,
title: item.title,
content: item.body,
published_at: new Date(item.date).toISOString(),
raw_metadata: { id: item.id },
}))
);
}
}
现有适配器
| Adapter | Source | Priority | Poll Interval | Auth |
|---|---|---|---|---|
ArxivAdapter | arXiv RSS (cs.AI, cs.CL, cs.LG) | P0 | 30 min | 无 |
HackerNewsAdapter | HN Algolia API | P0 | 15 min | 无 |
GitHubTrendingAdapter | GitHub Search API | P0 | 60 min | 可选 GITHUB_TOKEN |
TwitterAdapter | X/Twitter API v2 | P1 | 15 min | 必需的 X_BEARER_TOKEN |
RssAdapter | 公司博客、TechCrunch AI、The Verge AI、Simon Willison | P1 | 2h (default) | 无 |
注册适配器
- 将适配器添加到
packages/agent/src/start.ts中的适配器列表:
import { MySourceAdapter } from "./sources/my-source.js";
const adapters: SourceAdapter[] = [
new HackerNewsAdapter(),
new ArxivAdapter(),
new GitHubTrendingAdapter(),
new MySourceAdapter(), // add here
];
-
按照现有模式,在
packages/agent/src/sources/__tests__/中编写测试。 -
运行测试:
pnpm --filter @nexus/agent test
Jev 增强
每个去重后的 RawItem 都会恰好调用一次 TypeSafe 的 System One API(POST https://api.typesafe.ai/v1/systemone,模型 jev-latest,Bearer TYPESAFE_API_KEY)。Jev 是一种决策模型——它会针对结构化 JSON 回答类型化问题(Noul、Choice、Score),而非生成文本。一次调用即可回答一条内容的全部四个问题:
is_ai_relevant(Noul)——置信度 < 0.6 时丢弃vertical(Choice)——21 个Vertical值之一,或noneevent_type(Choice)——launch | funding | release | acquisition | paper | update | shutdown | othersignificance(Score)——5 分制评分规则,映射到 0.2–1.0
动态流中显示的摘录是来源内容的前 280 个字符——绝不是大模型摘要,因此不会产生幻觉。
聊天搜索
POST /api/chat 是一个带防护的抽取式搜索框,不是聊天机器人。它通过一次 Jev 调用对查询进行分类(主题相关性检查、垂直领域/事件类型/时间范围提取),然后通过 Postgres 三元组搜索返回 feed_items 中的真实行。聊天处理路径中完全没有生成式模型——因此没有可供提示词注入攻击交互的对象。
MCP 服务
该信息流通过 Streamable HTTP 作为公开的只读 Model Context Protocol 服务提供给 Agent:
https://nexus.carapace.bot/mcp
| 工具 | 功能 |
|---|---|
search_news | 全文搜索(短语、OR、-exclude),可按 vertical / event_type / source / since 筛选 |
get_latest_news | 优先显示最新条目,支持相同的筛选条件,并通过 next_cursor 进行游标分页 |
get_feed_stats | 总数以及按 vertical 和 event_type 分类的数量 |
使用 claude mcp add --transport http nexus https://nexus.carapace.bot/mcp 将其添加到 Claude Code。无状态(无会话),仅提取信息——与 GET /api/feed 使用相同的验证,不调用模型。注册清单:server.json。
数据模型
feed_items
id(uuid)· title · url(唯一)· source · published_at · excerpt · vertical · event_type · significance(0.0–1.0)· created_at
垂直类别
21 个空间聚类类别,定义于 packages/shared/src/types.ts(例如 foundation_models、agents、safety_alignment、consumer_products 等)。
事件类型
launch | funding | release | acquisition | paper | update | shutdown | other
贡献
- Fork 仓库并创建分支:
feat/my-feature、fix/some-bug或chore/cleanup - 编写符合 Conventional Commits 规范的提交信息:
feat: add devto adapter、fix: handle empty RSS feed - 创建 PR 前运行检查:
pnpm test # run all tests
pnpm lint # eslint
pnpm typecheck # tsc --noEmit
- 保持 PR 聚焦——每个 PR 只包含一个适配器或功能。
环境变量
| 变量 | 必填 | 默认值 | 描述 |
|---|---|---|---|
TYPESAFE_API_KEY | 是 | — | Jev(System One)增强和聊天分类所需的 TypeSafe API 密钥 |
POSTGRES_HOST | 否 | localhost | PostgreSQL 主机 |
POSTGRES_PORT | 否 | 5432 | PostgreSQL 端口 |
POSTGRES_DB | 否 | nexus | PostgreSQL 数据库名称 |
POSTGRES_USER | 否 | nexus | PostgreSQL 用户 |
POSTGRES_PASSWORD | 是 | — | PostgreSQL 密码 |
X_BEARER_TOKEN | 否 | — | X/Twitter API bearer 令牌(启用 Twitter 适配器) |
GITHUB_TOKEN | 否 | — | GitHub PAT(提高 GitHub 适配器的速率限制) |
API_KEY | 否 | — | 写入/管理端点所需的 API 密钥 |
API_PORT | 否 | 3001 | API 服务端口 |
API_HOST | 否 | 0.0.0.0 | API 服务绑定地址 |
CLIENT_PORT | 否 | 5173 | 客户端开发服务端口 |
技术栈
- 数据库 — PostgreSQL 16(
raw_items、feed_items、pg_trgm 搜索) - API — Fastify
- 客户端 — Vite + React
- 搜索 — Fuse.js(客户端,已加载条目)、pg_trgm(服务端,聊天和信息流搜索)
- Agent — TypeSafe Jev(System One),用于增强和聊天分类
- 部署 — Railway(Postgres + API)+ Vercel(客户端)
成本
增强每个新去重条目大约需要调用 Jev 1 次,所有来源每天约有 50–100 个条目;每次聊天查询还需要调用 Jev 1 次。整个处理流程中没有 Neo4j、Redis,也没有生成式大模型——这就是全部计算开销。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。