buzz-cli e harness ACP: como o Buzz conversa com Claude Code, Codex e Goose?

O buzz-cli é a CLI agent-first do Buzz, a plataforma de comunicação open source da Block: JSON na entrada, JSON na saída, stdout pra dados e stderr pra erros estruturados. Ele é a boca do agente dentro do canal. A ponte é outra peça: o buzz-acp, um harness ACP que mora no próprio repo, escuta menções com @ no relay e dispara o prompt no seu agente local por stdio. Como ACP é um protocolo aberto, dá pra plugar Goose (nativo), Claude Code (via claude-agent-acp) e Codex (via codex-acp) sem gambiarra
Fala aí, beleza? A Block soltou o Buzz e a primeira pergunta de quem já tem um agente rodando no terminal é sempre a mesma: dá pra plugar o meu ali dentro?
A resposta curta é sim, e ela passa por duas peças diferentes que costumam ser confundidas
Uma é o buzz-cli, a interface de linha de comando pensada pra ser usada por agente, não por humano
A outra é o buzz-acp, o harness que faz a ponte entre o canal e o agente que você já usa (o Claude Code que você já paga, e cujo preço em reais a gente já destrinchou, entra aqui também)
Bora entender cada uma delas =)
O que é o Buzz e por que ele trata agente como membro
O Buzz é uma plataforma de comunicação open source da Block, a empresa do Jack Dorsey
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Lançamento público em 21/07/2026, código aberto em github.com/block/buzz sob licença Apache 2.0, e construído em cima do protocolo Nostr
Até aí parece só mais um chat, né? A diferença mora na identidade
No Buzz não existe aquela conta centralizada com login e senha: cada participante recebe um par de chaves criptográficas próprio
E aqui vem o pulo do gato: isso vale pra humano E pra agente
O agente não é um bot pendurado na sua conta, ele é membro de primeira classe, com identidade própria e trilha de auditoria própria
Se você conhece assinatura de commit com GPG, a ideia de aproximação é essa: dá pra saber exatamente QUEM escreveu aquilo, e o agente responde pela chave dele, não pela sua
Como compilar e autenticar o buzz-cli
O caminho verificado hoje é compilar do fonte com Rust
- Clone o repositório
block/buzze compile a crate em modo release:
cargo build --release
O binário resultante NÃO se chama buzz-cli, ele se chama buzz, e sai em ./target/release/buzz
O erro comum deste passo é procurar um executável com o nome da crate e achar que a build falhou
- Exporte a sua chave privada Nostr na variável de ambiente que a CLI espera:
export BUZZ_PRIVATE_KEY="nsec1..."
É a chave privada mesmo, aquela nsec
O erro comum aqui é o clássico: colar isso num arquivo que vai pro Git
Tome cuidado! Chave privada em repositório é o tipo de coisa que estraga o dia
- Rode o primeiro comando, e preste atenção na ordem dos argumentos:
buzz --format compact channels list
O --format compact é uma flag GLOBAL, então ela precisa vir ANTES do subcomando
O erro comum deste passo é escrever buzz channels list --format compact e não entender por que a flag não pegou
buzz-cli: por que JSON na saída muda o jogo pro agente
CLI normal é feita pra você ler
Coluna alinhada, cor no terminal, um "✓ done" bonitinho no final
O problema é que isso é um inferno pra um LLM: ele precisa interpretar texto humano e adivinhar se deu certo
O buzz-cli inverte a lógica: a resposta sai pronta pra máquina, não pro olho
Toda saída é JSON no stdout, e os erros saem em JSON no stderr
Ou seja, os dois canais não se misturam: dado vai num cano, erro vai no outro, ambos estruturados
Os códigos de saída como regra de decisão
Essa parte é MUITO massa e passa batido pra maioria
O buzz-cli define códigos de saída específicos, então o agente decide o que fazer sem ler uma linha de texto:
0deu certo1erro do usuário2rede3auth4outro5conflito de escrita
Se liga no que isso permite: código 2 o agente pode tentar de novo, porque é rede
Código 3 não adianta insistir, é autenticação, tem coisa errada na chave
Código 5 é conflito de escrita, alguém mexeu antes, então a decisão é reler o estado e refazer
É decisão determinística em cima de um número, não achismo em cima de string
E a superfície MCP?
O buzz também expõe MCP, e a pergunta óbvia é se a CLI é redundante
Não é: a CLI espelha a superfície MCP e ainda estende ela
Além das mesmas primitivas, a CLI cobre operações de repo, upload e canvas, onde ela é a interface canônica
Como o buzz-acp conecta o seu agente ao canal
Agora a segunda peça
O buzz-acp é um harness ACP que vive dentro do próprio repositório do Buzz, como crate Rust em crates/buzz-acp
O fluxo completo é bem direto:
relay → menção com @ → prompt disparado no agente → resposta via buzz-cli
Traduzindo: o harness fica escutando o relay, alguém marca o agente com @ num canal, ele dispara aquilo como prompt pro agente local, e o agente responde usando o buzz-cli
O transporte: WebSocket de um lado, stdio do outro
São dois mundos diferentes conversando
Com o relay, o buzz-acp fala por WebSocket, com autenticação NIP-42
Com o agente local, ele fala por stdio, o velho stdin/stdout
É por isso que qualquer agente que fale ACP por stdio serve: o harness não precisa saber nada sobre o agente além de como escrever na entrada dele
A configuração
A configuração é por variável de ambiente, e cada variável tem uma flag de linha de comando equivalente
export BUZZ_ACP_AGENT_COMMAND="goose"
export BUZZ_ACP_AGENT_ARGS='-c,key="value"'
O BUZZ_ACP_AGENT_COMMAND (equivalente a --agent-command) aponta pro binário do agente
O BUZZ_ACP_AGENT_ARGS passa os argumentos separados por VÍRGULA, e não por espaço
O erro comum aqui é separar por espaço como você faria no shell normal
E tem um ponto de atenção que economiza uma hora de debug: BUZZ_RELAY_URL, BUZZ_PRIVATE_KEY e BUZZ_AUTH_TAG são injetadas automaticamente pelo buzz-acp no subprocesso do agente que ele gerencia
Você não precisa exportar essas três de novo pro agente, o harness faz isso
Claude Code, Codex e Goose no Buzz: o que muda em cada um
O denominador comum é o ACP, o Agent Client Protocol: JSON-RPC 2.0 rodando sobre stdin/stdout, criado pela Zed Industries e lançado em agosto de 2025, com a spec em agentclientprotocol.com
O que muda de agente pra agente é só quanto de adaptador você precisa no meio:
| Agente | Como fala ACP | Detalhe que importa |
|---|---|---|
| Goose | Nativo, sem adaptador externo | É o agente open source da própria Block, e ainda consegue usar Claude Code e Codex como provedores |
| Claude Code | Adaptador npm @agentclientprotocol/claude-agent-acp |
Construído em cima do Claude Agent SDK oficial da Anthropic; o antigo @zed-industries/claude-agent-acp está deprecated |
| Codex | Adaptador @agentclientprotocol/codex-acp |
Roda com CODEX_PATH apontando o binário do codex; autentica por login do ChatGPT ou por CODEX_API_KEY / OPENAI_API_KEY |
O Goose é o caminho mais curto por motivo óbvio: mesma casa
No Claude Code, a instalação do adaptador é o npm de sempre:
npm i @agentclientprotocol/claude-agent-acp
Atenção no nome do pacote: se você seguir tutorial antigo vai acabar no @zed-industries/..., que foi renomeado e está deprecated
No Codex, dá pra rodar sem instalar nada permanente:
CODEX_PATH=/caminho/para/codex npx -y @agentclientprotocol/codex-acp
E se a sua dúvida ainda é qual desses dois usar no dia a dia antes mesmo de plugar no Buzz, isso é outro papo: já rolou por aqui uma comparação entre Codex e Claude Code para programar
Vale plugar hoje? Limites conhecidos do buzz-acp e do buzz-cli
Agora a parte honesta, porque nem tudo que aparece em thread de lançamento já existe
O Cursor como runtime ACP de primeira classe no Buzz é issue ABERTA (a #2535), não é recurso entregue
Se você esperava plugar o Cursor hoje, ainda não é hoje
Tem também uma limitação reconhecida no buzz-acp: um servidor MCP por agente
A issue #2899 descreve o incômodo bem direto: isso força escolher entre o shell e qualquer servidor de domínio
Ou você dá o shell pro agente, ou dá o servidor MCP específico do seu contexto, não os dois
Dependendo do que você quer montar, isso pesa
E no buzz-cli, a saída em tabela é proposta na issue #2672, ainda não é recurso
O padrão continua sendo JSON, o que faz total sentido pro agente e é chatinho pra você ler no olho
Nada disso tem prazo, e eu não vou chutar nenhum: são issues abertas, ponto
Conclusão
No fim, dá pra guardar o post inteiro em duas frases
O buzz-cli é a BOCA do agente: JSON no stdout, erro em JSON no stderr, código de saída dizendo o que fazer
O buzz-acp é a PONTE: escuta a menção no canal, dispara o prompt no agente local por stdio e deixa a resposta voltar pela CLI
Quem já usa Goose, Claude Code ou Codex não precisa trocar de agente, precisa só falar ACP
O próximo passo concreto é bem curto: clona o block/buzz, roda o cargo build --release, exporta a BUZZ_PRIVATE_KEY e aponta o BUZZ_ACP_AGENT_COMMAND pro agente que já tá instalado na tua máquina
Depois é só marcar ele com @ num canal e ver a coisa acontecer 😀
até o próximo post!
Perguntas frequentes
Dá pra usar o Cursor como agente no Buzz?
Ainda não. Suporte ao Cursor como runtime ACP de primeira classe é a issue #2535, aberta no repositório block/buzz, ou seja, é pedido, não recurso entregue. Hoje a documentação cita goose, codex (via codex-acp) e Claude Code (via claude-agent-acp) como os agentes suportados.
O buzz-acp aceita mais de um servidor MCP rodando junto com o agente?
Essa é uma limitação reconhecida: existe apenas um servidor MCP por agente. Está discutida na issue #2899, que resume o problema como ter que escolher entre o shell e qualquer servidor de domínio. Então, por enquanto, é uma escolha, não uma composição.
O buzz-cli tem opção de saída em tabela, tipo texto formatado pra humano ler?
Não por padrão. A saída em tabela é uma proposta na issue #2672, que sugere um --format table, mas ainda não foi implementada. O padrão atual do buzz-cli continua sendo JSON no stdout e erros em JSON no stderr.
Como o Claude Code se conecta ao Buzz via ACP?
Através do pacote @agentclientprotocol/claude-agent-acp, instalado com npm i @agentclientprotocol/claude-agent-acp. Ele implementa o ACP em cima do Claude Agent SDK oficial da Anthropic. O nome antigo, @zed-industries/claude-agent-acp, está deprecated, então vale usar o pacote atual.
Preciso instalar algo separado pra ligar o Codex ao buzz-acp?
Sim, o codex-acp, hoje na versão da organização agentclientprotocol. Ele roda com CODEX_PATH=/caminho/para/codex npx -y @agentclientprotocol/codex-acp e aceita autenticação por login do ChatGPT ou por CODEX_API_KEY/OPENAI_API_KEY.
O goose precisa de algum adaptador pra funcionar como agente ACP no Buzz?
Não. O goose é o agente de IA open source da própria Block e já fala ACP nativamente, sem adaptador externo. Curiosamente, ele também consegue usar outros agentes ACP, como Claude Code e Codex, como provedores por baixo dos panos.
Formações
Formação SAAS com IA
Tire usas ideias do papel criando softwares com IA, integre pagamentos e lance seu projeto!
- 291 aulas
- 18 projetos
- 24h 17min
Blog | Mais populares
As diferenças de var, let e const
Como fazer redirecionamento com PHP
Neste artigo você vai aprender a como fazer redirecionamento com PHP, utilizaremos abordagens fáceis de entender e de aplicar Fala programador(a), beleza? Bora aprender mais […]
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação A popularidade da automação de processos com o n8n está em alta, principalmente […]
