AgentStack
MCP verified MIT Self-run

Correios Rastreamento

mcp-opastorello-correios-rastreamento · by opastorello

MCP server + REST API para rastreamento de objetos dos Correios com solver de CAPTCHA CRNN (99.6% acuracia)

No reviews yet
0 installs
12 views
0.0% view→install

Install

$ agentstack add mcp-opastorello-correios-rastreamento

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access Used
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets Used
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of Correios Rastreamento? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

📦 Correios Rastreamento

> 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.


💡 O que este projeto faz

| | | |--|--| | 📦 | 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.


🤖 MCP Tools

| 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 |


🌐 REST API

| 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).

📂 Histórico de rastreamentos

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/save com os dados do objeto.

🏗️ Arquitetura

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 FastMCP
  • routers/ e mcp_server.py — importam apenas de services/
  • I/O bloqueante em services/correios.py é sempre executado via run_in_threadpool

⚙️ Configuração

Todas as opções são lidas de variáveis de ambiente ou do arquivo .env na raiz do projeto.

Referência completa de variáveis

| 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 |

🔒 Rotas abertas por ambiente

| 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_TOKEN estiver vazio, o middleware ignora autenticação em qualquer ambiente.


🔐 Autenticação

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.


🚀 Instalação

Docker (recomendado)

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 -d

Local

pip install -r requirements.txt
cp .env.example .env
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload

Após iniciar:

  • Interface web: http://localhost:8000/
  • REST docs: http://localhost:8000/docs (apenas em ENV=development)
  • MCP endpoint: http://localhost:8000/mcp

📋 Exemplos de uso

Rastrear um objeto

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" } }
    }
  ]
}

Rastrear múltiplos objetos

curl -X POST http://localhost:8000/rastreamento/multiplos \
  -H "Content-Type: application/json" \
  -d '{"codigos": ["AA000000000BR", "AA000000001BR"]}'

🧠 Modelo de CAPTCHA

Arquitetura CRNN

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)

Histórico de treino

| 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.

Fluxo de scraping

Objeto único:

  1. GET index.php — session cookie
  2. GET securimage_show.php — imagem CAPTCHA
  3. Resolve com CRNN local (99.62% acurácia)
  4. GET resultado.php?objeto={code}&captcha={text}&mqs=S — JSON com eventos
  5. 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)

Treinar o modelo

1. Coletar amostras

python -m app.captcha.collector --probe AA000000000BR --target 20000 --workers 8

2. Treinar do zero

python -m app.captcha.train --epochs 80 --batch 128 --lr 1e-3

3. Fine-tuning a partir de checkpoint

python -m app.captcha.train --epochs 60 --batch 128 --lr 1e-4 --checkpoint app/captcha/captcha_model.pt

O melhor modelo (menor val_loss) é salvo em app/captcha/captcha_model.pt. Para consultar o histórico de versões:

python -m app.captcha.registry

🗺️ Roadmap

Ideias e melhorias planejadas para versões futuras.

Escalabilidade

  • 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.

Multi-usuário

  • 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.

Cobertura

  • Notificação de atualização — webhook ou push notification quando um objeto muda de status desde a última consulta.

⚖️ Responsabilidade de Uso

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.


📦 Dependências principais

| 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 |


📄 Licença

[MIT](LICENSE) © 2026 Nícolas Pastorello

Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.