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_secret e redirect_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 para client_id liberado 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
Atenção

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 RESTMCP
Endereçohttps://api-v2.contaazul.com/v1/...https://api-v2.contaazul.com/mcp
Quem chamaO seu sistema (backend, BI, CRM)Um cliente de IA, em nome de um modelo
Como descobrir o que existeDocumentação OpenAPI por áreatools/list devolve as ferramentas
AutenticaçãoAuthorization: Bearer <access_token>O mesmo header, com o mesmo token
Quem tem acessoToda aplicação cadastradaSó client_id liberado, na fase de testes
Limite de chamadas600 por minuto e 10 por segundo, por conta conectadaNão documentado
Documentação públicadevelopers.contaazul.comNenhuma 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.

Atenção

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

  1. initialize: o cliente se apresenta e informa a versão do protocolo
  2. notifications/initialized: confirma o início da sessão
  3. tools/list: devolve as ferramentas
  4. tools/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.

Atenção

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.

Atenção

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:

  1. Busca o cliente com buscarPessoasPorFiltro
  2. Busca a conta com listarContasFinanceiras
  3. Busca a categoria com buscarCategoriasPorFiltro
  4. Chama criarEventoFinanceiroAReceber com 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.

Dica

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çãoUsePor quê
Sincronizar clientes, vendas ou títulos com outro sistemaAPI RESTChamadas previsíveis, renovação automática do token e limite documentado
Alimentar o Power BI ou rodar uma rotina agendadaAPI RESTTraz 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 produtosAPI RESTO 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 naturalMCPO agente escolhe as ferramentas e monta a resposta
Conferir por amostragem depois de uma cargaMCPO agente lê uma amostra e aponta o que parece incoerente; a correção volta pela REST
Explorar um caso de uso antes de construirMCPMostra 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.

Dica

"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

Erro 1

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.

Erro 2

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.

Erro 3

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.

Erro 4

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_subtypeCausaO que fazer
invalid_refresh_tokenO refresh_token não existe ou já foi usadoEnvie o último recebido; sem ele, faça novo login
access_revokedA empresa, o suporte ou o integrador revogou o acessoNovo 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.

Erro 5

invalid_client

O header Authorization: Basic está malformado. Confira o Base64 de client_id:client_secret.

Erro 6

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.

Erro 7

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.

Erro 8

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.

Dica

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.

Bônus

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.