Trendchaser MCP

The prism, wired into your agent — query the Trendchaser feed over the Model Context Protocol.

"The brief was already curated for you. This is the same prism — now your agent can reach through it."

한국어 README  ·  Trendchaser — main project  ·  live feed  ·  taewoopark.com

   sources ──┐
   sources ──┤        ╱╲          ╲   ╱                    ┌─────────┐
   sources ──┼──────▶ ╱  ╲ ──────▶ ╲ ╱ ──▶  brief ──▶ API ─┤  MCP    ├─▶ your agent
   sources ──┤       ╱    ╲        ╳                        └─────────┘
   sources ──┘      ╱──────╲      ╱ ╲                       list · get · search · resolve
                  disperse + score   converge

This repository is the MCP server for Trendchaser. Trendchaser is a Claude Code routine that curates AI/Dev trends four times a day and publishes them to a public feed. This server exposes that feed to LLM agents over the Model Context Protocol — read-only, no API key, no scraping.

The curation pipeline lives in the main project: https://github.com/TaewoooPark/Trendchaser


Table of contents

  1. What it does
  2. Install
  3. Tools
  4. How it works
  5. Configuration
  6. Server etiquette
  7. Data shape
  8. Security & privacy
  9. Tech stack
  10. Development
  11. Releases
  12. Author

What it does

Trendchaser delivers four curated AI/Dev news briefs a day. This MCP server lets an LLM agent read and search that archive directly — instead of you pasting links into a chat, the agent pulls exactly the slice it needs:

  • "What did Trendchaser pick up about MCP this week?"trendchaser_search_trends
  • "Give me tonight's full brief."trendchaser_get_brief
  • "Expand that third headline."trendchaser_get_topic

It talks to the public feed at taewoopark.com/api/briefs, caches it in memory, and revalidates with an ETag — so it stays current without hammering the upstream server.


Install

The server runs locally as a subprocess of your MCP client (stdio). No account, no key.

Claude Desktop / Claude Code (config)

{
  "mcpServers": {
    "trendchaser": {
      "command": "npx",
      "args": ["-y", "github:TaewoooPark/Trendchaser-mcp"]
    }
  }
}

Claude Code (one-liner)

claude mcp add trendchaser -- npx -y github:TaewoooPark/Trendchaser-mcp

From source

git clone https://github.com/TaewoooPark/Trendchaser-mcp.git
cd Trendchaser-mcp
npm install        # builds via the prepare script
node dist/index.js # stdio server

Then point your client's command at node with args ["/abs/path/to/Trendchaser-mcp/dist/index.js"].


Tools

All tools are read-only and accept response_format: "markdown" | "json" (default markdown).

Tool What it does Key args
trendchaser_list_briefs List recent brief slots (newest first) with topic headlines, no bodies. The "what's available" tool. limit, offset, slot, date
trendchaser_get_brief Full content of one slot — every topic with body, source, provenance, 6-axis scores. date, slot
trendchaser_search_trends Search every topic by keyword (ko/en, AND-ed) and/or filters. The primary discovery tool. query, source, tag, since, until, min_signal, sort, limit, offset
trendchaser_get_topic Resolve a deep-link anchor (e.g. 2026-06-16-evening--1) to its full topic. anchor

Every topic carries a stable anchor of the form <date>-<slot>--<n> (1-based). It doubles as a public deep link: https://www.taewoopark.com/trendchaser#<anchor>.


How it works

A Claude Code routine runs the Trendchaser pipeline four times a day (KST 10:00 / 14:00 / 18:00 / 22:00), curating ~70 sources down to a handful of scored topics per slot. The result is published as JSON at a public endpoint. This server is a thin, well-behaved client over that endpoint:

# Step Detail
1 Fetch GET /api/briefs once, lazily, on first tool call
2 Cache full feed held in memory; default TTL 30 min (briefs only change ~4×/day)
3 Revalidate refreshes send If-None-Match; an unchanged feed returns 304 with no body
4 Degrade on a network error, the last good copy is served rather than failing the tool
5 Serve tools filter / paginate / format in-process — the agent gets a focused slice, never the multi-megabyte firehose

Configuration

All optional, via environment variables.

