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

Rocketseat

Navegação Rápida:
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 umServer
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 osClients
(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
, enviarNotifications
, formatarResults
e lidar comErrors
. - 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. OClient
"conversa" com oServer
diretamente pela linha de comando (entrada e saída padrão). Super útil para ferramentas CLI ou quandoClient
eServer
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 oServer
envie atualizações para oClient
em tempo real, sem que oClient
precise ficar perguntando ("polling"). É uma comunicação mais eficiente para notificações e eventos assíncronos doServer
para oClient
.- 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:
Request
: um pedido doClient
para oServer
executar algo. Sempre espera umaResult
ou umError
.- Exemplo (Conceitual):
{ "jsonrpc": "2.0", "id": 1, "method": "listProjectFiles", "params": { "projectId": "rocketseat-launch" } }
Result
: a resposta positiva a umRequest
. Contém o resultado da operação.- Exemplo (Conceitual):
{ "jsonrpc": "2.0", "id": 1, "result": { "files": ["launch.ts", "rocketseat.rs"] } }
Error
: a resposta quando algo dá errado no processamento doRequest
. Contém código e mensagem de erro.- Exemplo (Conceitual):
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -32601, "message": "Project not found" } }
Notification
: uma mensagem enviada em uma única direção (geralmente doServer
para oClient
, 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), tipofile:///app/src/user.ts
oudb://products/sku/12345
. OServer
MCP implementa a lógica para: ListResources
: informar quaisResources
estão disponíveis.ReadResource
: ler e entregar o conteúdo de umResource
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"); });
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
. OClient
(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
implementaListPrompts
eGetPrompt
(que pega os argumentos, busca osResources
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"); });
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 asTools
que oferece usandoListTools
, 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 oServer
. - 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"); });
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?
- Escolha uma linguagem com SDK disponível.
- Instale o SDK oficial do MCP na linguagem escolhida.
- Experimente criar um
Server
básico, implementando pelo menos umResource
simples.
- Teste a comunicação usando JSON-RPC localmente (stdio).
- Expanda o teste adicionando um
Prompt
simples para integrar com uma IA.
- 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 umResource
.
- 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.