Skip to main content
Glama
JPLopez23

logistics-mcp-server

by JPLopez23
README.md
# logistics-mcp-server

Servidor **MCP remoto** para CC3067 *Redes* — Proyecto 1, punto 7. Corre en la
nube y el chatbot lo usa por HTTPS igual que a un servidor local.

* Transporte: **Streamable HTTP** (un solo endpoint `/mcp`). No es stdio.
* Protocolo: **JSON-RPC 2.0 a mano** — sin SDK de MCP.
* Framework: Starlette + Uvicorn.
* Sin base de datos, sin secretos: datos mock deterministas, seguro de exponer.

## Herramientas

| Herramienta | Parametros | Devuelve |
|---|---|---|
| `traffic_factor` | `zone` (int), `hour` (0-23) | multiplicador de tiempo de viaje (>= 1.0) para una zona a esa hora |
| `holiday_calendar` | `country` (ej. `GT`), `date` (`YYYY-MM-DD`) | `is_holiday`, `holiday_name`, `is_weekend`, restriccion de circulacion |
| `fuel_price` | `country`, `date?` | precio de referencia del diesel por galon + moneda |

Alimentan al optimizador de rutas: `traffic_factor` se pasa como argumento
`traffic_factor` al planificador; `holiday_calendar` y `fuel_price` sirven para
decisiones de despacho y costeo de rutas.

## API

```
POST /mcp   cuerpo = request JSON-RPC 2.0       -> 200, respuesta JSON-RPC (application/json)
POST /mcp   cuerpo = notificacion JSON-RPC 2.0  -> 202, vacio
GET  /mcp                                       -> 405
GET  /healthz                                   -> 200 "ok"
```

`initialize` devuelve el header `Mcp-Session-Id`; el cliente lo reenvia en las
siguientes peticiones (aceptado pero no obligatorio).

Metodos: `initialize`, `notifications/initialized`, `tools/list`, `tools/call`,
`ping`. Version de protocolo `2025-06-18`.

## Correr localmente

```bash
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8080
# -> http://localhost:8080/mcp
```

Prueba rapida:

```bash
curl -s localhost:8080/mcp -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"t","version":"0"}}}'

curl -s localhost:8080/mcp -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"traffic_factor","arguments":{"zone":10,"hour":18}}}'
```

## Despliegue

### Google Cloud Run

```bash
gcloud run deploy logistics-mcp-server \
  --source . \
  --region us-central1 \
  --allow-unauthenticated
```

Cloud Run inyecta `$PORT` y el `Dockerfile` ya lo respeta. El deploy imprime una
URL HTTPS; usar `<url>/mcp` en el `config/servers.json` del chatbot:

```json
{ "name": "logistics-remote", "transport": "http", "url": "https://logistics-mcp-server-xxxx.run.app/mcp" }
```

### Cualquier host con Docker

```bash
docker build -t logistics-mcp-server .
docker run -p 8080:8080 logistics-mcp-server
```

## Integridad

Repositorio publico, desarrollo individual para CC3067. Solo datos ficticios.
Uso de IA generativa conforme al reglamento de la UVG.