Você ouviu falar que a Conta Azul agora tem um MCP e ficou na dúvida: preciso trocar a minha integração do Power BI por isso? Eu sei como é. Sai novidade, ninguém explica a diferença, e você fica com medo de estar usando a ferramenta errada.
Resposta curta: não troque. A API REST e o MCP chegam nos mesmos dados do ERP, com o mesmo access_token. O que muda é quem faz a chamada: na REST, um código que você escreveu. No MCP, um agente de IA que decide quais chamadas fazer a partir de uma pergunta.
Neste artigo você vai ver quatro pedidos reais feitos pelos dois caminhos, lado a lado, aprender a conectar o MCP no Claude Code e sair sabendo qual usar em cada situação. Bora lá.
Requisitos
- Conta Azul com plano ativo e uma aplicação cadastrada no Portal do Desenvolvedor (
client_id,client_secreteredirect_uri). Se ainda não tem o token, comece pelo artigo Conta Azul: como tratar o Extrato de Movimentações no Power BI - API REST: Conta Azul API v2, servidor
https://api-v2.contaazul.com. Qualquer aplicação cadastrada pode usar - MCP: endpoint
https://api-v2.contaazul.com/mcp. Na fase de testes, **só funciona paraclient_idliberado pela Conta Azul**. Ainda não se sabe se nem como o acesso será aberto depois - Cliente de IA para o MCP: Claude Code, Cursor ou VS Code. O protocolo usado é o MCP versão
2025-06-18 - Válido em: outubro/2026, conforme a documentação oficial da Conta Azul e a especificação do MCP
O token dá acesso aos dados reais da empresa que fez o login. Para testar, use uma conta de teste, principalmente nas ferramentas que gravam.
O que é cada um
A API REST tem um endereço por recurso (/v1/...), responde em JSON e é documentada em OpenAPI. Quem integra, seja um backend, o Power BI ou um e-commerce, escreve cada chamada.
O MCP (Model Context Protocol) é um servidor que expõe ferramentas para um cliente de IA. O agente lê a lista de ferramentas, escolhe quais chamar e monta a resposta em texto. Não confunda com developers.contaazul.com/mcp: esse é outro servidor, que serve para buscar na documentação e não acessa dados do ERP.
| API REST | MCP | |
|---|---|---|
| Endereço | https://api-v2.contaazul.com/v1/... | https://api-v2.contaazul.com/mcp |
| Quem chama | O seu sistema (backend, BI, CRM) | Um cliente de IA, em nome de um modelo |
| Como descobrir o que existe | Documentação OpenAPI por área | tools/list devolve as ferramentas |
| Autenticação | Authorization: Bearer <access_token> | O mesmo header, com o mesmo token |
| Quem tem acesso | Toda aplicação cadastrada | Só client_id liberado, na fase de testes |
| Limite de chamadas | 600 por minuto e 10 por segundo, por conta conectada | Não documentado |
| Documentação pública | developers.contaazul.com | Nenhuma página pública |
Na prática: o MCP é a REST embalada para um agente. Quando listamos as ferramentas em 26/10/2026 (tools/list, com um token real), vieram 58: 44 só leem dados e 14 gravam no ERP. Elas espelham os endpoints da REST. A Conta Azul não publica essa lista, então ela pode mudar.
1 Conecte os dois com o mesmo token
O token vem do fluxo OAuth 2.0 da Conta Azul: você autoriza em https://login.contaazul.com/#/oauth/authorize, troca o código em https://api-v2.contaazul.com/oauth/token e recebe um access_token que vale 1 hora (expires_in: 3600) e um refresh_token.
Quando o access_token vence, renove:
curl 'https://api-v2.contaazul.com/oauth/token' \
-H 'Authorization: Basic BASE64(SEU_CLIENT_ID:SEU_CLIENT_SECRET)' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'refresh_token=SEU_REFRESH_TOKEN'
Conforme a documentação oficial; não executado aqui.
O refresh_token muda a cada renovação e o anterior deixa de valer. Grave sempre o novo. Se dois processos renovarem o token da mesma empresa ao mesmo tempo, um deles recebe invalid_refresh_token.
Com o token na mão, conecte o MCP no Claude Code:
claude mcp add --transport http contaazul https://api-v2.contaazul.com/mcp \
--header "Authorization: Bearer SEU_ACCESS_TOKEN"
Rode /mcp dentro do Claude Code: o servidor contaazul deve aparecer conectado. No Cursor, o mesmo vai no mcp.json:
{
"mcpServers": {
"contaazul": {
"url": "https://api-v2.contaazul.com/mcp",
"headers": { "Authorization": "Bearer SEU_ACCESS_TOKEN" }
}
}
}
Comandos conforme as documentações do Claude Code e do Cursor; não executados contra a Conta Azul neste artigo.
O header fica fixo na configuração. Como o token vence em 1 hora, você tem dois caminhos: rodar claude mcp remove contaazul e adicionar de novo, ou usar um headersHelper, um comando que imprime os cabeçalhos em JSON a cada conexão (veja na Dica bônus).
O que o cliente de IA faz por baixo
Você não precisa escrever isso, mas ajuda entender. O MCP usa Streamable HTTP: toda mensagem é um POST em /mcp, com Content-Type: application/json e Accept: application/json, text/event-stream. A sequência é:
initialize: o cliente se apresenta e informa a versão do protocolonotifications/initialized: confirma o início da sessãotools/list: devolve as ferramentastools/call: executa uma ferramenta pelo nome, com os argumentos em JSON
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"teste","version":"1.0.0"}}}
Depois do initialize, o cliente envia também o header MCP-Protocol-Version: 2025-06-18 em todas as requisições, e o servidor pode devolver um Mcp-Session-Id que volta nas mensagens seguintes. Tudo isso está na especificação do MCP.
2 Pergunta simples: "Quanto tenho a receber esta semana?"
Uma pergunta, uma consulta.
Pela REST, quem programa calcula as datas (de 26/10 a 01/11/2026) e chama a busca de contas a receber:
curl 'https://api-v2.contaazul.com/v1/financeiro/eventos-financeiros/contas-a-receber/buscar?pagina=1&tamanho_pagina=50&data_vencimento_de=2026-10-26&data_vencimento_ate=2026-11-01' \
-H 'Authorization: Bearer SEU_ACCESS_TOKEN'
Conforme a especificação OpenAPI do Financeiro; não executado aqui.
A resposta traz itens_totais, itens (as parcelas, cada uma com total, status e cliente.nome) e totais. Cuidado com esse último: ele conta parcelas ativas e inativas (ativo, inativo, todos), não soma dinheiro. Para saber quanto vai entrar, você soma o total de cada parcela e, se itens_totais passar de 50, pede a página 2.
Pelo MCP, o usuário escreve no cliente de IA:
Quanto tenho a receber esta semana, e de quais clientes?
O agente calcula as datas sozinho e chama buscarParcelasAReceberPorFiltro com os mesmos filtros da REST:
{"data_vencimento_de": "2026-10-26", "data_vencimento_ate": "2026-11-01", "pagina": 1, "tamanho_pagina": 50}
Depois responde em texto. Exemplo com valores fictícios:
Você tem R$ 12.400,00 a receber esta semana, em 5 parcelas. Os maiores valores são da Conectai (R$ 6.000,00) e da Loja Exemplo (R$ 3.200,00).
A diferença: na REST, as datas, a paginação e a soma estão no seu código. No MCP, o agente cuida disso e entrega a resposta pronta para ler.
tamanho_pagina só aceita 10, 20, 50, 100, 200, 500 ou 1000. A partir de 10/11/2026, as buscas de contas a pagar e a receber também passam a limitar o período a 1 ano. Detalhes no artigo API Conta Azul muda em 10/11: ajuste sua carga no Power BI.
3 Pergunta encadeada: "Qual o saldo de cada conta?"
Aqui uma resposta depende de outra: primeiro é preciso saber quais contas existem.
Pela REST, você escreve as duas etapas:
curl 'https://api-v2.contaazul.com/v1/conta-financeira?pagina=1&tamanho_pagina=50' \
-H 'Authorization: Bearer SEU_ACCESS_TOKEN'
curl 'https://api-v2.contaazul.com/v1/conta-financeira/ID_DA_CONTA/saldo-atual' \
-H 'Authorization: Bearer SEU_ACCESS_TOKEN'
Conforme a especificação OpenAPI do Financeiro; não executado aqui.
A primeira lista as contas (id, nome, tipo, banco). A segunda devolve { "saldo_atual": 18250.00 } para cada id. Com 3 contas, são 4 requisições, e o laço que as encadeia está no seu código.
Pelo MCP:
Qual o saldo atual de cada conta?
O agente decide a ordem sozinho: chama listarContasFinanceiras, lê os ids e chama obterSaldoDaContaFinanceira uma vez por conta. Saída de exemplo, com valores fictícios:
Conta corrente: R$ 18.250,00. Poupança: R$ 4.130,00. Caixa: R$ 600,00.
A diferença: as 4 chamadas acontecem dos dois jeitos. Na REST, você planeja o encadeamento. No MCP, o agente descobre que precisa dele.
4 Gravar no ERP: "Lance uma receita de R$ 500 da Conectai para 10/11"
Agora o pedido altera dados.
Pela REST, o sistema monta o corpo com os campos obrigatórios e envia um POST:
curl -X POST 'https://api-v2.contaazul.com/v1/financeiro/contas-a-receber' \
-H 'Authorization: Bearer SEU_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"descricao":"Serviço de consultoria","data_competencia":"2026-11-10","valor":500,"id_cliente":"ID_DO_CLIENTE","conta_financeira":"ID_DA_CONTA","rateio":[{"id_categoria":"ID_DA_CATEGORIA","valor":500}],"condicao_pagamento":{"parcelas":[{"descricao":"Parcela 1","data_vencimento":"2026-11-10","conta_financeira":"ID_DA_CONTA","detalhe_valor":{"valor_bruto":500}}]}}'
Corpo conferido contra a especificação OpenAPI do Financeiro; não executado aqui.
Os três ids (cliente, conta e categoria) vêm de consultas anteriores ou do cadastro do seu sistema. É o caso típico de integração: a cada pedido pago no e-commerce, o sistema lança a receita sem ninguém olhar.
Desde 18/10/2026, esse POST devolve 201 com a conta criada (com o id e as parcelas), e os erros de validação voltam na própria resposta, com 400. Antes, ele devolvia um protocolo com status PENDING, e você precisava consultar GET /v1/protocolo/{id}. Essa API de Protocolos deixou de existir. Se a sua integração ainda espera o protocolo, ajuste.
Pelo MCP:
Lance uma receita de R$ 500 da Conectai, com vencimento em 10/11, na conta corrente.
O agente precisa descobrir os mesmos ids:
- Busca o cliente com
buscarPessoasPorFiltro - Busca a conta com
listarContasFinanceiras - Busca a categoria com
buscarCategoriasPorFiltro - Chama
criarEventoFinanceiroARecebercom um corpo igual ao da REST
Se faltar informação, como a categoria, um bom agente pergunta antes. Se não perguntar, ele pode escolher sozinho.
O cuidado: essa chamada grava de verdade no ERP. No Claude Code, mantenha a aprovação manual: ele mostra a ferramenta e os argumentos e só executa depois do seu sim. Confira valor, data, cliente e categoria antes de aprovar.
Das 58 ferramentas, as 14 que gravam são: criarEventoFinanceiroAReceber, criarEventoFinanceiroAPagar, criarBaixa, criarCobranca, criarCentroDeCusto, criarProduto, criarServico, criarVenda, criarOrcamento, criarPessoa, ativarPessoasEmLote, criarContrato, encerrarContrato e vincularNotaFiscalAoMdfe. Pelos nomes, nenhuma exclui registros nem edita os dados de um cadastro, mas quatro mudam algo que já existe: criarBaixa, encerrarContrato, ativarPessoasEmLote e vincularNotaFiscalAoMdfe. Para corrigir ou excluir, só a REST (por exemplo, PUT /v1/venda/{id}).
5 Faturamento do mês: onde o agente pode mudar o número
Aqui, faturamento é o valor das vendas aprovadas no mês, pela data de emissão. Testamos as duas chamadas em 26/10/2026 com uma conta real, e elas devolveram a mesma estrutura. Os valores abaixo são fictícios.
Pela REST:
curl 'https://api-v2.contaazul.com/v1/venda/busca?data_inicio=2026-10-01&data_fim=2026-10-31&pagina=1&tamanho_pagina=10' \
-H 'Authorization: Bearer SEU_ACCESS_TOKEN'
Parâmetros conforme a especificação OpenAPI de Vendas.
A resposta traz o bloco totais já somado para o período inteiro, então você não precisa percorrer as páginas de vendas:
{
"totais": { "total": 58300.00, "aprovado": 52100.00, "cancelado": 1900.00, "esperando_aprovacao": 4300.00 },
"quantidades": { "total": 47, "aprovado": 42, "cancelado": 2, "esperando_aprovacao": 3 },
"total_itens": 47,
"itens": [ "..." ]
}
O faturamento é totais.aprovado: R$ 52.100,00 em 42 vendas. As canceladas ficam de fora, e as que esperam aprovação podem entrar como previsão.
A especificação tem um parâmetro totais (valores WAITING_APPROVED, APPROVED, CANCELED e ALL) que define o tipo de total. Na chamada que testamos, o bloco veio sem ele. Se a sua resposta vier sem totais, teste incluir o parâmetro.
Pelo MCP:
Qual o faturamento deste mês até agora? Compare com o mês passado.
O agente monta o período de outubro, chama buscarVendasPorFiltro (que devolve o mesmo JSON da REST), chama de novo para setembro e responde em texto:
O faturamento de outubro até hoje é de R$ 52.100,00, em 42 vendas aprovadas. Em setembro inteiro foram R$ 61.800,00. Há ainda R$ 4.300,00 em 3 vendas esperando aprovação.
A diferença: a consulta por trás é a mesma. Na REST, você decide uma vez que faturamento é totais.aprovado. No MCP, o agente interpreta a pergunta a cada vez: se ele usar total em vez de aprovado, as vendas canceladas entram no número. Por isso, diga no pedido o que conta, por exemplo "só vendas aprovadas".
Se para vocês faturamento for nota fiscal emitida, o caminho é outro: buscarNotasFiscaisProdutoPorFiltro e buscarNotasFiscaisServicoPorFiltro no MCP.
6 Qual usar em cada situação
Regra de bolso: REST para o que roda sozinho, MCP para perguntas feitas por pessoas.
| Situação | Use | Por quê |
|---|---|---|
| Sincronizar clientes, vendas ou títulos com outro sistema | API REST | Chamadas previsíveis, renovação automática do token e limite documentado |
| Alimentar o Power BI ou rodar uma rotina agendada | API REST | Traz todos os registros, página a página; o código controla paginação, tentativas e limite |
| Cadastrar ou corrigir em volume, como 10 mil produtos | API REST | O código controla o ritmo e registra cada erro. No limite de 600 chamadas por minuto, 10 mil cadastros levam cerca de 17 minutos |
| Perguntar sobre os dados em linguagem natural | MCP | O agente escolhe as ferramentas e monta a resposta |
| Conferir por amostragem depois de uma carga | MCP | O agente lê uma amostra e aponta o que parece incoerente; a correção volta pela REST |
| Explorar um caso de uso antes de construir | MCP | Mostra o que dá para fazer sem escrever código |
Por que volume não vai pelo MCP: tudo o que o MCP devolve passa pelo modelo de IA, que lê e cobra por tokens de IA (pedaços de texto). Uma carga de milhares de registros fica lenta, cara e arrisca o modelo pular linhas. A REST entrega o mesmo volume direto ao código, com contagem exata.
"token" tem dois sentidos aqui. O access_token é a chave de acesso, a mesma na REST e no MCP. Os tokens de IA são o texto que o modelo lê e cobra. Só o MCP consome os de IA.
Os dois funcionam bem juntos: a REST faz a carga, e o MCP confere por amostragem. Rodar a REST não exige servidor próprio. Para uma carga pontual, basta um script no computador ou um fluxo no n8n.
Erros comuns
401 na REST
{"erro": "invalid_token", "descricao": "O access token fornecido é inválido ou expirou."}
Token inválido, expirado ou emitido pelo fluxo de autorização antigo. Renove com o refresh_token ou faça um novo login.
401 no MCP
{"error": "unauthorized", "error_description": "Bearer token is required"}
O header Authorization não foi enviado. Note que o formato do erro é outro: a REST responde erro/descricao, em português, e o MCP responde error/error_description, no padrão OAuth.
500 na REST ao esquecer o header
Se você chamar a REST sem o header Authorization, a resposta não é 401, e sim um 500 de gateway, com uma mensagem começando assim:
{"fault":{"faultstring":"Execution of JS-EXTRACT-LOKI-VARIABLES failed ..."}}
Não é a API fora do ar. Confira se o header Authorization: Bearer ... está indo na requisição.
invalid_grant na troca do código ou na renovação
Resposta 400 com error: invalid_grant. A causa muda conforme o error_subtype:
error_subtype | Causa | O que fazer |
|---|---|---|
invalid_refresh_token | O refresh_token não existe ou já foi usado | Envie o último recebido; sem ele, faça novo login |
access_revoked | A empresa, o suporte ou o integrador revogou o acesso | Novo fluxo de autorização e novo consentimento |
Na troca do código, invalid_grant também aparece com código já usado, redirect_uri diferente do cadastrado ou client_id incorreto.
invalid_client
O header Authorization: Basic está malformado. Confira o Base64 de client_id:client_secret.
429 Too Many Requests
Você passou de 600 chamadas por minuto ou de 10 por segundo, por conta conectada. Espere e repita com backoff exponencial, e olhe os cabeçalhos de rate limit da resposta.
400 na busca com tamanho_pagina inválido
A API só aceita 10, 20, 50, 100, 200, 500 ou 1000. Qualquer outro valor devolve 400.
403 com status_conta
Em 26/10/2026, um token válido de uma conta com plano suspenso recebeu o mesmo 403 na REST e no MCP:
{"descricao_erro":"A conta não está elegível para uso da API devido ao status atual do plano.","status_conta":"SUSPENDIDA"}
O plano da empresa que fez o login precisa estar ativo. Se a REST responde 200 e o MCP responde 403 sem status_conta, o provável é que o seu client_id ainda não tenha sido liberado para o MCP. Esse caso nós ainda não vimos acontecer, então trate como hipótese.
Teste a REST antes do MCP. Se os dois falham igual, o problema é o token ou a conta. Se só o MCP falha, o problema é o acesso ao MCP.
Dica bônus
Trave a escrita. O token não tem permissão por ferramenta: quem tem o token pode chamar as 58. Se o uso for só consulta, bloqueie as 14 que gravam no Claude Code, com uma regra deny por ferramenta no formato mcp__<servidor>__<ferramenta>. No .claude/settings.json:
{
"permissions": {
"deny": [
"mcp__contaazul__criarVenda",
"mcp__contaazul__criarBaixa",
"mcp__contaazul__encerrarContrato"
]
}
}
Complete a lista com as outras 11 ferramentas da seção 4. As regras deny são avaliadas antes das de allow e ask, então um allow genérico não anula o bloqueio. Formato conforme a documentação de permissões do Claude Code.
Renove o token sozinho. Em vez de remover e adicionar o servidor a cada hora, use um headersHelper: um comando que escreve um objeto JSON com os cabeçalhos na saída padrão. O Claude Code o roda ao conectar, desiste dele após 10 segundos, e os cabeçalhos dinâmicos sobrescrevem os estáticos. Você escreve o script que devolve o Authorization com o token renovado (e que grava o novo refresh_token a cada renovação). A configuração aponta o servidor para o comando, em vez de fixar o header:
{
"mcpServers": {
"contaazul": {
"type": "http",
"url": "https://api-v2.contaazul.com/mcp",
"headersHelper": "/caminho/absoluto/gera-headers-contaazul.sh"
}
}
}
O script imprime algo como {"Authorization": "Bearer SEU_ACCESS_TOKEN"} na saída padrão. Use o caminho absoluto do script, porque o Claude Code escolhe o diretório de trabalho conforme o lugar onde o servidor foi configurado. Conforme a documentação do Claude Code; não executado contra a Conta Azul.
Conclusão
Agora você sabe quando usar cada um: REST para integrações, BI e cargas, onde o código manda, e MCP para perguntar, explorar e conferir, onde o agente conduz. Os dados e o token são os mesmos. O que muda é quem decide as chamadas, e por isso o MCP pede mais cuidado quando o pedido grava.
Se você quer aprender a puxar os dados da Conta Azul direto no Power BI, o curso Chora API parte do zero, e as aulas usam consultas reais na Conta Azul. Dúvidas ou casos que você testou com o MCP? Conta aqui nos comentários, na comunidade #conectados.
Quer dominar integrações com o Conta Azul e outros ERPs?
Na Formação Chora API você aprende a puxar os dados direto do sistema por API e a atualizar o relatório sozinho. As aulas usam consultas reais em Conta Azul, Omie, Bling e Nibo.
Ver a Formação →Referências
Consultadas em 31/10/2026.
- Introdução às APIs Conta Azul (Portal do Desenvolvedor)
- Requisitos mínimos e rate limits (Portal do Desenvolvedor)
- Erros comuns na integração (Portal do Desenvolvedor)
- Renovando seu Access Token (Portal do Desenvolvedor)
- Financeiro v1, especificação OpenAPI e aviso de 18/10/2026 (Portal do Desenvolvedor)
- Vendas v1, especificação OpenAPI (Portal do Desenvolvedor)
- Model Context Protocol: Transports, versão 2025-06-18
- Model Context Protocol: Lifecycle, versão 2025-06-18
- Claude Code: conectar ferramentas via MCP
- Claude Code: permissões
- Cursor: Model Context Protocol
- Lista de ferramentas do MCP e teste de faturamento: consulta feita pelo autor em 26/10/2026, com token real. A Conta Azul não publica documentação do MCP.