MCP na prática: ferramentas e conceitos essenciais para codar com IA contextual
Rocketseat

Rocketseat

5 min de leitura
inteligencia-artificial
Faaaala, dev! No nosso último artigo sobre o tema aqui do blog, a gente mergulhou fundo no porquê do Model Context Protocol (MCP) ser uma verdadeira revolução na forma como integramos Inteligência Artificial. Vimos como ele promete dar um fim àquela bagunça de APIs desconexas e à frustrante perda de contexto que tanto limita o potencial das IAs no nosso dia a dia.
A empolgação foi palpável! Mas, como bons desenvolvedores que somos, a pergunta seguinte ecoou forte: "Show! Mas... e agora? Como eu começo a brincar com isso? Quais ferramentas eu uso? Como funciona essa mágica por baixo dos panos?"
Se essa pulga ficou atrás da sua orelha, pode chegar mais! Este artigo é o seu guia inicial, o seu "mapa estelar" para navegar pelas ferramentas, tecnologias e conceitos fundamentais que você precisa conhecer para dar os primeiros passos no desenvolvimento com MCP. Bora desmistificar isso juntos e preparar nosso foguete para essa nova fronteira?

Seu kit de partida: os SDKs MCP

Pra começar, a boa notícia: você não precisa reinventar a roda para falar a "língua" do MCP. Assim como temos SDKs (Software Development Kits) para interagir com serviços na nuvem ou bancos de dados, o ecossistema MCP também oferece (ou está começando a oferecer) seus próprios kits.
O que são esses SDKs? Pense neles como bibliotecas superpoderosas para a sua linguagem de programação favorita. Eles abstraem boa parte da complexidade do protocolo MCP, fornecendo funções e classes prontas para você:
  • Construir Clients MCP: aplicações que vão consumir as capacidades oferecidas por um Server MCP (pode ser seu app web, uma ferramenta de linha de comando, ou até mesmo um plugin para sua IDE).
  • Construir Servers MCP: aplicações ou serviços que vão expor capacidades e contexto para os Clients (pode ser uma ferramenta externa, um wrapper para uma API legada, um acesso inteligente a um banco de dados).
Em quais linguagens? A comunidade e empresas como a Anthropic (frequentemente associada ao início do MCP) estão trabalhando em SDKs para as linguagens que a gente mais usa no dia a dia, como:
  • TypeScript/JavaScript: essencial para o mundo web e Node.js.
  • Python: queridinho da galera de dados e IA.
  • Java/Kotlin: fortes no mundo corporativo e Android.
Onde encontrar? Fique de olho nas documentações das empresas que estão impulsionando o protocolo. Uma busca por "Model Context Protocol SDK [sua linguagem]" deve te dar um norte.
A ideia principal é: os SDKs estão aí para acelerar seu desenvolvimento e te deixar focar na lógica da sua aplicação, e não nos detalhes de baixo nível do protocolo.

A mágica por trás das cortinas: entendendo a comunicação MCP

Ok, temos os SDKs. Mas como a informação flui entre quem pede (Client) e quem oferece (Server) as capacidades contextuais? Aqui entram as camadas de comunicação, inspiradas em modelos que já conhecemos:
  • Protocol Layer (o maestro): essa camada é o "cérebro" que entende a linguagem MCP. Ela sabe interpretar os diferentes tipos de mensagens (vamos vê-las já já!), processar Requests, enviar Notifications, formatar Results e lidar com Errors.
    • Analogia: pense no Protocol Layer como o gerente experiente de um restaurante. Ele recebe seu pedido, sabe exatamente o que você quer, se espera uma resposta ou não, encaminha para a cozinha (Server) e depois traz a resposta formatada ou avisa se houve algum problema.
  • Transport Layer (o entregador): essa camada é responsável por levar as mensagens de um ponto a outro. Ela não precisa entender o conteúdo da mensagem MCP, apenas garantir que ela chegue ao destino. Os meios de transporte mais comuns aqui são:
    • stdio (Standard Input/Output): ideal para comunicação local, na mesma máquina. O Client "conversa" com o Server diretamente pela linha de comando (entrada e saída padrão). Super útil para ferramentas CLI ou quando Client e Server rodam juntinhos.
    • HTTP/SSE (Server-Sent Events): a escolha para comunicação remota (rede). Usa o protocolo HTTP que amamos, mas com um tempero especial: SSE. Isso permite que o Server envie atualizações para o Client em tempo real, sem que o Client precise ficar perguntando ("polling"). É uma comunicação mais eficiente para notificações e eventos assíncronos do Server para o Client.
    • Flexibilidade: o MCP também permite a criação de transportes customizados, caso você precise de algo muito específico (talvez WebSockets? gRPC? As possibilidades são abertas!).
