Skip to main content
Glama
lucad-28

Traffic MCP Server

by lucad-28
README.md
# Traffic MCP Server (SSE Transport)

Servidor MCP (Model Context Protocol) con transporte SSE (Server-Sent Events) que consume una API REST de predicción de tráfico. Diseñado para despliegue en la nube y consumo remoto.

## Características

Este servidor MCP proporciona 3 herramientas principales:

1. **get_traffic_stations** - Obtiene la lista de estaciones de tráfico disponibles
2. **predict_traffic_spi** - Predice el Speed Performance Index usando modelo LSTM
3. **suggest_routes** - Sugiere rutas óptimas entre estaciones usando Dijkstra

## Instalación Local

### Requisitos

- Python 3.10 o superior
- pip

### Instalar dependencias

```bash
cd traffic_mcp_server
pip install mcp httpx starlette uvicorn[standard]
```

O usando el archivo de proyecto:

```bash
pip install -e .
```

## Configuración

### Variables de Entorno

- `TRAFFIC_API_URL`: URL base de la API de tráfico (default: https://traffict-predict-api-452792205673.southamerica-west1.run.app)
- `MCP_API_KEY`: API key para autenticación (default: your-secure-api-key-here)
- `PORT`: Puerto del servidor (default: 8080)

### Ejecutar localmente

```bash
# Con variables de entorno por defecto
python server.py

# Con variables de entorno personalizadas
export MCP_API_KEY="mi-api-key-segura"
export PORT=3000
python server.py
```

El servidor estará disponible en:
- SSE endpoint: `http://localhost:8080/sse`
- Health check: `http://localhost:8080/health`

## Despliegue en la Nube

### Opción 1: Docker Local

```bash
# Construir la imagen
docker build -t traffic-mcp-server .

# Ejecutar el contenedor
docker run -p 8080:8080 \
  -e MCP_API_KEY="mi-api-key-segura" \
  -e TRAFFIC_API_URL="https://traffict-predict-api-452792205673.southamerica-west1.run.app" \
  traffic-mcp-server
```

### Opción 2: Google Cloud Run

```bash
# Configurar el proyecto de Google Cloud
export PROJECT_ID="tu-proyecto-gcp"
export SERVICE_NAME="traffic-mcp-server"
export REGION="us-central1"

# Construir y subir la imagen a Google Container Registry
gcloud builds submit --tag gcr.io/$PROJECT_ID/$SERVICE_NAME

# Desplegar en Cloud Run
gcloud run deploy $SERVICE_NAME \
  --image gcr.io/$PROJECT_ID/$SERVICE_NAME \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated \
  --set-env-vars MCP_API_KEY="tu-api-key-segura" \
  --set-env-vars TRAFFIC_API_URL="https://traffict-predict-api-452792205673.southamerica-west1.run.app" \
  --port 8080

# Obtener la URL del servicio
gcloud run services describe $SERVICE_NAME --region $REGION --format='value(status.url)'
```

### Opción 3: AWS (ECS/Fargate)

```bash
# Crear repositorio ECR
aws ecr create-repository --repository-name traffic-mcp-server

# Autenticar Docker con ECR
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.us-east-1.amazonaws.com

# Construir y subir imagen
docker build -t traffic-mcp-server .
docker tag traffic-mcp-server:latest <account-id>.dkr.ecr.us-east-1.amazonaws.com/traffic-mcp-server:latest
docker push <account-id>.dkr.ecr.us-east-1.amazonaws.com/traffic-mcp-server:latest

# Crear tarea y servicio en ECS (usar consola de AWS o CLI)
```

### Opción 4: Heroku

```bash
# Login en Heroku
heroku login

# Crear app
heroku create traffic-mcp-server

# Configurar variables de entorno
heroku config:set MCP_API_KEY="tu-api-key-segura"
heroku config:set TRAFFIC_API_URL="https://traffict-predict-api-452792205673.southamerica-west1.run.app"

# Desplegar usando Git
git init
git add .
git commit -m "Initial commit"
heroku git:remote -a traffic-mcp-server
git push heroku main
```

## Configuración en Claude Desktop

Una vez desplegado el servidor, configura Claude Desktop para usar el servidor remoto:

### Configuración con SSE Transport

Agrega la siguiente configuración a tu archivo `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "traffic-api": {
      "url": "https://tu-servidor-desplegado.com/sse",
      "transport": {
        "type": "sse",
        "headers": {
          "Authorization": "Bearer tu-api-key-segura"
        }
      }
    }
  }
}
```

**Ejemplo con Google Cloud Run:**
```json
{
  "mcpServers": {
    "traffic-api": {
      "url": "https://traffic-mcp-server-xxxxx.a.run.app/sse",
      "transport": {
        "type": "sse",
        "headers": {
          "Authorization": "Bearer mi-api-key-super-segura-2024"
        }
      }
    }
  }
}
```

**Notas importantes:**
- Reemplaza `tu-servidor-desplegado.com` con la URL real de tu servidor desplegado
- Reemplaza `tu-api-key-segura` con la misma API key que configuraste en el servidor (variable `MCP_API_KEY`)
- Reinicia Claude Desktop después de modificar la configuración

## Uso

### Herramientas Disponibles

#### 1. get_traffic_stations

Obtiene información de estaciones de tráfico con filtros opcionales.

**Parámetros:**
- `freeway` (opcional): Número de autopista para filtrar
- `direction` (opcional): Dirección (N, S, E, W)

**Ejemplo de uso en Claude:**
```
¿Cuáles son las estaciones de la autopista 101 dirección Norte?
```

#### 2. predict_traffic_spi

Predice el índice de rendimiento de velocidad usando datos históricos de 1 hora.

**Parámetros:**
- `sequence` (requerido): Lista de 12 intervalos de 5 minutos, cada uno con 7 valores:
  - Total_Flow
  - Avg_Occupancy
  - Avg_Speed
  - Hour
  - Day_of_Week
  - Lanes
  - Lane_Type_encoded

**Ejemplo de uso en Claude:**
```
Predice el tráfico con esta secuencia: [[100, 0.5, 60, 8, 1, 4, 1], [105, 0.52, 58, 8, 1, 4, 1], ...]
```

**Respuesta incluye:**
- SPI predicho (0-100)
- Nivel de congestión (0-3)
- Clasificación difusa con membresías
- Descripción lingüística del estado
- Estado de transición

#### 3. suggest_routes

Sugiere rutas óptimas entre dos estaciones considerando condiciones actuales.

**Parámetros:**
- `origin_station` (requerido): ID de estación origen
- `destination_station` (requerido): ID de estación destino
- `current_predictions` (requerido): Diccionario {station_id: spi_value}
- `num_routes` (opcional): Número de rutas alternativas (1-5, default: 3)

**Ejemplo de uso en Claude:**
```
Sugiere la mejor ruta desde la estación 400001 hasta la 400050 considerando estas predicciones de SPI: {400001: 85.5, 400002: 75.2, ...}
```

**Respuesta incluye:**
- Rutas ordenadas por tiempo total
- Distancia y tiempo estimado
- SPI promedio y mínimo por ruta
- Porcentaje de congestión
- Recomendación de mejor ruta

## Endpoints del Servidor

- `POST /sse` - Endpoint SSE para conexiones MCP (requiere autenticación)
- `GET /health` - Health check del servidor

## API Endpoints Consumidos

El servidor se conecta a los siguientes endpoints de la API de tráfico:

- `GET /stations` - Obtiene todas las estaciones disponibles
- `POST /predict` - Realiza predicción SPI usando LSTM
- `POST /routes/suggest` - Calcula rutas óptimas con Dijkstra

## Estructura del Proyecto

```
traffic_mcp_server/
├── server.py          # Servidor MCP con SSE transport
├── pyproject.toml     # Configuración del proyecto
├── Dockerfile         # Configuración Docker para despliegue
└── README.md          # Esta documentación
```

## Seguridad

### Autenticación

El servidor implementa autenticación básica mediante API Key:
- Las solicitudes al endpoint `/sse` deben incluir el header: `Authorization: Bearer <API_KEY>`
- La API key se valida contra la variable de entorno `MCP_API_KEY`
- Conexiones no autenticadas reciben error 401

### Recomendaciones

1. **Genera una API key segura:**
   ```bash
   python -c "import secrets; print(secrets.token_urlsafe(32))"
   ```

2. **Usa HTTPS en producción** (Cloud Run, Heroku y similares lo proporcionan automáticamente)

3. **No expongas la API key en código fuente** - usa variables de entorno

4. **Restringe CORS en producción** si es necesario (modificar `allow_origins` en `server.py`)

## Monitoreo

### Health Check

Verifica el estado del servidor:
```bash
curl https://tu-servidor.com/health
```

Respuesta esperada:
```json
{
  "status": "healthy",
  "service": "traffic-mcp-server",
  "traffic_api_url": "https://traffict-predict-api-452792205673.southamerica-west1.run.app"
}
```

### Logs

El servidor usa logging estándar de Python. En producción:

**Google Cloud Run:**
```bash
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=traffic-mcp-server" --limit 50
```

**Heroku:**
```bash
heroku logs --tail -a traffic-mcp-server
```

**Docker:**
```bash
docker logs <container-id> -f
```

## Troubleshooting

### Error 401 Unauthorized

Verifica que:
1. El header `Authorization` esté incluido en la configuración de Claude Desktop
2. La API key coincida exactamente con `MCP_API_KEY` del servidor
3. El formato sea `Bearer <tu-api-key>` (con espacio después de Bearer)

### Conexión rechazada

Verifica que:
1. El servidor esté corriendo (`/health` endpoint responde)
2. La URL en `claude_desktop_config.json` sea correcta
3. El firewall/security group permita conexiones entrantes

### Errores de la API de tráfico

Verifica que:
1. `TRAFFIC_API_URL` esté configurada correctamente
2. La API de tráfico esté disponible
3. Los logs del servidor para detalles específicos

### El servidor no aparece en Claude Desktop

Asegúrate de:
1. Haber reiniciado Claude Desktop después de modificar la configuración
2. La configuración JSON esté bien formada (sin errores de sintaxis)
3. La URL del servidor incluya el path `/sse`

## Desarrollo

### Ejecutar tests

```bash
pip install -e ".[dev]"
pytest
```

### Desarrollo local con hot reload

```bash
uvicorn server:app --reload --host 0.0.0.0 --port 8080
```

## Escalabilidad

### Consideraciones de Rendimiento

- El servidor es asíncrono y puede manejar múltiples conexiones concurrentes
- Cada conexión SSE mantiene una sesión activa
- Timeouts configurados: 10s connect, 30s total por request

### Escalado Horizontal

En Cloud Run o ECS, configura auto-scaling basado en:
- Número de conexiones concurrentes
- CPU/Memoria usage
- Request latency

## Licencia

MIT

## Soporte

Para reportar problemas o solicitar características, abre un issue en el repositorio del proyecto.