Back to Blog
BlogApril 6, 2026352

Como Construir Seu Primeiro Servidor MCP: Tutorial Passo a Passo

Como Construir Seu Primeiro Servidor MCP: Tutorial Passo a Passo

Pré-requisitos

Antes de começar, certifique-se de ter o seguinte preparado:

  • Python 3.10 ou superior instalado.
  • Conhecimento básico de funções Python e código assíncrono.
  • uv (gerenciador de pacotes Python rápido) – instale com curl -LsSf https://astral.sh/uv/install.sh | sh.
  • Um cliente MCP como Claude Desktop (baixe em claude.ai/download e mantenha-o atualizado).
  • Um editor de texto ou IDE.

Não é necessária experiência prévia com MCP. Vamos construir um servidor MCP de clima prático que permite à IA consultar alertas meteorológicos em tempo real e previsões dos EUA via API do National Weather Service.

Passo和被 1: Configurar o Ambiente

Crie um diretório de projeto limpo e inicialize-o com uv:

mkdir weather-mcp-server
cd weather-mcp-server
uv init
uv venv
source .venv/bin/activate  # No Windows: .venv\Scripts\activate
uv add "mcp[cli]" httpx

Isso instala o SDK Python oficial do MCP (FastMCP) e httpx para chamadas de API. Seu projeto agora tem um pyproject.toml e um ambiente virtual.

Resultado esperado: Uma nova pasta .venv e dependências listadas em uv.lock.

Passo 2: Criar o Código do Servidor MCP

Crie o arquivo principal:

touch weather.py

Cole este código completo e pronto para execução em weather.py:

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# Inicializar o servidor MCP
mcp = FastMCP("weather")

NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"

# Função auxiliar para chamar a API NWS com segurança
async def make_nws_request(url: str) -> dict[str, Any] | None:
    headers = {"User-Agent": USER_AGENT, "Accept": "application/geo+json"}
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=headers, timeout=30.0)
            response.raise_for_status()
            return response.json()
        except Exception:
            return None

# Formatar alertas meteorológicos de forma organizada para a IA
def format_alert(feature: dict) -> str:
    props = feature["properties"]
    return f"""
Event: {props.get("event", "Unknown")}
Area: {props.get("areaDesc", "Unknown")}
Severity: {props.get("severity", "Unknown")}
Description: {props.get("description", "No description available")}
Instructions: {props.get("instruction", "No specific instructions provided")}
"""

# Ferramenta 1: Obter alertas meteorológicos ativos para um estado dos EUA
@mcp.tool()
async def get_alerts(state: str) -> str:
    """Get current weather alerts for a U.S. state (e.g., "CA" or "TX")."""
    url = f"{NWS_API_BASE}/alerts/active/area/{state.upper()}"
    data = await make_nws_request(url)
    if not data or "features" not in data:
        return "Unable to fetch alerts or no alerts found."
    if not data["features"]:
        return f"No active alerts for {state.upper()}."
    alerts = [format_alert(f) for f in data["features"]]
    return "\n---\n".join(alerts)

Ferramenta 2: Obter previsão de 5 dias para qualquer lat/long

