Model Context Protocol: um servidor para rodar, implantar e testar

O MCP é um padrão aberto para conectar modelos de IA a ferramentas e dados — pense nele como um contrato tipado e independente de linguagem que qualquer cliente de IA consome sem escrever código de integração sob medida. Construí um servidor MCP pequeno e com cara de produção para mostrar o caminho completo: o protocolo, uma camada de UI interativa opcional e rodar na AWS. Você pode operá-lo aqui mesmo no navegador.

O que é MCP?

Antes do MCP, cada assistente integrava cada ferramenta com sua própria cola sob medida — uma bagunça N×M que ninguém era dono. O MCP substitui isso por um único protocolo: um cliente (o host de IA — Claude, Cursor, VS Code, Copilot) conversa com servidores que expõem ferramentas, recursos e prompts por JSON-RPC. Dizem que é o "USB-C das ferramentas de IA": construa seu servidor uma vez e qualquer cliente compatível com MCP poderá usá-lo — sem retrabalho por assistente.

Por que importa

Construa uma vez, reutilize em todo lugar

Um servidor é consumido por todo cliente compatível com MCP. Você não reintegra a cada nova ferramenta de IA que seus times adotam.

Um único ponto de controle

Autenticação, limites de taxa, allow-lists e auditoria ficam em um servidor que você opera — e não espalhados por prompts e clientes. É ali que política de acesso e logging pertencem.

Independente de fornecedor

O protocolo é aberto e agnóstico de modelo. Troque o host ou o modelo sem reescrever a integração — você não fica preso ao formato de plugin de um fornecedor.

Você é dono do caminho dos dados

O servidor roda na sua conta, ao lado dos seus sistemas. Dados sensíveis e credenciais ficam do seu lado da fronteira.

Duas camadas: um protocolo e uma UI opcional

Vale separar na cabeça — elas são desacopladas de propósito.

Core MCP — para o modelo

Ferramentas, recursos e prompts que o modelo chama por JSON-RPC; o host renderiza o resultado. É o caso de 90% das vezes, e é o que torna um servidor reutilizável entre clientes.

MCP Apps — para a pessoa

Uma extensão opcional (SEP-1865): uma ferramenta também pode entregar uma página HTML que o host renderiza em um iframe isolado, conversando de volta via postMessage. Use só onde uma pessoa se beneficia de uma interface visual. Esta demo traz um painel por ferramenta para você clicar em cada um — em produção, a UI é seletiva.

Como uma chamada flui

De ponta a ponta, uma chamada de ferramenta são cinco saltos — sem mágica, só JSON-RPC sobre HTTP.

  1. 1 · HostO app de IA (Claude, Cursor) decide que uma ferramenta é necessária e monta os argumentos.
  2. 2 · ClienteSeu cliente MCP envia uma requisição JSON-RPC tools/call.
  3. 3 · TransportePor Streamable HTTP até POST /mcp — através de um load balancer para qualquer réplica.
  4. 4 · FerramentaO servidor valida os argumentos contra o schema da ferramenta e a executa.
  5. 5 · ResultadoA saída estruturada volta para o host — e, se a ferramenta tiver um MCP App, sua UI é renderizada.

Arquitetura

O servidor usa o transporte Streamable HTTP em um único endpoint (POST /mcp). Um host envia JSON-RPC; atrás de um load balancer, qualquer uma das N réplicas idênticas atende a requisição.

MCP HostClaude · VS CodeJSON-RPCPOST /mcpALB / IngressTLS · authStateless replicas (N)MCP serverfresh server + transport per requestMCP serverfresh server + transport per requestMCP serverfresh server + transport per requestNo session state → any replica serves any request → scale out (EKS/ECS) or to zero (Lambda).

Por que sem estado

Cada requisição cria um servidor e um transporte novos — nenhum estado de sessão mantido em memória entre chamadas. É essa decisão de design que permite rodar N réplicas intercambiáveis atrás de um load balancer (EKS/ECS) ou escalar a zero (Lambda) sem sessões fixas. O mesmo código roda sem alterações nos três destinos.

Como esta demo roda ao vivo

O painel "Teste ao vivo" abaixo não é simulado — este é o caminho real que uma chamada de ferramenta faz em karina-borges.com.

