Ecommapi — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Ecommapi (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<div align="center">
Plataforma Python de automação para e-commerce — sincroniza estoque entre o fornecedor e o ERP Bling em tempo real, propõe alterações de preço via IA (Claude / Gemini) sob revisão humana, e foi projetada para escalar até a automação completa de pedidos.
</div>
EcommAPI é uma plataforma de automação de operações de e-commerce que conecta três sistemas que normalmente vivem isolados:
O sistema é construído sobre uma filosofia central: a IA propõe, o humano aprova, e só então a mudança é aplicada. Nada de _auto-pilot_ irresponsável — toda alteração de preço, descrição ou estoque passa por uma camada explícita de aprovação humana antes de tocar o Bling.
A motivação é concreta e mensurável: substituir uma integração paga de terceiros que conectava a API do fornecedor ao Bling de forma limitada, custosa e sem visibilidade.
Construir a própria integração trouxe três ganhos:
| Benefício | Impacto |
|---|---|
| 💰 Economia direta | Eliminação do custo mensal recorrente do serviço externo |
| 🔧 Controle total | Lógica de sincronização ajustada à realidade do negócio, sem caixa-preta |
| 🤖 Extensibilidade com IA | Camada de inteligência para análise de vendas e sugestões de preço — impossível com a ferramenta paga |
flowchart LR
Supplier[("🏭 API do<br/>Fornecedor")] -->|estoque / preço| Sync["⚙️ sync_worker.py<br/>(loop 24/7)"]
Sync -->|diff incremental| State[("🗄️ SQLite<br/>state.db")]
Sync -->|2 req/s + backoff| Bling[("🛒 Bling ERP<br/>(API v3)")]
User([👤 Operador]) <-->|conversa| Claude["🧠 Claude / Gemini<br/>(brain.py)"]
Claude -->|MCP tools| Server["🔌 server.py<br/>(MCP Server)"]
Server -->|propostas| Pending[("📋 pending_<br/>changes.json")]
User -->|aprovação| Pending
Pending -->|aplicar| Bling
Bling -.->|webhook Fase 3| Future["🚀 fulfillment<br/>futuro"]Princípios de arquitetura:
| Princípio | Implementação |
|---|---|
| Human-in-the-loop | Toda mudança passa por aprovação humana antes de ser aplicada |
| Separação leitura/escrita | Ferramentas de análise são livres; só uma ferramenta escreve no Bling |
| Respeito a rate limits | 2 req/s contra o Bling com _exponential backoff_ em erros 429/5xx |
| Diff incremental | SQLite local armazena estado; só itens que mudaram são enviados |
| AI provider-agnostic | LLMProvider abstrai Claude e Gemini — troca-se um pelo outro sem mexer no resto |
| Audit trail completo | Toda alteração aplicada fica registrada em applied_log.jsonl |
| Camada | Tecnologia | Uso |
|---|---|---|
| Linguagem | Python 3.11+ | Toda a base do projeto |
| IA | Anthropic Claude (SDK anthropic) | Provedor de LLM padrão |
| IA | Google Gemini (SDK google-genai) | Provedor de LLM alternativo (intercambiável) |
| Protocolo | MCP — Model Context Protocol | Conecta a IA ao Bling via ferramentas padronizadas |
| ERP | Bling API v3 | Sistema central (produtos, estoque, vendas, preços) |
| Persistência | SQLite | Estado local para diff incremental do sync |
| Auth | OAuth 2.0 | Autorização do Bling com refresh automático de token |
| HTTP | requests | Cliente HTTP com retry e backoff |
| Config | python-dotenv | Variáveis de ambiente |
A IA nunca altera dados diretamente. Toda sugestão entra numa fila explícita (pending_changes.json) e só é aplicada quando o operador aprova por ID. É um _design pattern_ de segurança que evita o pesadelo clássico de "IA mudou o preço de mil produtos sozinha".
A camada brain.py define uma interface LLMProvider que abstrai Claude e Gemini. Trocar de provedor é uma linha de configuração — não uma refatoração. Isso protege o projeto de _vendor lock-in_ e permite escolher o melhor modelo para cada tipo de tarefa.
A API do Bling tem limites estritos (3 req/s, 120k/dia). O sync_worker.py opera deliberadamente abaixo do limite (2 req/s) e implementa _backoff_ exponencial em erros 429 e 5xx — uma demonstração de respeito a constraints externas e de robustez operacional.
Em vez de empurrar o catálogo inteiro do fornecedor para o Bling a cada ciclo, o worker mantém o estado anterior em SQLite e envia apenas o que mudou. Resultado: ordens de magnitude a menos de requisições, e respeito automático ao rate limit.
Mesmo com aprovação humana, uma trava de segurança (MAX_VARIACAO_PCT) impede mudanças bruscas de preço. Se a proposta exceder o limite configurado, ela é bloqueada antes mesmo de chegar na fila — proteção contra erros de digitação e respostas anômalas da IA.
O projeto é organizado em três fases evolutivas, cada uma agregando capacidades à anterior.
Worker 24/7 que mantém o estoque do Bling em paridade com o catálogo do fornecedor. Operações de estoque seguem o modelo v3 do Bling (POST /estoques com tipo B para saldo absoluto), com matching por campo codigo (SKU).
Servidor MCP (server.py) que expõe ao Claude (ou outro cliente MCP) ferramentas de análise e proposta:
listar_produtos, analisar_vendas, produtos_sem_giropropor_alteracao_preco, propor_alteracao_descricaolistar_alteracoes_pendentes, cancelar_propostaaplicar_alteracoes_aprovadasAlterações de preço vindas do fornecedor também caem nessa fila — nada é aplicado automaticamente.
Recebimento de eventos de pedido do Bling via webhook e criação automática do pedido na API do fornecedor. Requer:
O brain.py já é arquiteturalmente preparado para gerar sugestões de listings do Mercado Livre via API pública de _sellers_, mantendo o mesmo padrão de aprovação humana antes de aplicar qualquer mudança em anúncios.
1. Claude analisa vendas ─► propor_alteracao_preco ─► [proposta fica pendente]
│
▼
2. Você revisa o diff ◄──────────────────────────── pending_changes.json
│
▼
3. Aplicar IDs aprovados ─► aplicar_alteracoes_aprovadas ─► escreve no Bling
│
▼
applied_log.jsonlExemplo de uso conversacional:
_"Liste as vendas dos últimos 30 dias, identifique os 5 produtos com menor giro e proponha um desconto de 10% em cada um."_
O Claude chama as ferramentas de análise, raciocina sobre os dados, e cria propostas — sem tocar no Bling. Você revisa:
_"Aplique apenas as propostas abc123 e def456."_
Só então os dois preços específicos são alterados no ERP.
EcommAPI/
├── sync_worker.py # Worker 24/7 de sincronização de estoque (Fase 1)
├── server.py # Servidor MCP para preços e métricas (Fase 2)
├── brain.py # Camada AI provider-agnostic (Claude / Gemini)
├── bling_client.py # Cliente da API Bling v3 com OAuth + refresh
├── supplier_client.py # Cliente da API do fornecedor
├── pricing.py # Lógica de precificação e validações
├── state.py # Estado local em SQLite (diff incremental)
├── autorizar.py # Script de autorização OAuth inicial
├── pricing_rules.example.json # Template de regras de precificação
├── requirements.txt # Dependências Python
├── SETUP-sync.md # Guia detalhado de setup do worker
├── .env.example # Template de variáveis de ambiente
└── .gitignore # Proteção contra commits acidentais de segredosA segurança foi tratada como requisito de primeira classe, com múltiplas camadas:
.env e bling_tokens.json no .gitignore desde o primeiro commitMAX_VARIACAO_PCT bloqueia mudanças bruscas mesmo se aprovadasapplied_log.jsonl com antes/depoisSYNC_DRY_RUN=1 permite validar lógica sem tocar dados reaisBLING_SANDBOX=1 para testes em ambiente isolado antes da produçãoCrie um arquivo .env na raiz do projeto a partir do .env.example. Nunca commite valores reais.
# Bling — Credenciais OAuth
BLING_CLIENT_ID=<seu-client-id>
BLING_CLIENT_SECRET=<seu-client-secret>
BLING_DEPOSITO_ID=<id-do-deposito>
# Bling — Modo de operação
BLING_SANDBOX=1 # 1 = homologação, 0 = produção
MAX_VARIACAO_PCT=30 # Bloqueia variações de preço acima deste percentual
SYNC_DRY_RUN=0 # 1 = simula sem aplicar, 0 = aplica de verdade
# Fornecedor
SUPPLIER_API_URL=<url-da-api-do-fornecedor>
SUPPLIER_API_KEY=<sua-chave>
# Provedores de IA (escolha um ou ambos)
ANTHROPIC_API_KEY=<sua-chave-claude>
GEMINI_API_KEY=<sua-chave-gemini>Pré-requisitos: Python 3.11+ e conta no Bling com app criado.
git clone https://github.com/pedrofalchi-fullstack/EcommAPI.git
cd EcommAPI
# Criar e ativar ambiente virtual
python -m venv .venv
.\.venv\Scripts\activate # Windows
# source .venv/bin/activate # Linux/Mac
# Instalar dependências
pip install -r requirements.txtNo painel do Bling: Preferências → Integrações → API → Criar aplicativo. Anote o client_id e client_secret, e defina a _redirect URI_ (ex.: http://localhost:8080/callback).
cp .env.example .env # e preencha com os valores reaispython autorizar.pyO script abre o navegador, você autoriza, e o bling_tokens.json é gerado automaticamente. O cliente passa a renovar tokens sozinho a partir daí.
python sync_worker.pymcp dev server.pyCom o servidor MCP rodando, é possível conectá-lo ao Claude Desktop ou ao Claude Code.
Edite o arquivo de configuração de MCP servers e adicione (ajuste o caminho):
{
"mcpServers": {
"ecommapi": {
"command": "python",
"args": ["C:/caminho/completo/EcommAPI/server.py"]
}
}
}claude mcp add ecommapi python /caminho/completo/EcommAPI/server.pyDepois é só conversar com o Claude pedindo análises e propostas. Ele vai chamar as ferramentas, propor mudanças, e aguardar sua aprovação.
Desenvolvido por Pedro Henrique Falchi.
Este projeto está licenciado sob a Licença MIT — consulte o arquivo LICENSE para mais detalhes.
<div align="center">
_Construído com a filosofia de que IA aumenta humanos, não os substitui._ 🤖🤝
</div>
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.