MCP com Chrome: Automação com IA · Capítulo 10 de 16 · 20 min
Configurar o servidor MCP sem herdar um prazo de validade
Um bloco de configuração copiado decide se qualquer página aberta alcança o seu servidor, e a revisão nova do protocolo tem data marcada.
Este capítulo faz parte do curso gratuito MCP com Chrome: Automação com IA.
O que é: O MCP é o protocolo que padroniza como um assistente de IA conversa com ferramentas. Ele evolui por revisões datadas, e a configuração que seu time cola hoje decide duas coisas silenciosas: se um servidor local escuta só você ou qualquer aba aberta, e por quanto tempo ela continua funcionando. Por que importa: A revisão 2026-07-28, vigente desde 28 de julho de 2026, reescreveu a base do protocolo, e os SDKs oficiais pularam para a linha 2.0 no mesmo dia. Configuração escrita sem esse cuidado vira dívida com data de vencimento: funciona hoje e para sozinha quando as dependências avançarem, sem ninguém ter mexido em nada. A sua decisão: Se a casa fixa versões e escreve contra a revisão vigente, ou se convive com builds que quebram sozinhas. E quanto vale impedir que um servidor que dirige um navegador logado fique alcançável de fora. O que delegar: A auditoria dos arquivos de configuração, a checagem do endereço de escuta e a fixação de versões. O passo a passo para operar vem logo abaixo.
Glossário rápido
Revisão vigente vs. anterior
A revisão vigente é a 2026-07-28, publicada em 28 de julho de 2026; a anterior, 2025-11-25, é a que boa parte do ecossistema instalado ainda negocia. É como uma lei nova já em vigor enquanto contratos antigos seguem rodando: os SDKs 2.x atendem as duas eras no mesmo servidor, e por isso a virada não derruba ninguém de um dia para o outro.
Fixar versão (pinning)
Trocar "a mais recente" por um número exato na configuração. Equivale a assinar a edição do contrato que você leu, e não uma futura que nunca viu: sem isso, a build sobe de versão sozinha e pode quebrar sem ninguém tocar no código.
Em algum momento desta semana você vai copiar um bloco de configuração de servidor MCP (o padrão que liga o assistente às ferramentas, como uma tomada universal). De um post, da documentação de um projeto, da resposta de um agente. Esse bloco é curto, parece inofensivo e você vai colar sem ler linha por linha.
Ele decide duas coisas que não se anunciam: se o servidor que dirige o seu navegador escuta apenas você ou escuta qualquer página aberta em outra aba, e por quanto tempo essa configuração continua funcionando.
Engenharia de protocolo fica de fora; o módulo fixa o mínimo que evita duas dores caras: um servidor local alcançável de fora, e uma configuração que funciona hoje e para sozinha daqui a algumas semanas porque uma revisão nova entrou em vigor.
As revisões do MCP são identificadas por data, no formato AAAA-MM-DD, e a data marca a última vez em que houve mudança incompatível. Cada revisão carrega um estado: Draft, Current ou Final. A revisão vigente é a 2026-07-28, desde 28 de julho de 2026; a 2025-11-25 passou a ser a anterior.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A 2026-07-28 foi anunciada como candidata em 21 de maio de 2026 e publicada como vigente em 28 de julho de 2026, ao fim de uma janela de validação de dez semanas. No mesmo dia saíram a versão 2.0 do SDK de Python e a do SDK de TypeScript.
A virada importa porque a revisão reescreveu a camada base. Configuração antiga não quebra de um dia para o outro, porque os SDKs 2.x atendem clientes da era 2025 no mesmo servidor. O risco está na dependência sem limite superior, que sobe sozinha para a 2.x e leva junto a mudança de import.
Os dois erros de leitura são simétricos e custam igual. Tratar a 2025-11-25 como se continuasse vigente produz código novo apoiado em recurso já deprecado. Tratar a migração para o SDK 2.x como detalhe produz build quebrada, porque o pacote de TypeScript se dividiu em servidor e cliente e o FastMCP do Python passou a se chamar MCPServer. A postura correta é escrever código novo contra a 2026-07-28 e migrar as dependências com data marcada, fixando a versão exata que você testou.
Dois transportes, não três.
A especificação define exatamente dois transportes: stdio e Streamable HTTP. Clientes devem preferir stdio quando for possível, e é por stdio que a maioria dos servidores locais de controle de navegador roda.
O transporte antigo, com um endpoint de GET para o stream e outro de POST para as mensagens, pertence à revisão 2024-11-05 e está deprecado desde a revisão 2025-03-26. Boa parte dos tutoriais de 2024 e do começo de 2025 ensina justamente esse par de endpoints, o que os torna material vencido sem aviso na página.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
SSE não é um terceiro transporte. Dentro do Streamable HTTP, SSE é apenas um modo de resposta que o servidor pode usar quando precisa mandar mais de uma mensagem. Se um texto listar "stdio, HTTP e SSE" como três opções de mesmo nível, ele foi escrito contra a especificação antiga e o resto dele provavelmente também está.
# Caminho documentado para adicionar o servidor oficial do Chrome no Claude Code.
# O escopo user grava a configuracao no seu usuario, valendo em qualquer projeto.
claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest
# A documentacao oficial do Chrome tambem descreve a via de plugin, dentro do Claude Code:
# /plugin marketplace add ChromeDevTools/chrome-devtools-mcp
# /plugin install chrome-devtools-mcp@chrome-devtools-plugins
# Confira o que ficou registrado antes de seguir.
claude mcp list{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": ["-y", "chrome-devtools-mcp@latest"]
}
}
}Esse bloco é a configuração de referência publicada pelo próprio time do Chrome, e ele usa stdio: o cliente sobe o servidor como processo filho e conversa por entrada e saída padrão. Não existe porta aberta, não existe header de origem, e por isso não existe a superfície de ataque que vem a seguir.
A conversa muda quando o servidor é HTTP e roda na sua máquina. Aí entram as duas regras de higiene que a própria especificação exige.
Primeira regra: o servidor deve validar o header Origin e responder 403 Forbidden quando ele estiver presente e for inválido. A segunda: rodando localmente, o servidor deveria se ligar apenas a 127.0.0.1, e não a todas as interfaces.
Por trás das duas está o mesmo mecanismo. Uma página qualquer que você abriu no navegador consegue fazer requisições para endereços locais. Com um nome de domínio que troca de resolução no meio do caminho, ela alcança o servidor que roda na sua máquina como se fosse um serviço remoto comum. Isso se chama DNS rebinding, é conhecido há anos, e não depende de você clicar em nada.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Um servidor MCP de controle de navegador não é um serviço qualquer rodando na sua máquina. Ele clica, digita, navega e lê o que estiver na tela, dentro de um navegador que provavelmente tem sessões logadas. Quem alcança esse servidor ganha as suas sessões, muito além de um endpoint.
# 1) Descubra em qual endereco cada servidor local esta escutando.
# Se aparecer 0.0.0.0 ou ::: no endereco local, ele aceita conexao de fora da maquina.
# Se aparecer 127.0.0.1, ele so aceita conexao da propria maquina. E o que voce quer.
netstat -an | grep LISTEN
# No Windows, dentro do PowerShell, o equivalente e:
# Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, OwningProcess# 2) Simule uma pagina hostil chamando o seu servidor MCP local.
# Troque a porta e o caminho pelos do seu servidor.
# Resposta esperada de um servidor bem configurado: 403.
# Se vier 200, qualquer pagina aberta no seu navegador tambem consegue falar com ele.
curl -s -o /dev/null -w "%{http_code}\n" \
-X POST http://127.0.0.1:3000/mcp \
-H "Content-Type: application/json" \
-H "Origin: https://pagina-qualquer.example" \
-H "MCP-Protocol-Version: 2025-11-25" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'Repare no header MCP-Protocol-Version do comando acima. Na revisão 2025-11-25 ele é obrigatório em toda requisição depois da inicialização, e um servidor que não o recebe assume 2025-03-26, perdendo em silêncio tudo que veio depois. Na 2026-07-28 a versão viaja no _meta de cada requisição e, no Streamable HTTP, também nesse header; versão que o servidor não suporta devolve UnsupportedProtocolVersionError com a lista das aceitas.
O que a 2026-07-28 mudou debaixo dos seus pés.
A 2026-07-28 tornou o protocolo stateless. O handshake de inicialização saiu, e junto com ele saíram notifications/initialized e o header Mcp-Session-Id. A versão do protocolo e as capacidades do cliente passaram a viajar em _meta a cada requisição, e um método novo, server/discover, assumiu o papel de anunciar versões e capacidades. Servidores que precisam de estado entre chamadas passaram a usar handles explícitos, cunhados pelo servidor e passados como argumento comum de ferramenta.
2025-11-25 (anterior)
cliente -> initialize .................. negocia versão e capacidades
cliente -> notifications/initialized
servidor <- Mcp-Session-Id .............. ancora o estado da conversa
cliente -> tools/call + header MCP-Protocol-Version
2026-07-28 (vigente desde 28/07/2026)
cliente -> server/discover ............. versões e capacidades, opcional
cliente -> tools/call
_meta: io.modelcontextprotocol/protocolVersion
io.modelcontextprotocol/clientCapabilities
(sem handshake, sem Mcp-Session-Id: estado vira handle explícito)Roots, Sampling e Logging estão deprecados na revisão 2026-07-28, com remoção elegível apenas na primeira revisão publicada em ou após 2027-07-28. Ou seja, continuam funcionando por pelo menos doze meses. As migrações sugeridas: passar diretórios e arquivos por parâmetro de ferramenta, URI de recurso ou configuração do servidor no lugar de Roots; integrar direto com a API do provedor de LLM no lugar de Sampling; escrever em stderr no stdio ou usar OpenTelemetry no lugar de Logging. Construir coisa nova em cima das três hoje é escolher dívida de olhos abertos.
# Python: a linha 2.0 saiu em 28/07/2026 e `pip install mcp` ja instala a 2.x.
# Ainda nao migrou? Limite superior explicito, como o proprio SDK recomenda:
pip install "mcp>=1.28,<2"
# TypeScript: na linha 2.x o pacote unico se dividiu em servidor e cliente
# (@modelcontextprotocol/server e @modelcontextprotocol/client).
# O pacote @modelcontextprotocol/codemod reescreve os imports antigos.
# Em qualquer linguagem, fixe a versao EXATA que voce testou, sem ^ e sem ~.
# Veja primeiro o que esta instalado de verdade:
npm ls --depth=0A divisão do pacote TypeScript em servidor e cliente é uma quebra de import, não um ajuste de assinatura. Todo arquivo que importa do pacote único precisa ser tocado. Descobrir isso pelo erro de build, na pressa, é bem pior do que descobrir agora lendo uma linha do seu package.json.
SERVIDOR TRANSPORTE ESCUTA RISCO chrome-devtools stdio n/a nenhum de rede playwright stdio n/a capacidades de código ligadas servidor-interno HTTP 0.0.0.0:8931 alcançável de fora + sem 403 em Origin DEPENDÊNCIAS mcp (Python) >=1.27 SEM LIMITE SUPERIOR -> já instala a 2.x sdk (TypeScript) faixa com ^ SEM VERSÃO FIXA -> quebra no split de pacote CORRIGIR HOJE (ordem por custo) 1. pôr limite superior na dependência Python ~2 min 2. ligar servidor-interno em 127.0.0.1 ~5 min 3. validar Origin no servidor-interno ~1 h
Aprovar um servidor uma vez vale para o conteúdo daquele momento. A definição das ferramentas pode ser reescrita depois da aprovação inicial, e a sua aprovação continua valendo para um texto que você nunca leu. Fixar versão é o que mantém a aprovação de ontem sobre a mesma coisa amanhã.
Tarefa deste módulo. Rode a auditoria e responda por escrito, em um arquivo, quatro perguntas: qual transporte cada servidor seu usa; se algum servidor local está ligado em algo diferente de 127.0.0.1; se alguma dependência de SDK está sem limite superior de versão; e se algum servidor foi aprovado uma vez e nunca mais revisado.
Depois corrija o item mais barato hoje mesmo. Na maioria das configurações o mais barato é o limite superior na dependência, que leva dois minutos e evita a quebra silenciosa quando a dependência subir para a 2.x sem ninguém pedir.
Sua auditoria existe como arquivo, nomeia o transporte de cada servidor e aponta pelo menos um item que precisa de ajuste ou de fixação de versão antes da migração para a linha 2.x. Você consegue explicar com as próprias palavras, sem consultar este módulo, por que fixar versão evita que uma configuração que funciona hoje pare de funcionar sozinha, e por que ligar um servidor local em 127.0.0.1 com validação de origem não é zelo excessivo quando esse servidor dirige um navegador logado.
O que chega até você é uma questão de disciplina, acima da escolha de transporte ou do formato de um header: a casa fixa versões e revisa configuração antes de colar, ou aceita que builds parem sozinhas e que servidores locais fiquem expostos. Trate a fixação de versão e o endereço de escuta de servidores que dirigem navegadores logados como padrão obrigatório para todo o time. Exigir isso agora custa minutos; descobrir na quebra custa uma madrugada.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Veja o que estudar antes e para onde seguir depois, explore os conceitos e compare abordagens em outros cursos. Sugestões marcadas como “sugerido pelo grafo” vêm dos assuntos em comum, não do índice do curso.
Estude antes
- Usar o mapa do curso e o glossário mínimosugerido pelo grafoApresenta o conceito “MCP”, usado em “Configurar o servidor MCP sem herdar um prazo de validade”.
- Paralelizar cenas com subagentes sem estourar o limite das APIssugerido pelo grafoApresenta o conceito “SDK”, usado em “Configurar o servidor MCP sem herdar um prazo de validade”.
- CursoMCP para quem decidesugerido pelo grafo7 capítulos de “MCP com Chrome: Automação com IA” usam conceitos apresentados em “MCP para quem decide”.
- CursoNode.js: JavaScript no Servidorsugerido pelo grafo3 capítulos de “MCP com Chrome: Automação com IA” usam conceitos apresentados em “Node.js: JavaScript no Servidor”.
Conceitos deste capítulo
O mesmo assunto em outros cursos
- Software e IA para executivosConferir quem publicou cada plugue que liga o agente aos sistemasExaminar conexões de Conferir quem publicou cada plugue que liga o agente aos sistemas
- MCP para quem decidePreparar a empresa para ser o servidorExaminar conexões de Preparar a empresa para ser o servidor
- Agentes de IA Autônomos: Do Conceito à ProduçãoMCP (Model Context Protocol)Examinar conexões de MCP (Model Context Protocol)
- Skills de IA com Vibecoding e TerminalModel Context Protocol: o USB-C da IAExaminar conexões de Model Context Protocol: o USB-C da IA
Voltar ao capítulo anterior: Barrar o ataque que chega pela ferramenta que você instalou
Leve uma ideia para a prática
Escolha uma atividade no painel e volte a este curso quando quiser.
Atividades e evolução ficam reunidas no painel da sua conta.
Capítulos vizinhos em MCP com Chrome: Automação com IA
- 08Cortar o vazamento pela montagem, sem depender da instrução escrita
- 09Barrar o ataque que chega pela ferramenta que você instalou
- 10Configurar o servidor MCP sem herdar um prazo de validade
- 11Fazer a automação sobreviver à segunda-feira sem duplicar registro
- 12Descobrir o que a IA não vê na página que você vê