{"jsonrpc":"2.0","method":"initialize","params":{"clientInfo":{"name":"você"}}}

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.

nível: básico → muito avançado código: Python + TypeScript foco: empregabilidade revisada: jul/2026 · spec 2025-11-25 + RC 2026-07-28
{"method":"cap/01.intro"}

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)

QuandoO que aconteceuPor que importa
Nov/2024A 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/2025Adoçã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/2025Revisão 2025-03-26: transporte Streamable HTTP, autorização OAuth 2.1, anotações de tools.Base dos servidores remotos modernos.
Jun/2025Revisão 2025-06-18: elicitation, saída estruturada de tools, resource links, servidor como resource server OAuth.Maturidade para uso corporativo.
Set/2025Lança o MCP Registry oficial, um catálogo aberto de servidores.Descoberta e distribuição padronizadas.
Nov/2025Revisã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/2025A 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/2026Publicado 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/2026Release 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.
Radar jul/2026 · a revisão 2026-07-28 em um parágrafo

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.

Nota de atualidade

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:

PrimitivaQuem expõeQuem decide usarExemplo
Toolsservidoro modelo (com aprovação do usuário)criar_ticket, buscar_pedido
Resourcesservidora aplicação/usuário (contexto)file:///relatorio.pdf, esquema do banco
Promptsservidoro usuário (ex.: comandos de barra)/revisar-pr, template de resumo
Samplingclienteo servidor pede, o usuário aprovaservidor pede ao LLM do host para resumir um texto
Rootsclientea aplicação"você pode operar dentro de ~/projeto"
Elicitationclienteo servidor pede, o usuário responde"confirme o e-mail antes de enviar"
No mercado de trabalho

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.

Exercícios · cap. 01
  1. Explique o problema M×N para um colega não técnico em até 3 frases, sem usar a palavra "protocolo".
  2. Para um sistema de e-commerce, liste 3 candidatos a tool, 3 a resource e 1 a prompt.
  3. 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?
Porque padroniza a "porta" de conexão: qualquer aplicação compatível (cliente) conecta a qualquer periférico compatível (servidor) sem integração sob medida — reduzindo M×N conectores para M+N implementações.

{"method":"cap/02.protocolo"}

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:

TipoTem id?Espera resposta?Exemplo no MCP
Requestsimsimtools/call, resources/read
Responsesim (o mesmo)result ou error
Notificationnãonãonotifications/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.

Radar 2026-07-28 · o fim do handshake

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 outputSchema e 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.

No mercado de trabalho

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.

Exercícios · cap. 02
  1. Escreva à mão (sem SDK) o JSON-RPC de: (a) listar tools; (b) chamar criar_ticket com título e prioridade; (c) a resposta com isError: true porque a API externa retornou 503.
  2. Modele o inputSchema de uma tool agendar_reuniao com data ISO, duração em minutos (15–120) e lista de e-mails.
  3. 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?
Violação de contrato: o cliente não deveria enviar (a negociação de capacidades proíbe usar o que não foi declarado) e o servidor tipicamente responde com erro JSON-RPC de método não suportado. Capacidades declaradas no handshake são o contrato da sessão.

{"method":"cap/03.transportes"}

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 para stderr ou 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.

Radar 2026-07-28 · adeus, sessões pegajosas

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ériostdioStreamable HTTP
Onde rodamáquina do usuário (subprocesso)qualquer lugar (serviço web)
Nº de usuários1 por processomultiusuário, escala horizontal
Autenticaçãoimplícita (permissões do SO)OAuth 2.1 / tokens (cap. 7)
Acesso a recursos locaisnativo (arquivos, apps)não (só o que o serviço alcança)
Distribuiçãousuário instala (npm/pip/binário)você faz deploy; usuário só aponta a URL
Caso típicodev tools, filesystem, gitSaaS, APIs corporativas, produtos
No mercado de trabalho

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.

Exercícios · cap. 03
  1. Seu time quer expor o ERP interno para 300 funcionários usarem via Claude. Qual transporte, e por quê?
  2. 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).
  3. Desenhe (papel mesmo) o fluxo de um tools/call demorado 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?
O modelo de dois endpoints exigia conexão SSE permanente e dificultava balanceamento de carga, retomada e execução serverless. O Streamable HTTP unifica tudo num endpoint que responde com JSON simples ou abre SSE sob demanda, com sessões explícitas via header.

{"method":"cap/04.servidor"}

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
Armadilhas clássicas
  • 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. Use logging para 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.

Projeto de portfólio nº 1 (júnior/pleno)

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.

