Model Context Protocol
do primeiro handshake à produção
Uma apostila completa sobre o padrão aberto que conecta modelos de IA a ferramentas, dados e sistemas reais — escrita para quem quer dominar o protocolo e transformar esse domínio em oportunidades de trabalho.
O que é o MCP e por que ele existe
Antes de escrever uma linha de código, você precisa entender o problema que o MCP resolve — porque é exatamente isso que entrevistadores perguntam primeiro.
1.1 O problema M×N
Modelos de linguagem, sozinhos, só fazem uma coisa: transformar texto em texto. Para serem úteis no mundo real, precisam acessar dados (seu banco, seus arquivos, seu CRM) e executar ações (criar um ticket, enviar uma mensagem, rodar uma query). Antes do MCP, cada aplicação de IA implementava suas próprias integrações: o time do produto A escrevia um conector para o GitHub, o time do produto B escrevia outro conector para o mesmo GitHub, com outra interface, outros bugs e outra manutenção.
Com M aplicações de IA e N sistemas externos, o mundo precisava de M×N integrações sob medida. O MCP transforma isso em M+N: cada aplicação implementa o protocolo uma vez (como cliente) e cada sistema externo é exposto uma vez (como servidor). Qualquer cliente conversa com qualquer servidor.
Daí vem a analogia mais citada (inclusive em entrevistas): o MCP é o "USB-C das aplicações de IA". Um padrão único de "porta" que permite plugar qualquer ferramenta em qualquer modelo, sem adaptadores sob medida.
1.2 Linha do tempo (o que você precisa saber de contexto)
| Quando | O que aconteceu | Por que importa |
|---|---|---|
| Nov/2024 | A Anthropic lança o MCP como padrão aberto (spec 2024-11-05), com SDKs e servidores de referência. | Nasce o protocolo; transporte inicial: stdio e HTTP+SSE. |
| 1º sem/2025 | Adoção em massa: OpenAI, Google DeepMind, Microsoft e as principais IDEs (Cursor, VS Code, JetBrains) anunciam suporte. | MCP vira o padrão de facto — e requisito em vagas. |
| Mar/2025 | Revisão 2025-03-26: transporte Streamable HTTP, autorização OAuth 2.1, anotações de tools. | Base dos servidores remotos modernos. |
| Jun/2025 | Revisão 2025-06-18: elicitation, saída estruturada de tools, resource links, servidor como resource server OAuth. | Maturidade para uso corporativo. |
| Set/2025 | Lança o MCP Registry oficial, um catálogo aberto de servidores. | Descoberta e distribuição padronizadas. |
| Nov/2025 | Revisão 2025-11-25 (1º aniversário): Tasks experimentais, elicitation em modo URL, sampling com tools, registro de cliente via CIMD, ícones e consentimento incremental de escopos. | É a versão estável corrente — a que você usa em produção hoje. |
| Dez/2025 | A Anthropic doa o MCP à Agentic AI Foundation, sob a Linux Foundation; governança por Working Groups e SEPs (Spec Enhancement Proposals). | Padrão neutro e comunitário — argumento decisivo para adoção corporativa. |
| Mar/2026 | Publicado o roadmap 2026: escalabilidade de transporte, comunicação entre agentes, maturidade de governança e prontidão enterprise (via extensões, não inchaço do núcleo). | Mostra para onde o protocolo — e as vagas — estão indo. |
| Jul/2026 | Release candidate da revisão 2026-07-28 (final em 28/07): núcleo stateless, framework formal de extensões (MCP Apps, Tasks), política de ciclo de vida e endurecimento do OAuth. | A maior revisão desde o lançamento — detalhes na caixa abaixo. |
A próxima versão da spec (final prevista para 28/07/2026) torna o MCP stateless na camada de protocolo: o handshake initialize e a sessão de protocolo deixam de existir, permitindo escalar servidores com um load balancer round-robin comum, sem sessões pegajosas. Interações iniciadas pelo servidor (elicitation, sampling) passam a usar Multi Round-Trip Requests (MRTR); Tasks e MCP Apps (interfaces HTML sandboxed servidas pelo servidor) viram extensões oficiais; e roots, sampling e logging clássicos entram em deprecated — com garantia de permanecerem na spec por pelo menos 12 meses pela nova política de ciclo de vida. Esta apostila ensina a versão estável corrente (2025-11-25) e sinaliza, em caixas como esta, o que muda na 2026-07-28.
Esta apostila foi revisada em julho/2026, cobrindo a spec estável 2025-11-25 e o release candidate 2026-07-28. O MCP evolui por revisões datadas — sempre confira modelcontextprotocol.io para a versão corrente antes de uma entrevista ou projeto.
1.3 Os três papéis: host, cliente e servidor
Todo o MCP se apoia em três papéis. Memorize-os — a confusão entre "host" e "cliente" é um erro clássico de iniciante:
- Host — a aplicação de IA com a qual o usuário interage: Claude Desktop, Claude Code, uma IDE, seu agente customizado. O host contém o modelo (ou o acesso a ele) e coordena tudo.
- Cliente MCP — o componente dentro do host que mantém uma conexão 1:1 com um servidor. Um host com 5 servidores conectados roda 5 clientes.
- Servidor MCP — o programa que expõe capacidades (ferramentas, dados, prompts) por meio do protocolo. Pode rodar local (um processo na sua máquina) ou remoto (um serviço HTTP).
1.4 As primitivas em 60 segundos
Um servidor pode oferecer três tipos de coisa, e um cliente pode oferecer três de volta. Esta tabela é o mapa mental de toda a apostila:
| Primitiva | Quem expõe | Quem decide usar | Exemplo |
|---|---|---|---|
| Tools | servidor | o modelo (com aprovação do usuário) | criar_ticket, buscar_pedido |
| Resources | servidor | a aplicação/usuário (contexto) | file:///relatorio.pdf, esquema do banco |
| Prompts | servidor | o usuário (ex.: comandos de barra) | /revisar-pr, template de resumo |
| Sampling | cliente | o servidor pede, o usuário aprova | servidor pede ao LLM do host para resumir um texto |
| Roots | cliente | a aplicação | "você pode operar dentro de ~/projeto" |
| Elicitation | cliente | o servidor pede, o usuário responde | "confirme o e-mail antes de enviar" |
Pergunta de entrevista real e frequente: "qual a diferença entre tool e resource?" Resposta curta: tools são controladas pelo modelo (o LLM decide chamar, para executar ações) e resources são controlados pela aplicação (dados anexados como contexto, sem efeitos colaterais). Se você citar também que prompts são controlados pelo usuário, demonstra domínio do modelo de controle — um diferencial imediato.
- Explique o problema M×N para um colega não técnico em até 3 frases, sem usar a palavra "protocolo".
- Para um sistema de e-commerce, liste 3 candidatos a tool, 3 a resource e 1 a prompt.
- Um host com Claude conectado a GitHub, Slack e Postgres tem quantos clientes MCP rodando? Por quê?
Autoteste: por que o MCP é comparado ao USB-C?
Arquitetura e protocolo: JSON-RPC, ciclo de vida e capacidades
Aqui você abre o capô. Entender as mensagens que trafegam no fio é o que separa quem "usa MCP" de quem consegue depurar, estender e projetar servidores profissionais.
2.1 Duas camadas: dados e transporte
A especificação separa o MCP em duas camadas independentes — e essa separação é uma decisão de design que você deve saber defender:
- Camada de dados: o que é dito. Mensagens JSON-RPC 2.0, ciclo de vida da conexão, primitivas (tools, resources, prompts...), notificações e utilitários.
- Camada de transporte: como as mensagens viajam. Hoje: stdio (processos locais) e Streamable HTTP (servidores remotos). O capítulo 3 é todo sobre isso.
Consequência prática: o mesmo servidor lógico pode ser servido por stdio em desenvolvimento e por HTTP em produção, sem mudar uma linha das suas tools.
2.2 JSON-RPC 2.0 em 5 minutos
Todo o tráfego MCP são três tipos de mensagem JSON-RPC:
| Tipo | Tem id? | Espera resposta? | Exemplo no MCP |
|---|---|---|---|
| Request | sim | sim | tools/call, resources/read |
| Response | sim (o mesmo) | — | result ou error |
| Notification | não | não | notifications/tools/list_changed |
JSON-RPC · request e response de uma chamada de tool→ {"jsonrpc": "2.0", "id": 42,
"method": "tools/call",
"params": {"name": "buscar_pedido",
"arguments": {"pedido_id": "BR-1093"}}}
← {"jsonrpc": "2.0", "id": 42,
"result": {"content": [{"type": "text",
"text": "Pedido BR-1093: enviado em 10/07"}],
"isError": false}}
Detalhe que derruba candidatos: erros têm dois níveis. Erros de protocolo (método inexistente, params inválidos) usam o objeto error do JSON-RPC. Erros de execução da tool (API externa caiu, pedido não existe) voltam como result normal com isError: true — assim o modelo vê o erro e pode reagir (tentar de novo, avisar o usuário). A revisão 2025-11-25 reforçou isso: até erros de validação de argumentos devem voltar como erro de execução, para que o modelo se autocorrija.
2.3 O ciclo de vida da conexão
Toda conexão MCP passa por três fases: inicialização → operação → encerramento. A inicialização é um handshake em que cada lado declara o que sabe fazer (capability negotiation):
handshake · o que cada lado declara→ // cliente
{"method": "initialize", "params": {
"protocolVersion": "2025-11-25",
"capabilities": {"sampling": {}, "elicitation": {}, "roots": {"listChanged": true}},
"clientInfo": {"name": "meu-agente", "version": "1.0.0"}}}
← // servidor
{"result": {
"protocolVersion": "2025-11-25",
"capabilities": {"tools": {"listChanged": true},
"resources": {"subscribe": true}},
"serverInfo": {"name": "pedidos-mcp", "version": "2.3.1"}}}
Regras de ouro da negociação: (1) nenhum lado pode usar uma capacidade que o outro não declarou; (2) a versão do protocolo é negociada — se o servidor não suporta a versão pedida, responde com a mais nova que suporta e o cliente decide se continua; (3) só depois do notifications/initialized começa a operação normal.
A revisão 2026-07-28 remove o initialize e a sessão de protocolo: versão e capacidades passam a viajar em cada requisição, tornando o núcleo stateless. O fluxo acima continua valendo para 2025-11-25 e anteriores (o que está em produção hoje) e permanece essencial para entender servidores existentes — mas, ao ler a spec nova, espere encontrar esse modelo redesenhado.
2.4 Tools por dentro
Tools são funções descritas por JSON Schema. O modelo lê nome, descrição e schema — e é só isso que ele vê. Por consequência, a qualidade da descrição é a qualidade da sua tool:
resposta de tools/list · a "vitrine" que o modelo enxerga{"tools": [{
"name": "buscar_pedido",
"title": "Buscar pedido",
"description": "Retorna status, itens e rastreio de um pedido pelo ID (formato BR-XXXX). Use quando o usuário perguntar sobre um pedido específico.",
"inputSchema": {
"type": "object",
"properties": {"pedido_id": {"type": "string", "pattern": "^BR-\\d{4}$"}},
"required": ["pedido_id"]},
"annotations": {"readOnlyHint": true, "openWorldHint": false}}]}
- Annotations (
readOnlyHint,destructiveHint,idempotentHint...) são dicas para a interface do host — por exemplo, pedir confirmação extra antes de tools destrutivas. São não confiáveis por definição: o host não deve tomar decisões de segurança baseado nelas. - Desde a revisão 2025-06-18, tools podem declarar
outputSchemae devolver structuredContent — JSON validável em vez de só texto. Essencial quando outro software (não só o modelo) consome o resultado. - O resultado pode conter texto, imagens, áudio e resource links (referências a resources do servidor).
2.5 Resources e prompts por dentro
Resources são dados identificados por URI (file:///..., postgres://..., esquemas customizados). O cliente pode listá-los (resources/list), lê-los (resources/read) e, se o servidor declarar suporte, assinar mudanças (resources/subscribe → o servidor emite notifications/resources/updated). Também existem resource templates — URIs parametrizadas como pedidos://{cliente_id}/historico que descrevem famílias inteiras de dados.
Prompts são templates de mensagens com argumentos, pensados para o usuário invocar explicitamente (a origem dos comandos de barra em várias interfaces). prompts/get devolve mensagens prontas para entrar na conversa.
2.6 Notificações e dinamismo
MCP é um protocolo vivo: servidores podem mudar durante a sessão. Se declarou listChanged, o servidor pode emitir notifications/tools/list_changed e o cliente refaz o tools/list. Isso habilita padrões avançados como tools que aparecem após login ou de acordo com o plano do usuário.
Saber desenhar boas tools é hoje uma habilidade avaliada em teste técnico: nomes inequívocos, descrições que dizem quando usar (não só o que fazem), schemas restritivos (enums, patterns, limites) e resultados enxutos — resultados gigantes estouram a janela de contexto do modelo e degradam o agente. Times chamam isso de tool design ou context engineering, e é critério de aprovação em code review de servidores MCP.
- Escreva à mão (sem SDK) o JSON-RPC de: (a) listar tools; (b) chamar
criar_ticketcom título e prioridade; (c) a resposta comisError: trueporque a API externa retornou 503. - Modele o
inputSchemade uma toolagendar_reuniaocom data ISO, duração em minutos (15–120) e lista de e-mails. - Explique por que erro de execução não deve ser um erro JSON-RPC. Quem precisa "ver" esse erro?
Autoteste: o que acontece se o cliente chamar resources/subscribe num servidor que não declarou subscribe: true?
Transportes: stdio e Streamable HTTP
A mesma conversa JSON-RPC pode viajar por um pipe local ou pela internet. Escolher o transporte certo — e entender o legado — é decisão de arquitetura que aparece em toda vaga que menciona MCP.
3.1 stdio: o transporte local
No transporte stdio, o cliente lança o servidor como subprocesso e conversa com ele por stdin/stdout: uma mensagem JSON-RPC por linha. É o transporte padrão de servidores locais (acesso a arquivos, git, ferramentas da máquina).
- Vantagens: latência mínima, zero rede, herda as permissões do usuário, simples de depurar.
- Regra crítica: o servidor jamais pode escrever logs no stdout — qualquer
print()perdido corrompe o protocolo. Logs vão parastderrou arquivo. Esse é provavelmente o bug nº 1 de iniciantes em MCP. - Limite: um processo por cliente; não serve para expor um serviço a muitos usuários.
3.2 Streamable HTTP: o transporte remoto
Introduzido na revisão 2025-03-26, o Streamable HTTP usa um único endpoint (por convenção /mcp) que aceita POST com mensagens JSON-RPC. A resposta pode ser:
- um JSON simples (
Content-Type: application/json) para operações rápidas; ou - um stream SSE (
text/event-stream) quando o servidor precisa mandar múltiplas mensagens — progresso, logs, requests de sampling — antes da resposta final.
O servidor também pode aceitar GET no mesmo endpoint para abrir um canal SSE de notificações espontâneas. Sessões são identificadas pelo header Mcp-Session-Id, e clientes devem enviar o header MCP-Protocol-Version nas chamadas subsequentes.
Na revisão 2026-07-28 a sessão em nível de protocolo desaparece: o servidor pode rodar atrás de um load balancer round-robin comum, sem afinidade de sessão nem armazenamento compartilhado de sessões. Foi a mudança mais pedida por quem opera MCP em escala — e completa o plano "The Future of MCP Transports" publicado pelo projeto no fim de 2025.
na prática · uma chamada por HTTPPOST /mcp HTTP/1.1
Host: mcp.minhaempresa.com
Authorization: Bearer eyJhbGciOi...
Mcp-Session-Id: 3fa85f64-5717
MCP-Protocol-Version: 2025-11-25
Content-Type: application/json
Accept: application/json, text/event-stream
{"jsonrpc":"2.0","id":7,"method":"tools/call", ...}
3.3 O legado HTTP+SSE (e por que você ainda vai encontrá-lo)
A primeira versão do protocolo (2024-11-05) usava dois endpoints: um SSE permanente (/sse) para servidor→cliente e um POST para cliente→servidor. Esse desenho complicava load balancing, retomada de conexão e infraestrutura serverless — por isso foi substituído pelo Streamable HTTP. Muitos servidores antigos e tutoriais de 2024/2025 ainda usam o modelo antigo; saber identificar e migrar é trabalho real de manutenção que empresas estão pagando para fazer. Formalmente, o HTTP+SSE entrou em estado Deprecated na revisão 2026-07-28, sob a nova política de ciclo de vida do protocolo: toda funcionalidade agora passa por Active → Deprecated → Removed, com no mínimo 12 meses entre depreciação e a remoção mais próxima possível (exceção apenas para emergências de segurança, com piso de 90 dias).
3.4 Como decidir
| Critério | stdio | Streamable HTTP |
|---|---|---|
| Onde roda | máquina do usuário (subprocesso) | qualquer lugar (serviço web) |
| Nº de usuários | 1 por processo | multiusuário, escala horizontal |
| Autenticação | implícita (permissões do SO) | OAuth 2.1 / tokens (cap. 7) |
| Acesso a recursos locais | nativo (arquivos, apps) | não (só o que o serviço alcança) |
| Distribuição | usuário instala (npm/pip/binário) | você faz deploy; usuário só aponta a URL |
| Caso típico | dev tools, filesystem, git | SaaS, APIs corporativas, produtos |
Vagas de "MCP server engineer" em SaaS quase sempre significam Streamable HTTP + OAuth + deploy em nuvem. Já vagas de developer tooling e plataformas internas pedem mais stdio + empacotamento (npx/uvx). Cite os dois cenários na entrevista e diga qual você já construiu — isso demonstra visão de arquitetura, não só de código.
- Seu time quer expor o ERP interno para 300 funcionários usarem via Claude. Qual transporte, e por quê?
- Um servidor stdio funciona no terminal mas "trava" no Claude Desktop. Liste 3 causas prováveis (dica: uma envolve stdout, outra envolve PATH/ambiente, outra envolve mensagens malformadas).
- Desenhe (papel mesmo) o fluxo de um
tools/calldemorado via Streamable HTTP em que o servidor envia 3 notificações de progresso antes do resultado.
Autoteste: por que o Streamable HTTP substituiu o HTTP+SSE original?
Seu primeiro servidor MCP (Python e TypeScript)
Teoria vira portfólio aqui. Você vai construir um servidor real, conectá-lo ao Claude Desktop e ao Claude Code, e aprender a depurá-lo com o Inspector.
4.1 Escolhendo o SDK
Existem SDKs oficiais para Python, TypeScript, Java, Kotlin, C#, Go, Ruby, Rust, Swift e PHP. Para o mercado, domine Python (dados, automação, IA) e TypeScript (produtos web, ecossistema npm) — a maioria absoluta das vagas cita um dos dois.
instalação# Python (SDK oficial, servidor de alto nível FastMCP incluído)
uv add "mcp[cli]" # ou: pip install "mcp[cli]"
# TypeScript
npm install @modelcontextprotocol/sdk zod
4.2 Servidor completo em Python
O exemplo abaixo expõe as três primitivas — uma tool, um resource e um prompt — para um domínio realista (suporte a pedidos):
pedidos_server.pyfrom mcp.server.fastmcp import FastMCP
mcp = FastMCP("pedidos")
# --- TOOL: o modelo decide chamar -------------------------------
@mcp.tool()
def buscar_pedido(pedido_id: str) -> dict:
"""Retorna status, itens e rastreio de um pedido (formato BR-XXXX).
Use quando o usuário perguntar sobre um pedido específico."""
pedido = db.get(pedido_id) # sua lógica real aqui
if pedido is None:
raise ValueError(f"Pedido {pedido_id} não encontrado")
return pedido # vira structuredContent
# --- RESOURCE: contexto controlado pela aplicação ---------------
@mcp.resource("pedidos://{cliente_id}/historico")
def historico(cliente_id: str) -> str:
"""Histórico de pedidos de um cliente, em texto."""
return db.historico_txt(cliente_id)
# --- PROMPT: template invocado pelo usuário ---------------------
@mcp.prompt()
def responder_reclamacao(pedido_id: str) -> str:
return (f"Analise o pedido {pedido_id}, identifique o problema "
"e redija uma resposta empática com próximos passos.")
if __name__ == "__main__":
mcp.run() # transporte stdio por padrão
Repare no que o framework faz por você: gera o inputSchema a partir dos type hints, usa a docstring como descrição, converte exceções em resultados com isError e serializa o retorno. Seu trabalho intelectual está nos nomes, tipos e descrições.
4.3 O mesmo servidor em TypeScript
server.tsimport { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({ name: "pedidos", version: "1.0.0" });
server.registerTool("buscar_pedido", {
title: "Buscar pedido",
description: "Retorna status, itens e rastreio de um pedido (BR-XXXX).",
inputSchema: { pedido_id: z.string().regex(/^BR-\d{4}$/) }
}, async ({ pedido_id }) => {
const pedido = await db.get(pedido_id);
if (!pedido) return { content: [{ type: "text",
text: `Pedido ${pedido_id} não encontrado` }], isError: true };
return { content: [{ type: "text", text: JSON.stringify(pedido) }] };
});
await server.connect(new StdioServerTransport());
4.4 Conectando ao Claude Desktop e ao Claude Code
Servidores stdio são declarados na configuração do host, que os lança como subprocesso:
claude_desktop_config.json{
"mcpServers": {
"pedidos": {
"command": "uv",
"args": ["run", "--with", "mcp", "python", "/caminho/pedidos_server.py"],
"env": { "DB_URL": "postgres://..." }
}
}
}
Claude Code · CLI# local (stdio)
claude mcp add pedidos -- uv run python /caminho/pedidos_server.py
# remoto (Streamable HTTP)
claude mcp add --transport http pedidos https://mcp.minhaempresa.com/mcp
- Caminhos absolutos sempre — o host não roda no seu diretório nem com seu PATH completo (GUIs no macOS têm PATH mínimo). Aponte para binários e scripts por caminho absoluto.
- Nunca escreva no stdout — em stdio, um
print()de debug quebra o parsing. Useloggingpara stderr. - Reinicie o host após editar a configuração — a maioria só relê no boot.
4.5 Depurando com o MCP Inspector
O Inspector é a ferramenta oficial de teste: uma interface web que se conecta ao seu servidor, mostra o handshake, lista primitivas e permite chamar tools manualmente com argumentos arbitrários — sem precisar de um modelo no meio.
terminalnpx @modelcontextprotocol/inspector uv run python pedidos_server.py
Fluxo de trabalho profissional: Inspector primeiro (o contrato está certo?), host depois (o modelo entende e escolhe bem as tools?). Metade dos "bugs de MCP" são, na verdade, descrições ruins que confundem o modelo — e isso você só enxerga testando com o host real.
Publique no GitHub um servidor stdio que resolva um problema seu de verdade (ex.: consultar sua planilha de finanças, controlar seu Obsidian, consultar a API do seu banco de horas). README com: gif de uso no Claude Desktop, instruções de instalação via uvx/npx, decisões de tool design explicadas. Recrutadores técnicos abrem o README antes do código.
- Implemente o servidor de pedidos com um dicionário em memória como "banco" e teste as três primitivas no Inspector.
- Adicione uma tool
cancelar_pedidoe marque-a comdestructiveHint. Observe como o host trata a confirmação. - Quebre de propósito: adicione um
print("debug")no meio de uma tool em stdio e documente o sintoma. Depois conserte com logging em stderr.
Clientes e integrações: do host pronto ao agente próprio
A maioria começa escrevendo servidores. Quem escreve clientes — e agentes que orquestram vários servidores — entra numa fatia mais escassa e mais bem paga do mercado.
5.1 O ecossistema de hosts
Você raramente precisará construir um host do zero: Claude Desktop e Claude.ai (conectores), Claude Code, VS Code/Copilot, Cursor, Windsurf, JetBrains, agentes via API (Claude, OpenAI e outros aceitam servidores MCP diretamente) e dezenas de frameworks de agentes falam MCP. A habilidade de mercado aqui é saber configurar, restringir e auditar servidores nesses hosts — especialmente em ambiente corporativo (quem pode instalar o quê, com quais credenciais, com que escopo).
5.2 Escrevendo um cliente do zero
Escrever um cliente mínimo é o melhor exercício para fixar o protocolo — e é a base de qualquer agente customizado:
cliente mínimo em Pythonimport asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
params = StdioServerParameters(
command="uv", args=["run", "python", "pedidos_server.py"])
async with stdio_client(params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize() # handshake do cap. 2
tools = await session.list_tools()
r = await session.call_tool("buscar_pedido",
{"pedido_id": "BR-1093"})
print(r.content)
asyncio.run(main())
5.3 O loop agêntico: MCP + LLM
Um agente é um loop: o modelo recebe as tools (vindas do tools/list de todos os servidores conectados), decide chamar, o cliente executa via tools/call, devolve o resultado ao modelo, e repete até a resposta final. Este é o coração de qualquer produto agêntico:
esqueleto do loop (Claude API + MCP)tools_mcp = await session.list_tools() # 1. descoberta
schema = [converter(t) for t in tools_mcp.tools] # 2. formato da API do modelo
while True:
resp = client.messages.create(model="claude-sonnet-4-6",
max_tokens=2048, tools=schema, messages=msgs)
if resp.stop_reason != "tool_use": break # 5. resposta final
msgs.append({"role": "assistant", "content": resp.content})
results = []
for b in resp.content:
if b.type == "tool_use": # 3. modelo decidiu
out = await session.call_tool(b.name, b.input) # 4. MCP executa
results.append({"type": "tool_result",
"tool_use_id": b.id, "content": out.content[0].text})
msgs.append({"role": "user", "content": results})
Além disso, a API da Anthropic aceita o parâmetro mcp_servers apontando para servidores remotos — o próprio backend faz a ponte, e seu código não precisa nem do loop de conversão. Conheça as duas formas: o loop manual (controle total, qualquer provedor) e o conector gerenciado (menos código).
5.4 Orquestrando múltiplos servidores
Problemas reais de quem conecta 5+ servidores num agente — e que separam pleno de sênior:
- Colisão de nomes: dois servidores com tool
search. Solução: prefixar por servidor (github__search). - Inflação de contexto: 80 tools no prompt degradam a escolha do modelo e custam tokens. Soluções: filtrar tools por tarefa, carregar sob demanda (descoberta dinâmica), agrupar servidores por "modo" do agente.
- Resultados gigantes: paginação e sumarização antes de devolver ao modelo.
- Confiabilidade: timeout por tool, limite de iterações do loop, orçamento de custo por execução, trilha de auditoria de cada chamada.
Um agente CLI ou web que orquestra 3 servidores MCP (ex.: filesystem + GitHub + um servidor seu) com loop próprio, política de aprovação para tools destrutivas, log estruturado de cada tools/call e um relatório de custo por sessão. Esse projeto responde, com código, às perguntas de system design de 90% das entrevistas de AI Engineer.
- Escreva o cliente mínimo e conecte-o ao seu servidor do cap. 4. Imprima o resultado do handshake (capacidades negociadas).
- Estenda o loop agêntico com um
max_iters=8e um custo máximo. O que o agente deve fazer ao estourar o limite? - Simule colisão: dois servidores com
search. Implemente prefixação e mostre o antes/depois do que o modelo enxerga.
Autoteste: seu agente com 6 servidores ficou lento e "burro" na escolha de tools. Três hipóteses?
Primitivas avançadas: sampling, elicitation, roots e utilitários
As capacidades do lado do cliente invertem a seta do protocolo: agora é o servidor que pede coisas ao host. É aqui que servidores deixam de ser "wrappers de API" e viram componentes verdadeiramente agênticos.
6.1 Sampling: o servidor usa o LLM do host
Com sampling (sampling/createMessage), um servidor pede que o cliente rode uma geração no modelo do host. O servidor ganha inteligência sem ter chave de API própria, sem escolher modelo e sem pagar a conta — e o usuário mantém controle (o host pode exigir aprovação e revisar o prompt).
servidor pedindo uma geração ao host@mcp.tool()
async def triagem_reclamacao(texto: str, ctx: Context) -> str:
"""Classifica a reclamação e sugere prioridade."""
r = await ctx.session.create_message( # sampling!
messages=[{"role": "user", "content":
{"type": "text", "text": f"Classifique em baixa/média/alta e justifique: {texto}"}}],
max_tokens=200)
return r.content.text
Casos de uso legítimos: sumarizar dados grandes antes de devolver à conversa, extrair campos de texto livre, decidir ramificações dentro de uma tool. Cuidados: latência (é um round-trip até o modelo), aprovação humana no host, e nunca depender de um modelo específico — você não escolhe qual roda, apenas envia preferências (modelPreferences com hints e prioridades de custo/velocidade/inteligência).
Desde a revisão 2025-11-25, o sampling aceita os parâmetros tools e toolChoice: o servidor pode rodar um loop agêntico próprio usando o modelo (e as chaves) do host — o modelo pede tool uses, o servidor executa e devolve os resultados na mensagem seguinte. Isso abre a porta para servidores que são, eles mesmos, mini-agentes. Nota de futuro: no release candidate 2026-07-28 o sampling clássico (iniciado pelo servidor) entra em deprecated, substituído pelo padrão MRTR descrito na seção 6.6 — mas segue válido e suportado por pelo menos 12 meses.
6.2 Elicitation: o servidor pergunta ao usuário
Introduzida na revisão 2025-06-18, a elicitation (elicitation/create) permite ao servidor pedir dados estruturados ao usuário no meio de uma operação — com um JSON Schema simples (campos planos) que o host transforma em formulário. O usuário pode aceitar, recusar ou cancelar, e a spec proíbe usar elicitation para pedir segredos (senhas, tokens): credenciais pertencem ao fluxo de autenticação, não a formulários.
A revisão 2025-11-25 resolveu exatamente essa lacuna com o modo URL (mode: "url"): em vez de um formulário, o servidor envia uma URL e o usuário completa o fluxo sensível no navegador — OAuth com terceiros, cadastro de API key, pagamento. O cliente nunca vê as credenciais; o servidor recebe os tokens diretamente. Regras de segurança do host: exibir a URL completa antes do consentimento, nunca pré-buscar a página, abrir só no navegador do sistema (nunca em webview embutida) e destacar o domínio contra spoofing. É o mecanismo padrão para servidores que precisam de autorização junto a outros serviços em nome do usuário — sem token passthrough.
confirmação estruturada antes de agirresult = await ctx.elicit(
message="Confirme o reembolso do pedido BR-1093",
schema={"type": "object", "properties": {
"valor": {"type": "number", "maximum": 500},
"motivo": {"type": "string", "enum": ["defeito", "atraso", "outro"]}},
"required": ["valor", "motivo"]})
if result.action != "accept": return "Reembolso cancelado pelo usuário."
6.3 Roots: delimitando o território
Roots são URIs (tipicamente file://) que o cliente informa ao servidor como fronteiras de operação — "trabalhe dentro destas pastas". São orientação, não sandbox: a aplicação host ainda precisa impor os limites de verdade (permissões do SO, validação de caminhos). Servidores bem-comportados consultam os roots (roots/list) e reagem à notificação de mudança. (No RC 2026-07-28, roots — assim como sampling e logging clássicos — entra em deprecated, com a janela mínima de 12 meses; hosts tendem a mover essa função para configuração da aplicação.)
6.4 Utilitários que separam protótipo de produto
| Utilitário | Mensagens | Para quê |
|---|---|---|
| Progresso | notifications/progress (+ progressToken) | barras de progresso em operações longas |
| Cancelamento | notifications/cancelled | abortar requests em voo (usuário desistiu) |
| Logging | notifications/message + logging/setLevel | telemetria do servidor visível no host |
| Paginação | cursor/nextCursor nas listas | catálogos grandes de tools/resources |
| Completion | completion/complete | autocompletar argumentos de prompts e templates |
| Ping | ping | verificação de vida da conexão |
| Tasks (2025-11-25, experimental) | tasks/get · tasks/cancel | trabalho longo em modo "chame agora, busque depois": a tool devolve um identificador de task e o cliente consulta status e resultado depois |
6.5 Padrões de projeto avançados
- Servidor adaptativo: tools mudam conforme estado (pós-login, plano do usuário, fase do fluxo) usando
listChanged. Reduz drasticamente o contexto do modelo. - Workflow como tool: em vez de expor 12 tools cruas da sua API, exponha 3 tools de intenção ("preparar_relatorio_mensal") que orquestram várias chamadas internamente. Menos passos de modelo = mais confiabilidade e menos custo.
- Resource + tool em par: resource para o dado bruto (contexto), tool para a ação sobre ele — deixando claro ao host o que é leitura e o que é efeito colateral.
- Composição/proxy: um servidor MCP que é, ele próprio, cliente de outros servidores — agregando, filtrando e aplicando políticas (um "gateway MCP"). É o padrão por trás de plataformas corporativas de conectores.
6.6 O que a revisão 2026-07-28 muda neste capítulo
A maior revisão do protocolo desde o lançamento (final prevista para 28/07/2026) reorganiza justamente as interações avançadas deste capítulo. Três peças para acompanhar:
- MRTR — Multi Round-Trip Requests: num protocolo stateless, o servidor não pode mais "ligar de volta" para o cliente a qualquer momento. Quando precisa de algo no meio de uma chamada (uma pergunta ao usuário, uma geração do modelo), ele responde com um
InputRequiredResultcontendo os pedidos (inputRequests) e um estado opaco (requestState); o cliente coleta as respostas e reemite a chamada original com elas. Além disso, pedidos iniciados pelo servidor só podem ocorrer enquanto ele processa uma requisição do cliente — o usuário nunca é interrompido "do nada", e toda elicitation rastreia de volta a algo que ele (ou seu agente) iniciou. - Framework de extensões: extensões ganham processo formal — identificadas por IDs em reverse-DNS, negociadas num mapa
extensionsdas capacidades, versionadas de forma independente da spec. Novas capacidades nascem como extensão e só migram para o núcleo (se um dia migrarem) depois de amadurecer. - Duas extensões oficiais de estreia: MCP Apps — servidores entregam interfaces HTML interativas que o host renderiza em iframe sandboxed; os templates de UI são declarados antecipadamente (o host pode pré-buscar, cachear e revisar), e toda ação da UI volta pelo mesmo JSON-RPC, passando pelo mesmo caminho de auditoria e consentimento de uma tool. E Tasks — o experimento de 2025-11-25 foi redesenhado como extensão para o modelo stateless: o servidor decide responder um
tools/callcom um identificador de task, e o cliente dirige o ciclo comtasks/get,tasks/updateetasks/cancel(otasks/listfoi removido por não ter escopo seguro sem sessões). Quem implementou as Tasks experimentais precisará migrar.
Em entrevistas de system design, "desenhe um servidor MCP para o nosso produto" é a nova "desenhe um encurtador de URL". A resposta forte cobre: escolha das tools por intenção do usuário (não pelo espelho da API REST), schemas restritivos, elicitation para ações sensíveis, paginação de resultados, e o par progresso+cancelamento para operações longas. Cite os utilitários pelo nome — pouquíssimos candidatos citam.
- Adicione ao servidor de pedidos uma tool
reembolsarque usa elicitation para confirmar valor e motivo. - Implemente uma tool de importação que reporta progresso a cada 10% e respeita cancelamento.
- Refatore 8 tools "espelho de API" hipotéticas em 3 tools de intenção. Justifique cada fusão.
Autoteste: quando usar sampling em vez de simplesmente devolver os dados para o modelo do host processar?
Segurança, autenticação e produção
O capítulo que diferencia salários. MCP dá superpoderes ao modelo — e cada superpoder é uma superfície de ataque. Quem sabe operar MCP com segurança em escala é quem as empresas estão disputando.
7.1 Autorização OAuth 2.1 em servidores remotos
Servidores Streamable HTTP autenticam com OAuth 2.1. Desde a revisão 2025-06-18, o servidor MCP é formalmente um resource server — ele valida tokens, mas quem os emite é um authorization server (o seu IdP: Auth0, Keycloak, Okta, etc.). Peças do quebra-cabeça:
- Descoberta: o servidor publica
/.well-known/oauth-protected-resourceapontando para o authorization server; o cliente descobre tudo sozinho e inicia o fluxo. - PKCE obrigatório e registro de cliente sem cadastro manual. O mecanismo original era o Dynamic Client Registration (DCR), que obrigava cada authorization server a manter um banco de clientes; desde a revisão 2025-11-25, o mecanismo recomendado é o CIMD (Client ID Metadata Documents): o próprio client ID é uma URL HTTPS onde o cliente publica seus metadados (nome, redirect URIs, chaves), que o servidor busca e cacheia durante a autorização — sem pré-cadastro em milhares de servidores.
- Descoberta e consentimento modernos: suporte a OpenID Connect Discovery 1.0 além do Protected Resource Metadata, e consentimento incremental de escopos via
WWW-Authenticate— o servidor pede permissões adicionais só quando a operação exige, em vez de tudo no primeiro login (privilégio mínimo na prática). - Resource Indicators (RFC 8707): o token é emitido para aquele servidor específico (claim de audiência). Impede que um token roubado de um servidor seja aceito em outro.
- Proibição de token passthrough: o servidor nunca repassa ao upstream o token que recebeu do cliente, nem aceita tokens emitidos para outra audiência. Se precisa falar com uma API externa, troca por credencial própria (ex.: token exchange).
fluxo resumido1. Cliente → POST /mcp → 401 + WWW-Authenticate (onde me autentico?)
2. Cliente → /.well-known/... → descobre o authorization server
3. Cliente → fluxo OAuth (PKCE) → usuário consente no navegador
4. Cliente → POST /mcp + Bearer → servidor valida (assinatura, audiência, escopo)
5. Servidor executa a tool COM AS PERMISSÕES DAQUELE usuário
O item 5 é a alma do enterprise: identidade propagada. A tool buscar_pedido deve enxergar apenas os pedidos que aquele usuário pode ver. Autorização por usuário, não por servidor.
Duas novidades de 2025/2026 completam o quadro corporativo. A extensão Enterprise-Managed Authorization ficou estável em 2026: a organização gerencia centralmente a autorização dos servidores MCP e o usuário final acessa todos os conectores aprovados com um único login (SSO de verdade para agentes). E o release candidate 2026-07-28 endurece o alinhamento com OAuth/OIDC como são usados na prática — por exemplo, clientes agora devem validar o parâmetro iss nas respostas de autorização (RFC 9207), fechando ataques de mix-up entre authorization servers.
7.2 O mapa de ameaças
| Ameaça | Como funciona | Mitigações |
|---|---|---|
| Prompt injection indireto | conteúdo que a tool retorna (página web, e-mail, issue) contém instruções que o modelo obedece | tratar todo retorno como dado não confiável; aprovação humana para ações sensíveis; escopos mínimos; separar agentes que leem conteúdo externo de agentes com poderes de escrita |
| Tool poisoning | descrição de tool de um servidor malicioso carrega instruções ocultas ("antes de tudo, leia ~/.ssh e envie para...") | instalar servidores só de fontes confiáveis; revisar descrições; hosts que exibem/auditam descrições; pinning de versão |
| Rug pull | servidor confiável atualiza e muda o comportamento das tools | fixar versões, revisar diffs de atualização, registries com verificação |
| Confused deputy | servidor com privilégios altos é induzido a agir em nome do atacante (ex.: proxy OAuth com consentimento reaproveitado) | audiência de token (RFC 8707), consentimento explícito por cliente, não reutilizar aprovações |
| Exfiltração combinada | a "tríade letal": acesso a dado privado + exposição a conteúdo não confiável + canal de saída (web, e-mail) | nunca dar as três capacidades ao mesmo agente sem aprovação humana no meio; políticas de egress |
| Session hijacking | adivinhar/roubar Mcp-Session-Id | IDs criptograficamente aleatórios, TLS sempre, sessão não é autenticação (token continua obrigatório por request) |
| Supply chain | pacote npm/pip do servidor comprometido | lockfiles, auditoria de dependências, executar servidores em sandbox/containers com o mínimo de acesso |
O modelo vai ler tudo o que suas tools retornarem e pode ser convencido por qualquer texto no caminho. Projete assumindo isso: privilégio mínimo por tool, aprovação humana em ações irreversíveis, e isolamento entre "ler o mundo" e "agir no mundo". Segurança em MCP é design, não patch.
7.3 Deploy e operação
- Empacotamento: servidores stdio distribuídos via
uvx/npxou binário; servidores HTTP em containers. Streamable HTTP foi desenhado para funcionar até em serverless (respostas JSON simples quando não há streaming). - Estado e escala: na spec estável corrente (2025-11-25), sessões via
Mcp-Session-Idexigem afinidade de sessão ou armazenamento compartilhado (ex.: Redis) atrás do load balancer — ou modo stateless quando o servidor dispensa sessão. Com a revisão 2026-07-28, a sessão de protocolo desaparece e um round-robin comum basta; ao projetar hoje, minimize a dependência de sessão para que a migração seja trivial. - Observabilidade: logue cada
tools/callcom usuário, argumentos (com redação de dados sensíveis), duração, resultado/erro; exporte métricas (latência por tool, taxa deisError, tokens consumidos por resultados). Tracing distribuído (OpenTelemetry) ligando conversa → chamada → sistemas downstream é o padrão que empresas maduras pedem. - Testes: unitários da lógica; contrato via Inspector/cliente de teste; e evals com modelo real — um conjunto de tarefas em linguagem natural que devem resultar nas chamadas corretas. Tool design se testa com evals, não só com asserts.
- Versionamento: a spec versiona por data e o servidor versiona seu pacote (semver). Mudar schema de tool é breaking change para o modelo também — descreva mudanças e mantenha compatibilidade quando puder.
7.4 Distribuição: o MCP Registry
O Registry oficial (registry.modelcontextprotocol.io) é um catálogo aberto com API padronizada: servidores publicam metadados (nome com namespace, pacotes, transporte) e clientes/marketplaces consomem o índice — inclusive sub-registries corporativos com curadoria interna (só servidores aprovados pelo time de segurança). Publicar seu servidor no registry, com metadados corretos, é o "último quilômetro" da distribuição — e mais um item verificável de portfólio. Para dimensionar o ecossistema em 2026: registries independentes indexam dezenas de milhares de servidores e os SDKs oficiais somam algo na casa de dezenas de milhões de downloads mensais; no roadmap, os MCP Server Cards propõem metadados em URLs .well-known para que navegadores, crawlers e registries descubram capacidades de um servidor sem precisar conectar.
Um servidor Streamable HTTP multiusuário, com OAuth 2.1 (Keycloak ou Auth0), deploy em container na nuvem, logs estruturados + métricas, e um documento de threat model de 1 página cobrindo a tabela da seção 7.2. Esse conjunto — código + operação + segurança — é raro em candidatos e é exatamente o que times de plataforma procuram.
- Escreva o threat model do seu servidor de pedidos: para cada tool, liste o pior uso indevido possível e a mitigação.
- Explique por que token passthrough é proibido, usando o cenário de um servidor MCP na frente de uma API interna de RH.
- Monte um eval com 10 frases de usuário e as chamadas de tool esperadas; rode contra seu servidor e meça acertos.
Autoteste: o que é a "tríade letal" e como quebrá-la?
MCP no mercado de trabalho
Tudo o que você estudou até aqui vale dinheiro quando está visível, verificável e conectado às dores reais das empresas. Este capítulo transforma conhecimento em contratação.
8.1 Onde o MCP aparece nas vagas
Você raramente verá o cargo "Engenheiro de MCP". O protocolo aparece como requisito ou diferencial dentro destes perfis:
| Perfil | Como o MCP aparece | Capítulos-chave |
|---|---|---|
| AI Engineer / LLM Engineer | "experiência com tool use/function calling e MCP", construir agentes que orquestram conectores | 1, 2, 5, 6 |
| Backend/Platform Engineer | expor APIs internas como servidores MCP; gateway corporativo de conectores | 3, 4, 7 |
| Developer Experience / Integrações (SaaS) | construir o servidor MCP do produto para clientes usarem em Claude, IDEs e agentes | 4, 6, 7 |
| Segurança de IA / AppSec | threat modeling de agentes, revisão de servidores, políticas de instalação | 7 |
| Solutions/Sales Engineer | demos e provas de conceito conectando o produto ao ecossistema de IA | 1, 4, 5 |
| Automação / RevOps / Dados | conectar CRMs, planilhas e bancos a assistentes; MCP como cola de automação | 1, 4, 5 |
Termos para configurar nos alertas de vaga: MCP, Model Context Protocol, tool use, function calling, AI agents, agentic, conectores/integrações de IA, LLM integrations.
8.2 Como colocar no currículo e no LinkedIn
- Fraco: "Conhecimento em MCP." Forte: "Projetei e operei servidor MCP (Streamable HTTP + OAuth 2.1) expondo o ERP a 300 usuários via Claude; 14 tools de intenção, p95 de 800 ms, zero incidentes de segurança em 6 meses."
- Use os verbos do domínio: projetei tools, negociei capacidades, implementei elicitation, publiquei no MCP Registry, escrevi threat model. Recrutadores técnicos filtram por vocabulário.
- Cada projeto de portfólio (caps. 4, 5 e 7) vira: repositório com README forte + post curto explicando decisões + demo em vídeo de 60s. Três projetos assim contam uma progressão: local → agente → produção segura.
- Mostre que acompanha o padrão: desde a doação à Agentic AI Foundation, o MCP evolui por SEPs e Working Groups públicos. Citar uma SEP relevante para a vaga (ex.: a de extensões ou a de Tasks) ou ter comentado uma discussão no repositório da spec é um sinal raro e forte de senioridade.
8.3 Banco de perguntas de entrevista
Conceituais — responda em 2–3 frases cada, em voz alta, cronometrado:
- O que o MCP resolve que function calling puro não resolve? (padronização entre hosts: a tool escrita uma vez serve a qualquer cliente; ciclo de vida, descoberta, resources/prompts e capacidades bidirecionais que function calling não define)
- Host × cliente × servidor — quem é quem?
- Tool × resource × prompt e o modelo de controle (modelo × aplicação × usuário).
- stdio × Streamable HTTP: quando cada um, e o que aconteceu com o HTTP+SSE original?
- Erro de protocolo × erro de execução (
isError): por que a distinção existe? - O que é sampling e por que um servidor o usaria em vez de ter chave de API própria?
- Por que token passthrough é proibido? O que é audiência de token?
- Descreva prompt injection indireto com um exemplo envolvendo uma tool de leitura de e-mail.
- O que muda com o núcleo stateless da revisão 2026-07-28, e por que isso importa para quem opera atrás de load balancer? (fim do initialize e da sessão de protocolo → round-robin simples, sem sticky sessions; interações servidor→cliente viram MRTR)
- Quando usar Tasks em vez de uma chamada síncrona com notificações de progresso? (quando a operação pode exceder o tempo de vida razoável da requisição/conexão: o cliente recebe um identificador e consulta depois)
- DCR × CIMD: qual problema o CIMD resolve no registro de clientes OAuth?
- O que é o modo URL de elicitation e que problema de credenciais ele elimina?
De design — pratique desenhando de verdade:
- Desenhe o servidor MCP do nosso SaaS de gestão de projetos. Quais tools, quais resources, o que exige elicitation?
- Nosso agente ficou lento com 70 tools de 9 servidores. Plano de ataque?
- Como você levaria um servidor stdio interno para 5 mil usuários com SSO corporativo?
De código (teste técnico típico): implementar um servidor com 2–3 tools sobre uma API fake, com validação, erros bem reportados e um teste; ou depurar um servidor com bugs plantados (print no stdout, schema errado, descrição enganosa).
8.4 Plano de estudo de 6 semanas
| Semana | Meta | Entregável verificável |
|---|---|---|
| 1 | Caps. 1–2: conceitos + protocolo; ler a spec corrente por cima | Explicar M×N e o handshake sem consultar nada |
| 2 | Cap. 4: primeiro servidor stdio + Inspector + Claude Desktop/Code | Projeto nº 1 no GitHub com README e gif |
| 3 | Cap. 5: cliente próprio + loop agêntico | Agente CLI orquestrando 2 servidores |
| 4 | Cap. 6: sampling, elicitation, progresso; refatorar para tools de intenção | Projeto nº 2 completo, com política de aprovação |
| 5 | Cap. 7: OAuth 2.1 + deploy em container + logs/métricas | Servidor remoto no ar com login funcionando |
| 6 | Threat model, evals, publicação no Registry; simular entrevistas da seção 8.3 | Projeto nº 3 + post técnico publicado |
Empresas não contratam "quem sabe MCP" — contratam quem conecta sistemas reais a modelos com segurança e bom design de tools. O protocolo é o meio. Se seus três projetos provarem isso publicamente, o MCP deixa de ser uma linha do currículo e vira a razão da entrevista.
Glossário e trilha de referência
Vocabulário mínimo para ler a spec, discutir em inglês e não travar em entrevista.
| Termo | Definição de bolso |
|---|---|
| Host | Aplicação de IA que o usuário usa; coordena clientes e modelo. |
| Client | Componente do host com conexão 1:1 a um servidor. |
| Server | Programa que expõe tools, resources e prompts via MCP. |
| Capability negotiation | Troca de capacidades no initialize; define o contrato da sessão. |
| Tool / Resource / Prompt | Primitivas do servidor: ação (controle do modelo) / dado (controle da aplicação) / template (controle do usuário). |
| Sampling / Roots / Elicitation | Primitivas do cliente: geração pelo LLM do host / fronteiras de operação / perguntas estruturadas ao usuário. |
| stdio / Streamable HTTP | Transportes: subprocesso local via stdin/stdout / endpoint HTTP único com JSON ou SSE. |
| structuredContent / outputSchema | Saída de tool em JSON validável (revisão 2025-06-18). |
| Annotations | Dicas de comportamento da tool (readOnly, destructive...); não confiáveis para segurança. |
| Resource template | URI parametrizada (esquema://{var}) que descreve uma família de resources. |
| Mcp-Session-Id | Header que identifica a sessão no Streamable HTTP (até 2025-11-25; a revisão 2026-07-28 elimina a sessão de protocolo). |
| RFC 8707 / audiência | Token OAuth amarrado a um servidor específico; base contra confused deputy. |
| Token passthrough | Repassar o token do cliente ao upstream — proibido pela spec. |
| Tool poisoning / rug pull | Instruções maliciosas em descrições / mudança maliciosa em atualização. |
| MCP Inspector | Ferramenta oficial de teste e depuração de servidores. |
| MCP Registry | Catálogo oficial e aberto de servidores, com API para sub-registries. |
| SEP / Working Group | Spec Enhancement Proposal — mecanismo público de evolução do protocolo — e os grupos que as conduzem, sob a Agentic AI Foundation (Linux Foundation). |
| CIMD | Client ID Metadata Documents: o client ID OAuth é uma URL com os metadados do cliente; registro sem pré-cadastro (recomendado desde 2025-11-25). |
| Tasks | Trabalho longo em modo "chame agora, busque depois": identificador de task + consulta de status/resultado. Experimental em 2025-11-25; extensão oficial redesenhada na 2026-07-28. |
| Elicitation modo URL | Servidor envia uma URL e o usuário completa o fluxo sensível no navegador; o cliente nunca vê credenciais. |
| MRTR | Multi Round-Trip Requests (2026-07-28): o servidor pede insumos devolvendo InputRequiredResult; o cliente responde reemitindo a chamada com requestState. |
| Extensões / MCP Apps | Capacidades opcionais negociadas por ID reverse-DNS e versionadas fora da spec; MCP Apps é a extensão de interfaces HTML sandboxed servidas pelo servidor. |
| Ciclo de vida (Active/Deprecated/Removed) | Política formal: mínimo de 12 meses entre depreciação e remoção (90 dias em emergência de segurança). |
Fontes primárias para continuar
- modelcontextprotocol.io — especificação corrente, tutoriais e SDKs (leia a spec da versão que você usa; ela é curta).
- github.com/modelcontextprotocol — SDKs, Inspector, servidores de referência e o registry.
- Documentação de MCP dos hosts que você usa (Claude Docs para Claude Desktop/Code e API).
- Changelogs entre revisões da spec — ler o diff entre versões é o jeito mais rápido de se manter atualizado (e rende boas respostas em entrevista).