De cara: MCP (Model Context Protocol) não é outro nome para Function Calling, e não é um modelo. É um protocolo aberto entre um app de IA (o Host) e processos de ferramentas externas (MCP Servers). As mensagens são JSON-RPC 2.0. O modelo continua falando o Tool Calling / Function Calling de cada fornecedor. O Host traduz tools/list no array tools do modelo e depois traduz tool_calls em tools/call. Essas três camadas juntas são o jeito em que a maioria dos agentes de 2026 chama ferramentas.
Este artigo está datado de 7 de setembro de 2026. A spec atual é 2026-07-28: sem sessão de protocolo, sem handshake de initialize, cada requisição carrega _meta, e a descoberta de capacidades usa server/discover. O texto de agosto fluxo de dados JSON do Agent ainda mostra o exemplo antigo de initialize; trate este guia como a leitura vigente. Para «preciso mudar o código do Server?», veja o guia de migração MCP 2026.
O que é o MCP
Model Context Protocol é um padrão aberto para como aplicações de IA descobrem, leem e invocam contexto externo. A Anthropic lançou em novembro de 2024; a governança depois foi para a Agentic AI Foundation. Ele especifica como o contexto é trocado. Não especifica qual modelo você usa, como orquestra um agent de vários passos, nem como escreve a lógica de negócio.
Pense no USB-C: o soquete é padrão; se o que entra é disco, tela ou fonte de energia, fica fora do escopo. O MCP padroniza o soquete Host ↔ Server. Um filesystem, GitHub, uma API interna de pedidos ou um validador JSON como este site são só Servers.
| Expressão | O que realmente significa | Leitura errada comum |
|---|---|---|
| MCP | Um protocolo JSON-RPC entre Host e processos de ferramentas | Um modelo, um framework de agent, ou a Tools API da OpenAI |
| MCP Server | Um programa que expõe tools / resources / prompts | Precisa estar na internet pública, ou precisa substituir a sua REST API |
| MCP Client | O gerenciador de conexão dentro do Host para um Server | A mesma coisa que o modelo de linguagem |
| MCP Host | Um app de IA como Cursor, VS Code ou Claude Desktop | A spec MCP ou um SDK |
Duas camadas: a camada de dados é JSON-RPC 2.0 (métodos, params, códigos de erro, notificações); a camada de transporte é como esses frames JSON se movem — stdio na mesma máquina, Streamable HTTP à distância. Troque o transporte e a forma da mensagem permanece. Por isso o debug de MCP começa separando «o envelope é JSON-RPC; o payload de negócio muitas vezes também é JSON».
Host, Client, Server
O triângulo da spec é fácil de misturar com o «cliente / servidor» do dia a dia:
- Host: o app de IA que o usuário abriu. Ele cria Clients, alimenta schemas de ferramentas no modelo, autoriza e valida antes da execução, e escreve os resultados de volta na conversa.
- Client: um objeto de conexão dentro do Host. Um Server, um Client. VS Code falando com um filesystem e com o Sentry são dois Clients em runtime.
- Server: o programa que serve contexto. Pode compartilhar a máquina com o Host (stdio) ou rodar em outro lugar (Streamable HTTP). «Server» é um papel, não uma exigência de hostname público.
O modelo não está nesse triângulo. GPT-5.5, Claude 4.8 e Gemini 3.7 veem o array tools traduzido pelo Host. Não veem JSON-RPC, e não veem Mcp-Session-Id (o header de sessão sumiu em 2026-07-28). «O modelo fala MCP» é marketing. Na engenharia, sempre há um Host no meio.
Como ler JSON-RPC 2.0
JSON-RPC é uma convenção para chamadas de procedimento remoto usando JSON — mais perto de «chamar uma função» do que de REST. O MCP escolheu isso porque os nomes de método ficam estáveis (tools/list, tools/call), a divisão requisição / resposta / notificação é limpa, e o envelope inteiro é JSON amigável ao modelo.
| Campo | Quem usa | Significado |
|---|---|---|
jsonrpc | Toda mensagem | Sempre "2.0" |
id | Requisições e respostas | Correlação; notificações não têm id |
method | Requisições / notificações | ex.: tools/call, server/discover |
params | Requisições | Objeto de parâmetros; a partir de 2026-07-28 costuma incluir _meta |
result / error | Respostas | Exatamente um; sucesso usa result, falha usa error |
Um tools/call na spec 2026-07-28 é assim. Note: sem handshake, sem header de sessão. Versão e identidade do cliente moram em _meta, então qualquer instância de Server consegue tratar o frame.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "validate_json",
"arguments": {
"payload": {"orderId": "A-1001", "total": 42.5},
"schemaId": "order.v1"
},
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "json-toolbox-host",
"version": "1.0.0"
}
}
}
}
Uma resposta de sucesso é o mesmo envelope. O resultado de negócio fica em result.content, muitas vezes type: "text", e esse texto pode ser ele mesmo uma string JSON — protocolo do lado de fora, payload do lado de dentro. No debug, primeiro veja se o id casa com a requisição; depois valide o objeto interno contra o Schema.
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"resultType": "complete",
"content": [
{
"type": "text",
"text": "{\"valid\":true,\"schemaId\":\"order.v1\"}"
}
]
}
}
Falhas usam o objeto error do JSON-RPC: code, message, data opcional. 2026-07-28 mudou «recurso não encontrado» do -32002 específico do MCP para o padrão -32602 (Invalid Params). Clients que casam o literal antigo vão perder o caso. Notificações não têm id e não esperam resposta — por exemplo, uma mudança na lista de tools.
Tools, Resources, Prompts
Um Server pode expor três primitivas. Agentes vivem em Tools; as outras duas são fáceis de pular e muitas vezes poupam uma rodada de chute do modelo.
| Primitiva | Descobrir | Usar | Para quê |
|---|---|---|---|
| Tools | tools/list | tools/call | Ações: consultar um DB, chamar uma API, escrever um arquivo, validar JSON |
| Resources | resources/list | resources/read | Ler contexto por URI: um arquivo de Schema, um recorte de log, config |
| Prompts | prompts/list | prompts/get | Templates de prompt reutilizáveis, opcionalmente parametrizados |
Uma ferramenta é name, description e inputSchema. inputSchema é JSON Schema (2020-12 a partir de 2026-07-28; a raiz ainda precisa ser type: "object"; oneOf / $ref / $defs são permitidos). O outputSchema opcional restringe a forma do retorno. Hosts copiam quase 1:1 o inputSchema para parameters / input_schema da API do modelo.
{
"name": "validate_json",
"title": "Validate JSON",
"description": "Check a JSON payload against a named schema. Returns valid and errors.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"payload": { "type": "object", "description": "Already parsed JSON object, not a raw string" },
"schemaId": { "type": "string", "description": "Stable schema id such as order.v1" }
},
"required": ["payload", "schemaId"]
}
}
Resources cabem em «leia, depois pense»: carregar schema://order.v1 é mais barato do que fazer o modelo decorar um Schema de 200 linhas na conversa. Prompts cabem nas aberturas prontas da equipe. Roots, Sampling e Logging estão deprecados em 2026-07-28: passe caminhos de workspace como argumentos de ferramenta ou URIs de resource; Servers não devem pedir um completion ao Host; logs vão para stderr ou OpenTelemetry.
Como se empilha com Tool Calling
Três nomes viram uma coisa só. Não são a mesma camada — o artigo de fluxo de dados JSON do Agent rastreia cada salto. Aqui, só o mapeamento:
| Camada | Entre | Mensagem típica |
|---|---|---|
| Function Calling / Tool Calling | Model API ↔ Host | tools[] + tool_calls.arguments |
| MCP | Host ↔ Server | JSON-RPC tools/list, tools/call |
| JSON Schema | O contrato, não o transporte | inputSchema / parameters |
Function Calling é o nome antigo da OpenAI; Tool Calling é o termo genérico posterior (Claude tools, Gemini Function Calling, OpenAI Tools API). Para quem desenvolve, é um fluxo só: o Host manda um Schema, o modelo devolve uma chamada com argumentos JSON, o Host executa e enfia um resultado JSON de volta na conversa.
O MCP não substitui essa camada. Um Host que chama funções no mesmo processo só com Tool Calling continua válido. O MCP torna as ferramentas descobráveis, entre processos e reutilizáveis entre Hosts. Agentes corporativos quase sempre empilham as duas; scripts e demos muitas vezes pulam o MCP.
Duas armadilhas de mapeamento: APIs de modelo muitas vezes entregam arguments como string; params.arguments do MCP é um object. E o name de tools/list precisa chegar ao modelo e ao tools/call sem mudança — não invente um alias «mais amigável» no meio. Valide antes do tools/call de verdade; veja Tool Calling e validação com JSON Schema.
Uma chamada de ferramenta completa
O usuário diz: «Valide este JSON de pedido com order.v1.» Em 2026-07-28, o caminho é:
- Host → Server:
server/discover(cacheável) para confirmar tools; ou mande a próxima requisição e tente de novo se a versão falhar. - Host → Server:
tools/listdevolve itens cominputSchema; o resultado pode trazerttlMs/cacheScope. - Host → modelo: mapeie a lista para
tools[].parameters(ainda JSON Schema). - Modelo → Host:
tool_callscomnamevalidate_json;argumentscostuma ser JSON stringificado. - Host valida:
JSON.parse, depois chequeinputSchema. Se falhar, escreva o erro como resultado de tool — não toque no Server de verdade. - Host → Server:
tools/callcomargumentsobjeto e versão de protocolo em_meta. - Server → Host:
result.content; o Host pode checaroutputSchemade novo. - Host → modelo: uma string JSON
role: tool; o modelo responde ao usuário ou começa outra rodada de ferramenta.
Linguagem natural do usuário
│
▼
Host ──JSON Schema──► LLM Tool Calling
│ │
│ ▼
│ arguments JSON
▼ │
MCP JSON-RPC ◄──── tools/call só depois da validação
│
▼
result JSON ──► tool message ──► resposta final do modelo
No transporte remoto, os headers HTTP precisam incluir MCP-Protocol-Version, Mcp-Method e Mcp-Name, e precisam bater com o body ou o Server deve recusar. Load balancers podem rotear pelos headers sem parsear JSON. stdio local não tem esses headers; os nomes de método JSON-RPC são os mesmos.
O que lembrar de 2026-07-28
A spec de julho é a maior revisão desde o lançamento, e 28 de julho de 2026 é a data de publicação final. Para «o que é MCP», fique com a lista abaixo. Se o seu Server precisa de mudanças de código, continua sendo a árvore de decisão do artigo de migração.
- Sem handshake, sem sessão de protocolo:
initialize/initializedeMcp-Session-Idsumiram. Cada requisição é autocontida. Encadeie estado de aplicação com umbasket_idexplícito (ou similar) como argumento normal. Não espere que o transporte lembre de você. - A descoberta é
server/discover: opcional, mas uma chamada devolve versões suportadas, capabilities e serverInfo. Resultados de lista trazemttlMs; um stream SSE longo já não é o único jeito de saber que as tools mudaram. - Schemas são JSON Schema 2020-12: a raiz de entrada continua object; composição e refs são permitidos; não resolva automaticamente
$refexternos. Schemas de saída já não são só object. - Roots / Sampling / Logging estão deprecados: os métodos ainda funcionam na janela de um ano. Servers novos não devem implementar Sampling para pedir um completion ao Host.
- Extensions: Tasks e MCP Apps são extensões oficiais, não obrigações do core. Trabalho longo usa um task handle +
tasks/get. Não invente a sua própria sessão.
Hosts e Servers ainda em 2025-11-25 continuam usando initialize. Quando as versões se misturam, use o protocolVersion negociado. Não mande os frames sem sessão deste artigo para um Server antigo. Para o que instalar, veja rankings de MCP Server 2026.
O que fazer agora
- Desenhe três camadas antes de escrever código: Tool Calling da API do modelo, orquestração do Host, MCP Server. Scripts podem parar nas duas primeiras. Reuso entre IDEs é quando você escreve um Server.
- Use um SDK oficial; não escreva frames JSON-RPC na mão:
@modelcontextprotocol/sdke os outros pacotes oficiais já tratam descoberta, transporte e códigos de erro. SSE escrito à mão ou campos privados são o caso clássico de «você precisa mudar código» no guia de migração. - Escreva
inputSchemacomo um contrato que você valida sozinho:additionalProperties: false,required, enums, tetos de comprimento. Modelos omitem campos e stringificam números. Bloqueie uma vez com o mesmo Schema antes de executar. - stdio no local, Streamable HTTP à distância: debug pessoal não precisa de HTTP. Acesso compartilhado da equipe, muitos Clients ou um gateway é quando você vai remoto — mais OAuth e privilégio mínimo.
- Cacheie listas, recorte resultados: respeite
ttlMs. Não despeje stacks crus de volta no modelo. Janela maior não torna JSON sujo seguro — veja janelas de contexto de 1M tokens. - Confira fixtures no navegador antes de bater num Server ao vivo: salve
inputSchema, arguments bons / ruins e retornos de exemplo do Server como JSON; valide e faça Diff neste site. Nada é enviado. O mesmo hábito de testar um contrato REST.
FAQ
O MCP é um modelo ou um framework?
Nenhum dos dois. MCP é um protocolo aberto entre um Host e processos de ferramentas externas. As mensagens são JSON-RPC 2.0. Modelos ainda vêm das APIs dos fornecedores; a orquestração continua no Host / runtime do agent. Não existe «modelo MCP».
Se eu já tenho Tool Calling, preciso de MCP?
Se as ferramentas estão no mesmo processo e hardcoded no Host, Tool Calling basta. Adicione MCP quando precisar de reuso entre apps, isolamento de processo ou descoberta dinâmica. Agentes de IDE em 2026 costumam rodar as duas camadas; scripts CLI de uma vez só muitas vezes não têm MCP.
O MCP é JSON-RPC ou REST?
A camada de dados é JSON-RPC 2.0, não «um path HTTP por ferramenta». O transporte remoto pode usar Streamable HTTP, mas o body continua sendo um objeto JSON-RPC, com o método em method e no header Mcp-Method. Não fatie o MCP como se fosse recursos REST.
Ainda escrevo initialize depois de 2026-07-28?
A spec nova não tem initialize / initialized nem Mcp-Session-Id. Versão e identidade do cliente vão em _meta em cada requisição. Se você só fala com um Server 2025-11-25, mantenha o handshake antigo. Siga o protocolVersion negociado; não misture envelopes.
O MCP vai substituir o OpenAPI?
Não. OpenAPI descreve APIs HTTP; MCP descreve como um runtime de agent descobre e chama ferramentas. O padrão usual é manter OpenAPI no serviço REST e embrulhar um MCP Server fino que mapeia paths para tools/call.
Como checo JSON de MCP no local?
Salve inputSchema, arguments de exemplo do modelo e retornos de exemplo de tools/call como arquivos. Use a caixa de ferramentas JSON no navegador para checagens de sintaxe e estrutura, depois faça Diff de duas versões de Schema. Os dados nunca saem do navegador.
Conclusão
MCP é o soquete de ferramentas do agent em 2026: JSON-RPC 2.0 transporta descoberta e invocação entre Host e Server; do lado do modelo continua sendo Tool Calling; JSON Schema é o contrato compartilhado. Não é um modelo, não é um framework e não substitui o OpenAPI. A spec 2026-07-28 tirou sessões do protocolo, então as requisições precisam ser autocontidas. As três primitivas — Tools, Resources, Prompts — não mudaram.
Este guia é só o empilhamento. A forma dos bytes em cada salto está no artigo de fluxo de dados; se um Server antigo precisa mudar código está no artigo de migração; quais Servers instalar está no artigo de ranking. Antes de ligar qualquer coisa ao vivo, valide o Schema e o JSON de exemplo no local — você pode trocar o modelo; nomes de campo e required não deveriam se mover.