Skip to main content
Glama
willianmarcel

MCP Weather Server

README.md
# MCP Weather Server

Um servidor MCP (Model Context Protocol) para busca de dados climáticos com suporte a streaming HTTP, desenvolvido em TypeScript.

## 🚀 Características

- 🌤️ **Dados climáticos em tempo real** - Temperatura, umidade, pressão, vento e mais
- 📡 **Streaming HTTP** - Requisições assíncronas e eficientes
- 🗺️ **Múltiplas formas de busca** - Por cidade, país ou coordenadas geográficas
- 🔮 **Previsão do tempo** - Previsão para 5 dias com dados detalhados
- 🌍 **Suporte internacional** - Cidades em qualquer país
- 📊 **Dados estruturados** - Resposta em JSON bem formatado
- 🐳 **Docker ready** - Containerizado para fácil deploy
- ☸️ **Kubernetes ready** - Configurado para deploy no AKS
- 🔧 **Health checks** - Endpoints para monitoramento
- 📈 **Métricas** - Endpoint básico de métricas

## 📋 Pré-requisitos

- Node.js 18+
- Docker (para containerização)
- Azure CLI (para deploy no AKS)
- kubectl (para gerenciamento do Kubernetes)
- Chave da API OpenWeatherMap

## 🛠️ Instalação

### 1. Clone o repositório
```bash
git clone <seu-repositorio>
cd mcp-weather
```

### 2. Instale as dependências
```bash
npm install
```

### 3. Configure a API key
```bash
# Copie o arquivo de exemplo
cp .env.example .env

# Edite o arquivo .env com sua chave da API
nano .env
```

