Aprenda a lidar com falhas de forma elegante — validação, try/except, timeouts e logging.
Servers MCP estão sujeitos a diversos tipos de falhas. Compreender cada categoria de erro é o primeiro passo para tratá-los adequadamente. Um bom server não é aquele que nunca falha — é aquele que falha de forma previsível, informativa e recuperável.
Os erros em um server MCP se dividem em quatro categorias principais: erros de entrada (parâmetros inválidos, tipos errados, valores fora do range esperado); erros de execução (bugs no código, divisão por zero, chave inexistente em dicionário); erros de rede (API externa fora do ar, timeout de conexão, DNS não resolvido); e erros de permissão (acesso negado a arquivo, token expirado, credenciais inválidas). Cada tipo exige uma estratégia de tratamento diferente.
Estudos de engenharia de software mostram que mais de 60% dos incidentes em produção são causados por tratamento inadequado de erros — não pelos erros em si. Em servers MCP, isso é ainda mais crítico porque o modelo de IA depende de mensagens de erro claras para informar o usuário sobre o que aconteceu e sugerir próximos passos. Um stack trace cru não ajuda ninguém.
Parâmetros inválidos, tipos errados, valores fora do range. Detectáveis antes de executar a lógica principal. Prevenidos com validação.
Bugs no código, KeyError, IndexError, divisão por zero. Acontecem durante o processamento. Prevenidos com try/except e testes.
API fora do ar, timeout, DNS não resolvido. Imprevisíveis e transitórios. Tratados com retry e mensagens claras.
Acesso negado, token expirado, credenciais inválidas. Requerem ação do usuário ou admin. Mensagem clara sobre o que falta.
A primeira linha de defesa contra erros é a validação de entrada. Antes de processar qualquer dado, verifique se os parâmetros estão corretos — tipo, formato, range, presença. Nunca confie nos dados que chegam. Retorne mensagens claras quando algo estiver errado, para que o modelo possa informar o usuário de forma útil.
Validação robusta no início da tool evita erros cascata:
Nunca exponha dados sensíveis em mensagens de erro. Evite retornar caminhos de arquivo do servidor, nomes de variáveis de ambiente, strings de conexão de banco de dados ou qualquer informação que possa ser usada para explorar o sistema. Mensagens de erro devem ser úteis para o usuário, não para um atacante.
Mesmo com validação perfeita, erros de execução podem acontecer. A estrutura try/except é sua rede de segurança — ela captura exceções antes que derrubem o server e permite retornar mensagens de erro úteis em vez de stack traces incompreensíveis.
Envolva a lógica principal em try/except com exceções específicas:
Sempre capture exceções específicas antes da genérica. Comece com os erros mais prováveis (ValueError, KeyError, json.JSONDecodeError) e termine com except Exception como rede de segurança final. Nunca use except: sem tipo — isso captura até KeyboardInterrupt e SystemExit.
except: sem tipo de exceçãopassQuando suas tools fazem requisições HTTP a APIs externas, falhas de rede são inevitáveis. O servidor da API pode estar fora do ar, a conexão pode expirar, ou a resposta pode ter um status de erro. Cada tipo de falha de rede exige tratamento específico com mensagens que ajudem o modelo a informar o usuário sobre o que aconteceu.
Com httpx, os principais erros de rede são:
httpx.ConnectError — não conseguiu conectar ao servidor (DNS, porta fechada, host inacessível)httpx.TimeoutException — conexão ou leitura excedeu o tempo limitehttpx.HTTPStatusError — servidor respondeu com status 4xx ou 5xxTrate cada um separadamente para dar mensagens precisas ao modelo.
Servidor inacessível. Mensagem: "Não foi possível conectar ao serviço X. Verifique se o serviço está online." Retry pode ajudar se for transitório.
Tempo esgotado. Mensagem: "A requisição ao serviço X demorou mais que o esperado." Considerar aumentar timeout ou retry com backoff.
Resposta com erro. 404 = recurso não encontrado, 401/403 = não autorizado, 500 = erro no servidor externo. Adaptar mensagem ao status code.
Cuidado com retry infinito. Se a API está fora do ar, tentar novamente sem limites vai travar sua tool. Use retry com backoff exponencial e limite máximo de tentativas (ex: 3 tentativas com espera de 1s, 2s, 4s). Se todas falharem, retorne uma mensagem clara informando que o serviço está temporariamente indisponível.
Configurar timeouts é essencial em servers MCP. O modelo de IA espera a resposta da tool para continuar — se a tool travar em uma requisição HTTP sem timeout, o modelo fica parado indefinidamente. Sempre defina limites de tempo para operações que podem demorar.
Sempre configure timeout nas requisições HTTP:
O valor timeout=10.0 significa que a requisição será cancelada se demorar mais de 10 segundos. Para APIs rápidas, 5-10 segundos é suficiente. Para operações pesadas, pode ser necessário 30 segundos ou mais — mas sempre com um limite definido.
Você pode configurar timeouts granulares com httpx.Timeout(connect=5.0, read=10.0, write=5.0, pool=5.0). Isso permite limites diferentes para conexão, leitura, escrita e pool. Na maioria dos casos, timeout=10.0 como valor único é suficiente e mais simples de manter.
Mensagens de erro retornadas ao modelo devem ser simples e úteis. Mas para você, o desenvolvedor, precisa de detalhes completos para diagnosticar problemas. É aí que entra o logging — registrar erros detalhados para stderr sem interferir no protocolo MCP que usa stdout.
Configure logging para registrar erros detalhados em stderr:
O exc_info=True inclui o stack trace completo no log — essencial para debug. O protocolo MCP usa stdout para comunicação, então logs em stderr não interferem.
Use níveis de log adequados: DEBUG para detalhes de desenvolvimento, INFO para operações normais (tool chamada, parâmetros recebidos), WARNING para situações suspeitas mas não críticas, ERROR para falhas que impedem a operação. Em produção, configure o nível para INFO; em desenvolvimento, use DEBUG.
O MCP Inspector mostra os logs do server na sua interface, facilitando o debug durante desenvolvimento. Logs estruturados (com timestamp, nível e nome do logger) são 3x mais rápidos de diagnosticar do que prints soltos, segundo estudos de engenharia de software. Invista tempo configurando logging adequado desde o início — você agradecerá quando surgir o primeiro bug em produção.
Próximo Módulo: 3.9 — Testando com MCP Inspector