Browserkarina-borges.comHTTPSVercel · Next.jspage + /api/mcp-demorate-limit · allow-listsame-origin proxyMCP_DEMO_URLBearer · HTTPSAWS LambdaFunction URL · HTTPSscale-to-zerofresh server + transport / requestLive backend: Lambda — scale-to-zero, ~$0 idle, HTTPS Function URL (no load balancer).The same image also runs on EKS or ECS — see "Where it runs" below.
  1. 1 · NavegadorVocê clica em Executar em karina-borges.com — um app Next.js servido pela Vercel.
  2. 2 · Proxy da VercelA página chama uma rota de mesma origem, /api/mcp-demo — nunca o servidor MCP diretamente. Ela limita a taxa, aplica uma allow-list somente-leitura e adiciona o token bearer.
  3. 3 · Até a AWSO proxy encaminha a requisição JSON-RPC por HTTPS para a Function URL do Lambda (MCP_DEMO_URL), com o token bearer anexado.
  4. 4 · LambdaO Lambda inicia (ou reaproveita) uma instância, cria um servidor e um transporte novos, valida os argumentos e executa a ferramenta determinística — e volta a escalar para zero quando ocioso.
  5. 5 · De volta para vocêO resultado estruturado volta pelo proxy até o painel — e, nos painéis MCP App, para dentro do iframe isolado.

O proxy é a fronteira de segurança. O navegador não é confiável, então o limite de taxa, a allow-list somente-leitura e o token bearer ficam todos em uma única rota de mesma origem — o público pode operar a demo sem nunca alcançar o servidor MCP diretamente.

Por que Lambda? Custo.

A demo ao vivo roda em Lambda para escalar a zero — praticamente US$ 0 quando ociosa, com HTTPS embutido e sem load balancer ou nós sempre ligados. EKS e ECS estão documentados abaixo como opções de produção: a mesma imagem e o mesmo código, com trade-offs diferentes de custo e controle.

Onde rodar: EKS vs ECS vs Lambda

EKS

Controle total — HPA, rolling updates, mTLS via service mesh, sub-redes privadas. A escolha certa quando você já roda Kubernetes e quer que o servidor MCP seja "só mais um Deployment". Você assume o peso operacional do cluster e paga pelos nós mesmo ocioso.

≈ US$ 120–180/mês — control plane, nós, ALB e NAT sempre ligados

ECS / Fargate

O mesmo contêiner, muito menos para operar: você define uma task e um service, e a AWS agenda. SSE de longa duração funciona bem. Costuma ser a escolha pragmática quando você ainda não roda Kubernetes.

≈ US$ 30–40/mês — uma task sempre ligada + ALB

LambdaRoda esta demo ao vivo

Serverless, escala a zero — não paga nada ocioso. A ausência de estado o torna um encaixe natural; o porém é o streaming limitado e o teto de 15 minutos. Ótimo para tráfego irregular e de baixo volume.

≈ US$ 0/mês ocioso — escala a zero, paga por requisição

Observabilidade

O servidor expõe logs estruturados em JSON e um endpoint Prometheus /metrics. Abaixo ele está, ao vivo — os mesmos sinais que você coletaria no Prometheus, CloudWatch ou Grafana em produção.

Métricas do servidor ao vivo

GET /metrics

Obtidas ao vivo do endpoint Prometheus /metrics do servidor, pelo proxy de mesma origem. Execute uma ferramenta acima e atualize — os contadores se movem.

Requisições
Latência média
Uptime

Mostra o tráfego MCP real — os polls de /metrics do próprio widget e as sondas de /healthz são excluídos, então atualizar não move o contador (só executar uma ferramenta ou carregar um painel move). Os contadores são por réplica e em memória; no Lambda (escala a zero) refletem uma única instância quente e zeram no cold start — em produção você agregaria via Prometheus ou CloudWatch/EMF.

Teste ao vivo

Escolha uma ferramenta, edite os argumentos JSON e execute contra o servidor MCP. A requisição passa por um proxy de mesma origem, com limite de taxa, que só permite estas ferramentas determinísticas e somente-leitura — sem segredos, sem caminhos de escrita. Abaixo, carregue o painel MCP App de qualquer ferramenta e interaja com ele para ver o ciclo de postMessage.

Ferramenta
Requisição
Resposta

As chamadas passam por um proxy de mesma origem até o servidor MCP. Se o servidor da demo não estiver rodando, você verá um erro amigável — o protocolo e a UI ainda ilustram o fluxo.

Painel de UI do MCP App

ui://devtools/pr-panel

Escolha o painel de uma ferramenta abaixo. Cada um é o recurso ui:// do servidor renderizado em um iframe isolado; edite os campos e envie — o painel manda um tools/call de volta, o proxy executa e o resultado é devolvido. Um ciclo completo de postMessage.

Escolha um painel acima para renderizar a UI isolada do MCP App.

Métricas do servidor ao vivo

GET /metrics

Obtidas ao vivo do endpoint Prometheus /metrics do servidor, pelo proxy de mesma origem. Execute uma ferramenta acima e atualize — os contadores se movem.

Requisições
Latência média
Uptime

Mostra o tráfego MCP real — os polls de /metrics do próprio widget e as sondas de /healthz são excluídos, então atualizar não move o contador (só executar uma ferramenta ou carregar um painel move). Os contadores são por réplica e em memória; no Lambda (escala a zero) refletem uma única instância quente e zeram no cold start — em produção você agregaria via Prometheus ou CloudWatch/EMF.