MCP: arquitetura, transportes e configuração
Objetivos de aprendizagem
- Descrever a arquitetura cliente-servidor do Model Context Protocol e suas três primitivas: tools, resources e prompts.
- Diferenciar os transportes
stdio(processo local) e HTTP (servidor remoto). - Configurar servidores no Claude Code:
.mcp.jsonde projeto (compartilhado no repositório) vs~/.claude.jsonde usuário (pessoal/experimental), com expansão${VAR}para credenciais. - Entender a descoberta de tools na conexão e usar resources como catálogo para reduzir chamadas exploratórias.
- Decidir entre servidores comunitários e implementações custom; conhecer o MCP connector da API (beta).
Arquitetura cliente-servidor
O MCP padroniza como aplicações de IA (hosts) acessam contexto e ações externas. Um host (Claude Code, Claude Desktop, seu agente) mantém um cliente MCP por conexão; cada servidor MCP expõe capacidades de um sistema (GitHub, Jira, banco de dados) num protocolo único. Na conexão, o cliente faz o handshake e descobre as tools do servidor (tools/list); as tools de todos os servidores configurados ficam disponíveis simultaneamente para o agente.
flowchart LR
subgraph Host [Host: Claude Code / agente]
M[Modelo] --- C1[Cliente MCP 1]
M --- C2[Cliente MCP 2]
end
C1 -- stdio --> S1[Servidor local\nex.: filesystem]
C2 -- HTTP --> S2[Servidor remoto\nex.: GitHub]
S1 --- P1[(tools / resources / prompts)]
S2 --- P2[(tools / resources / prompts)]
As três primitivas
| Primitiva | O que é | Quem controla o uso |
|---|---|---|
| Tools | Ações executáveis (criar issue, consultar banco) | O modelo decide chamar |
| Resources | Conteúdo endereçável por URI (esquemas de banco, sumários de issues, hierarquia de docs) | A aplicação/host anexa como contexto |
| Prompts | Templates de interação reutilizáveis | O usuário invoca |
Resources como catálogo: expor um catálogo (ex.: lista de sumários de issues, esquema do banco) como resource dá ao agente visibilidade do que existe sem gastar turnos em chamadas exploratórias de tools — padrão cobrado no exame para reduzir round-trips.
Transportes: stdio e HTTP
- stdio: o host lança o servidor como processo local filho e conversa por stdin/stdout. Ideal para servidores locais (filesystem, CLIs). Baixa latência, sem rede.
- HTTP (streamable): o servidor roda remoto e atende via HTTP. Ideal para serviços compartilhados/hospedados, com autenticação própria (tokens, OAuth).
Configuração no Claude Code
Dois escopos principais:
| Arquivo | Escopo | Uso |
|---|---|---|
.mcp.json (raiz do projeto) | Projeto — versionado no repositório | Tooling compartilhado do time: todo mundo que clona recebe |
~/.claude.json | Usuário — só a sua máquina | Servidores pessoais/experimentais que não devem afetar o time |
.mcp.json de projeto com expansão de variável de ambiente — o token não é commitado; cada dev define GITHUB_TOKEN no próprio ambiente:
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/",
"headers": {
"Authorization": "Bearer ${GITHUB_TOKEN}"
}
},
"local-db": {
"command": "npx",
"args": ["-y", "@example/db-mcp-server"],
"env": {
"DB_URL": "${DATABASE_URL}"
}
}
}
}
Gerenciamento pela CLI com claude mcp:
# adicionar servidor stdio no escopo do projeto (.mcp.json)
claude mcp add --scope project local-db -- npx -y @example/db-mcp-server
# adicionar servidor pessoal (escopo de usuário)
claude mcp add --scope user experiments -- npx -y @example/experimental-server
# listar e remover
claude mcp list
claude mcp remove experiments
Se o agente prefere built-ins (ex.: Grep) a uma tool MCP mais capaz, a causa habitual é descrição fraca da tool MCP: enriqueça a descrição explicando capacidades e saídas em detalhe. E lembre: como as tools de todos os servidores ficam disponíveis ao mesmo tempo, cada servidor adicionado aumenta a superfície de seleção — conecte só o que o projeto usa.
Comunitário vs custom: para integrações padrão (Jira, GitHub, Postgres), prefira servidores comunitários existentes — manutenção compartilhada e chegada mais rápida. Reserve servidores custom para workflows específicos do seu time que nenhum servidor pronto cobre.
MCP connector na API (beta)
Fora do Claude Code, a Messages API pode conectar-se diretamente a servidores MCP remotos via MCP connector (beta mcp-client-2025-11-20): a Anthropic faz a conexão server-side. Dois parâmetros obrigatórios juntos: mcp_servers (as conexões) e uma entrada mcp_toolset em tools referenciando cada servidor pelo name:
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=2048,
betas=["mcp-client-2025-11-20"],
mcp_servers=[{
"type": "url",
"url": "https://mcp.example.com/sse",
"name": "issue-tracker",
"authorization_token": "TOKEN_AQUI",
}],
tools=[{
"type": "mcp_toolset",
"mcp_server_name": "issue-tracker",
}],
messages=[{
"role": "user",
"content": "Liste as issues abertas com label 'bug' e resuma as 3 mais antigas.",
}],
)
for block in response.content:
if block.type == "text":
print(block.text)
Omitir o mcp_toolset correspondente é erro de validação: todo servidor em mcp_servers deve ser referenciado por exatamente um toolset. O connector é para servidores remotos (URL); para servidores locais via stdio no seu processo, use os helpers MCP do SDK.
Pegadinhas da prova
- Distrator típico: colocar o servidor do time em
~/.claude.json— os colegas não recebem; tooling compartilhado vai em.mcp.jsonversionado no projeto. - Distrator típico: commitar o token literal no
.mcp.json"porque o repo é privado". Use${VAR}; segredo fica no ambiente de cada dev. - Pegadinha: resources não são tools — são conteúdo que o host anexa; o padrão "catálogo como resource" existe justamente para evitar chamadas exploratórias de tools.
- Distrator típico: escrever um servidor Jira custom do zero quando há servidor comunitário maduro — custom é para workflow específico do time.
- Pegadinha: MCP connector na API é beta (
mcp-client-2025-11-20) e exigemcp_servers+mcp_toolsetjuntos.
Resumo em 5 linhas
- MCP é cliente-servidor: o host mantém um cliente por servidor; tools são descobertas na conexão e ficam todas disponíveis simultaneamente.
- Primitivas: tools (modelo executa), resources (host anexa como contexto — use como catálogo anti-exploração), prompts (usuário invoca).
- Transportes:
stdiopara processo local; HTTP para servidor remoto compartilhado. - No Claude Code:
.mcp.jsonde projeto (versionado, time) vs~/.claude.jsonde usuário (pessoal); credenciais via expansão${VAR}; gerencie comclaude mcp. - Prefira servidores comunitários para integrações padrão; na API, o MCP connector (beta
mcp-client-2025-11-20) conecta a servidores remotos commcp_servers+mcp_toolset.
Documentação oficial
Questões de fixação
1. O time quer que um servidor MCP do Jira esteja disponível para todos que clonarem o repositório, autenticando com token individual sem commitar segredos. Qual configuração?
Gabarito: A. Projeto-escopo versionado + expansão ${VAR} é exatamente o padrão recomendado. B não é compartilhado via version control e ainda expõe o token num arquivo pessoal. C commita segredo — vaza no histórico do git. D reinventa com fricção o que .mcp.json já resolve nativamente.
2. Um agente gasta 6–8 chamadas de tools "exploratórias" só para descobrir quais tabelas e issues existem antes de começar o trabalho. Qual mecanismo MCP reduz isso?
Gabarito: C. Resources existem para dar visibilidade de conteúdo sem gastar turnos de tools — o padrão "catálogo". A acelera a exploração, mas não a elimina. B ainda é uma chamada de tool e tende a inundar o contexto com tudo. D usa a primitiva errada: prompts são templates invocados pelo usuário.
3. Qual afirmação sobre transportes MCP está correta?
Gabarito: B. stdio = processo filho local via stdin/stdout; HTTP = servidor remoto. A inverte os papéis. C é falsa: Claude Code suporta servidores HTTP também. D é falsa: as primitivas expostas independem do transporte.
4. Ao usar o MCP connector na Messages API (beta), o request retorna erro de validação. O código declara mcp_servers=[{"type": "url", "url": "...", "name": "tracker"}] e tools=[]. Qual é a causa provável?
Gabarito: D. O connector exige os dois parâmetros juntos, com o mcp_server_name casando com o name do servidor. A é falsa: os schemas vêm do próprio servidor MCP. B inverte: o connector é para servidores remotos por URL. C é inventada — não há dependência de code execution.