npm.io
0.13.0 • Published 3d ago

contadeo-mcp

Licence
MIT
Version
0.13.0
Deps
0
Vulns
0
Weekly
0

contadeo-mcp

Servidor MCP de Contadeo: conecta tu asistente de IA (Claude Desktop, Claude Code, Cursor…) a la facturación electrónica del SRI (Ecuador).

"Emite una factura de 2 horas de consultoría a $75 para Juan Pérez, cédula 0923266183, pago por transferencia, y mándale el PDF a su correo"

El asistente busca (o crea) al cliente, el servidor calcula el IVA y cuadra los totales con las reglas oficiales del SRI, te muestra el resumen, y tras tu confirmación emite, espera la autorización del SRI y te entrega el RIDE.

Por qué es seguro

La matemática tributaria no la hace el modelo de IA — la hace este servidor, con las mismas reglas que valida Contadeo:

  • Cálculo y cuadre de totales con aritmética decimal exacta (redondeo half-up a 2 decimales, agrupación de IVA por tarifa).
  • Validación del dígito verificador de cédulas y RUC (los 3 tipos) antes de enviar nada — espejo verificado contra el núcleo fiscal de Contadeo (fuzz de 100 000 valores, 0 diferencias).
  • Regla de consumidor final (identificación fija, máximo $50 — error SRI 69).
  • Catálogos oficiales embebidos: tarifas de IVA (Tabla 18), formas de pago (Tabla 24), tipos de identificación (Tabla 7).
  • El flujo exige confirmación humana: preparar_factura solo calcula y devuelve un resumen; emitir_factura re-valida el cuadre y rechaza payloads hechos a mano.
  • Ambiente siempre visible (Pruebas/Producción): el objeto ambiente viaja en las respuestas y el resumen que confirmas encabeza con un banner ( Producción = documento tributario real). Nunca se describe "de memoria".
  • confirmToken: preparar_* firma el resumen y emitir_* lo verifica — ata la emisión al resumen exacto que confirmaste y bloquea payloads modificados o resúmenes rancios (se activa con MCP_CONFIRM_SECRET).
  • Auditoría: cada emisión queda registrada (tenant, tool, latencia, sin datos personales) para depuración y cumplimiento.
  • Reverso legal: para dejar sin efecto una factura se emite una nota de crédito (preparar_nota_credito / emitir_nota_credito) — la vía del SRI cuando ya no aplica la anulación (fuera del plazo del día 7, o consumidor final). La anulación interna (estado ANULADO) sigue haciéndose desde el panel; su trámite formal ante el SRI es en SRI en línea.

Requisitos

  • Cuenta en contadeo.com (gratis: 10 comprobantes/mes) con emisor y certificado .p12 configurados
  • Para el modo stdio: Node.js 18+ y una API key (panel → Configuración → API → Crear; rol emisor basta)

Conexión recomendada: servidor remoto con OAuth

Sin API keys: el cliente abre el login de Contadeo, autorizas con un clic y listo (OAuth 2.1 con PKCE y registro dinámico de clientes).

# Claude Code
claude mcp add --transport http contadeo https://contadeo.com/api/mcp
# dentro de la sesión: /mcp → authenticate (abre el navegador)

En claude.ai: Settings → Connectors → Add custom connectorhttps://contadeo.com/api/mcp.

Para clientes que solo hablan stdio pero soportan OAuth vía proxy:

claude mcp add contadeo -- npx -y mcp-remote https://contadeo.com/api/mcp

Revocar el acceso: cambia tu contraseña en Contadeo (invalida los tokens de todos los clientes conectados).

Método alternativo: stdio + API key

Útil para automatizaciones machine-to-machine o clientes sin MCP remoto. La API key se crea en el panel (Configuración → API; el rol emisor basta).

Claude Desktop / Cursor (claude_desktop_config.json)
{
  "mcpServers": {
    "contadeo": {
      "command": "npx",
      "args": ["-y", "contadeo-mcp"],
      "env": { "CONTADEO_API_KEY": "cdo_tu_api_key" }
    }
  }
}
Claude Code
claude mcp add contadeo -e CONTADEO_API_KEY=cdo_tu_api_key -- npx -y contadeo-mcp
Variables de entorno (solo stdio)
Variable Requerida Default
CONTADEO_API_KEY
CONTADEO_API_URL https://contadeo.com/api

Tu primera factura (tutorial)

Recomendado: deja tu cuenta en ambiente de Pruebas (Configuración → Empresa) hasta dominar el flujo — los comprobantes de Pruebas no tienen validez tributaria.

Una conversación real se ve así:

Tú: Factúrale a María García, cédula 1714616123, 3 cajas de té a $4.50 cada una, pago en efectivo. Su correo es maria@correo.com

Asistente: (usa contexto_emision, crear_cliente y preparar_factura) Te muestro el resumen antes de emitir:

