Pitch: pixcli: por que escrevi uma CLI em Rust para Pix (e adicionei um MCP server para AI agents)
Fala, pessoal. Quero compartilhar um projeto que venho construindo nos últimos meses e as decisões técnicas por trás dele.
O contexto
Se você já integrou com APIs Pix de algum PSP, sabe que a experiência de desenvolvedor é... sofrível. Cada provedor implementa a spec do Bacen de um jeito, os SDKs disponíveis são pesados, e não existe nenhuma ferramenta de terminal para testar cobranças ou debugar webhooks. Eu queria algo como o stripe-cli ou o gh — ferramentas que resolvem o problema direto, sem firula.
O resultado é o pixcli: uma CLI open-source (MIT) para pagamentos Pix, escrita em Rust — e a primeira com integração nativa para AI agents via MCP.
🔗 https://github.com/pixcli/pixcli
Por que Rust?
Decisão pragmática, não hype.
-
Type safety importa quando se lida com dinheiro. Representar valores, status de pagamento e BR Codes como tipos fortes evita uma classe inteira de bugs. O compilador trabalha a seu favor.
-
Performance para o MCP server. O pixcli inclui um servidor MCP (Model Context Protocol) que permite AI agents interagirem com Pix. Isso precisa ser rápido e ter baixo consumo de memória — vai rodar como sidecar, não como o processo principal.
-
Distribuição. Um binário estático, sem runtime, sem dependências.
cargo install pixclie pronto. Não precisa de Node, Python, JVM, nada. -
Ecossistema. Crates como
clap,reqwest,serde,tokiosão maduras e bem mantidas. O workspace system do Cargo facilita projetos modulares.
Dito isso, Rust tem seus custos. Tempo de compilação, curva de aprendizado, e em algumas partes o borrow checker te faz repensar o design inteiro. Mas pra esse tipo de projeto — CLI, networking, tipos de domínio complexos — encaixou bem.
Decisões de arquitetura
O projeto é um Cargo workspace com 8 crates:
- pix-core: tipos compartilhados (Cobrança, Devolução, Webhook) como traits
- pix-brcode: geração de BR Codes seguindo spec EMV — isolada pra ser usada em outros projetos
- pix-provider: trait
PixProviderque abstrai qualquer PSP - pix-efi: implementação pra Efí/Gerencianet (mTLS, OAuth2, API v2)
- pix-config: gerenciamento de credenciais (keyring, arquivo, env vars)
- pix-mcp: MCP server — expõe Pix como ferramentas pra AI agents
- pix-webhook-server: servidor local pra receber callbacks
- pixcli: a CLI em si (clap v4)
A separação em crates não é capricho — cada uma pode ser versionada, testada e publicada independentemente. Alguém que só quer gerar BR Codes não precisa trazer a integração com Efí. Alguém que quer adicionar suporte ao Itaú implementa o trait PixProvider sem tocar no resto.
O MCP server: AI agents que fazem pagamentos
Essa foi a feature que mais mudou minha visão do projeto.
MCP (Model Context Protocol) é o padrão da Anthropic para AI agents chamarem ferramentas externas. Com o pix-mcp rodando, um agent compatível com MCP (Claude Code, OpenClaw, e outros) consegue criar cobranças Pix, verificar pagamentos e gerenciar webhooks sem nenhum código customizado do seu lado.
// Adicionar no .mcp.json do seu projeto
{
"mcpServers": {
"pixcli": {
"command": "pixcli",
"args": ["mcp", "serve"]
}
}
}
Pronto. A partir daí, o agent tem as ferramentas Pix disponíveis nativamente.
Os casos de uso concretos que me fizeram construir isso:
- E-commerce autônomo: agent que cria cobranças, monitora pagamentos, e dispara fulfillment sozinho
- Suporte com autonomia: agent que emite reembolso Pix na hora, sem escalar para humano
- Billing automatizado: pipelines financeiros que entendem contexto e reagem a inadimplência
Até onde sei, o pixcli é a primeira ferramenta Pix com integração nativa para AI agents. MCP está ganhando adoção rápida no ecossistema de AI agents — faz sentido construir a camada de pagamentos já preparada pra esse mundo.
Lições aprendidas
mTLS em Rust é trabalhoso. A maioria dos PSPs exige certificados client-side. Configurar isso com reqwest + native-tls ou rustls envolve converter formatos de certificado, lidar com PKCS#12 vs PEM, e testar em ambientes que nem sempre suportam. Gastei mais tempo nisso do que gostaria.
A spec do Bacen é boa, as implementações nem sempre. O padrão Pix é bem definido, mas cada PSP adiciona campos extras, muda nomes, ou interpreta de formas diferentes. O layer de abstração (pix-provider) nasceu dessa dor.
Testes são inegociáveis. Com 210+ testes, posso refatorar sem medo. Isso é especialmente importante num projeto financeiro onde um bug pode significar cobrança errada. Cada PR roda CI completo.
MCP muda o que é possível. Integrar o Model Context Protocol fez o projeto ganhar outra dimensão — deixou de ser só uma CLI e virou infraestrutura que AI agents podem usar diretamente.
Estado atual
- CLI funcional com criação de cobranças, consulta, QR codes, webhook server
- MCP server operacional — pronto pra uso com Claude Code, OpenClaw e outros runtimes
- 210+ testes, CI green
- Docs em construção (Fumadocs + Next.js)
- Suporte a Efí/Gerencianet, com mais PSPs no roadmap
Quer contribuir?
O projeto é MIT e está aberto. Contribuições de qualquer nível são bem-vindas — desde correção de typos até implementação de novos provedores ou novas ferramentas MCP. Se você usa Pix no dia a dia (quem não usa?) e gosta de Rust ou de AI agents, dá uma olhada.
Feedback honesto também é muito apreciado. O que funciona? O que não funciona? O que falta?