E o formato da "encomenda"? JSON-RPC 2.0 As mensagens que viajam por essas camadas seguem um padrão bem conhecido: JSON-RPC 2.0. É um jeito leve e simples de fazer chamadas de procedimento remoto (Remote Procedure Calls) usando JSON. Se você já integrou alguma API moderna, provavelmente já esbarrou em algo parecido.

Os 4 tipos de mensagem MCP:

  1. Request: um pedido do Client para o Server executar algo. Sempre espera uma Result ou um Error.
      • Exemplo (Conceitual): { "jsonrpc": "2.0", "id": 1, "method": "listProjectFiles", "params": { "projectId": "rocketseat-launch" } }
  1. Result: a resposta positiva a um Request. Contém o resultado da operação.
      • Exemplo (Conceitual): { "jsonrpc": "2.0", "id": 1, "result": { "files": ["launch.ts", "rocketseat.rs"] } }
  1. Error: a resposta quando algo dá errado no processamento do Request. Contém código e mensagem de erro.
      • Exemplo (Conceitual): { "jsonrpc": "2.0", "id": 1, "error": { "code": -32601, "message": "Project not found" } }
  1. Notification: uma mensagem enviada em uma única direção (geralmente do Server para o Client, mas pode ser o contrário) que não espera resposta. Ideal para avisos, eventos ou atualizações.
      • Exemplo (Conceitual): { "jsonrpc": "2.0", "method": "fileDidChange", "params": { "filePath": "rocketseat.rs" } }
Entender essas camadas e mensagens te dá a base para saber como depurar problemas e arquitetar suas soluções com MCP.

Os superpoderes do MCP: construindo capacidades incríveis!

Agora vem a parte mais legal! O verdadeiro poder do MCP está nas capacidades (capabilities) que um Server pode oferecer ao mundo. São elas que permitem à IA ter contexto e agir de forma inteligente. Vamos conhecer as três principais:

Resources: dando olhos e memória à IA

  • O quê? São a forma padronizada de expor dados do seu sistema (código-fonte, logs, documentos, informações de um banco, etc.) para serem usados como contexto pela IA ou pelo usuário final.
  • Como? Cada Resource é identificado por uma URI (Uniform Resource Identifier), tipo file:///app/src/user.ts ou db://products/sku/12345. O Server MCP implementa a lógica para:
    • ListResources: informar quais Resources estão disponíveis.
    • ReadResource: ler e entregar o conteúdo de um Resource específico quando solicitado.
  • Por quê? Isso permite que a IA "enxergue" informações relevantes do mundo real de forma controlada. Ela pode ler um arquivo de código para te ajudar a refatorar, analisar um log para diagnosticar um erro, ou consultar dados de um produto para responder a um cliente.
  • Exemplo prático (conceitual):
    • // No seu Server MCP (usando um exemplo de SDK hipotético) // Handler para listar os logs disponíveis server.setRequestHandler(ListResourcesRequestSchema, async () => { console.log(">> Client pediu a lista de Resources!"); // Lógica para buscar os logs disponíveis (ex: últimos 5 arquivos de log) const availableLogs = await findAvailableLogFiles(); // Sua função return { resources: availableLogs.map(log => ({ uri: `file:///var/log/${log.fileName}`, // URI única para cada log name: `Log: ${log.date}`, // Nome amigável mimeType: "text/plain" })) }; }); // Handler para ler o conteúdo de um log específico server.setRequestHandler(ReadResourceRequestSchema, async (request) => { const uri = request.params.uri; console.log(`>> Client quer ler o Resource: ${uri}`); if (uri.startsWith("file:///var/log/")) { const fileName = uri.replace("file:///var/log/", ""); try { const logContent = await readSpecificLogFile(fileName); // Sua função para ler o arquivo // Retorna o conteúdo como texto simples return { contents: [{ uri, mimeType: "text/plain", text: logContent }] }; } catch (err) { throw new Error(`Erro ao ler o log ${fileName}`); // Ou um erro MCP } } throw new Error("Resource URI inválida"); });
      O código acima mostra como um Server responderia a pedidos para listar (ListResources) e ler (ReadResource) arquivos de log. Ele define manipuladores (setRequestHandler) que contêm a lógica específica para encontrar e ler esses arquivos, retornando os dados no formato esperado pelo MCP.

