Skip to main content
Timbrix expone un servidor MCP (Model Context Protocol) oficial — @timbrix/mcp — que le da a cualquier agente de IA compatible con MCP (Claude Desktop, Cursor, agentes construidos con LangChain, etc.) acceso directo a la misma API REST que usa @timbrix/sdk, sin que el agente tenga que conocer los detalles del protocolo HTTP de Timbrix.
Tiempo estimado: 20 minutos. La sección “Inicio rápido” te lleva de cero a tu primer CFDI timbrado por un agente en menos de 10 minutos; el resto de la página cubre instalación completa, las 4 herramientas disponibles, manejo de errores y responsabilidad legal.

Inicio rápido

1. Obtén tu API key de sandbox

Sigue los pasos 1 y 2 de Quickstart: crea tu cuenta en app.timbrix.mx/register y copia la API key “Sandbox — auto generada” desde Configuración → API Keys. Los CFDI que timbres con esta key no tienen validez fiscal real — es el ambiente correcto para que un agente experimente sin riesgo.

2. Instala el MCP server

No necesitas instalar nada de forma permanente. Agrega esto a la configuración MCP de tu cliente (Claude Desktop, Cursor, etc.):
Ver la sección Instalación del MCP server más abajo para el path exacto de este archivo según tu cliente.

3. Timbra tu primer CFDI desde el agente

Con el MCP server conectado, pídele a tu agente algo como:
“Usa timbrix_crear_cfdi_ingreso para timbrar una factura a Público en General por $100 MXN, forma de pago efectivo (01), uso G03.”
El agente resuelve la herramienta timbrix_crear_cfdi_ingreso y te regresa el UUID fiscal, el estatus y el XML timbrado. Si el resultado trae isError: true, revisa la sección Manejo de errores antes de reintentar — los errores más comunes en sandbox (fecha en UTC, RFC no inscrito) están documentados ahí con su solución exacta.

Instalación del MCP server

@timbrix/mcp es un paquete npm público que implementa el protocolo MCP sobre stdio (por defecto) o HTTP (para despliegues hospedados).

Sin instalación (npx)

Esto siempre ejecuta la última versión publicada. Para instalarlo de forma global en su lugar:

Configuración en Claude Desktop

Agrega esto a tu claude_desktop_config.json:

Configuración en Cursor

Cursor usa el mismo formato mcpServers que Claude Desktop. El bloque JSON de arriba funciona sin cambios; solo cámbialo al archivo de configuración MCP que use tu versión de Cursor (Cursor expone esta configuración desde Settings → MCP, o un archivo de configuración de proyecto/usuario según la versión — consulta la documentación oficial de Cursor para el path exacto, ya que puede variar entre versiones).

Variables de entorno

El transporte http no implementa autenticación propia — cualquier proceso que pueda alcanzar el puerto puede timbrar y cancelar CFDI reales contra tu RFC, a tu costo. Por eso el servidor hace bind a 127.0.0.1 por defecto (solo accesible desde la misma máquina). Si necesitas exponerlo más allá de eso (MCP_HTTP_HOST=0.0.0.0), es tu responsabilidad poner tu propio front door de autenticación delante (reverse proxy, API gateway o red privada) — el paquete no lo hace por ti. Para agentes locales de un solo usuario, usa el transporte stdio por defecto: no requiere ningún puerto abierto.

Operaciones disponibles

El MCP v1 de Timbrix expone 4 herramientas. No existe una quinta herramienta para crear organizaciones/emisores (timbrix_crear_emisor) — registrar un nuevo RFC emisor y subir su CSD requiere hoy una sesión autenticada de owner, no una API key, así que se hace desde el dashboard o @timbrix/cli.

timbrix_crear_cfdi_ingreso

Timbra (sella ante el SAT vía PAC) un CFDI 4.0 de tipo Ingreso para la organización a la que pertenece tu API key. Devuelve el UUID fiscal, el XML timbrado y el estatus. * Debes enviar exactamente uno de customer o customerId. ** Obligatorio solo cuando requiere_confirmacion es true.
date va siempre en hora local de Ciudad de México (America/Mexico_City, UTC-6), nunca en UTC. El PAC compara este valor directamente contra su propio reloj de servidor, que está en hora de México sin ninguna conversión. Una fecha en UTC se ve ~6 horas en el futuro y el timbrado falla — y el error que reporta el PAC casi nunca dice “fecha inválida”: normalmente aparece como el confuso CFDI40102 - El resultado de la digestión debe ser igual al resultado de la desencripción del sello, que parece un problema de certificado pero casi siempre es esto. El SAT exige que la fecha esté dentro de las 72 horas previas al timbrado; el servidor no la asigna por su cuenta, así que un agente debe calcularla explícitamente en la zona horaria correcta (ver ejemplos de código más abajo).

timbrix_cancelar_cfdi

Solicita la cancelación de un CFDI ya timbrado ante el SAT. Si el receptor debe aprobar la cancelación, el resultado queda en estatus pendiente. Valores de motivo:

timbrix_listar_cfdi

Lista los CFDI timbrados de la organización, más recientes primero.

timbrix_consultar_saldo

