Servidor MCP para retail VTEX — Plaza Vea (Perú). Golden Flow: select_address → search_products → add_to_cart → open_checkout. Checkout is exclusively human. This server does NOT execute payments.
Plaza Vea has 14 tools with schemas and descriptions present, but quality is inconsistent. Naming is mostly verb-noun compliant (select_address, search_products, get_cart). However, descriptions are verbose and context-heavy (200-400+ chars), mixing implementation details with user intent. Schemas are visible but sparse: most parameters lack type constraints (no enums for categorical inputs like 'month' format, 'auto' boolean). Critical issue: descriptions assume Spanish-language context and internal state management (e.g., 'ESTADO 1', 'Híbrido Inteligente') that LLMs cannot parse reliably. Error handling is mentioned but not demonstrated in schemas. Output schemas are not documented. No tool annotations (readOnlyHint/destructiveHint). Composition is reasonable (14 focused tools), but parameter descriptions lack actionable constraints (e.g., 'month' should specify YYYY-MM format explicitly, not buried in prose).
Agrega un producto al carrito por skuId. Verifica stock post-add.
Lista las direcciones de envío registradas en el perfil del usuario.
Analiza el gasto del usuario: total, promedio por orden, gasto por mes, top productos. Primera llamada es lenta (descarga detalles). Las siguientes usan cache.
Devuelve el contenido actual del carrito con precios y totales.
Devuelve el historial de pedidos del usuario.
ESTADO 4 — Handoff Humano. Abre el browser con el carrito precargado para que el usuario complete el pago manualmente. El servidor NO ejecuta pagos. Requiere sesión activa y dirección seleccionada.
Descriptions mix implementation state (ESTADO 1, ESTADO 4, Híbrido Inteligente) with user intent. LLMs cannot parse Spanish-language state machine references. Rewrite descriptions to focus on user-facing behavior: 'Selects a delivery address from the user's saved addresses. Must be called before searching products.' instead of 'ESTADO 1, Anclaje Logístico...'
No output schemas documented. LLMs cannot plan downstream calls or extract required fields. Document what each tool returns: e.g., search_products returns [{skuId, productName, priceList, priceOnline, priceTarjetaOH}], get_cart returns {items: [...], total, subtotal}.
Parameters lack type constraints and enums. 'month' in get_analytics should declare format: 'YYYY-MM (e.g., 2026-05)' as a constraint, not prose. 'auto' in open_checkout/open_login should be explicitly boolean with description 'true: open browser automatically; false: return fallback command'.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Abre el browser para iniciar sesión en Plaza Vea. Si auto=false, devuelve comando fallback para ejecución manual.
Elimina un ítem del carrito según su índice (visible en get_cart).
PASO 2 — Búsqueda Honesta. Busca productos filtrando los sin stock global. IMPORTANTE: Requiere haber llamado select_address primero (Selección de dirección). Si no hay dirección seleccionada, retorna error con instrucción. Muestra resultados SIEMPRE en tabla de 4 columnas: | Producto | Precio Lista | Precio Online | Precio Tarjeta OH! | Usa - si un precio no aplica. PROHIBIDO usar la palabra LED.
ESTADO 1 — Anclaje Logístico. SOLO ancla la ubicación; NO valida stock (eso es simulate_stock, Estado 3). Llama get_addresses, muestra las opciones al usuario y PREGUNTA cuál prefiere ANTES de invocar. NO asumas ni elijas solo. Una vez el usuario elija, ancla esa dirección en el orderForm (funciona con carrito vacío — Híbrido Inteligente). Las búsquedas posteriores ya saben la ubicación.
Simula disponibilidad de un SKU en una dirección específica. Valida que el local tenga stock antes de agregar al carrito.
Agrega un producto al radar de precios. Guarda precio actual y dispara alerta cuando baje del umbral.
Refresca precios de todos los productos rastreados. Devuelve cambios y alertas activas.
Lista todos los productos en el radar de precios con precio actual y alerta configurada.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes. Mark: add_to_cart, remove_from_cart, track_add as destructiveHint=true; get_* tools as readOnlyHint=true.
Error handling not demonstrated in schemas. Descriptions mention 'retorna error' but no error response structure is shown. Define error responses: e.g., search_products without address returns {error: 'Address not selected. Call select_address first.', code: 'MISSING_ADDRESS'}.