Prompts: suas receitas de bolo para interações inteligentes

  • O quê? São templates de prompt reutilizáveis e workflows de interação que você define no Server. O Client (ou a própria IA) pode então acioná-los pelo nome.
  • Como? Um Prompt pode:
    • Aceitar argumentos dinâmicos (ex: "gere um commit para essas mudanças").
    • Incluir automaticamente o conteúdo de Resources relevantes no contexto.
    • Encadear múltiplas perguntas ou passos para guiar o usuário ou a IA.
    • O Server implementa ListPrompts e GetPrompt (que pega os argumentos, busca os Resources se necessário, monta a mensagem final e a envia para a LLM).
  • Por quê? Padroniza interações frequentes, garante a qualidade e o contexto dos prompts enviados à LLM, e permite criar experiências guiadas mais complexas de forma estruturada. É como ter suas "receitas" de interação com a IA prontas para usar!
  • Exemplo prático (conceitual):
    • // No seu Server MCP (usando um exemplo de SDK hipotético) // Handler para retornar um prompt específico formatado server.setRequestHandler(GetPromptRequestSchema, async (request) => { const promptName = request.params.name; console.log(`>> Client pediu para usar o Prompt: ${promptName}`); if (promptName === "explainCode" && request.params.arguments?.codeUri) { const codeUri = request.params.arguments.codeUri; // 1. Usa o ReadResource internamente para buscar o código const codeResource = await server.internalReadResource(codeUri); // Função interna do SDK/Server const codeText = codeResource.contents[0].text; const language = request.params.arguments.language || "desconhecida"; // 2. Monta a mensagem final para a LLM, incluindo o código return { messages: [{ role: "user", content: { type: "text", text: `Por favor, explique este trecho de código em ${language}:\n\n\`\`\`\n${codeText}\n\`\`\`` } }] }; } // ... outros prompts ... throw new Error("Prompt não encontrado ou argumentos inválidos"); });
      Este exemplo mostra um handler GetPrompt para "explainCode". Ele recebe a URI do código como argumento, usa a capacidade ReadResource internamente para buscar o conteúdo do código, e então monta a mensagem final que será enviada para a LLM processar, já com todo o contexto necessário.

Tools: dando mãos e ferramentas à IA

  • O quê? São a forma de permitir que a IA execute ações no mundo real através do seu Server. É aqui que a IA deixa de ser só um cérebro e ganha "mãos" para agir.
  • Como?
    • O Server declara as Tools que oferece usando ListTools, descrevendo o que cada uma faz e quais parâmetros (inputs) ela espera (usando um schema JSON).
    • Quando a IA decide que precisa usar uma ferramenta para cumprir uma tarefa, ela envia um CallToolRequest para o Server.
    • O Server executa a lógica da ferramenta (chama uma API, atualiza um banco, etc.) e retorna o resultado para a IA.
  • Por quê? Isso transforma a IA num agente poderoso! Ela pode calcular impostos, agendar reuniões, enviar e-mails, fazer deploy de uma aplicação, controlar dispositivos IoT... As possibilidades são imensas! É o equivalente padronizado pelo MCP aos famosos "Plugins" ou "Function Calling" das LLMs.
  • Exemplo Prático (Conceitual em TypeScript):
    • // No seu Server MCP (usando um exemplo de SDK hipotético) // Handler para listar as tools disponíveis para a IA server.setRequestHandler(ListToolsRequestSchema, async () => { console.log(">> Client (IA) pediu a lista de Tools!"); return { tools: [{ name: "scheduleMeeting", description: "Agenda uma reunião no calendário.", inputSchema: { // Define os parâmetros esperados type: "object", properties: { attendees: { type: "array", items: { type: "string" }, description: "Emails dos participantes" }, startTime: { type: "string", format: "date-time", description: "Início da reunião (ISO 8601)" }, durationMinutes: { type: "number", description: "Duração em minutos" } }, required: ["attendees", "startTime"] } }] }; }); // Handler para executar a tool quando a IA chamar server.setRequestHandler(CallToolRequestSchema, async (request) => { const toolName = request.params.name; console.log(`>> Client (IA) quer executar a Tool: ${toolName}`); if (toolName === "scheduleMeeting") { const args = request.params.arguments; try { // Lógica REAL para chamar a API de calendário const meetingResult = await callCalendarAPI(args.attendees, args.startTime, args.durationMinutes); // Retorna um texto simples confirmando para a IA return { content: [{ type: "text", text: `Reunião agendada com sucesso! ID: ${meetingResult.id}` }] }; } catch (err) { // Informa a IA que deu erro return { content: [{ type: "text", text: `Falha ao agendar reunião: ${err.message}` }] }; // Ou poderia retornar um erro MCP estruturado } } throw new Error("Tool não encontrada"); });
      Aqui, definimos uma Tool chamada "scheduleMeeting". O ListTools descreve a ferramenta e seus parâmetros. O CallTool contém a lógica que (neste exemplo conceitual) chamaria uma API de calendário real e retornaria uma mensagem de sucesso ou falha para a IA, que então pode usar essa informação para responder ao usuário final.

