Voltar as noticias
Zero Dependências, 250KB, 486 Testes: O que Aprendi Construindo um Cliente MCP
MCP ProtocolMediaEN

Zero Dependências, 250KB, 486 Testes: O que Aprendi Construindo um Cliente MCP

Dev.to - MCP·19 de agosto de 2026

Zero Dependencies, 250KB, 486 Tests: O que Aprendi Construindo um Cliente MCP

Isso não é uma apresentação de produto. É um diário de engenharia. Se você quer a apresentação, o README está aqui. Isso é sobre o custo de zero.

A configuração

Seis semanas atrás, comecei a construir mcptoon — uma ferramenta CLI que fica entre agentes de IA (Claude Code, Cursor, Codex) e servidores MCP. O problema que ela resolve: esquemas de ferramentas MCP são injetados na sua janela de contexto como JSON. 255 ferramentas = ~91K tokens de chaves, colchetes, aspas e vírgulas de JSON — antes de qualquer trabalho real acontecer.

mcptoon mantém esquemas fora do contexto. O agente executa comandos de shell. Apenas o resultado compacto entra no contexto.

Mas nada disso é sobre o que quero falar.

Quero falar sobre a decisão que moldou tudo: zero dependências.

# pyproject.toml
dependencies = []

Não "dependências mínimas." Não "poucas dependências." Zero.

Por que zero?

O gatilho foi o incidente de segurança uv. Uma dependência transitiva em uma ferramenta Python popular teve uma vulnerabilidade na cadeia de suprimentos. Milhares de projetos foram afetados. Não porque fizeram algo errado — porque alguém a montante fez algo errado.

Olhei para meu próprio histórico de pip install. Quantos pacotes eu instalei no último ano? Centenas. Cada um puxando sua própria árvore de dependências. Quantas dessas dependências eu auditei? Zero.

Então, quando comecei o mcptoon, fiz uma regra: sem importações de terceiros. Apenas a biblioteca padrão do Python.

Isso parecia razoável em teoria. Na prática, significava que eu estava prestes a criar muitas coisas do zero.

O custo: O que eu tive que construir eu mesmo

Sem requests → escrever manualmente um cliente HTTP

A biblioteca padrão tem http.client e urllib. Eles funcionam. Mas são verbosos. Aqui está como uma solicitação POST se parece com urllib:

import json, urllib.request

def http_post(url, data, headers=None):
    body = json.dumps(data).encode("utf-8")
    req = urllib.request.Request(
        url, data=body,
        headers={"Content-Type": "application/json", **(headers or {})}
    )
    with urllib.request.urlopen(req, timeout=30) as resp:
        return json.loads(resp.read().decode("utf-8"))

Isso são 8 linhas. Com requests, seria 1:

import requests
resp = requests.post(url, json=data, headers=headers, timeout=30)

Custo: ~200 linhas de encanamento HTTP (streaming SSE, tratamento de erros, lógica de repetição, autenticação). Com requests, talvez 30 linhas.

Valeu a pena? Para a análise de SSE (Server-Sent Events) — sim, aprendi como o protocolo realmente funciona. Para HTTP básico — não, foi apenas encanamento.

Sem extensões click ou argparse → escrever manualmente a análise de CLI

A biblioteca padrão do Python argparse é... boa. Mas click é muito mais agradável. Decoradores, subcomandos, contexto, geração de texto de ajuda. Com argparse, acabei com uma função de despacho de CLI de 400 linhas:

def main():
    parser = argparse.ArgumentParser(prog="mcptoon")
    sub = parser.add_subparsers(dest="command")

    # ... 15 subcomandos, cada um com seus próprios args ...
add_cmd = sub.add_parser("add")
    add_cmd.add_argument("name")
    add_cmd.
Contexto Triplo Up

A construção de ferramentas com zero dependências pode impactar a segurança e a eficiência de sistemas que interagem com agentes de IA. Empresas brasileiras devem considerar essa abordagem para mitigar riscos de segurança em suas aplicações web.

Noticias relacionadas

Gostou do conteudo?

Receba toda semana as principais novidades sobre WebMCP.