FastMCP: Crie Servidores MCP em Minutos, Não em Horas

FastMCP: Crie Servidores MCP em Minutos, Não em Horas

9 min de leitura

Você já tentou criar um servidor MCP e se deparou com dezenas de arquivos de configuração, boilerplate complexo e horas de debugging antes de ver sua primeira ferramenta funcionando? O tempo de desenvolver e testar servidores MCP precisa ser rápido - afinal, a iteração ágil é fundamental quando estamos experimentando com agentes de IA. É aí que entra o FastMCP.

O Problema: Desenvolvimento MCP é Muito Lento

Quando queremos testar uma ideia com MCP (Model Context Protocol), o ciclo tradicional envolve:

  1. ⚙️ Configurar estrutura de arquivos e dependências
  2. 📝 Escrever boilerplate para comunicação cliente-servidor
  3. 🔧 Implementar handlers de protocolo manualmente
  4. 🐛 Debugar problemas de transporte (STDIO, HTTP, SSE)
  5. 🧪 Finalmente testar sua ferramenta

Resultado: Horas até ter algo funcionando.

O que precisamos: Minutos para ir da ideia ao teste.

FastMCP: Simplicidade Extrema

FastMCP é uma biblioteca Python que reduz um servidor MCP completo a literalmente 3 linhas de código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from fastmcp import FastMCP

mcp = FastMCP("Meu Servidor")

@mcp.tool
def multiplicar(a: float, b: float) -> float:
    """Multiplica dois números."""
    return a * b

if __name__ == "__main__":
    mcp.run()

Pronto. Você tem um servidor MCP funcional com uma ferramenta que pode ser chamada por Claude, GPT, GitHub Copilot ou qualquer cliente MCP.

Criando Seu Primeiro Servidor em 2 Minutos

Vamos criar um servidor de análise de dados do zero:

1. Instalação

1
pip install fastmcp

2. Código Completo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from fastmcp import FastMCP

mcp = FastMCP(
    "Analise Dados",
    instructions="Servidor para análise de datasets numéricos. Use get_summary() para visão geral."
)

@mcp.tool
def calcular_media(numeros: list[float]) -> float:
    """Calcula a média de uma lista de números."""
    if not numeros:
        return 0.0
    return sum(numeros) / len(numeros)

@mcp.tool
def encontrar_outliers(numeros: list[float], desvios: float = 2.0) -> list[float]:
    """
    Identifica outliers em uma lista usando regra do desvio padrão.
    
    Args:
        numeros: Lista de números para análise
        desvios: Número de desvios padrão para considerar outlier (padrão: 2.0)
    """
    if len(numeros) < 2:
        return []
    
    media = sum(numeros) / len(numeros)
    variancia = sum((x - media) ** 2 for x in numeros) / len(numeros)
    desvio_padrao = variancia ** 0.5
    
    limite_superior = media + (desvios * desvio_padrao)
    limite_inferior = media - (desvios * desvio_padrao)
    
    return [x for x in numeros if x > limite_superior or x < limite_inferior]

@mcp.resource("data://config")
def obter_config() -> dict:
    """Retorna configurações do servidor."""
    return {
        "versao": "1.0",
        "modo": "producao",
        "max_elementos": 10000
    }

@mcp.prompt
def analisar_dataset(pontos: list[float]) -> str:
    """Gera prompt para análise de dataset."""
    dados_formatados = ", ".join(str(p) for p in pontos[:10])
    if len(pontos) > 10:
        dados_formatados += f"... ({len(pontos)} pontos no total)"
    
    return f"""Analise este dataset:
Dados: {dados_formatados}

Forneça:
1. Tendência geral
2. Valores atípicos
3. Insights principais"""

if __name__ == "__main__":
    mcp.run()

Salve como servidor_dados.py e execute:

1
python servidor_dados.py

Boom! Servidor rodando em STDIO, pronto para conectar com qualquer cliente MCP.

Os 3 Tipos de Componentes

FastMCP expõe três tipos de componentes para clientes:

🔧 Tools (Ferramentas)

Funções que o agente pode invocar para realizar ações:

1
2
3
4
5
@mcp.tool
def buscar_preco_acao(simbolo: str) -> dict:
    """Busca preço atual de uma ação."""
    # Sua lógica aqui
    return {"simbolo": simbolo, "preco": 150.25, "moeda": "USD"}

📊 Resources (Recursos)

Dados passivos que clientes podem ler:

1
2
3
4
5
6
7
8
@mcp.resource("data://metricas")
def obter_metricas() -> dict:
    """Expõe métricas do sistema."""
    return {
        "requests_hoje": 1247,
        "tempo_medio_resposta_ms": 45,
        "taxa_erro_pct": 0.3
    }