### 4. Obtenha uma chave da API OpenWeatherMap
1. Visite [OpenWeatherMap](https://openweathermap.org/api)
2. Crie uma conta gratuita
3. Gere uma API key
4. Configure no arquivo `.env`

## 🚀 Execução

### Desenvolvimento
```bash
# Executar em modo desenvolvimento
npm run dev

# Executar em modo watch
npm run watch
```

### Produção
```bash
# Build da aplicação
npm run build

# Executar em produção
npm start
```

### Docker
```bash
# Build da imagem
npm run docker:build

# Executar container
npm run docker:run

# Ou usar docker-compose
npm run docker:compose
```

## 🔧 Ferramentas MCP Disponíveis

### 1. get_current_weather
Obtém dados climáticos atuais para uma cidade.

**Parâmetros:**
- `city` (obrigatório): Nome da cidade
- `country` (opcional): Código do país (ex: "BR", "US")
- `units` (opcional): Unidade de medida ("metric", "imperial", "standard")

### 2. get_weather_forecast
Obtém previsão do tempo para 5 dias.

**Parâmetros:**
- `city` (obrigatório): Nome da cidade
- `country` (opcional): Código do país
- `units` (opcional): Unidade de medida

### 3. get_weather_by_coordinates
Obtém dados climáticos usando coordenadas geográficas.

**Parâmetros:**
- `lat` (obrigatório): Latitude
- `lon` (obrigatório): Longitude
- `units` (opcional): Unidade de medida

## 🧪 Teste

### Cliente de exemplo
```bash
# Executar todos os exemplos
npm run client

# Clima atual
npm run client current "São Paulo" "BR"

# Previsão do tempo
npm run client forecast "Rio de Janeiro" "BR"

# Por coordenadas
npm run client coords -23.5505 -46.6333

# Listar recursos e ferramentas
npm run client list
```

### Endpoints HTTP
```bash
# Health check
curl http://localhost:8080/health

# Status da aplicação
curl http://localhost:8080/status

# Métricas básicas
curl http://localhost:8080/metrics
```

## 📊 Recursos MCP

### weather://current
Recurso para acessar dados climáticos atuais.

### weather://forecast
Recurso para acessar previsões do tempo.

## 🐳 Deploy no Azure Kubernetes Service (AKS)

### Pré-requisitos
- Azure CLI instalado e configurado
- kubectl instalado
- Docker instalado
- Variáveis de ambiente configuradas

### Deploy automatizado
```bash
# Tornar script executável
chmod +x scripts/deploy-aks.sh

# Executar deploy
./scripts/deploy-aks.sh
```

### Deploy manual
```bash
# 1. Criar Resource Group
az group create --name rg-mcp-weather-poc --location brazilsouth

# 2. Criar ACR
az acr create --resource-group rg-mcp-weather-poc --name acrmcpweather --sku Basic

# 3. Criar cluster AKS
az aks create --resource-group rg-mcp-weather-poc --name aks-mcp-weather --attach-acr acrmcpweather

# 4. Obter credenciais
az aks get-credentials --resource-group rg-mcp-weather-poc --name aks-mcp-weather

# 5. Build e push da imagem
docker build -f deploy/Dockerfile -t acrmcpweather.azurecr.io/weather-mcp:latest .
docker push acrmcpweather.azurecr.io/weather-mcp:latest

# 6. Deploy no Kubernetes
kubectl apply -f deploy/aks-deployment.yaml
```

### Limpeza de recursos
```bash
# Executar script de limpeza
./scripts/cleanup-aks.sh
```

## 📝 Exemplo de Resposta

### Clima Atual
```json
{
  "location": {
    "city": "São Paulo",
    "country": "BR",
    "coordinates": {
      "lat": -23.5505,
      "lon": -46.6333
    }
  },
  "current": {
    "temperature": 22.5,
    "feels_like": 24.1,
    "humidity": 65,
    "pressure": 1013,
    "description": "céu limpo",
    "icon": "01d",
    "wind_speed": 3.2,
    "wind_direction": 180,
    "visibility": 10,
    "uv_index": 5
  },
  "units": "metric",
  "timestamp": "2025-01-15T10:30:00Z"
}
```

## 🔧 Configuração para Claude Desktop

Adicione ao arquivo de configuração do Claude:

```json
{
  "mcpServers": {
    "weather": {
      "command": "node",
      "args": ["/path/to/mcp-weather/dist/index.js"],
      "env": {
        "OPENWEATHERMAP_API_KEY": "sua_api_key"
      }
    }
  }
}
```

## 📁 Estrutura do Projeto

```
mcp-weather/
├── src/
│   ├── index.ts              # Servidor MCP principal
│   └── client.ts             # Cliente de exemplo
├── deploy/
│   ├── Dockerfile            # Dockerfile otimizado
│   ├── docker-compose.yml    # Docker Compose
│   └── aks-deployment.yaml   # Manifests Kubernetes
├── scripts/
│   ├── deploy-aks.sh         # Script de deploy AKS
│   └── cleanup-aks.sh        # Script de limpeza
├── tests/
│   └── (testes futuros)
├── package.json
├── tsconfig.json
└── README.md
```

## 🚨 Limitações da API

- **Plano Gratuito**: 1000 chamadas/mês, 60 chamadas/minuto
- **Dados históricos**: Limitados no plano gratuito
- **Resolução**: Dados atualizados a cada 10 minutos

## 🐛 Troubleshooting

### Problemas comuns

1. **Erro de API Key**
   ```bash
   # Verifique se a variável está configurada
   echo $OPENWEATHERMAP_API_KEY
   ```

2. **Erro de conectividade**
   ```bash
   # Teste a conectividade com a API
   curl "https://api.openweathermap.org/data/2.5/weather?q=London&appid=SUA_API_KEY"
   ```

3. **Problema com Docker**
   ```bash
   # Limpar containers e imagens
   docker system prune -a
   ```

4. **Problema com Kubernetes**
   ```bash
   # Verificar logs dos pods
   kubectl logs -f -n mcp-weather deployment/weather-mcp
   
   # Verificar eventos
   kubectl get events -n mcp-weather
   ```

## 📈 Monitoramento

### Métricas disponíveis
- Health check: `/health`
- Readiness: `/ready`
- Métricas: `/metrics`
- Status: `/status`

### Logs
```bash
# Logs do container
docker logs -f <container-id>

# Logs do Kubernetes
kubectl logs -f -n mcp-weather deployment/weather-mcp
```

## 🤝 Contribuição

1. Fork o projeto
2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)
3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)
4. Push para a branch (`git push origin feature/AmazingFeature`)
5. Abra um Pull Request

## 📄 Licença

Distribuído sob a licença MIT. Veja `LICENSE` para mais informações.

## 🙏 Agradecimentos

- [OpenWeatherMap](https://openweathermap.org/) pela API de dados climáticos
- [Model Context Protocol](https://github.com/modelcontextprotocol) pela especificação
- [Azure Kubernetes Service](https://azure.microsoft.com/services/kubernetes-service/) pela plataforma

---

⭐ Se este projeto foi útil para você, considere dar uma estrela no GitHub!