Sin parámetros. Devuelve cuántos CFDI ha timbrado la organización en el mes calendario actual (hora Ciudad de México) contra el límite de su plan, y cuándo se reinicia el periodo.
cfdiIncluded y cfdiRemaining son null en el plan enterprise (timbrado ilimitado), no cero. Un agente que reporte “0 timbres restantes” en ese caso le está dando información falsa al usuario — siempre distingue null de 0 antes de comunicar el saldo.

Ejemplos de flujos

Caso real: timbrar automáticamente al confirmarse un pago

Un patrón común es que un agente escuche un webhook de un proveedor de pagos (ej. Stripe payment_intent.succeeded) y, al confirmarse el cobro, arme el cliente, el producto y el CFDI usando las herramientas MCP —sin intervención humana.

TypeScript/Node con LangChain

Python con LangChain

Los nombres exactos de MultiServerMCPClient/getTools() (TypeScript) y get_tools() (Python) corresponden a la API pública documentada de @langchain/mcp-adapters / langchain-mcp-adapters al momento de escribir esta guía. Verifica contra la versión que instales antes de publicar código de producción basado en estos ejemplos.

Autenticación

TIMBRIX_API_KEY resuelve automáticamente la organización — no necesitas pasar organizationId en ninguna herramienta MCP. Reglas de seguridad para agentes:
  • Nunca pongas la API key en el prompt o system message del agente. Un LLM puede repetir cualquier texto de su contexto en su output (por un error de razonamiento, un prompt injection, o simplemente al depurar en voz alta), y eso filtraría la key.
  • Pasa siempre la key como variable de entorno del proceso que hospeda el MCP server (TIMBRIX_API_KEY=sk_... npx @timbrix/mcp), nunca como un valor que el modelo pueda leer o citar.
  • Si tu agente corre en un entorno multi-tenant (por ejemplo, un SaaS que orquesta agentes para varios clientes de Timbrix), cada tenant necesita su propia API key con su propio scope de organización — no reutilices una sola key para varios tenants. Como la key ya resuelve la organización por sí sola, aislar tenants es tan simple como levantar una instancia del MCP server (o una sesión, en el transporte HTTP) por key.

Manejo de errores

@timbrix/mcp nunca lanza una excepción que tumbe el proceso cuando la API de Timbrix responde con un error. En su lugar, cualquier error se devuelve como un resultado MCP normal con isError: true y content[0].text conteniendo un mensaje de texto libre. Un agente debe revisar result.isError explícitamente — no puede confiar en un bloque try/catch alrededor de la llamada a la herramienta para detectar fallos.
Los códigos de catálogo del SAT (formato CFDI#####) vienen embebidos dentro de ese texto libre, no como un campo estructurado aparte. Los más comunes que verás en sandbox:
timbrix_crear_cfdi_ingreso acepta un idempotencyKey opcional. Úsalo siempre que un agente pueda necesitar reintentar una llamada tras un timeout de red — sin él, un reintento ciego arriesga timbrar el mismo CFDI dos veces (con el consumo y costo fiscal que eso implica).
El SAT no tiene una regulación específica para el timbrado ejecutado por agentes de IA: la responsabilidad del CFDI emitido sigue siendo, íntegramente, del RFC emisor — el cliente de Timbrix — sin importar si el comprobante lo generó un humano desde el dashboard o un agente autónomo vía MCP. Timbrix no valida ni certifica el juicio del agente antes de aceptar la petición de timbrado. Si despliegas un agente autónomo capaz de timbrar o cancelar CFDI sin intervención humana en cada paso, eres responsable de supervisarlo: revisar sus timbrados, tener alertas sobre montos o volúmenes inusuales, y poder detenerlo si empieza a operar incorrectamente. timbrix_crear_cfdi_ingreso incluye un hook de confirmación para esto (ver abajo), pero sigue siendo tu responsabilidad configurarlo y actuar sobre sus mensajes de confirmación pendiente — Timbrix no supervisa el juicio del agente por ti.

Confirmación explícita para timbrados de alto valor

Un agente mal configurado que timbra automáticamente un CFDI de $500,000 MXN sin revisión humana es un riesgo operativo real, aunque el SAT no lo regule de forma distinta a cualquier otro CFDI. timbrix_crear_cfdi_ingreso acepta tres parámetros opcionales para mitigar esto: Cuando requiere_confirmacion: true y la suma de items[].amount (el subtotal estimado del CFDI) supera umbral_confirmacion_mxn, el tool no timbra: responde con un mensaje estructurado (requiereConfirmacion: true, el subtotal estimado, el umbral configurado y las instrucciones para proceder) en vez de llamar a la API. El agente debe mostrarle ese mensaje a un humano y, solo tras obtener su confirmación explícita, volver a invocar la herramienta con el mismo payload agregando "confirmado": true.
Un umbral razonable para empezar es el monto a partir del cual tu negocio ya pediría una segunda revisión humana para una factura normal — no hay un valor único recomendado para todos los casos, ya que depende del ticket promedio de cada organización.

Siguiente paso

Quickstart de la API REST

El mismo flujo cliente → producto → CFDI, sin MCP de por medio.

API Reference

Endpoints, autenticación, límites de tasa y códigos de error.