💬 Prompts (Templates)

Templates reutilizáveis para guiar LLMs:

1
2
3
4
5
6
7
@mcp.prompt
def revisar_codigo(codigo: str, linguagem: str) -> str:
    """Template para revisão de código."""
    return f"""Revise este código {linguagem}:

```{linguagem}
{codigo}

Analise:

  • Bugs potenciais
  • Problemas de performance
  • Boas práticas violadas
  • Sugestões de melhoria"""

Transportes: STDIO, HTTP ou SSE

FastMCP suporta múltiplos transportes sem mudar seu código:

STDIO (Padrão - para integração local)

1
mcp.run()  # Usa STDIO automaticamente

HTTP (Para serviços web)

1
mcp.run(transport="http", host="0.0.0.0", port=8000)

Agora você tem um endpoint HTTP com o protocolo MCP Streamable. Perfeito para deploy em produção.

SSE (Legado)

1
mcp.run(transport="sse")

Recursos Avançados

Tags para Filtragem de Ferramentas

Organize ferramentas por categorias e exponha apenas o necessário:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
@mcp.tool(tags={"publico", "util"})
def ferramenta_publica() -> str:
    return "Acessível a todos"

@mcp.tool(tags={"interno", "admin"})
def ferramenta_admin() -> str:
    return "Apenas administradores"

# Expor apenas ferramentas públicas
mcp.enable(tags={"publico"}, only=True)

# Ou esconder internas e deprecated
mcp.disable(tags={"interno", "deprecated"})

Rotas HTTP Customizadas

Adicione endpoints HTTP personalizados quando usar transporte HTTP:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from starlette.requests import Request
from starlette.responses import JSONResponse

@mcp.custom_route("/health", methods=["GET"])
async def health_check(request: Request) -> JSONResponse:
    return JSONResponse({"status": "ok", "server": "online"})

@mcp.custom_route("/metrics", methods=["GET"])
async def metricas(request: Request) -> JSONResponse:
    return JSONResponse({
        "ferramentas_registradas": 15,
        "uptime_horas": 48
    })

mcp.run(transport="http")
# Health check em: http://localhost:8000/health
# Métricas em: http://localhost:8000/metrics

Validação de Entrada Rigorosa

Por padrão, FastMCP é flexível (converte "10"10 automaticamente). Para validação estrita:

1
2
3
4
5
6
7
mcp = FastMCP("Servidor Estrito", strict_input_validation=True)

@mcp.tool
def processar(quantidade: int) -> str:
    # Com strict=True, apenas int é aceito
    # String "10" será rejeitada
    return f"Processando {quantidade} itens"

Caso de Uso Real: Servidor de Criptomoedas

Vamos criar algo útil - um servidor para consultar dados de crypto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from fastmcp import FastMCP
import httpx

mcp = FastMCP(
    "CryptoMCP",
    instructions="Consulte preços e dados de criptomoedas em tempo real."
)

@mcp.tool
async def preco_bitcoin() -> dict:
    """Retorna preço atual do Bitcoin em USD."""
    async with httpx.AsyncClient() as client:
        response = await client.get(
            "https://api.coingecko.com/api/v3/simple/price",
            params={"ids": "bitcoin", "vs_currencies": "usd,brl"}
        )
        data = response.json()
        return {
            "moeda": "Bitcoin",
            "preco_usd": data["bitcoin"]["usd"],
            "preco_brl": data["bitcoin"]["brl"]
        }

@mcp.tool
async def top_cryptos(limite: int = 10) -> list[dict]:
    """
    Lista as top criptomoedas por market cap.
    
    Args:
        limite: Quantidade de moedas a retornar (padrão: 10, máx: 100)
    """
    limite = min(limite, 100)  # Proteger API
    
    async with httpx.AsyncClient() as client:
        response = await client.get(
            "https://api.coingecko.com/api/v3/coins/markets",
            params={
                "vs_currency": "usd",
                "order": "market_cap_desc",
                "per_page": limite,
                "page": 1
            }
        )
        cryptos = response.json()
        
        return [
            {
                "nome": c["name"],
                "simbolo": c["symbol"].upper(),
                "preco_usd": c["current_price"],
                "variacao_24h_pct": round(c["price_change_percentage_24h"], 2),
                "market_cap_usd": c["market_cap"]
            }
            for c in cryptos
        ]

@mcp.resource("data://status")
def status_api() -> dict:
    """Status da conexão com APIs de crypto."""
    return {
        "api": "CoinGecko",
        "status": "online",
        "rate_limit": "50 requests/min"
    }