Decolando com MCP: pronto para construir o futuro?

Ufa! Passamos pelos SDKs que facilitam nossa vida, desvendamos como a comunicação acontece por baixo dos panos e exploramos os superpoderes dos Resources, Prompts e Tools. Deu pra sentir o potencial absurdo que o MCP coloca nas mãos de nós, desenvolvedores, para criar aplicações com IA que são verdadeiramente contextuais e proativas, né?
Mas deu pra notar também que, embora os conceitos sejam elegantes, construir Servers MCP robustos, definir Tools seguras, gerenciar o contexto de forma eficaz e orquestrar tudo isso exige conhecimento sólido, boas práticas de arquitetura e, claro, muita mão na massa.
🚀
Dominar essa nova fronteira é o que vai diferenciar os devs que simplesmente usam IA daqueles que constroem o futuro com ela. Se você quer ir além do básico, aprender a fundo como criar e integrar essas soluções inteligentes, e estar preparado para liderar essa nova era do desenvolvimento, a Formação Inteligência Artificial da Rocketseat é o seu mapa completo para o sucesso. Lá você encontra trilhas estruturadas, projetos práticos para solidificar o aprendizado e uma comunidade incrível para te apoiar nessa jornada.

FAQ (perguntas mais frequentes):

Onde encontro os SDKs oficiais?
Verifique nas documentações oficiais da Anthropic e da comunidade MCP no GitHub.
Posso usar MCP com qualquer IA?
Sim! Desde que a IA consiga interagir com JSON-RPC 2.0 ou APIs via HTTP, você pode integrar MCP para dar contexto à IA.
O MCP é gratuito e aberto?
Sim, MCP é um protocolo aberto e gratuito, desenvolvido por uma comunidade com contribuição de empresas como a Anthropic.
Como começar simples e imediatamente?
  1. Escolha uma linguagem com SDK disponível.
  1. Instale o SDK oficial do MCP na linguagem escolhida.
  1. Experimente criar um Server básico, implementando pelo menos um Resource simples.
  1. Teste a comunicação usando JSON-RPC localmente (stdio).
  1. Expanda o teste adicionando um Prompt simples para integrar com uma IA.
  1. Defina uma Tool básica e teste uma interação real com a IA.

Conclusão: seu mapa inicial para o universo MCP

Considere este artigo como seu "mapa estelar" inicial. Ele te deu as coordenadas básicas: as ferramentas (SDKs), as rotas de comunicação (Layers, Transport, JSON-RPC, Mensagens) e os principais "planetas" a serem explorados (Resources, Prompts, Tools) no universo do Model Context Protocol.
O MCP ainda está florescendo, e isso é fantástico! Significa que temos a chance de ser pioneiros, de experimentar, aprender e contribuir para moldar como a IA vai interagir com o software no futuro.
Qual o próximo passo? A aventura é sua!
  • Explore os SDKs: procure os repositórios e documentações que começam a surgir.
  • Experimente: tente rodar exemplos, mesmo que simples. Crie um Server básico, defina um Resource.
  • Aprenda continuamente: acompanhe as novidades, participe de discussões.
  • Compartilhe: suas descobertas e desafios ajudam toda a comunidade a crescer.
A jornada da IA no desenvolvimento está a todo vapor, e a integração inteligente é a próxima grande fronteira. Continue curioso, continue codando, e fique ligado aqui na Rocketseat para mais conteúdos que te impulsionam rumo ao futuro.
🚀
Bora construir juntos e #NeverStopLearning!
Artigos_

Explore conteúdos relacionados

Descubra mais artigos que complementam seu aprendizado e expandem seu conhecimento.

Aprenda programação do zero e DE GRAÇA

No Discover você vai descomplicar a programação, aprender a criar seu primeiro site com a mão na massa e iniciar sua transição de carreira.

COMECE A ESTUDAR AGORA