Factura para: MARIA GARCIA (Cédula 1714616123)
Detalle:
  • 3 × Caja de té @ $4.50 = $13.50 [IVA 15% (tarifa general vigente)]
Subtotal (sin impuestos): $13.50
IVA: $2.03
TOTAL: $15.53
Forma de pago: Sin utilización del sistema financiero (efectivo)
RIDE se enviará a: maria@correo.com

¿Confirmas la emisión?

Tú:

Asistente: (emitir_factura → esperar_autorizacion) AUTORIZADA por el SRI en 8 segundos. Clave de acceso 2306…947. Aquí tienes el PDF: [descargar RIDE]. María también lo recibirá en su correo.

En clientes MCP que soportan prompts, el comando facturar arranca este flujo guiado automáticamente.

Tools

Categoría Tool Qué hace
Cuenta consultar_cuenta Plan, consumo del mes y ambiente (Pruebas/Producción)
Contexto contexto_emision Emisores, establecimientos, puntos y certificados (los IDs para emitir)
Catálogo buscar_clientes / buscar_productos Búsqueda por texto
Catálogo crear_cliente / crear_producto Altas (valida cédula/RUC y tarifas antes de enviar)
Catálogo consultar_ruc Autocompleta al comprador por RUC/cédula (directorio + catastro SRI); alerta de contribuyente fantasma/inactivo
Emisión preparar_factura Calcula y cuadra todo; devuelve resumen + payload (con idempotencyKey). fechaEmision opcional: default hoy, hasta 5 días atrás. No emite
Emisión emitir_factura Emite tras confirmación; re-valida el cuadre localmente
Emisión preparar_lote Hasta 25 facturas de una vez: datos comunes al lote + override por factura; devuelve resumenAgregado (tabla por factura + totales). No emite
Emisión emitir_lote Emite el lote en secuencia tras UNA confirmación; pre-vuelo todo-o-nada y estado por factura (ENCOLADA/FALLO/NO_INTENTADA)
Reverso preparar_nota_credito Nota de crédito (04) que revierte una factura: reverso TOTAL desde comprobanteId + motivo, o explícito/parcial con items. Calcula y cuadra; no emite
Reverso emitir_nota_credito Emite la nota de crédito tras confirmación; re-valida cuadre y confirmToken
Emisión esperar_autorizacion Polling hasta AUTORIZADO/RECHAZADO (el SRI tarda 5–30 s); acepta id o ids (hasta 25, para lotes). Los AUTORIZADO incluyen los links de descarga del RIDE y XML
Consulta listar_comprobantes / consultar_comprobante Estados y detalle; con eventos: true incluye el timeline paso a paso de la emisión
Descarga descargar_ride / descargar_xml URLs temporales (1 h) del PDF y XML
Acción anular_comprobante / reenviar_comprobante Anula una factura autorizada (registro interno; si no aplica, orienta a nota de crédito) o reenvía el RIDE/XML por email
Reportes reporte_ventas Agregados del período
Multi-cuenta listar_mis_cuentas / consultar_cartera Contadores: todas tus empresas y su cartera (semáforo RIMPE + vencimientos) de un vistazo. Solo OAuth
Referencia consultar_reglas_sri Tablas oficiales: tarifas IVA, formas de pago, identificaciones, reglas
Asesor consultar_calendario_tributario Próximos vencimientos según el 9.º dígito del RUC y el régimen
Asesor consultar_semaforo_rimpe Proyección de ingresos vs límites RIMPE: VERDE/AMARILLO/ROJO
Asesor consultar_obligaciones Checklist de obligaciones del perfil (declaraciones, anexos, contabilidad)
Asesor consultar_f104 Borrador del F104 de IVA explicado: cifras + resumen en español llano, desglose por casillero (429, 564, 601, 605, 609, 902/615), alertas proactivas y proyección del arrastre — no es la declaración oficial
Asesor explicar_f104 Narra la declaración casillero por casillero para quien nunca ha declarado; también explica cifras pegadas de una declaración ya presentada
Asesor simular_f104 "¿Si facturo $500 más, cuánto más pago?": escenarios de ventas/compras/retenciones/ventas a crédito sobre el borrador, con la tarifa vigente del servidor
Asesor validar_f104 Chequeo previo a declarar: cruza el borrador contra los libros, detecta compras sin autorización, notas de crédito por compensar y diferencias con lo que piensas declarar
Asesor consultar_libro_ventas / consultar_libro_compras Libros de ventas y de compras del período (líneas + totales, insumo de declaración y ATS)
Asesor consultar_cumplimiento_despacho Vista cross-empresa del despacho: alertas urgentes, semáforos RIMPE, bandeja de vencimientos y resumen. Parámetro vista filtra los bloques. Solo OAuth.