Exercícios · cap. 04
  1. Implemente o servidor de pedidos com um dicionário em memória como "banco" e teste as três primitivas no Inspector.
  2. Adicione uma tool cancelar_pedido e marque-a com destructiveHint. Observe como o host trata a confirmação.
  3. 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.

{"method":"cap/05.clientes"}

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.
Projeto de portfólio nº 2 (pleno/sênior)

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.

Exercícios · cap. 05
  1. Escreva o cliente mínimo e conecte-o ao seu servidor do cap. 4. Imprima o resultado do handshake (capacidades negociadas).
  2. Estenda o loop agêntico com um max_iters=8 e um custo máximo. O que o agente deve fazer ao estourar o limite?
  3. 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?
(1) Excesso de tools no contexto — filtrar/carregar sob demanda; (2) descrições ambíguas ou redundantes entre servidores — revisar tool design e prefixar; (3) resultados de tools muito grandes poluindo a conversa — paginar/sumarizar. Bônus: latência de servidores remotos em série — paralelizar chamadas independentes.

{"method":"cap/06.avancado"}

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árioMensagensPara quê
Progressonotifications/progress (+ progressToken)barras de progresso em operações longas
Cancelamentonotifications/cancelledabortar requests em voo (usuário desistiu)
Loggingnotifications/message + logging/setLeveltelemetria do servidor visível no host
Paginaçãocursor/nextCursor nas listascatálogos grandes de tools/resources
Completioncompletion/completeautocompletar argumentos de prompts e templates
Pingpingverificação de vida da conexão
Tasks (2025-11-25, experimental)tasks/get · tasks/canceltrabalho 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 InputRequiredResult contendo 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 extensions das 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/call com um identificador de task, e o cliente dirige o ciclo com tasks/get, tasks/update e tasks/cancel (o tasks/list foi removido por não ter escopo seguro sem sessões). Quem implementou as Tasks experimentais precisará migrar.
No mercado de trabalho

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.

Exercícios · cap. 06
  1. Adicione ao servidor de pedidos uma tool reembolsar que usa elicitation para confirmar valor e motivo.
  2. Implemente uma tool de importação que reporta progresso a cada 10% e respeita cancelamento.
  3. 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?
Quando o processamento intermediário não deve poluir a conversa principal: sumarizar 200 KB de logs para devolver 2 KB úteis, extrair campos no meio de um workflow de várias etapas, ou decidir uma ramificação interna. Se o dado é pequeno e a decisão é "da conversa", devolva direto — sampling adiciona latência e um ponto de aprovação.

{"method":"cap/07.producao"}

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-resource apontando 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çaComo funcionaMitigações
Prompt injection indiretoconteúdo que a tool retorna (página web, e-mail, issue) contém instruções que o modelo obedecetratar 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 poisoningdescriçã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 pullservidor confiável atualiza e muda o comportamento das toolsfixar versões, revisar diffs de atualização, registries com verificação
Confused deputyservidor 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 combinadaa "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 hijackingadivinhar/roubar Mcp-Session-IdIDs criptograficamente aleatórios, TLS sempre, sessão não é autenticação (token continua obrigatório por request)
Supply chainpacote npm/pip do servidor comprometidolockfiles, auditoria de dependências, executar servidores em sandbox/containers com o mínimo de acesso
Princípio central

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/npx ou 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-Id exigem 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/call com usuário, argumentos (com redação de dados sensíveis), duração, resultado/erro; exporte métricas (latência por tool, taxa de isError, 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.

Projeto de portfólio nº 3 (sênior)

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.

Exercícios · cap. 07
  1. Escreva o threat model do seu servidor de pedidos: para cada tool, liste o pior uso indevido possível e a mitigação.
  2. Explique por que token passthrough é proibido, usando o cenário de um servidor MCP na frente de uma API interna de RH.
  3. 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?
Dado privado + conteúdo não confiável + canal de exfiltração no mesmo agente. Quebra-se removendo um vértice: agente que lê web não tem acesso a segredos; agente com dados privados não tem canal de saída livre; ou toda ação de saída passa por aprovação humana.

{"method":"cap/08.carreira"}

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:

PerfilComo o MCP apareceCapítulos-chave
AI Engineer / LLM Engineer"experiência com tool use/function calling e MCP", construir agentes que orquestram conectores1, 2, 5, 6
Backend/Platform Engineerexpor APIs internas como servidores MCP; gateway corporativo de conectores3, 4, 7
Developer Experience / Integrações (SaaS)construir o servidor MCP do produto para clientes usarem em Claude, IDEs e agentes4, 6, 7
Segurança de IA / AppSecthreat modeling de agentes, revisão de servidores, políticas de instalação7
Solutions/Sales Engineerdemos e provas de conceito conectando o produto ao ecossistema de IA1, 4, 5
Automação / RevOps / Dadosconectar CRMs, planilhas e bancos a assistentes; MCP como cola de automação1, 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:

  1. 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)
  2. Host × cliente × servidor — quem é quem?
  3. Tool × resource × prompt e o modelo de controle (modelo × aplicação × usuário).
  4. stdio × Streamable HTTP: quando cada um, e o que aconteceu com o HTTP+SSE original?
  5. Erro de protocolo × erro de execução (isError): por que a distinção existe?
  6. O que é sampling e por que um servidor o usaria em vez de ter chave de API própria?
  7. Por que token passthrough é proibido? O que é audiência de token?
  8. Descreva prompt injection indireto com um exemplo envolvendo uma tool de leitura de e-mail.
  9. 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)
  10. 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)
  11. DCR × CIMD: qual problema o CIMD resolve no registro de clientes OAuth?
  12. O que é o modo URL de elicitation e que problema de credenciais ele elimina?

