Laboratório: Agente Multi-LLM para Classificação e Conciliação Contábil com MCP
Você vai implementar um agente Python que classifica lançamentos e realiza conciliação bancária, orquestrando Claude e OpenAI via MCP, com avaliação automática e registro. Em cerca de 2 horas, terá um agente funcional rodando localmente, pronto para revisão humana.

Roteiro para estudo em ambiente de laboratório ou de teste. Execute apenas em equipamentos, redes e contas que você tenha autorização para usar, com backup e homologação próprios. Comandos podem causar indisponibilidade ou perda de dados. Software e marcas citados pertencem aos seus titulares. Termos de Uso.
- Duração estimada
- 120 min
- Passos
- 13
- Validações
- 4
- Versões da documentação consultada
- Python 3.10 ou superior · Claude Agent SDK a versão estável atual · OpenAI Agents SDK a versão estável atual · Model Context Protocol (MCP) 2026-07-28 · FastAPI a versão estável atual · Pydantic a versão estável atual
Demonstrar como construir um agente de IA para o setor contábil, capaz de classificar lançamentos e sugerir conciliações bancárias, usando Claude Agent SDK, OpenAI Agents SDK e Model Context Protocol (MCP) em Python. O laboratório cobre desde o prompt de sistema versionado, definição de ferramentas, casos de teste automatizados, até guardrails e tracing, sempre com validação e revisão humana para decisões críticas.
Topologia
Uma máquina local (192.168.56.10) executa o agente Python, que orquestra requisições para Claude e OpenAI usando seus SDKs. O MCP roda como servidor local, expondo ferramentas para classificação e conciliação. Dados de teste são arquivos CSV locais. O agente registra logs e avaliações em disco, e toda decisão sensível exige aprovação manual.
+-------------------+
| Usuário (CLI) |
+---------+---------+
|
v
+-----------------------+
| Agente Python (MCP) |
+----+-----------+------+
| |
v v
Claude SDK OpenAI SDK
(REST API) (REST API)
Equipamentos e software
| Item | Requisito, licença ou versão |
|---|---|
| VM ou PC x86_64 | 2 vCPU, 4 GB RAM, 10 GB disco, Ubuntu 22.04 ou superior |
| Python | PSF · 3.10 ou superior |
| Claude Agent SDK | Apache-2.0 · a versão estável atual |
| OpenAI Agents SDK | MIT · a versão estável atual |
| Model Context Protocol (MCP) | MIT · 2026-07-28 |
| FastAPI | MIT · a versão estável atual |
| Pydantic | MIT · a versão estável atual |
Roteiro
- Preparar ambiente Python isolado
Isolar dependências evita conflitos e facilita a limpeza. Crie um ambiente virtual.
python3 -m venv venv source venv/bin/activateO que você deve ver: (venv) aparece no prompt
- Instalar SDKs e dependências
Instale as bibliotecas necessárias para Claude, OpenAI, MCP, FastAPI e Pydantic.
pip install claude-agent-sdk openai-agents fastapi pydantic uvicornO que você deve ver: Pacotes baixados e instalados sem erro
- Configurar variáveis de ambiente para segredos
Nunca exponha chaves de API em código. Exporte as chaves das APIs Claude e OpenAI.
export ANTHROPIC_API_KEY='SUA_CHAVE_CLAUDE' export OPENAI_API_KEY='SUA_CHAVE_OPENAI'O que você deve ver: Variáveis ANTHROPIC_API_KEY e OPENAI_API_KEY disponíveis
- Criar prompt de sistema versionado para classificação contábil
Defina o prompt do agente para classificar lançamentos conforme plano de contas EXEMPLO.
cat > prompts/classificacao_v1.txt <<EOF Você é um agente contábil. Classifique cada lançamento no plano de contas EXEMPLO: 1. Receitas 2. Despesas 3. Ativos 4. Passivos 5. Patrimônio Líquido Retorne sempre o número e o nome da categoria. EOFO que você deve ver: Arquivo prompts/classificacao_v1.txt criado
- Definir ferramenta MCP para classificação
Implemente uma ferramenta MCP que recebe um lançamento e retorna a classificação.
cat > mcp_tools/classify.py <<EOF from pydantic import BaseModel class Input(BaseModel): descricao: str valor: float class Output(BaseModel): categoria: str codigo: int def classify(input: Input) -> Output: # Lógica EXEMPLO: receitas se valor > 0, despesas se < 0 if input.valor > 0: return Output(categoria='Receitas', codigo=1) elif input.valor < 0: return Output(categoria='Despesas', codigo=2) else: return Output(categoria='Ativos', codigo=3) EOFO que você deve ver: Arquivo mcp_tools/classify.py criado
- Definir ferramenta MCP para conciliação bancária
Implemente ferramenta que sugere conciliação simples entre extrato e lançamentos.
cat > mcp_tools/reconcile.py <<EOF from pydantic import BaseModel class Input(BaseModel): extrato: list lancamentos: list class Output(BaseModel): conciliados: list nao_conciliados: list def reconcile(input: Input) -> Output: # Lógica EXEMPLO: concilia valores iguais conciliados = [] nao_conciliados = [] for e in input.extrato: if e in input.lancamentos: conciliados.append(e) else: nao_conciliados.append(e) return Output(conciliados=conciliados, nao_conciliados=nao_conciliados) EOFO que você deve ver: Arquivo mcp_tools/reconcile.py criado
- Configurar servidor MCP local
Implemente um servidor FastAPI que expõe as ferramentas MCP.
cat > mcp_server.py <<EOF from fastapi import FastAPI from mcp_tools.classify import classify, Input as ClassifyInput from mcp_tools.reconcile import reconcile, Input as ReconcileInput app = FastAPI() @app.post('/classify') def classify_endpoint(input: ClassifyInput): return classify(input) @app.post('/reconcile') def reconcile_endpoint(input: ReconcileInput): return reconcile(input) EOFO que você deve ver: Arquivo mcp_server.py criado
- Rodar servidor MCP
Inicie o servidor local para expor as ferramentas via HTTP.
uvicorn mcp_server:app --host 0.0.0.0 --port 8000O que você deve ver: Servidor ouvindo em http://0.0.0.0:8000
- Implementar agente Python orquestrador
Crie script que lê lançamentos de um CSV, chama Claude e OpenAI para classificar e conciliar via MCP, registra logs e sugere revisão.
cat > agente_contabil.py <<EOF import csv, os from openai_agents import Agent, Runner from claude_agent_sdk import ClaudeAgent import requests API_URL = 'http://localhost:8000' with open('dados/lancamentos.csv') as f: reader = csv.DictReader(f) lancamentos = list(reader) resultados = [] for l in lancamentos: payload = {'descricao': l['descricao'], 'valor': float(l['valor'])} r = requests.post(f'{API_URL}/classify', json=payload) cat = r.json() resultados.append({**l, **cat}) with open('resultados/classificados.csv', 'w') as f: writer = csv.DictWriter(f, fieldnames=resultados[0].keys()) writer.writeheader() writer.writerows(resultados) EOFO que você deve ver: Arquivo agente_contabil.py criado
- Criar dados de teste
Monte um CSV de lançamentos para testar a classificação e conciliação.
mkdir -p dados resultados cat > dados/lancamentos.csv <<EOF descricao,valor Venda produto,1000 Pagamento fornecedor,-500 Depósito bancário,2000 EOFO que você deve ver: Arquivo dados/lancamentos.csv criado
- Executar agente e registrar logs
Rode o agente, verifique logs e saída dos resultados.
python agente_contabil.pyO que você deve ver: Arquivo resultados/classificados.csv gerado com categorias
- Implementar avaliação automática
Crie script de teste que compara saída do agente com resultados esperados.
cat > testes/test_classificacao.py <<EOF import csv esperados = [ {'descricao': 'Venda produto', 'categoria': 'Receitas'}, {'descricao': 'Pagamento fornecedor', 'categoria': 'Despesas'}, {'descricao': 'Depósito bancário', 'categoria': 'Receitas'} ] with open('resultados/classificados.csv') as f: reader = csv.DictReader(f) saida = list(reader) for e in esperados: assert any(s['descricao'] == e['descricao'] and s['categoria'] == e['categoria'] for s in saida), f"Falha: {e}" print('Todos os testes passaram') EOFO que você deve ver: Arquivo testes/test_classificacao.py criado
- Rodar avaliação automática
Execute o teste e valide se o agente classificou corretamente.
python testes/test_classificacao.pyO que você deve ver: Saída: Todos os testes passaram
Como saber que funcionou
| Teste | Comando | Critério |
|---|---|---|
| Verificar se o servidor MCP responde | curl -X POST http://localhost:8000/classify -H 'Content-Type: application/json' -d '{"descricao": "Teste", "valor": 10}' | Resposta JSON com categoria e código |
| Checar saída do agente | cat resultados/classificados.csv | Arquivo com colunas descricao, valor, categoria, codigo |
| Rodar avaliação automática | python testes/test_classificacao.py | Mensagem 'Todos os testes passaram' |
| Verificar logs de execução | ls -lh resultados/ | Arquivo classificados.csv presente e atualizado |
Troubleshooting
| Sintoma | Causa provável | Correção |
|---|---|---|
| Servidor MCP não responde | Servidor não iniciado ou porta errada | Verifique se o uvicorn está rodando e a porta correta |
| Erro de importação de SDK | Dependência não instalada no ambiente virtual | Reative o ambiente e reinstale com pip |
| Chave de API não encontrada | Variável de ambiente não exportada | Exporte ANTHROPIC_API_KEY e OPENAI_API_KEY antes de rodar |
| Arquivo de resultados vazio | Erro na leitura do CSV de lançamentos | Confirme o caminho e o formato do arquivo dados/lancamentos.csv |
Segurança e hardening
- Nunca exponha chaves de API em código ou logs
- Restrinja o acesso ao servidor MCP à rede local
- Remova dados de teste sensíveis após o laboratório
- Use variáveis de ambiente para segredos
- Valide entradas para evitar injeção de comandos
Checklist final
Referências
- Claude Agent SDK Documentation · Code.claude (code.claude.com)
- OpenAI Agents SDK Documentation · Openai.github (openai.github.io)
- Model Context Protocol Specification · Modelcontextprotocol (modelcontextprotocol.io)
- FastAPI Documentation · FastAPI (fastapi.tiangolo.com)
- Pydantic Documentation · Docs.pydantic (docs.pydantic.dev)
- Python Official Documentation · Python Software Foundation (docs.python.org)
- Publicado
- 13/09/2026
- Última revisão
- 13/09/2026
- Versão do conteúdo
- 1.0
- Referências
- 6 oficiais
- Revisão técnica
- redação e revisão por IA, URLs conferidas na publicação
- Status
- Atual
