mcp-techtrend
Servidor MCP de múltiplas fontes: arXiv + PubMed + GitHub + HuggingFace + openFDA 510(k)/Recalls. Briefings em estilo jornalístico, ajuste por domínio, lançador Python seguro em sandbox.
Documentação
trends-mcp
한국어 문서: README.ko.md
Um único servidor MCP que coleta dados de tendências acadêmicas + de código + regulatórias de dispositivos médicos de sete fontes e gera resumos em formato de jornal — com ajuste por domínio incorporado.
| Fonte | Ferramentas | Observações |
|---|---|---|
| arXiv | arxiv_recent, arxiv_search | Round-robin por categoria para que categorias pequenas não sejam ofuscadas pelas grandes |
| PubMed | pubmed_search | Resumos completos via efetch.fcgi |
| HF Daily Papers | paperswithcode_trending | Ordenados por votos da comunidade (substitui a API PwC descontinuada) |
| GitHub | github_trending, github_search | Raspagem da página de tendências + API de busca com filtro de data created:> |
| Hugging Face | huggingface_trending | Modelos / datasets / spaces, em tendência ou recentes |
| openFDA 510(k) | fda_510k_recent | Autorizações de dispositivos |
| openFDA Recalls | fda_recalls_recent | Eventos de recall com filtro de classe |
| (agregadores) | trends_digest, trends_briefing | Chamadas paralelas de múltiplas fontes |
trends_briefing é a ferramenta principal: invoque "weekly news" / "주간 뉴스" e receba um resumo em formato de jornal de todas as fontes ativadas, traduzido automaticamente para o idioma da conversa do usuário pelo LLM.
Por que isso existe
A maioria dos servidores MCP acadêmicos / de código / regulatórios é de fonte única. Este é multifonte e ciente do domínio: um pesquisador acompanhando IA de imagens médicas, um engenheiro de ML seguindo artigos de ML, um analista de segurança observando CVEs e repositórios em alta — todos configuram uma vez via python configure.py, e então trends_briefing se torna o "jornal de segunda-feira de manhã" para o domínio deles.
O que o torna útil:
- Formato de jornal com dica de tradução — o LLM traduz automaticamente o texto da fonte (resumos de artigos, motivos de recall, etc.) para o idioma da sua conversa, preservando identificadores, URLs e valores de métricas verbatim.
- Round-robin por categoria para arXiv —
cs.HC(~50 artigos/sem) não é ofuscada porcs.LG(~1500/sem) quando ambas são acompanhadas juntas. - Cache TTL + coalescência de requisições concorrentes — chamadas repetidas e resumos paralelos não sobrecarregam as APIs upstream.
- Nenhum token obrigatório. Todas as sete fontes funcionam anonimamente; tokens apenas elevam o teto do limite de taxa por fonte.
- Launcher Python seguro para sandbox. Contorna o bloqueio
claude_desktop_config.jsonenv(que trunca valores com espaços em alguns builds de macOS) definindo variáveis de ambiente em Python antes de entregar ao servidor.
Instalação
git clone https://github.com/salwks/mcp-techTrend.git
cd mcp-techTrend
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
Conecte ao Claude Desktop editando ~/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"]
}
}
}
⚠️
argsaponta pararun.py(o launcher), nãotrends_mcp.py. O launcher define variáveis de ambiente específicas do domínio antes de o servidor iniciar.
Reinicie o Claude Desktop. O servidor trends deve aparecer com as ferramentas listadas abaixo (a quantidade depende das suas fontes ativadas).
Configuração
Fonte única de verdade: run.py. Duas maneiras de editá-la:
A. TUI interativa — configure.py (recomendada)
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 saving
Alterne fontes com números, defina pesos do arXiv com set 1 7, aplique predefinições com preset medical-imaging, salve com [6]. A ação de salvar faz backup em run.py.bak, grava o novo bloco SETTINGS (baseado em AST — nunca toca em código que não seja de configuração) e executa pkill -f trends_mcp para que o Claude Desktop reinicie o servidor com a nova configuração na próxima chamada.
Os rótulos do menu da TUI estão em coreano; comandos e predefinições estão em inglês. A i18n da própria TUI está no roadmap da v0.2.
Modos de execução única:
python configure.py --show # print current config
python configure.py --restart # pkill stale MCP processes
B. Edição direta — bloco SETTINGS de run.py
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/day
Reinicie o Claude Desktop após salvar (ou pkill -f trends_mcp).
C. Pelo chat — ferramentas trends_set_*
Mesmo bloco SETTINGS, editado por chamadas de ferramentas MCP. O caminho do chat e configure.py leem e gravam o mesmo run.py (fonte única de verdade), então alterações de qualquer lado são visíveis para o outro.
Basta dizer no chat:
"트렌드에서 PubMed 쿼리를 cardiology 쪽으로 바꿔줘" "github와 arxiv만 켜둬" "GitHub 토큰 등록할게: ghp_..."
O Claude anfitrião escolhe a ferramenta trends_set_* certa e confirma o que mudou. Após qualquer alteração, reinicie o Claude Desktop (ou execute pkill -f trends_mcp em um terminal) — o servidor MCP lê o bloco SETTINGS no momento da inicialização.
| Ferramenta | Finalidade |
|---|---|
trends_get_config | Mostra fontes, categorias, consulta atuais e quais tokens estão definidos (valores nunca são retornados) |
trends_set_enabled_sources(sources) | Ativa um subconjunto; ["*"] ou ["all"] para todos |
trends_set_arxiv_categories(categories) | Lista no estilo ["cs.LG:5", "cs.HC:3"] |
trends_set_pubmed_query(query) | Sintaxe do PubMed (MeSH, tags [Title/Abstract]) |
trends_set_token(provider, value) | provider ∈ {github, hf, ncbi, openfda}; valor vazio limpa |
Tokens: o trends-mcp só faz operações de leitura, então crie tokens com escopo mínimo — para GitHub, nenhum escopo (apenas autenticação para limite de taxa). Não coloque um PAT com escopo
repoaqui; seria permissão demais.
Predefinições
# 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"
Categorias comuns do arXiv (referência completa: ARXIV_CATEGORIES.md):
| Código | Área | Artigos semanais (aprox.) |
|---|---|---|
cs.AI | Inteligência Artificial | 500–800 |
cs.LG | Aprendizado de Máquina | 1.500–2.000 (maior) |
cs.CV | Visão Computacional | 1.000–1.500 |
cs.CL | PLN | 500–800 |
cs.HC | IHC / UX | 50–100 |
cs.RO | Robótica | 100–200 |
cs.CR | Segurança | ~200 |
eess.IV | Processamento de Imagem/Vídeo (imagens médicas) | 100–200 |
q-bio.QM | Biologia quantitativa | 50–100 |
Lista de permissão de fontes
TRENDS_ENABLED_SOURCES = "arxiv,github,huggingface,paperswithcode"
# → fda_510k, fda_recalls, pubmed tools won't appear in the tool list at all
Vazio / "*" / "all" = ativa tudo. Fontes desativadas não registram suas ferramentas, então a própria lista de ferramentas do chat diminui. trends_digest e trends_briefing permanecem registradas e ignoram fontes desativadas com elegância.
Ferramentas
| Ferramenta | Finalidade |
|---|---|
arxiv_recent | Artigos recentes em uma categoria, por data de submissão |
arxiv_search | Busca por palavra-chave / sintaxe de campo (ti:, au:, abs:, cat:) |
pubmed_search | Busca no PubMed (termos MeSH, tags de campo) — resumos via efetch |
paperswithcode_trending | HF Daily Papers, ordenados por votos da comunidade |
github_trending | Navega em github.com/trending (raspagem de HTML) |
github_search | API de busca do GitHub; days filtra por created: |
huggingface_trending | Modelos / datasets / spaces do HF Hub |
fda_510k_recent | Autorizações recentes da FDA 510(k) |
fda_recalls_recent | Recalls recentes de dispositivos médicos da FDA (filtro de classe) |
trends_digest | Resumo em lista de marcadores de múltiplas fontes, dado um tópico |
trends_briefing | Resumo em formato de jornal de múltiplas fontes; tópico opcional |
trends_get_config | Mostra configurações atuais (valores de token nunca são retornados) |
trends_set_enabled_sources | Alterna quais fontes estão ativas |
trends_set_arxiv_categories | Define categorias do arXiv + pesos por categoria |
trends_set_pubmed_query | Define a consulta padrão do PubMed |
trends_set_token | Define / limpa um token de aumento de limite de taxa |
Todas as ferramentas de busca aceitam days=N para filtragem de últimos N dias. trends_briefing agrupa resultados em seções 🎓 Pesquisa / 💻 Código & Modelos / 🏥 Regulatório. As cinco ferramentas trends_*_config / trends_set_* são espelhos de configuração de configure.py — veja Configuração § C.
trends_digest vs trends_briefing
trends_digest | trends_briefing | |
|---|---|---|
| Tópico | obrigatório | opcional (modo "o que há de novo") |
| Alcance de fontes | subconjunto configurável (padrão 4) | todas as fontes ativadas |
| Formato | resumo em lista de marcadores | formato de jornal agrupado |
| Caso de uso | mergulho profundo em tópico | resumo semanal regular |
Cache
Cache TTL em memória por processo envolve cada resposta HTTP. Requisições idênticas concorrentes são coalescidas via asyncio.Lock por chave — N chamadores paralelos disparam uma requisição upstream.
| Grupo TTL | Duração | Ferramentas |
|---|---|---|
| Tendências | 5 min | github_trending, paperswithcode_trending, huggingface_trending (ordenação por tendência), github_search (com days) |
| Padrão | 10 min | arxiv_recent, arxiv_search, github_search, huggingface_trending (outras ordenações) |
| Estático | 1 hora | pubmed_search, fda_510k_recent, fda_recalls_recent |
Até 256 entradas; as mais antigas são removidas quando cheio. Não há como desativar — os TTLs são curtos o suficiente para que a obsolescência seja limitada.
Limitações conhecidas
- GitHub Trending é raspagem de HTML — não existe API oficial. Mudanças de layout podem quebrá-lo. Substituto estável de tendências:
github_searchcomdays=7esort=stars. - HF
trendingScorenão é documentado. A superfície da API pode mudar. - HF Daily Papers cobre ~50 artigos curados/dia, não todo o arXiv. É um feed de "o que foi comentado", não exaustivo.
- arXiv não tem tendências nativas — aproximamos via feeds de submissões recentes balanceados por categoria.
- O campo
classificationdo openFDA às vezes retornaNonemesmo em recalls classificados recentemente (atraso de dados upstream). O índice de busca também atrasa.
Roadmap (TODO)
- v0.2: i18n para o menu da TUI e cabeçalhos de seção do resumo
- bioRxiv / medRxiv via RSS
- Semantic Scholar (grafo de citações)
- openFDA Eventos Adversos (MAUDE)
- Raspagem do EUDAMED da UE
- PMDA (dispositivos médicos do Japão)
- MFDS (dispositivos médicos da Coreia)
- Suíte de testes baseada em mocks para CI