
Eu escaneei 200 pacotes populares de servidores MCP. Aqui está o que encontrei.
O ecossistema MCP tem crescido rapidamente, mas a higiene da cadeia de suprimentos não acompanhou. MCPwn (CVE-2026-33032, CVSS 9.8) expôs mais de 2.600 instâncias. O verme npm Shai-Hulud roubou tokens de autenticação MCP de 172 pacotes. O MCPSafe encontrou bugs de alta severidade em oficiais MCPs da Atlassian, GitHub, Cloudflare e Microsoft. A Perplexity tornou o Bumblebee de código aberto em maio de 2026 especificamente porque não existia um bom scanner.
Então eu construí um. Hoje estou lançando @weiseer/mcp-doctor — um portão de confiança de tempo de instalação de código aberto para pacotes de servidor MCP — juntamente com o conjunto de dados de validação que revelou sua primeira descoberta real.
TL;DR
npx @weiseer/mcp-doctor @some/mcp-server
Retorna PASS / WARN / BLOCK com evidências citadas por sinal. O rubrica de pontuação completa é de código aberto, então você pode discutir a metodologia em vez de confiar em uma caixa-preta. Endpoint de escaneamento público gratuito em https://api.weiseer.com/scan, 60 requisições/min/IP, sem autenticação.
Conjunto de dados ao vivo de 200 pacotes populares relacionados ao MCP em https://api.weiseer.com/dataset/scan_200.json. Visualização do leaderboard em https://api.weiseer.com/leaderboard.
O que a varredura de 200 pacotes encontrou
| Veredicto | Contagem |
|---|---|
| PASS | 138 (69%) |
| WARN | 58 (29%) |
| BLOCK | 3 (1.5%) |
| ERROR | 1 (npm 404) |
1 pacote tinha uma chave de API LLM hardcoded
O sinal D3_hardcoded_credentials_in_source do scanner dispara em padrões comuns de chaves de provedores (sk-ant-*, sk-*, AKIA*, ghp_*, npm_*, AIza*) no código fonte publicado. É um bloqueio severo: −50 pontos, sem perguntas.
Um dos 200 pacotes acionou isso com uma chave sk-ant-... da Anthropic que parecia real embutida em seu código JavaScript empacotado. O mantenedor foi contatado por e-mail dentro de uma hora usando seu contato de publicador npm. Eles têm 7 dias para girar a chave, descontinuar a versão ruim e republicar lendo de process.env. Após o fechamento dessa janela (2026-06-06), farei referência ao padrão anonimamente — mas manterei o nome específico do pacote privado indefinidamente se eles pedirem.
Este é o risco da classe Shai-Hulud em forma concreta: uma única chave embutida, em um único pacote npm, que qualquer ferramenta escaneando a árvore de dependências do agente poderia exfiltrar.
Seis servidores MCP "oficiais" estão silenciosamente abandonados
Isso me surpreendeu:
| Pacote | Dias desde o último lançamento | URL do repositório |
|---|---|---|
@modelcontextprotocol/create-server |
550 | nenhum |
@modelcontextprotocol/server-postgres |
541 | nenhum |
@modelcontextprotocol/server-gdrive |
501 | nenhum |
@modelcontextprotocol/server-github |
416 | nenhum |
@modelcontextprotocol/server-slack |
399 | nenhum |
@modelcontextprotocol/server-puppeteer |
382 | nenhum |
Esses ainda são citados em quase todos os tutoriais de MCP. Nenhum deles tem um campo repository em package.json, então a verificação de fonte para binário é impossível. Se você depende de algum deles em produção, faça uma cópia da fonte hoje.
@google/generative-ai também está amplamente instalado via npm, mas o Google arquivou seu repositório no GitHub em favor de @google/genai.
2 typosquats de servidores oficiais
Autoexplicativo — ambos bloqueados com −40 HARD C4_name_typosquats_official. A comparação de nomes curtos captura pacotes dentro da distância de edição 1 de nomes oficiais bem conhecidos.
O rubrica é de código aberto por design
Eu não sou um fornecedor de segurança e essas pontuações não são uma caixa-preta. Cada sinal em rubric.yaml tem:
- Um ID (por exemplo,
D3_hardcoded_credentials_in_source) - Um valor de dedução (quanto isso custa para você)
- Uma justificativa (por que achamos que isso importa)
Se você acha que A1_unpinned_deps é muito agressivo, abra um PR. Se você acha que B2_single_maintainer pune injustamente novos pacotes, abra um PR. O objetivo de um rubrica aberto é que a confiança no ecossistema é um bem público, não um segredo de fornecedor.
Eu executei o scanner em meus próprios 9 pacotes primeiro (@weiseer/*) e publiquei os resultados no mesmo leaderboard. Todos eles PASSAM com 100/100 — mas dois sinais (B2_single_maintainer, B3_repo_under_60d_old) são explicitamente suprimidos via a flag self_disclosure porque são trivialmente esperados em pacotes publicados no mesmo dia. Eu prefiro mostrar a supressão do que me pontuar perfeito com uma rubrica manipulada.
Como usá-lo
Pacote único:
npx @weiseer/mcp-doctor @some/package
Audite sua configuração MCP existente:
npx @weiseer/mcp-doctor --config ~/Library/Application\ Support/Claude/claude_desktop_config.json
Portão CI para bloquear MCPs ruins em PRs:
- uses: weiseer/mcp-doctor-action@v1
with:
config-path: '.mcp/claude_desktop_config.json'
policy: 'block-only' # ou strict, ou report
Badge de confiança README:

Preços
| Nível | Preço | Obter |
|---|---|---|
| Gratuito | $0 | Escaneamento único + Badge de Confiança + leaderboard, 60 req/min/IP |
| Pro | $19/mês | Monitoramento de repositório, alertas de desvio, histórico de badge |
| Equipe | $49/mês | 5 repositórios, alertas Slack/Webhook, YAML de política personalizada |
| Enterprise | $299/mês | Repositórios ilimitados, exportação de log de auditoria, SLA |
O que está quebrado / o que eu quero feedback
-
A1_unpinned_deps calibração — a convenção npm é
^intervalos. v0.2 aumentou o limite para >5 deps E >70% caret, mas eu ainda posso estar disparando demais. - B3_repo_under
As empresas brasileiras que utilizam pacotes MCP devem estar atentas às vulnerabilidades identificadas, como a exposição de tokens de autenticação. A implementação de ferramentas como o @weiseer/mcp-doctor pode melhorar a segurança e a confiança na cadeia de suprimentos de software.