if __name__ == "__main__":
    mcp.run()

Agora você pode perguntar ao Claude: “Qual o preço do Bitcoin agora?” ou “Me mostre as top 5 cryptos” e ele usará seu servidor automaticamente.

Configurando FastMCP no Claude Desktop

Para usar seu servidor FastMCP com o Claude Desktop, você precisa adicionar a configuração no arquivo claude_desktop_config.json:

Localizando o Arquivo de Configuração

O arquivo está localizado em:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

Adicionando Seu Servidor

Edite o arquivo e adicione sua configuração FastMCP:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "mcpServers": {
    "crypto-mcp": {
      "command": "python",
      "args": [
        "/caminho/completo/para/seu/servidor_crypto.py"
      ]
    }
  }
}

Importante: Use o caminho absoluto para o arquivo Python do seu servidor.

Exemplo com Ambiente Virtual

Se você usa um ambiente virtual Python (recomendado), aponte para o Python do ambiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  "mcpServers": {
    "crypto-mcp": {
      "command": "/home/usuario/.venvs/mcp-env/bin/python",
      "args": [
        "/home/usuario/projetos/mcp-servers/servidor_crypto.py"
      ]
    },
    "analise-dados": {
      "command": "/home/usuario/.venvs/mcp-env/bin/python",
      "args": [
        "/home/usuario/projetos/mcp-servers/servidor_dados.py"
      ]
    }
  }
}

Múltiplos Servidores

Você pode registrar vários servidores FastMCP simultaneamente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  "mcpServers": {
    "crypto": {
      "command": "python",
      "args": ["/caminho/para/servidor_crypto.py"]
    },
    "dados": {
      "command": "python",
      "args": ["/caminho/para/servidor_dados.py"]
    },
    "web-scraper": {
      "command": "python",
      "args": ["/caminho/para/servidor_scraper.py"]
    }
  }
}

Testando a Configuração

  1. Salve o arquivo de configuração
  2. Reinicie o Claude Desktop completamente
  3. Abra uma nova conversa no Claude
  4. Verifique se os servidores foram carregados - você pode perguntar: “Quais ferramentas MCP você tem disponíveis?”

Troubleshooting

Se seu servidor não aparecer:

Verificar logs do Claude:

  • macOS: ~/Library/Logs/Claude/mcp*.log
  • Windows: %APPDATA%\Claude\logs\mcp*.log

Problemas comuns:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ❌ Errado - Caminho relativo
{
  "command": "python",
  "args": ["./servidor.py"]
}

// ✅ Correto - Caminho absoluto
{
  "command": "python",
  "args": ["/home/usuario/projetos/servidor.py"]
}

// ❌ Errado - Python do sistema sem dependências
{
  "command": "python3",
  "args": ["/caminho/servidor.py"]
}

// ✅ Correto - Python do venv com fastmcp instalado
{
  "command": "/home/usuario/.venv/bin/python",
  "args": ["/caminho/servidor.py"]
}

Exemplo de Teste Completo

Crie teste_crypto.py:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from fastmcp import FastMCP

mcp = FastMCP("TesteCrypto")

@mcp.tool
def ola_claude() -> str:
    """Retorna uma saudação de teste."""
    return "👋 Olá do FastMCP! Servidor funcionando perfeitamente!"

if __name__ == "__main__":
    mcp.run()

Adicione no claude_desktop_config.json:

1
2
3
4
5
6
7
8
{
  "mcpServers": {
    "teste": {
      "command": "python",
      "args": ["/caminho/completo/para/teste_crypto.py"]
    }
  }
}

Reinicie o Claude e pergunte: “Use a ferramenta ola_claude”

Se receber a saudação, seu servidor FastMCP está configurado corretamente! 🎉

Vantagens do FastMCP

Zero boilerplate - Foco na lógica, não na infraestrutura
Type hints nativos - Validação automática via Pydantic
Async por padrão - Performance para chamadas I/O
Múltiplos transportes - STDIO, HTTP, SSE sem reescrever código
Docstrings como documentação - LLMs entendem suas ferramentas automaticamente
Deploy simples - Um arquivo Python é suficiente
Debugging facilitado - Errors claros e informativos

Conclusão: Velocidade é Tudo

FastMCP remove toda a fricção do desenvolvimento MCP. O que levaria horas configurando agora leva minutos codificando. Isso muda completamente a experiência de desenvolver ferramentas para agentes de IA.

Quando você pode testar uma ideia em 5 minutos ao invés de 5 horas, você experimenta mais, aprende mais rápido e constrói coisas melhores.

O futuro da IA é agêntico. FastMCP garante que você chegue lá rapidamente.