Los tools del Asesor son informativos: el servidor calcula con sus catálogos legislativos vigentes y toda respuesta incluye un disclaimer («no constituye asesoría tributaria») que el asistente siempre muestra. 34 tools en total. El catálogo se filtra por tenants.perfil: el negocio ve 31 y el contador ve las 34 — suma las 3 de despacho multiempresa (listar_mis_cuentas, consultar_cartera, consultar_cumplimiento_despacho), que requieren sesión OAuth.

Campos de respuesta (v0.7.0): preparar_* incluye el objeto ambiente, preparadoEn y un confirmToken en cada payload (reenvíalo tal cual, junto al idempotencyKey); emitir_* devuelve el ambiente legible y encoladoEn (y en el lote estadoComprobante); esperar_autorizacion y consultar_comprobante traen el ambiente legible, y con eventos:true el timeline incluye firmado → enviado → autorizado → notificado. El detalle interno de arquitectura vive en docs/MCP.md.

Lotes: varias facturas de una vez

Para emitir hasta 25 facturas en una sola pasada (p. ej. la facturación mensual a toda la cartera):

  1. preparar_lote — construye el lote con la matemática hecha por el servidor: comprador, forma de pago y fechaEmision comunes al lote, con override por factura. Devuelve el resumenAgregado (tabla por factura + totales del lote).
  2. UNA confirmación — el asistente muestra la tabla completa y pide una única confirmación explícita del lote entero antes de emitir.
  3. emitir_lote — emite en secuencia con pre-vuelo todo-o-nada (si un payload no cuadra, no se emite ninguna); si una factura falla continúa con las demás, salvo 401/402/429 que corta el lote.
  4. esperar_autorizacion con ids — sigue todos los comprobantes hasta el estado terminal (timeout sugerido: 90 s).

Reintentos seguros: cada payload lleva su idempotencyKey (lo genera preparar_lote); reintentar la emisión con la misma clave devuelve el comprobante original — no quema secuenciales ni duplica facturas.

Reglas del SRI que el servidor aplica por ti

Regla Detalle
Tarifas de IVA (Tabla 18) '4' = 15% (general vigente) · '0' = 0% · '5' = 5% · '7' = exento · '6' = no objeto
Formas de pago (Tabla 24) '01' efectivo · '20' transferencia · '19' t. crédito · '16' t. débito · más en consultar_reglas_sri
Identificación (Tabla 7) '04' RUC · '05' cédula · '06' pasaporte · '07' consumidor final — con dígito verificador validado
Consumidor final Identificación fija 9999999999999, importe máximo $50
Cuadre línea = cantidad×precio−descuento; IVA = base×tarifa/100; total = subtotal+IVA+propina — redondeo half-up a 2 decimales
Fecha de emisión Default: hoy (calendario de Ecuador). fechaEmision opcional acepta hasta 5 días atrás; nunca futura (la API la rechaza — error 65 SRI)

Skill para Claude (opcional, recomendado)

La carpeta skill/facturacion-contadeo/ contiene un Agent Skill que le enseña a Claude el flujo completo, las reglas de oro (nunca emitir sin confirmación, nunca calcular de cabeza, verificar el ambiente) y el manejo de errores del SRI. Instalación en Claude Code:

mkdir -p ~/.claude/skills && cp -r node_modules/contadeo-mcp/skill/facturacion-contadeo ~/.claude/skills/

(o copia la carpeta a .claude/skills/ de tu proyecto).

Troubleshooting

Síntoma Causa probable Solución
401 API key inválida o revocada Key mal copiada o revocada Genera otra en Configuración → API
402 Cupo mensual agotado Límite del plan contadeo.com/precios
RECHAZADO con error 62 Identificación inválida El flujo normal lo previene; revisa el número con el comprador
RECHAZADO con error 52 Totales descuadrados Usa siempre preparar_factura; no edites el payload
Queda en ENVIADO/CONTINGENCIA SRI lento o caído Reintentos automáticos; consulta en unos minutos
La factura salió "de verdad" sin querer Cuenta en Producción Cambia a Pruebas en Configuración → Empresa para experimentar

Desarrollo

# desde la raíz del monorepo (el paquete vive en el workspace)
pnpm install
pnpm --filter contadeo-mcp test    # vitest: identificación + cálculo/cuadre
pnpm --filter contadeo-mcp build   # tsc → dist/
CONTADEO_API_KEY=cdo_... node mcp/dist/index.js   # corre por stdio

El paquete exporta crearServidorContadeo({ apiUrl, token, confirmSecret?, onAuditoria? }): la misma factoría que usa el backend de Contadeo para montar el servidor remoto en https://contadeo.com/api/mcp. Arquitectura interna (protocolo, garantías, modelo de datos): docs/MCP.md; transporte/OAuth y despliegue: docs/MCP-REMOTO.md.

Documentación completa de la API REST: https://contadeo.com/desarrolladores

Keywords