@mcp.tool() async def get_forecast(latitude: float, longitude: float) -> str: """Obter previsão do tempo para uma latitude e longitude específicas.""" points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}" points_data = await make_nws_request(points_url) if not points_data: return "Não foi possível buscar dados de previsão para esta localização." forecast_url = points_data["properties"]["forecast"] forecast_data = await make_nws_request(forecast_url) if not forecast_data: return "Não foi possível buscar a previsão detalhada." periods = forecast_data["properties"]["periods"][:5] forecasts = [] for period in periods: forecast = f""" {period["name"]}: Temperatura: {period["temperature"]}°{period["temperatureUnit"]} Vento: {period["windSpeed"]} {period["windDirection"]} Previsão: {period["detailedForecast"]} """ forecasts.append(forecast) return "\n---\n".join(forecasts)

def main(): mcp.run(transport="stdio")

if name == "main": main()


**Conceitos-chave explicados:**
- Os decoradores `@mcp.tool()` transformam funções assíncronas regulares em ferramentas MCP que a IA pode descobrir e chamar.
- O servidor é executado via **stdio** (entrada/saída padrão) – o padrão para servidores MCP locais.
- Todos os logs devem ir para stderr (o FastMCP lida com isso automaticamente).

## Etapa移动到apa 3: Testar o Servidor Localmente

Execute o servidor:

```bash
uv run weather.py

Saída esperada: O terminal permanece aberto e em silêncio (isso é normal para servidores stdio). Você verá mensagens JSON-RPC apenas quando um cliente MCP se conectar.

Deixe este terminal em execução para a próxima etapa.

Etapa 4: Conectar o Servidor MCP ao Claude Desktop

  1. Abra o Claude Desktop.
  2. Crie ou edite o arquivo de configuração em:
    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows: %APPDATA%\Claude\claude_desktop_config.json

Adicione esta entrada exata (substitua /CAMINHO/ABSOLUTO/PARA/weather-mcp-server pelo caminho real da sua pasta):

{
  "mcpServers": {
    "weather": {
      "command": "uv",
      "args": [
        "--directory",
        "/CAMINHO/ABSOLUTO/PARA/weather-mcp-server",
        "run",
        "weather.py"
      ]
    }
  }
}
  1. Feche completamente o Claude Desktop (Cmd+Q no macOS ou feche pela bandeja do sistema no Windows) e reinicie-o.
  2. No Claude, clique em “Add files, connectors, and more” → passe o mouse sobre Connectors → você deve ver “weather” listado.

Etapa 5: Usar Seu Servidor MCP com IA

Experimente estes prompts no Claude Desktop:

  • “Quais são os alertas climáticos ativos no Texas?”
  • “Me dê a previsão para São Francisco (use lat 37.77, long -122.41).”
  • “Verifique alertas na Califórnia e me diga se preciso me preparar para algo.”

O Claude descobrirá automaticamente as ferramentas, solicitará sua aprovação na primeira vez e retornará resultados formatados.

Comportamento esperado: A IA chama suas ferramentas nos bastidores e mostra respostas em linguagem natural.

Problemas Comuns e Solução de Problemas

  • Servidor não aparece no Claude:

    • Verifique novamente se o JSON é válido (sem vírgulas no final).
    • Use um caminho absoluto na configuração.
    • Reinicie o Claude completamente.
    • Verifique os logs: ~/Library/Logs/Claude/mcp*.log (macOS) ou equivalente no Windows.
  • Erros de API ou sem dados:

    • A API NWS só funciona para locais nos EUA.
    • Use códigos de estado de duas letras (CA, TX, etc.).
    • As coordenadas devem ser lat/long válidas.
  • “Comando não encontrado”:

    • Certifique-se de que o uv está no seu PATH e o ambiente virtual está ativado.
    • Execute uv --version para verificar a instalação.
  • Timeout ou resposta lenta:

    • Aumente o timeout em make_nws_request se necessário.
    • A NWS tem limites de taxa – evite spam em produção.
  • Problemas de permissão:

    • No macOS, conceda ao Claude Desktop acesso total ao disco em Configurações do Sistema → Privacidade e Segurança.

Próximos Passos

  • Adicione mais ferramentas: Crie ferramentas para bancos de dados, GitHub, Slack ou suas próprias APIs usando o mesmo padrão @mcp.tool().
  • Adicione recursos e prompts: Use mcp.resource() e mcp.prompt() para dados tipo arquivo e instruções reutilizáveis.
  • Implante remotamente: Mude para transporte HTTP/SSE e hospede no AWS Lambda, Vercel ou qualquer servidor (o FastMCP suporta stateless_http=True).
  • Suporte a múltiplas linguagens: Experimente os SDKs oficiais TypeScript, Go ou Rust para a mesma funcionalidade.
  • Compartilhe seu servidor: Publique o repositório para que outros possam adicioná-lo via npx ou Docker.

Agora você tem um servidor MCP totalmente funcional que qualquer cliente de IA compatível pode usar. Experimente, estenda as ferramentas e comece a construir integrações poderosas de IA hoje!

Share this article

Referenced Tools

Browse entries that are adjacent to the topics covered in this article.

Explore directory
X MCP logo

X MCP

MCP Servers

X MCP é o servidor Model Context Protocol oficial e hospedado da X para chamar endpoints da X API a partir de ferramentas compatíveis com MCP. Ele usa a ponte xurl para OAuth com contexto de usuário e cobre fluxos como busca de posts, usuários, bookmarks, tendências, notícias e Articles.

TinyFish logo

TinyFish

MCP Servers

TinyFish exposes web automation, web search, content extraction, and remote browser-session tools to MCP-compatible AI assistants. The hosted MCP server uses OAuth 2.1, while an optional local @tiny-fish/mcp proxy supports API-key authentication for local-only, CI, and headless setups.

openaiDeveloperDocs logo

openaiDeveloperDocs

MCP Servers

OpenAI Developer Docs MCP is an OpenAI-hosted, read-only server that lets MCP clients search and fetch documentation from developers.openai.com, platform.openai.com, and learn.chatgpt.com. It uses a public streamable HTTP endpoint and does not call the OpenAI API on the user's behalf.

FetchSandbox logo

FetchSandbox

MCP Servers

FetchSandbox is a stdio MCP server and hosted API-sandbox service that lets AI coding agents import OpenAPI 3.x specifications, discover runnable workflows, and execute stateful integration tests without using production API credentials. It is designed for validating request flows, lifecycle state, webhooks, retries, and shareable run traces from MCP-compatible development tools.

DataForSEO MCP Server logo

DataForSEO MCP Server

MCP Servers

DataForSEO MCP Server is the official Model Context Protocol server for connecting AI clients to DataForSEO SEO, SERP, keyword, backlink, on-page, business, domain, content, merchant, and AI optimization data. It can be used as a hosted Streamable HTTP endpoint, a local npx package, a Docker container, or a source-built TypeScript server.

Ahrefs mcp logo

Ahrefs mcp

MCP Servers

Ahrefs MCP is the official hosted MCP server for connecting AI assistants to live Ahrefs SEO, backlink, keyword, rank tracking, site audit, and brand visibility data. It uses the remote Ahrefs MCP endpoint with OAuth or MCP-key authorization and is available on paid Ahrefs plans starting from Lite.