mcp-techTrend
mcp-techTrend is a multi-source technology trend aggregator that fetches academic papers, code repositories, and medical-device regulatory data from seven sources, delivering newspaper-style briefings.
π Research & Academic
arxiv_recentβ Latest arXiv papers by category, sorted by submission datearxiv_searchβ Search arXiv by keyword or advanced field syntax (ti:,au:,abs:,cat:)pubmed_searchβ Search PubMed biomedical literature using MeSH terms and field tagspaperswithcode_trendingβ Hugging Face Daily Papers (curated AI papers) sorted by community upvotes
π» Code & Models
github_trendingβ Browse GitHub trending repositoriesgithub_searchβ Search GitHub repositories by keyword with stars, date, and language filtershuggingface_trendingβ Browse Hugging Face models, datasets, or spaces by trending score, downloads, likes, or recency
π₯ Regulatory (FDA)
fda_510k_recentβ Recent FDA 510(k) medical device clearances via openFDAfda_recalls_recentβ Recent FDA medical device recalls, with optional severity class filter
π° Aggregated Briefings
trends_digestβ Multi-source bullet-list digest on a specific topic, fetched in paralleltrends_briefingβ Full newspaper-style weekly briefing across all enabled sources, grouped into Research / Code & Models / Regulatory sections, with automatic translation to the user's language
βοΈ Configuration
trends_get_configβ View current settings (enabled sources, arXiv categories, PubMed query, token status)trends_set_enabled_sourcesβ Enable or disable specific data sourcestrends_set_arxiv_categoriesβ Set arXiv categories with per-category weightstrends_set_pubmed_queryβ Set the default PubMed query for briefingstrends_set_tokenβ Set or clear rate-limit booster tokens for GitHub, Hugging Face, NCBI, or openFDA
Additional notes: All sources work anonymously (tokens optional for higher rate limits). Requests are cached with TTL-based invalidation and concurrent-request coalescing to avoid hammering upstream APIs. Configuration can be done via chat commands, an interactive TUI, or by editing run.py.
Provides tools for searching and retrieving recent academic papers from arXiv across various categories.
Provides tools for browsing trending repositories and searching GitHub repositories with date filters.
Provides tools for accessing trending models, datasets, and spaces from the Hugging Face Hub.
Provides tools for searching PubMed and retrieving full abstracts of biomedical literature.
trends-mcp
νκ΅μ΄ λ¬Έμ: README.ko.md
A single MCP server that pulls academic + code + medical-device-regulatory trend data from seven sources and renders newspaper-style briefings β with per-domain tuning baked in.
Source | Tools | Notes |
arXiv |
| Per-category round-robin so small categories aren't drowned by big ones |
PubMed |
| Full abstracts via |
HF Daily Papers |
| Sorted by community upvotes (replaces sunset PwC API) |
GitHub |
| Trending page scrape + Search API with |
Hugging Face |
| Models / datasets / spaces, trending or recent |
openFDA 510(k) |
| Device clearances |
openFDA Recalls |
| Recall events with class filter |
(aggregators) |
| Multi-source parallel calls |
trends_briefing is the headline tool: invoke "weekly news" / "μ£Όκ° λ΄μ€" and
get a newspaper-formatted briefing across all enabled sources, automatically
translated into the user's conversation language by the LLM.
Why this exists
Most academic / code / regulatory MCP servers are single-source. This one is
multi-source and domain-aware: a researcher tracking medical-imaging AI,
an ML engineer following ML papers, a security analyst watching CVEs and
trending repos β all configure once via python configure.py, then
trends_briefing becomes the "Monday morning newspaper" for their domain.
What makes it useful:
Newspaper format with translation hint β the LLM auto-translates source text (paper abstracts, recall reasons, etc.) to your conversation language while preserving identifiers, URLs, and metric values verbatim.
Per-category round-robin for arXiv β
cs.HC(~50 papers/wk) doesn't get drowned bycs.LG(~1500/wk) when both are tracked together.TTL cache + concurrent-request coalescing β repeat calls and parallel briefings don't hammer upstream APIs.
No required tokens. All seven sources work anonymously; tokens just raise the per-source rate limit ceiling.
Sandbox-safe Python launcher. Bypasses the
claude_desktop_config.jsonenvblock (which truncates whitespace-containing values on some macOS builds) by setting environment variables in Python before handing off to the server.
Related MCP server: mcp-ai-news-server
Install
git clone https://github.com/salwks/mcp-techTrend.git
cd mcp-techTrend
python3 -m venv .venv
.venv/bin/pip install -r requirements.txtConnect to Claude Desktop by editing
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"trends": {
"command": "/path/to/trends-mcp/.venv/bin/python",
"args": ["/path/to/trends-mcp/run.py"]
}
}
}β οΈ
argspoints atrun.py(the launcher), nottrends_mcp.py. The launcher sets domain-specific env vars before the server starts.
Restart Claude Desktop. The trends server should appear with the tools
listed below (count depends on your enabled sources).
Configuration
One source of truth: run.py. Two ways to edit it:
A. Interactive TUI β configure.py (recommended)
python configure.pyβββ trends-mcp μ€μ βββ
[1] Active sources (7/7 enabled)
[2] arXiv categories (4 entries Β· 13 papers/wk)
[3] PubMed query
[4] API tokens (0/4 set)
[5] Show current config
[6] Save and restart
[7] Quit without savingToggle sources with numbers, set arXiv weights with set 1 7, apply presets
with preset medical-imaging, save with [6]. The save action backs up to
run.py.bak, writes the new SETTINGS block (AST-based β never touches
non-config code), and runs pkill -f trends_mcp so Claude Desktop respawns
the server with the new config on next call.
The TUI menu labels are in Korean; commands and presets are in English. i18n of the TUI itself is on the v0.2 roadmap.
Single-shot modes:
python configure.py --show # print current config
python configure.py --restart # pkill stale MCP processesB. Direct edit β run.py SETTINGS block
TRENDS_ENABLED_SOURCES = "" # "" = all
TRENDS_ARXIV_CATEGORIES = "cs.LG:5,cs.CV:3,cs.CL:3,cs.AI:2"
TRENDS_DEFAULT_PUBMED_QUERY = "(deep learning OR AI) AND (medical OR clinical)"
# GITHUB_TOKEN = "ghp_..." # raises 60 β 5,000 req/h
# HF_TOKEN = "hf_..."
# NCBI_API_KEY = "..." # raises 3 β 10 req/s for PubMed
# OPENFDA_API_KEY = "..." # raises 240 β 120,000 req/dayRestart Claude Desktop after saving (or pkill -f trends_mcp).
C. From chat β trends_set_* tools
Same SETTINGS block, edited via MCP tool calls. The chat path and configure.py
read & write the same run.py (single source of truth), so changes from either
side are visible to the other.
Just say it in chat:
"νΈλ λμμ PubMed 쿼리λ₯Ό cardiology μͺ½μΌλ‘ λ°κΏμ€" "githubμ arxivλ§ μΌλ¬" "GitHub ν ν° λ±λ‘ν κ²: ghp_..."
The host Claude picks the right trends_set_* tool and confirms what changed.
After any change, restart Claude Desktop (or run pkill -f trends_mcp in
a terminal) β the MCP server reads the SETTINGS block at spawn time.
Tool | Purpose |
| Show current sources, categories, query, and which tokens are set (values never returned) |
| Enable a subset; |
|
|
| PubMed syntax (MeSH, |
|
|
Tokens: trends-mcp only does read operations, so create tokens with minimal scope β for GitHub, no scope at all (just authentication for rate limit). Don't put a
repo-scoped PAT here; it'd be over-permission.
Presets
# AI/ML researcher (default)
TRENDS_ARXIV_CATEGORIES = "cs.LG:5,cs.CV:3,cs.CL:3,cs.AI:2"
# Medical imaging / clinical AI
TRENDS_ARXIV_CATEGORIES = "eess.IV:5,cs.CV:3,cs.HC:2,q-bio.QM:2"
# Robotics
TRENDS_ARXIV_CATEGORIES = "cs.RO:5,cs.AI:3,cs.LG:2,cs.CV:2"
# HCI / UX
TRENDS_ARXIV_CATEGORIES = "cs.HC:5,cs.CY:3,cs.AI:2,cs.SI:2"
# Security
TRENDS_ARXIV_CATEGORIES = "cs.CR:5,cs.LG:2,cs.NI:2"
# Computational biology
TRENDS_ARXIV_CATEGORIES = "q-bio.QM:4,q-bio.GN:3,q-bio.BM:3,stat.AP:2"Common arXiv categories (full reference: ARXIV_CATEGORIES.md):
Code | Field | Weekly papers (approx) |
| Artificial Intelligence | 500β800 |
| Machine Learning | 1,500β2,000 (largest) |
| Computer Vision | 1,000β1,500 |
| NLP | 500β800 |
| HCI / UX | 50β100 |
| Robotics | 100β200 |
| Security | ~200 |
| Image/Video Processing (medical imaging) | 100β200 |
| Quantitative biology | 50β100 |
Source allowlist
TRENDS_ENABLED_SOURCES = "arxiv,github,huggingface,paperswithcode"
# β fda_510k, fda_recalls, pubmed tools won't appear in the tool list at allEmpty / "*" / "all" = enable everything. Disabled sources don't register
their tools, so the chat tool list itself shrinks. trends_digest and
trends_briefing remain registered and skip disabled sources gracefully.
Tools
Tool | Purpose |
| Recent papers in one category, by submission date |
| Keyword / field-syntax search ( |
| PubMed search (MeSH terms, field tags) β abstracts via efetch |
| HF Daily Papers, sorted by community upvotes |
| Browse github.com/trending (HTML scrape) |
| GitHub Search API; |
| HF Hub models / datasets / spaces |
| Recent FDA 510(k) clearances |
| Recent FDA medical-device recalls (class filter) |
| Multi-source bullet-list digest, given a topic |
| Multi-source newspaper briefing; topic optional |
| Show current settings (token values never returned) |
| Toggle which sources are active |
| Set arXiv categories + per-category weights |
| Set the default PubMed query |
| Set / clear a rate-limit booster token |
All search tools accept days=N for recent-N-days filtering. trends_briefing
groups results into π Research / π» Code & Models / π₯ Regulatory sections.
The five trends_*_config / trends_set_* tools are configuration mirrors
of configure.py β see Configuration Β§ C.
trends_digest vs trends_briefing
|
| |
Topic | required | optional ("what's new" mode) |
Source range | configurable subset (default 4) | all enabled sources |
Format | bullet-list digest | grouped newspaper format |
Use case | topic deep-dive | regular weekly briefing |
Caching
Per-process in-memory TTL cache wraps every HTTP response. Concurrent
identical requests are coalesced via per-key asyncio.Lock β N parallel
callers fire one upstream request.
TTL group | Length | Tools |
Trending | 5 min |
|
Default | 10 min |
|
Static | 1 hour |
|
Up to 256 entries; oldest evicted when full. No way to disable β TTLs are short enough that staleness is bounded.
Known limitations
GitHub Trending is HTML scraping β no official API exists. Layout changes can break it. Stable trending substitute:
github_searchwithdays=7andsort=stars.HF
trendingScoreis undocumented. API surface may change.HF Daily Papers covers ~50 curated papers/day, not all of arXiv. It's a "what was talked about" feed, not exhaustive.
arXiv has no native trending β we approximate via category-balanced recent-submissions feeds.
openFDA
classificationfield sometimes returnsNoneeven on recently classified recalls (upstream data lag). Search index lags too.
Roadmap (TODO)
v0.2: i18n for the TUI menu and briefing section headers
bioRxiv / medRxiv via RSS
Semantic Scholar (citation graph)
openFDA Adverse Events (MAUDE)
EU EUDAMED scraping
PMDA (Japan medical devices)
MFDS (Korea medical devices)
Mock-based test suite for CI
License
Available Tools
16 toolsarxiv_recentARead-only
Fetch recent arXiv papers in a category, sorted by submission date (newest first). days filters by published date.
Common categories: cs.AI (general AI), cs.LG (machine learning), cs.CV (computer vision), cs.CL (NLP), cs.HC (HCI / UX), cs.RO (robotics), cs.NE (neural networks), stat.ML (statistical ML), eess.IV (image/video processing β medical imaging lives here), eess.SP (signal processing), q-bio.QM (quantitative biology).
Inputs: category (required), days, max_results, response_format. Returns: result
arxiv_searchARead-onlyIdempotent
Search arXiv. Plain keywords work (auto-prefixed all:); for advanced queries use arXiv field syntax: ti: (title), au: (author), abs: (abstract), cat: (category, e.g. cat:eess.IV). days cuts off results older than N days (published field). When days is set, results are sorted by submission date instead of relevance.
Inputs: query (required), days, max_results, sort_by, +1 more. Returns: result
fda_510k_recentARead-onlyIdempotent
Recent FDA 510(k) clearances via openFDA. Date filter is always applied. openFDA uses token-exact matching on string fields β for partial name matches use wildcards (e.g. device_name:mammo* not device_name:mammography).
Inputs: query, days, max_results, response_format. Returns: result
fda_recalls_recentARead-onlyIdempotent
Recent FDA medical device recalls via openFDA. Optionally filter by class (1=most serious, 3=least). Note: openFDA query syntax uses token-exact matching on string fields β for partial matches use wildcards (e.g. product_description:mammog*).
Inputs: query, days, class_level, max_results, +1 more. Returns: result
github_searchARead-onlyIdempotent
Search GitHub repositories by keyword via the official Search API. USE THIS WHEN: user has a specific topic ('medical imaging 리ν¬', 'mammography GitHub'). days filters by repository created_at (treats it as 'repos created in the last N days') β pair with sort=stars for a stable trending-substitute. USE github_trending INSTEAD WHEN: no specific topic, just browsing.
Inputs: query (required), language, days, sort, +2 more. Returns: result
github_trendingARead-only
Browse github.com/trending β the public 'what's hot now' feed. USE THIS WHEN: user wants to browse trending repos with no specific topic in mind ('νμ΄μ¬ νΈλ λ© λ³΄μ¬μ€', 'GitHub ν«ν κ±°'). USE github_search INSTEAD WHEN: user has a specific topic/keyword. Note: this is HTML scraping (no official API), so layout changes can break it.
Inputs: language, since, max_results, response_format. Returns: result
huggingface_trendingARead-only
Browse Hugging Face Hub. kind selects models / datasets / spaces (default models). sort: trending / downloads / likes / recent. days filters by lastModified β CAUTION: this catches old entries with recent edits, not just newly published ones. For 'truly new' discovery prefer sort='recent' + days=N.
Inputs: kind, sort, query, tag, +3 more. Returns: result
paperswithcode_trendingARead-only
Daily curated AI papers feed (now backed by Hugging Face's daily_papers β Papers with Code API was sunset after the 2024 HF acquisition). Empty query returns the newest curated papers. Search is client-side filtering over the daily-papers stream.
Inputs: query, days, sort_by, max_results, +1 more. Returns: result
pubmed_searchARead-onlyIdempotent
Search PubMed for biomedical publications. Plain keywords work; for advanced queries use MeSH and field tags: mammography[MeSH], smith[Author], 2025[PDat]. Combine with AND/OR. days filters by publication date (PDat field).
Inputs: query (required), days, max_results, response_format. Returns: result
trends_briefingARead-only
Newspaper-style weekly briefing across all enabled sources. Topic is optional β without it, each source shows its 'what's new' feed. Use this when the user asks for 'μ£Όκ° λ΄μ€' / 'μ£Όκ° νΈλ λ' / 'weekly news' / 'briefing' style output.
PRESENTATION RULES β follow strictly:
PRESERVE STRUCTURE EXACTLY. The output is already organized into three groups (π μ°κ΅¬ λν₯ / π» μ½λ / λͺ¨λΈ / π₯ κ·μ / μλ£κΈ°κΈ°) and seven distinct source sections (arXiv, PubMed, Papers with Code, GitHub, Hugging Face, FDA 510(k), FDA Recalls). Do NOT merge sections (e.g. don't combine arXiv + PubMed into one 'papers' list). Do NOT reorder sections or items within a section. Do NOT change emoji or section headers.
TRANSLATE INLINE TEXT ONLY. Translate paper titles, abstracts, descriptions, and recall reasons into the user's current conversation language. Keep section headers, group titles, emoji, and metadata labels in their original form.
PRESERVE VERBATIM: proper nouns, author names, journal names, repository names (e.g. 'mattpocock/skills'), arXiv IDs, PMIDs, k_numbers, URLs, dates, and metric values (stars, downloads, etc.).
NO SUMMARIZATION at the briefing level. Render every item the tool returned. The user wants the full feed, not your synthesis.
ITEM-LEVEL DEPTH. For each paper, repo, model, or recall, preserve enough of the upstream abstract/description to convey what's new and why it matters β typically 2β4 sentences (around 150β300 chars of translated content per item). Do NOT collapse to a single headline-length sentence; the user wants to grasp each item without clicking through. Carry the problem β method β result/contribution structure when present in the source abstract.
Inputs: days, per_source_limit, topic, arxiv_categories, +1 more. Returns: result
trends_digestARead-only
One-shot multi-source digest for a topic. Calls sources in parallel; partial failures don't break the report.
PRESENTATION RULES β follow strictly:
PRESERVE SECTION STRUCTURE. The output has separate per-source sections (π arXiv, π PubMed, π GitHub, etc.). Do NOT merge them.
TRANSLATE INLINE TEXT into the user's conversation language; keep section headers and emoji as-is.
PRESERVE VERBATIM: proper nouns, IDs (PMID, k_number, arXiv IDs), URLs, repository names, metric values.
Render every item β no summarization at the digest level.
Inputs: topic (required), sources, per_source_limit, days. Returns: result
trends_get_configARead-onlyIdempotent
Show current trends-mcp configuration: enabled sources, arXiv categories, PubMed default query, and which optional rate-limit tokens are set. Token VALUES are never returned (only whether they are configured). Use this to confirm state before or after a trends_set_* call.
Inputs: no named parameters. Returns: object
trends_set_arxiv_categoriesAIdempotent
Set the default arXiv categories used by trends_briefing. Pass a list of entries; each entry is 'code' (e.g. 'cs.HC') or 'code:weight' (e.g. 'cs.HC:5'). Weight = papers per briefing per category (default 3). Example: ['cs.LG:5', 'cs.CV:3', 'cs.CL:2']. See ARXIV_CATEGORIES.md for the full list of valid codes.
Inputs: categories (required). Returns: result
trends_set_enabled_sourcesAIdempotent
Set which sources are enabled. Pass a list like ['arxiv', 'github']. Valid: arxiv, github, huggingface, paperswithcode, pubmed, fda_510k, fda_recalls. Pass ['*'] or ['all'] to enable all. Disabled sources' tools won't appear in the tool list at all (requires restart to take effect).
Inputs: sources (required). Returns: result
trends_set_pubmed_queryAIdempotent
Set the default PubMed query used by trends_briefing when no topic is provided. Use PubMed syntax: MeSH terms, [Title/Abstract] tags, AND/OR/NOT. [Title/Abstract] tags keep matches precise. Example: '(deep learning) AND (radiology[Title/Abstract])'.
Inputs: query (required). Returns: result
trends_set_tokenAIdempotent
Set or clear an optional rate-limit booster token. trends-mcp ONLY needs read access β when creating these tokens use the MINIMAL scope:
github: NO scope at all (just authentication for rate limit). Do NOT use a token with 'repo' scope here.
hf: read access only.
ncbi / openfda: API keys (no scope concept). Pass empty string for value to remove a token. Provider must be one of: github, hf, ncbi, openfda.
Inputs: provider (required), value (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogβ¦
TDQS
Scored across 16 tools
Each tool targets a distinct source or operation (e.g., arXiv search vs. recent, FDA 510k vs. recalls, GitHub search vs. trending). Even config tools are clearly separated. No ambiguity between tools.
All tools follow a consistent pattern: source_action (e.g., arxiv_recent, github_search) for data tools, and trends_verb for configuration tools. Lowercase with underscores throughout.
16 tools is well-scoped for a multi-source trend aggregation server. Each tool covers a specific need across multiple sources and configuration, without bloat.
The tool set covers all necessary operations for the domain: retrieval (recent, search, trending) per source, aggregation (briefing, digest), and full configuration (sources, categories, tokens). No obvious gaps.
Maintenance
Related MCP Connectors
Managed cloud RSS and Atom feed reader with a remote Model Context Protocol (MCP) endpoint. Zero server setup required β enables AI agents like Claude to instantly subscribe to feeds, search full-text articles, extract readable content, and access curated AI editions ("Your Newspaper") over secure streamable HTTP.
One MCP server for all web data. Scrape, search, crawl, and AI research in one install.
RSS & Atom feed manager with full-text search, AI curation, and remote MCP endpoint.
Unified 15-tool SEO, SERP, clean Markdown & GEO (LLM citation Share-of-Voice) MCP server.
Related MCP Servers
- AlicenseAqualityDmaintenanceA personalized news briefing MCP server that filters information from RSS, Reddit, and Hacker News based on user-defined interests and preferences. It also includes stock monitoring and alerting features.29Apache 2.0
- AlicenseNot gradedqualityDmaintenanceMCP server that fetches and filters AI-related news from 20+ RSS feeds with scheduled notifications and email digests.1MIT
- FlicenseNot gradedqualityDmaintenanceLocal MCP server that ingests and normalizes recent AI, tech, and research news from multiple sources, exposing tools for media agents to query and retrieve article content on demand.-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that fetches, dedupes, and scores women's-health & FemTech research and industry news, designed to feed GitHub Agentic Workflows and an auto-updating Astro + RSS site.MIT