De design — pratique desenhando de verdade:

  1. Desenhe o servidor MCP do nosso SaaS de gestão de projetos. Quais tools, quais resources, o que exige elicitation?
  2. Nosso agente ficou lento com 70 tools de 9 servidores. Plano de ataque?
  3. 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

SemanaMetaEntregável verificável
1Caps. 1–2: conceitos + protocolo; ler a spec corrente por cimaExplicar M×N e o handshake sem consultar nada
2Cap. 4: primeiro servidor stdio + Inspector + Claude Desktop/CodeProjeto nº 1 no GitHub com README e gif
3Cap. 5: cliente próprio + loop agênticoAgente CLI orquestrando 2 servidores
4Cap. 6: sampling, elicitation, progresso; refatorar para tools de intençãoProjeto nº 2 completo, com política de aprovação
5Cap. 7: OAuth 2.1 + deploy em container + logs/métricasServidor remoto no ar com login funcionando
6Threat model, evals, publicação no Registry; simular entrevistas da seção 8.3Projeto nº 3 + post técnico publicado
A tese de empregabilidade desta apostila

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.


{"method":"cap/09.referencia"}

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.

TermoDefinição de bolso
HostAplicação de IA que o usuário usa; coordena clientes e modelo.
ClientComponente do host com conexão 1:1 a um servidor.
ServerPrograma que expõe tools, resources e prompts via MCP.
Capability negotiationTroca de capacidades no initialize; define o contrato da sessão.
Tool / Resource / PromptPrimitivas do servidor: ação (controle do modelo) / dado (controle da aplicação) / template (controle do usuário).
Sampling / Roots / ElicitationPrimitivas do cliente: geração pelo LLM do host / fronteiras de operação / perguntas estruturadas ao usuário.
stdio / Streamable HTTPTransportes: subprocesso local via stdin/stdout / endpoint HTTP único com JSON ou SSE.
structuredContent / outputSchemaSaída de tool em JSON validável (revisão 2025-06-18).
AnnotationsDicas de comportamento da tool (readOnly, destructive...); não confiáveis para segurança.
Resource templateURI parametrizada (esquema://{var}) que descreve uma família de resources.
Mcp-Session-IdHeader 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ênciaToken OAuth amarrado a um servidor específico; base contra confused deputy.
Token passthroughRepassar o token do cliente ao upstream — proibido pela spec.
Tool poisoning / rug pullInstruções maliciosas em descrições / mudança maliciosa em atualização.
MCP InspectorFerramenta oficial de teste e depuração de servidores.
MCP RegistryCatálogo oficial e aberto de servidores, com API para sub-registries.
SEP / Working GroupSpec Enhancement Proposal — mecanismo público de evolução do protocolo — e os grupos que as conduzem, sob a Agentic AI Foundation (Linux Foundation).
CIMDClient ID Metadata Documents: o client ID OAuth é uma URL com os metadados do cliente; registro sem pré-cadastro (recomendado desde 2025-11-25).
TasksTrabalho 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 URLServidor envia uma URL e o usuário completa o fluxo sensível no navegador; o cliente nunca vê credenciais.
MRTRMulti Round-Trip Requests (2026-07-28): o servidor pede insumos devolvendo InputRequiredResult; o cliente responde reemitindo a chamada com requestState.
Extensões / MCP AppsCapacidades 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).