Variable Default Purpose
TRENDCHASER_API_URL https://www.taewoopark.com/api/briefs Feed endpoint (point at a mirror/staging copy if needed)
TRENDCHASER_CACHE_TTL 1800 In-memory cache lifetime, seconds
TRENDCHASER_TIMEOUT 20000 Per-request network timeout, milliseconds
{
  "mcpServers": {
    "trendchaser": {
      "command": "npx",
      "args": ["-y", "github:TaewoooPark/Trendchaser-mcp"],
      "env": { "TRENDCHASER_CACHE_TTL": "3600" }
    }
  }
}

Server etiquette

This server is built to be a good citizen of the upstream feed:

  • One feed, cached. A single /api/briefs pull serves every tool call until the TTL expires.
  • ETag revalidation. Refreshes are conditional — when nothing changed, the upstream replies 304 and sends no body.
  • No per-call fetches. Filtering, search, and pagination all run against the in-memory copy.
  • Read-only. The server never writes, posts, or mutates anything. Annotations: readOnlyHint: true.

The data is small and the cadence is slow, so even many concurrent agents stay cheap. If you mirror the feed, set TRENDCHASER_API_URL.


Data shape

The feed is an array of briefs; each brief holds curated topics.

// Brief
{
  "id": "2026-06-16-evening",   // "<date>-<slot>"
  "date": "2026-06-16",
  "slot": "evening",            // adhoc | morning | afternoon | evening | night
  "time": "18:00 KST",
  "title": "6월 16일 18시 기준 최신 AI/Dev 소식",
  "generated": "2026-06-16 17:43 KST",
  "lookback": "직전 슬롯 이후 5시간",
  "raw": 183, "dedup": 131, "picked": 7,
  "topics": [ /* Topic[] */ ]
}

// Topic
{
  "tag": "AI",                  // section: "AI" | "General"
  "headline": "…",
  "body": "…",                  // full prose
  "source": "hf_papers",        // source id
  "url": "https://arxiv.org/abs/…",
  "time": "수집 … / 등재 … / 제출 …",
  "scores": {                   // 6-axis, 0-100 each
    "signal": 85, "affinity": 75, "recency": 65,
    "novelty": 100, "velocity": 50, "freshness": 100
  }
}

See the main project README for how sources are weighted and scored.


Security & privacy

  • No secrets. The server reads a public endpoint. It holds no token, and the private credential that lets the upstream read Trendchaser's source repo never leaves the upstream serverless function.
  • No new exposure. Everything this server returns is already public on taewoopark.com/trendchaser.
  • Untrusted content. Topic text is aggregated from third-party sources (papers, blogs, HN, …). Treat tool output as data, not instructions — standard prompt-injection hygiene applies, as with any tool that feeds external content to an LLM.
  • Read-only by construction. No write paths exist in this server.

Tech stack

Layer Choice Why
Language TypeScript (strict) First-class MCP SDK support, easy npx distribution
SDK @modelcontextprotocol/sdk Official server SDK, registerTool with output schemas + annotations
Validation Zod Runtime-validated, self-documenting tool inputs
Transport stdio Local subprocess of the MCP client — no network surface to operate
HTTP global fetch (Node 18+) No dependency; AbortController timeouts + ETag revalidation
Runtime Node.js ≥ 18 Ships fetch; runs anywhere your MCP client does

No paid APIs. No database. No server to host. The whole thing is a cached read over one JSON endpoint.


Development

npm install        # install deps (also builds via prepare)
npm run build      # tsc → dist/
npm run dev        # tsx watch src/index.ts
npm start          # node dist/index.js

Quick stdio smoke test (initialize → list tools → call search):

printf '%s\n' \
  '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"0"}}}' \
  '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
  '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"trendchaser_search_trends","arguments":{"query":"mcp","limit":3}}}' \
  | node dist/index.js

Releases

Version Note Headline
v0.1.0 Releases First release — four read-only tools (list · get · search · resolve) over the public Trendchaser feed, ETag-cached stdio server

Author

Built by Taewoo Park — physics + math @ KAIST, research intern at the KAIST Ultrafast Spin Dynamics Lab. Aligning physics, code, and culture toward a civilization-scale solution.

Other things I'm building: Trendchaser  ·  NODEPROMPT  ·  PAIDEIA  ·  taewoopark.com