Rastreie encomendas dos Correios com histórico completo de eventos, resolução automática de CAPTCHA via rede neural treinada localmente.
Expõe as mesmas operações como MCP tools (para agentes AI) e REST API (para integrações diretas), com interface web incluída.
| 📦 | Rastreia qualquer objeto pelos Correios pelo código (ex: AA000000000BR) |
| 🚀 | Consulta até 20 objetos em paralelo com um único CAPTCHA |
| 🤖 | Integra com qualquer agente AI via protocolo MCP |
| 📋 | Mantém histórico de rastreamentos no servidor |
O rastreamento é feito via scraping do site oficial dos Correios. A resolução de CAPTCHA é feita por uma CRNN (Convolutional Recurrent Neural Network) treinada especificamente para isso, atingindo 99.62% de acurácia sem depender de nenhum serviço externo.
| Tool | Descrição |
|---|---|
rastrear_objeto |
Rastreia um objeto pelo código (ex: AA000000000BR) |
rastrear_multiplos |
Rastreia até 20 objetos de uma vez com um único CAPTCHA |
| Método | Rota | Rate limit | Descrição |
|---|---|---|---|
GET |
/ |
— | Interface web |
POST |
/rastreamento/objeto |
20/min por IP | Rastreia um objeto |
POST |
/rastreamento/multiplos |
10/min por IP | Rastreia até 20 objetos em paralelo |
GET |
/history/ |
— | Lista o histórico de rastreamentos |
POST |
/history/save |
— | Salva ou atualiza uma entrada no histórico |
DELETE |
/history/ |
— | Limpa todo o histórico |
DELETE |
/history/{codigo} |
— | Remove a entrada de um código específico |
GET |
/health |
— | Health check — retorna {"status": "ok"} |
Documentação interativa: http://localhost:8000/docs (disponível apenas em ENV=development).
O histórico é global e compartilhado — todas as consultas feitas pela interface web, pela REST API ou via MCP gravam no mesmo arquivo de histórico do servidor.
- Interface web: rastreamentos bem-sucedidos são salvos automaticamente no histórico.
- REST API / MCP: toda consulta bem-sucedida pode ser registrada chamando
POST /history/savecom os dados do objeto.
FastAPI com FastMCP 3.0 montado em /mcp (streamable-http). A camada services/ não tem dependência de framework — a mesma lógica é consumida pelos routers REST e pelo MCP server.
app/
├── main.py # FastAPI — routers + mcp.http_app() em /mcp + rate limiter
├── config.py # Lê todas as variáveis de ambiente com defaults
├── mcp_server.py # FastMCP("correios-rastreamento") — 2 tools
├── auth.py # TokenMiddleware — autenticação via API_TOKEN + controle prod/dev
├── services/
│ └── correios.py # Scraping: curl_cffi + CAPTCHA solver + JSON parsing
├── routers/
│ ├── rastreamento.py # POST /rastreamento/objeto, /rastreamento/multiplos
│ ├── history.py # GET/POST/DELETE /history/ — histórico de rastreamentos
│ └── ui.py # GET / — interface web
└── captcha/
├── model.py # Arquitetura CRNN (CNN + BiLSTM + CTC Loss)
├── predictor.py # Inferência: carrega captcha_model.pt e prediz
├── dataset.py # CaptchaDataset com data augmentation
├── train.py # Loop de treino com early stopping + AMP + registry
├── collector.py # Coleta amostras rotuladas direto dos Correios
├── evaluate.py # Avalia acurácia contra amostras salvas
└── registry.py # Versionamento de modelos
Regras de camada:
services/— zero imports de FastAPI ou FastMCProuters/emcp_server.py— importam apenas deservices/- I/O bloqueante em
services/correios.pyé sempre executado viarun_in_threadpool
Todas as opções são lidas de variáveis de ambiente ou do arquivo .env na raiz do projeto.
| Variável | Padrão | Descrição |
|---|---|---|
API_TOKEN |
(vazio — sem auth) | Token Bearer. Se vazio, todos os endpoints ficam abertos |
ENV |
development |
development ou production — controla quais rotas ficam abertas sem token |
RATE_LIMIT_OBJETO |
20/minute |
Rate limit de /rastreamento/objeto por IP |
RATE_LIMIT_MULTIPLOS |
10/minute |
Rate limit de /rastreamento/multiplos por IP |
HISTORY_RETENTION_DAYS |
90 |
Dias de retenção do histórico. 0 = sem limite |
APP_TIMEZONE |
America/Sao_Paulo |
Timezone para timestamps do histórico |
| Rota | development |
production |
|---|---|---|
/ |
✅ aberta | ✅ aberta |
/health |
✅ aberta | ✅ aberta |
/docs |
✅ aberta | 🔒 token |
/redoc |
✅ aberta | 🔒 token |
/openapi.json |
✅ aberta | 🔒 token |
/mcp |
🔒 token | 🔒 token |
| demais | 🔒 token | 🔒 token |
Se
API_TOKENestiver vazio, o middleware ignora autenticação em qualquer ambiente.
Com API_TOKEN configurado, todas as requisições protegidas precisam enviar:
Authorization: Bearer meu-token-secreto
REST:
curl -X POST http://localhost:8000/rastreamento/objeto \
-H "Authorization: Bearer meu-token-secreto" \
-H "Content-Type: application/json" \
-d '{"codigo": "AA000000000BR"}'Claude Desktop / Claude Code (claude_desktop_config.json):
{
"mcpServers": {
"correios-rastreamento": {
"command": "npx",
"args": ["mcp-remote", "http://localhost:8000/mcp", "--allow-http"],
"env": {
"MCP_REMOTE_HEADER_AUTHORIZATION": "Bearer meu-token-secreto"
}
}
}
}A interface web (/) exibe um gate de autenticação quando API_TOKEN está definido — o token é validado contra o servidor e salvo no navegador.
git clone https://github.com/opastorello/correios-rastreamento.git
cd correios-rastreamento
cp .env.example .env # edite se quiser definir API_TOKEN
docker compose up --build -dpip install -r requirements.txt
cp .env.example .env
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reloadApós iniciar:
- Interface web:
http://localhost:8000/ - REST docs:
http://localhost:8000/docs(apenas emENV=development) - MCP endpoint:
http://localhost:8000/mcp
curl -X POST http://localhost:8000/rastreamento/objeto \
-H "Content-Type: application/json" \
-d '{"codigo": "AA000000000BR"}'{
"codObjeto": "AA000000000BR",
"tipoPostal": { "descricao": "SEDEX" },
"situacao": "E",
"dtPrevista": "01/01/2026",
"eventos": [
{
"descricaoWeb": "ENTREGUE",
"dtHrCriado": { "date": "2026-01-01 10:00:00.000000" },
"unidade": { "endereco": { "cidade": "SAO PAULO", "uf": "SP" } }
}
]
}curl -X POST http://localhost:8000/rastreamento/multiplos \
-H "Content-Type: application/json" \
-d '{"codigos": ["AA000000000BR", "AA000000001BR"]}'Input (1×80×215 grayscale)
→ Conv2D ×4 + BatchNorm + ReLU + MaxPool (extração de features visuais)
→ BiLSTM ×2 (128 hidden, bidirectional) (modelagem de sequência)
→ Linear → CTC Loss (decode sem segmentação)
Output: string [0-9a-z] (CHARSET: 36 chars)
| Rodada | Amostras | Rotulador | val_acc |
|---|---|---|---|
| 1 | 55.033 | ddddocr (bootstrap) | 99.57% |
| 2 | 55.000 | Modelo R1 (83.6% acerto) | 99.61% |
| 3 (fine-tuning) | 20.000 | Modelo R2 (~99%) | 99.63% |
| 4 (fine-tuning) | 100.000 | Modelo R3 (~99%) | 99.62% |
Resultado v6 sobre 100k amostras: 99.97% por sequência | 99.99% por caractere
Erros residuais são confusões visuais: n↔h, e↔c, r↔p, v↔y.
Objeto único:
- GET
index.php— session cookie - GET
securimage_show.php— imagem CAPTCHA - Resolve com CRNN local (99.62% acurácia)
- GET
resultado.php?objeto={code}&captcha={text}&mqs=S— JSON com eventos - Retry até 4× em caso de CAPTCHA inválido
Múltiplos objetos (até 20):
- Mesmos passos 1–3, mas usa
rastroMulti.php?objeto={cod1cod2...}&captcha={text} - 1 CAPTCHA para até 20 objetos (códigos concatenados)
1. Coletar amostras
python -m app.captcha.collector --probe AA000000000BR --target 20000 --workers 82. Treinar do zero
python -m app.captcha.train --epochs 80 --batch 128 --lr 1e-33. Fine-tuning a partir de checkpoint
python -m app.captcha.train --epochs 60 --batch 128 --lr 1e-4 --checkpoint app/captcha/captcha_model.ptO melhor modelo (menor val_loss) é salvo em app/captcha/captcha_model.pt. Para consultar o histórico de versões:
python -m app.captcha.registryIdeias e melhorias planejadas para versões futuras.
- Cache de resultados — objetos já consultados recentemente retornam resultado armazenado sem nova requisição aos Correios. Reduz latência e carga no servidor.
- Worker distribuído — arquitetura de fila para distribuir consultas em múltiplos IPs e reduzir risco de throttling.
- Histórico isolado por token — cada integração (web, API, MCP) mantém seu próprio registro separado em vez do histórico global compartilhado atual.
- Quota de consultas por token — limite diário/mensal de rastreamentos configurável independentemente do rate limit por IP.
- Notificação de atualização — webhook ou push notification quando um objeto muda de status desde a última consulta.
Este projeto consulta exclusivamente o sistema público dos Correios — os mesmos dados acessíveis por qualquer pessoa pelo site oficial, sem login ou cadastro.
Usos adequados:
- Acompanhamento pessoal de encomendas
- Integração com agentes AI para automação de processos legítimos
- Monitoramento de entregas em sistemas próprios
O projeto não se destina a:
- Varredura em massa sem finalidade específica
- Qualquer uso que sobrecarregue desnecessariamente a infraestrutura dos Correios
- Qualquer uso que viole os termos de serviço ou a legislação brasileira vigente
O código é aberto e auditável. A responsabilidade pelo uso é inteiramente do operador que implanta e utiliza o serviço. Rate limiting está configurado por padrão para desincentivar abuso.
| Pacote | Uso |
|---|---|
| FastMCP | Framework MCP server |
| FastAPI | REST API |
| slowapi | Rate limiting por IP |
| curl-cffi | HTTP com impersonação TLS Chrome |
| PyTorch | Rede neural CRNN para CAPTCHA |
| torchvision | Transforms e augmentation de imagem |
| Pillow | Processamento de imagem |
| python-dotenv | Carregamento de variáveis do .env |
MIT © 2026 Nícolas Pastorello