Last.app MCP Remote Bridge
by ekaibide
README.md
# MONO MCP — bridge unificado
Un solo endpoint MCP (`/mcp`) con las herramientas de los tres sistemas de MONO:
| Prefijo | Sistema | Tools | Implementación |
|---|---|---|---|
| `lastapp_*` | Last.app (POS actual) | 28 | `server.cjs` como proceso hijo stdio |
| `haddock_*` | Haddock (compras y food cost) | 12 | Nativo en `bridge.mjs` |
| `platomico_*` | Platomico (POS nuevo) | 17 | Nativo en `bridge.mjs` |
**57 tools en total.** `tools/list` fusiona los tres juegos y `tools/call` enruta por prefijo, así que en Claude Desktop basta con **un conector**.
## Platomico
POS nuevo. Operativo en **Vitoria**; los otros cinco locales están dados de alta pero todavía sin ventas.
Auth: `authorization: Bearer <JWT>`. Documentación OpenAPI real (404 rutas):
```
https://api.platomico.dev/operations/api-json
https://api.platomico.dev/payments/api-json
https://api.platomico.dev/supply-chain/api-json
```
El servicio `auth` no publica spec. La UI navegable está en `/api` en lugar de `/api-json`.
### Particularidades de la API que el bridge ya resuelve
Los **importes vienen en céntimos** y las tools los convierten a euros. Los **arrays de query van repetidos** (`locationsIds[]=id`); separados por comas devuelven 400. `transactions/v2` **no tiene paginación**, así que las tools truncan y avisan — para totales hay que usar las de estadísticas, no listar transacciones. Los **QR de TicketBAI en base64 son el 48% del payload** y se podan siempre. El rate limit observado es de 1000 peticiones por minuto.
Los locales se pueden pedir **por nombre**: la resolución normaliza acentos, mayúsculas y letras repetidas, así que "Vitoria" encuentra "MONO VITTORIA".
### Tools principales
`platomico_sales_summary` es la de cabecera: pedidos, ventas, ticket medio y desglose por día. `platomico_sales_by_location` compara locales, `platomico_sales_by_source` desglosa por canal y proveedor de cobro (POS, Glovo/SINQRO, Revolut) con bruto y neto con y sin IVA, y `platomico_finance_close` da el cierre contable. Para producto están `platomico_top_items` y `platomico_consumption_items`. `platomico_raw` hace un GET contra cualquiera de las 404 rutas documentadas, y `platomico_diagnose` verifica token y conectividad cuando algo falla.
## Variables de entorno
| Variable | Requerida | Default | Descripción |
|---|---|---|---|
| `LASTAPP_API_KEY` | Sí | — | API key de Last.app |
| `HADDOCK_API_KEY` | Sí | — | API key de Haddock (`hpa_...`) |
| `PLATOMICO_TOKEN` | Sí | — | JWT de Platomico |
| `PLATOMICO_API_URL` | No | `https://os.api.platomico.com` | Host |
| `PLATOMICO_AUTH_HEADER` | No | `authorization` | Cabecera de auth |
| `PLATOMICO_AUTH_PREFIX` | No | `Bearer` | Prefijo; vacío = token en crudo |
| `PLATOMICO_TIMEZONE` | No | `Europe/Madrid` | Zona por defecto |
| `PORT` | No | `3000` | Puerto HTTP |
| `BRIDGE_SECRET` | No | — | Si se define, exige `Authorization: Bearer <secret>` |
Las claves viven en las variables de entorno de Render, no en el repositorio.
## Despliegue
Render (repo `ekaibide/MCP`) despliega solo con cada push a `main`. Endpoint: `https://mcp-ve0q.onrender.com/mcp`.
En local:
```bash
npm install
cp .env.example .env # y rellenar las claves
node --env-file=.env bridge.mjs
curl http://localhost:3000/
```
## Deuda conocida
Pendiente de respuesta de Platomico: si la buena es `transactions/v2` o `v3` (que añade `timeWindows`), si hay forma de paginar o excluir los QR, y sobre todo **una credencial de servicio** — hoy el token es el JWT personal de un usuario y caduca en agosto de 2027.
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues