MCP vs CLI: o que é cada um, quando usar e quando não
MCP (Model Context Protocol) padroniza como apps de IA descobrem e usam ferramentas externas. Mas nem todo agente precisa de MCP — CLI muitas vezes resolve melhor e mais barato. Explico o que é MCP, o fluxo client → server, casos de uso, quando não faz sentido, e por que CLI vence em vários cenários.
Tem uma confusão recorrente em conversas sobre agentes de IA: as pessoas tratam MCP como sinônimo de "agente que usa ferramentas", quando na verdade MCP é só uma das formas de entregar ferramentas a um modelo — e nem sempre a melhor.
Este post é um overview prático: o que é MCP, como o fluxo client → server funciona, em que casos faz sentido usar, em que casos CLI ganha, e por que function calling puro (SDK) resolve grande parte dos chats embutidos sem precisar de nenhum protocolo a mais.
A frase de uma linha
MCP é um protocolo aberto para apps de IA descobrirem e chamarem ferramentas externas de forma padronizada — útil quando o client e o server são de donos diferentes.
Tudo abaixo é detalhe técnico sobre essa frase.
O que é MCP
MCP (Model Context Protocol) é um padrão aberto criado pela Anthropic (final de 2024) para conectar modelos de IA a ferramentas, dados e sistemas externos.
A analogia oficial:
MCP é como a porta USB-C da IA. Antes, cada integração tinha um cabo diferente. Agora, qualquer modelo compatível conversa com qualquer ferramenta compatível pelo mesmo protocolo.
Em vez de N modelos × M ferramentas integrações customizadas, você tem um protocolo único que ambos os lados falam.
O problema que MCP resolve
Um LLM sozinho só sabe gerar texto a partir do que recebe no contexto. Ele não acessa seu banco de dados, seus arquivos, sua agenda, a internet. Antes do MCP, cada integração entre um modelo e uma ferramenta era feita à mão, de um jeito diferente para cada combinação.
MCP padroniza essa ponte.
Arquitetura — quem fala com quem
Mapa de arquitetura
Host
Modelo / app de IA
Claude Desktop, Claude Code, Cursor, ChatGPT ou seu produto embutido.
Lado consumidor
MCP client
Descobre tools, envia schemas ao modelo e roteia chamadas.
Lado provedor
MCP server
Expõe capacidades via JSON-RPC por stdio ou HTTP/SSE.
Sistema de apoio
Dado / ferramenta
Postgres, GitHub, arquivos, Slack, APIs internas ou ações SaaS.
- Host / Client: a aplicação de IA. É ela que fala MCP do lado do consumidor (Claude Desktop, Cursor, seu app embutido).
- MCP Server: um programa que expõe capacidades de um sistema externo seguindo o protocolo. Existe um oficial para GitHub, Postgres, Google Drive, sistema de arquivos, Playwright. E você pode escrever o seu.
A comunicação usa JSON-RPC e roda por stdio (local) ou HTTP/SSE (remoto).
As três primitivas de um MCP Server
| Primitiva | O que é | Exemplo |
|---|---|---|
| Tools | Ações que o modelo pode executar | create_issue, run_query, send_email |
| Resources | Dados que o modelo pode ler | arquivos, registros de DB, documentos |
| Prompts | Templates de prompt reutilizáveis | "resuma este PR seguindo este formato" |
Tools são o que mais aparece na prática.
O fluxo completo: do usuário ao banco e de volta
Vale visualizar passo a passo o que acontece quando alguém faz uma pergunta para um agente conectado a um MCP server:
Fluxo em runtime
Usuário faz uma pergunta de negócio
"quantas inscrições teve meu evento?"
Client envia prompt + tools disponíveis
tools = [listar_inscricoes, criar_evento, gerar_link, reembolsar]
LLM escolhe qual tool chamar
listar_inscricoes(eventoId: "abc")
Client chama o MCP server
{"method":"tools/call","params":{"name":"listar_inscricoes"}}
MCP server executa backend normal
tRPC, SQL, API interna, OAuth, RBAC, depois { total: 22 }
Client devolve o resultado ao LLM
tool result: { total: 22 }
LLM escreve a resposta final
"Seu evento teve 22 inscrições pagas até agora."
Resposta é entregue
O server não pensa; quem paga inferência é o client.
Dois detalhes que pouco se diz em voz alta:
- O MCP server não gasta tokens. Ele é um servidor de dados comum. Quem queima token é o client, em dois pontos: enviar tools+prompt pro modelo, e mandar de volta o resultado da tool como input.
- Retorno gordo encarece tudo. Se a tool devolve uma lista de 500 registros em JSON, isso entra como input para o próximo turno do modelo. Por isso vale agregar no servidor (
SELECT COUNT(*)) e devolver enxuto.
Como um cliente "se conecta" ao seu MCP server
Suponha que você expôs um MCP server pro seu produto (digamos, um SaaS de eventos). Um cliente final não "abre conexão MCP" — ele usa um app de IA que é o client. Os caminhos reais:
| Client (host) | Como o usuário adiciona seu MCP |
|---|---|
| Claude Desktop / Claude.ai | Settings → Connectors → "Add custom connector" → cola a URL |
| ChatGPT (com suporte a MCP/connectors) | Adiciona connector apontando para a mesma URL |
| Cursor / VS Code / Claude Code | Edita .mcp.json com a URL do servidor |
| App embutido no próprio produto | Você é o client e o server — não precisa nem expor o MCP publicamente |
O fluxo do usuário final é literalmente:
- Cola a URL do seu MCP.
- Faz login → aparece tela OAuth ("Autorizar Claude a acessar sua conta?").
- Clica "Permitir".
- Conversa em linguagem natural — o client descobre as tools, o modelo escolhe quais chamar.
O protocolo é a porta padronizada. O OAuth + autorização do seu lado é a fechadura. Sem auth decente, qualquer um conecta e enxerga os dados de outro tenant.
Casos de uso reais (consumir e expor)
Há dois lados:
Consumindo MCP
Quando você quer que seu agente ganhe acesso a um sistema externo:
- MCP do Postgres — durante dev, o agente inspeciona schema e dados pra te ajudar a escrever queries (idealmente apontando para dev, nunca produção com escrita).
- MCP do GitHub — abrir/revisar PRs, ler issues, comentar sem sair do editor.
- MCP do Playwright — dirigir um navegador real pra validar fluxos (E2E orientado por agente).
- MCPs de integrações que você usa (Slack, Linear, Sentry, Google Drive) — o agente já chega ao debug com contexto.
Regra mental:
Toda vez que, pra eu te ajudar, você precisaria copiar e colar dados de um sistema externo (saída de query, status de cobrança, log de e-mail, conteúdo de issue) → esse sistema é candidato a virar MCP.
Expondo MCP (seu produto como provedor)
Se você faz um SaaS, seu produto pode fornecer um MCP server pros clientes usarem dentro do Claude / ChatGPT deles. Em vez de "tem chat dentro do meu app", você vira parte do agente que eles já usam.
Exemplos de mapeamento:
| Primitiva MCP | Num SaaS de eventos seria... |
|---|---|
| Tools (ações) | criar_evento, listar_inscricoes, gerar_link, fazer_checkin, reembolsar |
| Resources (leitura) | dados de evento, lista de participantes, relatório de vendas, status de pagamento |
| Prompts (templates) | "gerar resumo de vendas do evento", "redigir e-mail de lembrete para inscritos" |
A grande vantagem técnica: se sua API já é tRPC / REST com Zod (ou schema validado), o MCP server é uma casca fina que mapeia tool → procedure existente. Você reaproveita auth, validação e regras de negócio.
server.tool(
"listar_inscricoes",
{ eventoId: z.string(), status: z.enum(["paga","pendente"]).optional() },
async ({ eventoId, status }, ctx) => {
const data = await trpcCaller.inscricao.list({ eventoId, status });
return { content: [{ type: "text", text: JSON.stringify(data) }] };
}
);Quando NÃO usar MCP
Esse é o ponto em que muito time tropeça. Três cenários onde MCP é overhead:
1. Você controla os dois lados (client e server)
Se o agente roda dentro do seu próprio produto (um chat no painel do usuário), você é dono do client e do server. Aí MCP é caro à toa: use o SDK do provedor + function calling direto.
// SDK Anthropic — tools definidas no código, sem MCP no meio
const tools = [{
name: "listar_inscricoes",
description: "Lista inscrições de um evento",
input_schema: { /* zod → json schema */ }
}];
const msg = await anthropic.messages.create({ model, tools, messages });
// se msg pede a tool, VOCÊ chama seu tRPC e devolve o resultadoMais simples, menos camadas, mesmo resultado.
2. Não há LLM no meio
MCP foi desenhado pra agente. Suas tools carregam descrições em linguagem natural, feitas pra um modelo entender. Sem IA orquestrando, é uma RPC com overhead desnecessário — sua API REST/tRPC normal resolve melhor.
3. A ferramenta já tem CLI conhecida pelo modelo
É aqui que entra a comparação com CLI — que vale a próxima seção inteira.
MCP vs CLI: por que CLI muitas vezes vence
Existe um custo escondido do MCP que poucos contam: o overhead permanente de declarar tools no contexto.
Cada tool de um MCP server injeta nome + descrição + JSON schema no prompt em toda requisição, mesmo que você não use. Um MCP server "rico" pode ter 20–40 tools → isso são milhares de tokens de input fixo só pra deixar as ferramentas disponíveis. Conecte 4–5 MCPs e você gastou dezenas de milhares de tokens antes do modelo ler uma linha do seu código.
CLI evita isso:
- Uma única tool: "rode este comando bash". Schema minúsculo.
- O modelo já conhece
git,gh,kubectl,psql,docker,awsdo treino. O "schema" das 200 operações doghjá está nos pesos do modelo, de graça.
MCP paga pra declarar ferramentas. CLI aproveita ferramentas que o modelo já conhece.
A tabela de trade-offs
| Critério | CLI | MCP / tool estruturada |
|---|---|---|
| Token overhead de disponibilidade | baixo ✅ | alto ❌ |
| Modelo já sabe a sintaxe? | sim, pra ferramentas famosas ✅ | precisa da descrição ❌ |
| Output | texto bruto, verboso, às vezes enorme ❌ | JSON enxuto e previsível ✅ |
| Segurança / escopo | "rode qualquer bash" é poderoso e perigoso ❌ | tool faz só o que você definiu ✅ |
| Ferramenta proprietária (seu SaaS) | modelo não conhece, viraria CLI custom ❌ | MCP/SDK brilha ✅ |
| Confiabilidade de parsing | modelo tem que parsear texto livre ❌ | dado estruturado ✅ |
Repara no detalhe que conecta com o ponto anterior: CLI economiza na declaração, mas pode estourar no retorno. Um gh pr list sem filtro despeja texto gigante que volta como input. A economia real depende de você usar a CLI com --json, --limit, grep etc.
A Anthropic inclusive escreveu sobre isso (artigos sobre code execution with MCP e o problema de "too many MCP tools eat the context window"). A direção é clara: em vez de expor 50 tools MCP, dê ao agente um ambiente onde ele escreve código e roda CLI quando faz sentido.
A regra de bolso
Regra de bolso
Sim
Use CLI
O modelo já conhece git, gh, docker, kubectl, psql e ferramentas parecidas. Sem overhead de schema.
Não
Cheque propriedade
Se você controla o client, use SDK + function calling. Se o client é de terceiros, exponha um MCP server para que eles consigam te descobrir.
Tem analogia com RAG?
Sim, e é boa pra fixar o conceito.
Em ambos:
- a LLM não sabe o dado;
- a LLM recebe o dado de fora e só redige;
- o conhecimento mora no seu sistema (banco, arquivos, API).
Mas há três diferenças importantes:
| Eixo | RAG | MCP |
|---|---|---|
| Como busca | semântica / por similaridade de embeddings (fuzzy) | chamada estruturada com parâmetros exatos (precisa) |
| Quem decide | mecânico — toda pergunta dispara busca, antes de gerar | agêntico — o modelo decide se, qual e como chamar |
| Read vs write | só lê | lê e escreve (reembolsar, criar_evento) |
Quando uma tool MCP só faz SELECT no banco e devolve, ela é literalmente um RAG com retrieval estruturado em vez de vetorial. Quando ela faz INSERT/UPDATE ou chama integrações externas, extrapola o RAG e vira automação / agente.
RAG é "G" com um "R" automático e semântico, sempre read-only. MCP é "G" com ferramentas que o modelo escolhe ativamente — podendo ler ou agir.
Se quiser ir fundo no R-A-G, deixei um post denso sobre RAG do começo ao fim.
Custos: quem paga pelo MCP?
Pergunta comum, resposta importante: o MCP server não gasta tokens de LLM. Quem fala com o modelo é o client.
| Item | Quem paga |
|---|---|
| Tokens da LLM (inferência) | Quem opera o client — o cliente final (Claude Pro dele) ou você |
| Rodar o MCP server (CPU, RAM, banda) | Você — é só infra de servidor |
| Banco de dados / API por trás | Você — sempre |
Os dois cenários comuns:
- Claude/ChatGPT do cliente conecta no seu MCP → o cliente paga a IA dele. Você só mantém um servidorzinho de API. Financeiramente, é o cenário ótimo pra quem provê o MCP.
- Chat embutido no seu produto (SDK) → você chama a Claude API com sua API key. Os tokens saem do seu bolso. Normalmente isso é repassado pro cliente como parte do plano.
A regra mental:
Token é custo de quem roda o modelo (client). MCP server é só servidor de dados — não pensa, não gasta token.
Resumo — o mapa de uma página
Mapa de uma página
Não
Use REST/tRPC
Sem orquestração por modelo, MCP vira só uma RPC mais pesada.
Você controla os dois lados
SDK + function calling
Defina tools no código, chame seu backend direto e evite a camada de protocolo.
Ferramenta conhecida
Use CLI também
Para ferramentas famosas, a sintaxe já está nos pesos do modelo. Filtre bem os outputs.
Client de terceiros
Exponha MCP
OAuth, escopo, tools mínimas, JSON enxuto. É aqui que o protocolo se paga.
Conclusão
MCP não é "a forma certa" de dar ferramentas a uma IA — é uma das três formas, junto com function calling puro (SDK) e CLI. Cada uma faz mais sentido num cenário:
- SDK + function calling: você é dono dos dois lados. Mais simples, sem overhead. É o que cabe em quase todo chat embutido.
- CLI: o modelo já conhece a ferramenta (git, gh, docker…). Quase grátis em tokens, brutalmente eficaz.
- MCP: você é provedor (SaaS expondo capacidades pra IAs de terceiros) ou consumidor de algo que não tem CLI conhecida.
O MCP é a porta USB-C — útil quando você precisa que qualquer cabo se conecte ao seu produto. Mas se você já tem o cabo na mão e o aparelho conhece o padrão antigo, não vale trocar tudo só porque o USB-C virou moda.
A pergunta decisiva, sempre: o modelo já conhece essa ferramenta? Eu controlo os dois lados? Responda e o caminho aparece.
27 de maio de 2026 · Brazil