nexusflex-mcp 3.68.0 → 3.69.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/docs.mjs +510 -534
  2. package/package.json +1 -1
  3. package/server.mjs +7 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexusflex-mcp",
3
- "version": "3.68.0",
3
+ "version": "3.69.1",
4
4
  "description": "MCP de Nexus Flex: operá tu nodo/cuenta desde un asistente de IA (altas de clientes, stock, KPIs). Login por autorización web (device-flow). NO toca dinero.",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/server.mjs CHANGED
@@ -54,8 +54,12 @@ const truthy = (v) => /^(1|true|yes|si|sí)$/i.test(v ?? "");
54
54
  const ALLOW_WRITE = truthy(process.env.NEXUSFLEX_MCP_ALLOW_WRITE);
55
55
  const ALLOW_PRECIOS = truthy(process.env.NEXUSFLEX_MCP_ALLOW_PRECIOS);
56
56
 
57
- const MCP_VERSION = "3.68.0"; // bumpear junto con package.json + backend/services/mcp-remote.ts
57
+ // ATADO CON: backend/src/services/mcp-remote.ts (MCP_VERSION + NOVEDADES + mismos tools, salvo SOLO_REMOTO)
58
+ // y mcp/package.json. Lo verifica backend/src/coherencia.test.ts. Ver CLAUDE.md → "Cosas que van juntas".
59
+ const MCP_VERSION = "3.69.1"; // bumpear junto con package.json + backend/services/mcp-remote.ts
58
60
  const NOVEDADES = [
61
+ "3.69.1 — AYUDA completa: `ayuda` ahora tiene la ficha (qué hace, cómo usarlo, ejemplo, qué NO hace) de los 20 tools que no la tenían (cierre semanal, zonas de grupo, tarifas de grupo, sin vendedor, corregir estado, pago al cadete, retiros…) y los 26 que no aparecían en el índice. La ayuda del paquete npm se genera desde la del conector, así que ya no se desincronizan. No mueve dinero.",
62
+ "3.69.0 — Control por foto de la TANDA DE UN CADETE (propios + de otros nodos mezclados): en `envio_desde_etiqueta_ml` alcanza con el `mlQr` crudo — de ahí sale el número de ML y el vendedor, y el vendedor se reconoce igual que en el escáner (cuenta vinculada O cuenta aprendida en juntadas/escaneos; antes solo la vinculada). `nodoEntrega` ya no necesita `grupo`: si el cliente es del mismo nodo que entrega es un paquete propio (sin traspaso) y si es de otro nodo se usa el grupo que comparten. Si no conoce al vendedor, contesta 404 con el senderId para que preguntes de qué nodo/cliente es. Si el envío ya existía, no lo duplica: lo completa y lo avanza. No mueve dinero.",
59
63
  "3.68.0 — Control por foto: `envio_desde_etiqueta_ml` acepta `nodoEntrega` (nombre o id de un nodo del `grupo`) = el nodo que RECIBIÓ y entregó el paquete. Con `fecha` + `grupo` + `nodoEntrega` una planilla atrasada entra al CIERRE SEMANAL entre nodos en su día real (ej. 5 envíos de un cliente de Envíos Frank que entregó FastCorreo el lunes 14: fecha 14/09, grupo Portela, nodoEntrega FastCorreo). Antes solo se ponía con `autoRutear` y si la zona tenía un único responsable; si no, quedaba fuera del cierre. Si el envío ya tenía OTRO nodo que entrega no se pisa (avisa). Si la semana ya cerró, entra en el cierre siguiente marcado como tarde, con su fecha real. No mueve dinero.",
60
64
  "3.67.0 — TARIFA de grupo de una: `grupo_tarifa_set` fija la tarifa de clearing por zona (cercana/media/lejana/muyLejana) de TODO un grupo — el default del grupo y el precio de cada nodo miembro — en una sola llamada, sin ir nodo por nodo (ej. dejar un grupo nuevo en 2700 los 4 tramos). Con `soloDef` toca solo el default. Solo la comisión (admin) del grupo o el admin global. Es config del clearing, no mueve dinero.",
61
65
  "3.66.0 — COMPOSICIÓN de zonas de grupo: `zona_mover_metazona` reclasifica una metazona/localidad de una zona de grupo a otra del mismo grupo sin tocar el nodo responsable (ej. 'El Palomar' mal puesto en Morón → Tres de Febrero). `zona_componer_grupo` crea/edita una zona de grupo agregando/quitando metazonas y sumándole un nodo responsable — sirve para armar las zonas de un grupo NUEVO con su composición completa (el ruteo matchea por metazona exacta, así que una zona de CABA necesita 'CABA · Barrio' y 'Barrio'). Solo la comisión (admin) del grupo o el admin global.",
@@ -860,14 +864,14 @@ if (ALLOW_WRITE) {
860
864
  cliente: zStr().describe("Vendedor por nombre/id (si no mandás mlSenderId)"),
861
865
  mlSenderId: zStr().describe("sender_id del vendedor en ML (mapea a su cuenta vinculada)"),
862
866
  mlShipmentId: zStr().describe("id de envío/tracking de ML leído de la etiqueta (se limpian espacios OCR)"),
863
- mlQr: zStr().describe("Contenido CRUDO del QR de ML (para reimprimir la etiqueta idéntica)"),
867
+ mlQr: zStr().describe("Contenido CRUDO del QR de ML (el JSON {id, sender_id, hash_code…}). Alcanza solo: de ahí salen el número de envío y el vendedor, y sirve para reimprimir la etiqueta idéntica. Mandalo SIEMPRE que lo leas."),
864
868
  destinatario: zStr(), telefono: zStr(),
865
869
  direccion: zStr().describe("Dirección; si un dígito de la altura no se lee, poné '*' por cada uno (ej. 'Julian Aguirre 31**'), NO lo inventes"),
866
870
  localidad: zStr(), cp: zStr(), zona: zStr(), barrio: zStr(),
867
871
  avanzarA: z.enum(["colectado", "procesado", "entregado"]).optional().describe("Control por foto: avanza el envío EN UN PASO registrando CADA estado intermedio (atribuido a vos, el usuario MCP). 'colectado' / 'procesado' (En centro) / 'entregado' (recorre A retirar→Colectado→En centro→[grupo=En camino]→Entregado). 'entregado' es la vía rápida para el clearing entre nodos."),
868
872
  autoRutear: z.boolean().optional().describe("Planilla: asigna automáticamente el NODO y/o MENSAJERO responsable de la ZONA de reparto del destino. Configurá antes los responsables con `asignar_nodo_zona`/`asignar_mensajero_zona`."),
869
873
  grupo: zStr().describe("Control por foto: nombre o id de un GRUPO logístico tuyo (ej. 'Bonorino') — despacha por ese grupo (queda 'En camino', su mensajero es el integrante del grupo)."),
870
- nodoEntrega: zStr().describe("Solo staff, va con `grupo`: nodo (nombre o id) del grupo que RECIBIÓ y entregó el paquete (ej. 'FastCorreo'). Es el que cobra el traspaso en el cierre semanal entre nodos; sin esto el envío solo entra al cierre si `autoRutear` encuentra UN responsable de zona. Si el envío ya tenía otro nodo que entrega, no se pisa."),
874
+ nodoEntrega: zStr().describe("Solo staff: nodo (nombre o id) que RECIBIÓ y entregó el paquete (ej. 'FastCorreo'). Es el que cobra el traspaso en el cierre semanal entre nodos. Sin `grupo` se deduce: si el cliente es de ese mismo nodo es un paquete propio (sin traspaso); si es de otro nodo, el grupo que comparten (si comparten varios, pedí `grupo`). Si el envío ya tenía otro nodo que entrega, no se pisa."),
871
875
  fotoRuta: zStr().describe("RUTA LOCAL de la foto de la etiqueta en tu compu (ej. 'C:\\\\Users\\\\...\\\\Desktop\\\\etiquetas\\\\ml_123.jpg') — NO la imagen, solo la ruta, para reencontrar la foto. Mandala SIEMPRE que la dirección tenga '*'."),
872
876
  montoCobro: zNum(), mensajero: zStr().describe("Mensajero que hizo el paquete (de tu nodo)"),
873
877
  reusarEtiqueta: z.boolean().optional().describe("ML MANUAL (no vinculado): true = REUSA el mismo tracking/QR/etiqueta de ML que ya viene impreso (NO genera uno nuevo), lo marca 'ml_manual' y es idempotente. Usalo cuando el paquete YA está etiquetado por ML pero no está vinculado a una cuenta."),