Nexus AI News について
Nexus AI Newsは複数の情報源からAI業界ニュースを集約し、重複を除いて分野やイベント種別で分類します。MCPフィードでは、リクエスト処理中に生成モデルを使わず、抽出型の検索と閲覧ができます。
主な機能
- 01arXiv、Hacker News、GitHub、X、RSSからニュースを収集
- 02情報源をまたいだ重複排除
- 03関連性、分野、イベント種別、重要度の分類
- 04新着順フィードの検索と閲覧
- 05分野、イベント種別、情報源、日付による絞り込み
活用シーン
- 01特定分野の最近のAIニュースを探す
- 02発表、資金調達、論文、買収のニュースを閲覧
- 03フレーズや除外語を使ったニュース検索
- 04分野別またはイベント種別のフィード件数を確認
MCP 対応
公開の読み取り専用MCPサーバーで、https://nexus.carapace.bot/mcp からStreamable HTTP経由で利用できます。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 | いいえ | 1つのイベントタイプに限定します。launch | funding | release | acquisition | paper | update | shutdown |
詳細
Nexus
Jevを活用したAIニュースフィードです。
Nexusは、複数のソースからAIニュースを取り込み、重複を排除し、単一のJev(TypeSafe System One)への呼び出しで各項目を分類し、フィルターと、保護された抽出的なチャット検索機能を備えた新しい順のフィードとして提供します。グラフデータベースはなく、リクエスト処理経路に生成型LLMもありません。
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で利用できます。
モノレポの構成
| パッケージ | パス | 説明 |
|---|---|---|
@nexus/shared | packages/shared | TypeScriptのインターフェース、列挙型、定数、バリデーション — すべてのパッケージからインポートされます |
@nexus/agent | packages/agent | ソースアダプター+重複排除+Jevによるエンリッチメント |
@nexus/api | packages/api | フィードとチャット検索用のFastify RESTサーバー |
@nexus/client | packages/client | React製フィードUI(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 },
}))
);
}
}
既存のアダプター
| アダプター | ソース | 優先度 | ポーリング間隔 | 認証 |
|---|---|---|---|---|
ArxivAdapter | arXiv RSS(cs.AI、cs.CL、cs.LG) | P0 | 30分 | なし |
HackerNewsAdapter | HN Algolia API | P0 | 15分 | なし |
GitHubTrendingAdapter | GitHub Search API | P0 | 60分 | GITHUB_TOKENは任意 |
TwitterAdapter | X/Twitter API v2 | P1 | 15分 | X_BEARER_TOKENが必要 |
RssAdapter | 企業ブログ、TechCrunch AI、The Verge AI、Simon Willison | P1 | 2時間(デフォルト) | なし |
アダプターの登録
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)を必ず1回だけ呼び出します。Jevは意思決定モデルです。構造化JSONに対して型付きの質問(Noul、Choice、Score)に回答し、テキストは生成しません。1回の呼び出しで、各項目について4つの質問すべてに回答します。
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文字です。LLMによる要約ではないため、幻覚が生じることはありません。
チャット検索
POST /api/chatは、保護された抽出的な検索ボックスであり、チャットボットではありません。1回のJev呼び出しでクエリを分類(対象トピックの確認、vertical/event type/期間の抽出)し、その後、Postgresのトライグラム検索を通じてfeed_itemsから実際の行を返します。チャットの処理経路に生成モデルは一切ないため、プロンプトインジェクションが作用する相手もありません。
MCP サーバー
このフィードは、Streamable HTTP を介したパブリックな読み取り専用の Model Context Protocol サーバーとして、エージェントに公開されています。
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 (unique) · 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
貢献
- リポジトリをフォークして、ブランチを作成します:
feat/my-feature、fix/some-bug、またはchore/cleanup - Conventional Commit 形式のコミットメッセージを記述します:
feat: add devto adapter、fix: handle empty RSS feed - PR を作成する前にチェックを実行します:
pnpm test # run all tests
pnpm lint # eslint
pnpm typecheck # tsc --noEmit
- PR の範囲を絞り、1 つの PR につきアダプターまたは機能を 1 つにします。
環境変数
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
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 のベアラートークン(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(サーバー側、チャットとフィードの検索)
- エージェント — エンリッチメントとチャット分類に TypeSafe Jev(System One)を使用
- デプロイ — Railway(Postgres + API)+ Vercel(クライアント)
コスト
エンリッチメントでは、新たに重複排除されたアイテムごとに Jev を約 1 回呼び出します。全ソースを合わせて 1 日あたり約 50~100 件で、さらにチャットクエリごとに Jev を 1 回呼び出します。パイプライン全体を通じて Neo4j も Redis も生成系 LLM も使用しません。計算コストはこれだけです。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。