Domínio 2 — Tool Design & MCP Integration · Lição 5 de 6

MCP: arquitetura, transportes e configuração

Objetivos de aprendizagem

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

PrimitivaO que éQuem controla o uso
ToolsAções executáveis (criar issue, consultar banco)O modelo decide chamar
ResourcesConteúdo endereçável por URI (esquemas de banco, sumários de issues, hierarquia de docs)A aplicação/host anexa como contexto
PromptsTemplates de interação reutilizáveisO 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

Configuração no Claude Code

Dois escopos principais:

ArquivoEscopoUso
.mcp.json (raiz do projeto)Projeto — versionado no repositórioTooling compartilhado do time: todo mundo que clona recebe
~/.claude.jsonUsuário — só a sua máquinaServidores 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

Resumo em 5 linhas

  1. MCP é cliente-servidor: o host mantém um cliente por servidor; tools são descobertas na conexão e ficam todas disponíveis simultaneamente.
  2. Primitivas: tools (modelo executa), resources (host anexa como contexto — use como catálogo anti-exploração), prompts (usuário invoca).
  3. Transportes: stdio para processo local; HTTP para servidor remoto compartilhado.
  4. No Claude Code: .mcp.json de projeto (versionado, time) vs ~/.claude.json de usuário (pessoal); credenciais via expansão ${VAR}; gerencie com claude mcp.
  5. Prefira servidores comunitários para integrações padrão; na API, o MCP connector (beta mcp-client-2025-11-20) conecta a servidores remotos com mcp_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?

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?

3. Qual afirmação sobre transportes MCP está correta?

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?