Skip to main content
Esta página es el contrato operativo del MCP Server, pensado para que un agente lo lea y opere sin leer el resto del sitio.

Conexión

Autenticación y límites

  • Ninguna herramienta es pública. Las 51 (incluidas verificarFormatoNit, calcularMontoLiteral, buscarNormativa, erroresComunesSiat, consultarDatosNit) se autentican antes de ejecutarse.
  • Las herramientas de Administración exigen la credencial de administración de CUCU (prefijo ck_admin_), no una key de tenant.
  • Rate limit por API Key: cada tools/call cuenta para el mismo límite de requests por minuto que REST. Superado, la tool devuelve el texto de rate limit (abajo) y hay que esperar 60 segundos.
  • Freno por IP: más de 20 credenciales inválidas en un minuto desde una IP bloquean esa IP por el tiempo que diga el mensaje, presente la llave que presente. Una llave de tenant válida sin permiso admin no cuenta.
  • Los errores de autenticación y de límite no son respuestas HTTP 401/429: llegan como texto en result.content[0].text.

Errores

Todos los errores llegan como texto en el resultado de la tool (no como error JSON-RPC). El agente debe inspeccionar el texto. Formas exactas: Las tools de eventos, masiva y webhooks anteponen el contexto: Error cerrando evento: [CODIGO] mensaje, Error registrando webhook: .... crearFactura y descargarDocumento devuelven JSON: {"success": false, "error": "<texto con las mismas formas>"}.

Formato de salida

Para extraer datos de forma confiable, preferí las tools con salida JSON o leé las líneas - Campo: valor por nombre. Los identificadores que se reutilizan son ID (UUID interno) y CUF.

Flujos recomendados

Emitir y entregar
  1. consultarPadron(tipo=5, numero=<NIT>) para obtener la razón social oficial; verificarFormatoNit si el NIT lo escribió un humano.
  2. crearFactura(requestJson) con pointOfSaleId, cliente, paymentMethodCode y details.
  3. Leer siatState de la respuesta: VALIDATED → listo; REJECTED → corregir con siatDescription y erroresComunesSiat; otro estado → verificarEstadoFactura(invoiceId).
  4. Entregar: pdfUrl / xmlUrl de la respuesta (públicas, sin key) o descargarDocumento(cuf, formato) para adjuntar el archivo en base64.
  5. No reintentar crearFactura a ciegas tras un timeout: primero listarFacturas(0, 5) u obtenerFacturaPorCuf para ver si ya se emitió.
Anular y revertir
  1. anularFactura(id, codigoMotivo) con motivo 1 error de datos, 2 devolución, 3 período posterior, 4 otros. Solo sobre VALIDATED.
  2. Si fue un error, revertirAnulacion(id): vuelve a VALIDATED (también para emitidas offline).
  3. Confirmar con verificarEstadoFactura(id).
Devolución o ajuste
  1. La factura original debe estar VALIDATED.
  2. crearNotaCreditoDebito(requestJson) con originalInvoiceId, notaType (CREDITO/DEBITO) y solo returnedDetails; las líneas originales se clonan de la base.
Contingencia (SIAT caído)
  1. verificarConexionSiat() para confirmar la caída.
  2. abrirEvento(posId, codigoMotivo, descripcion); desde ahí el POS emite offline (crearFactura sigue igual).
  3. Al volver el SIAT: cerrarEvento(posId, eventoId). Leer el detalle de paquetes de la respuesta: si alguno no entró, reenviarPaqueteEvento(posId, eventoId).
  4. Facturas emitidas después del fin del evento (verificarEstadoFactura responde [924]): regularizarFacturasFueraDeEvento(posId, eventoId). Facturas con CUFD distinto al del evento (quedan en 901): resellarFacturasEvento.
  5. obtenerEventoActivo(posId) antes de abrir otro: un POS tiene a lo sumo un evento activo.
Emisión masiva
  1. abrirLoteMasivo(posId) (idempotente). 2. crearFactura las veces que haga falta: quedan en MASSIVE_PENDING. 3. cerrarLoteMasivo(posId); puede tardar minutos y es reentrante. 4. verLoteMasivo(posId); si hay rechazadas, rectificarLoteMasivo(posId) y volver a cerrarLoteMasivo.
Webhooks
  1. registrarWebhook(url, descripcion, tiposEvento): el secreto de firma se muestra una sola vez; guardarlo.
  2. Diagnóstico: listarEntregasWebhook(endpointId) y reenviarEntregaWebhook(deliveryId) para una entrega DEAD.

Efectos y seguridad de reintento