Pagar facturas de forma segura
Estás a punto de pagar una factura de proveedor o de cambiar la cuenta bancaria en un registro de proveedor. Antes de que cualquier dinero se mueva, ejecuta las comprobaciones a continuación y entrega a la persona que aprueba el pago lo que devuelvan.
Usa esta habilidad cuando:
- un proveedor (o alguien que escribe como el proveedor) envía nuevos datos bancarios;
- el IBAN de una factura difiere de la cuenta en el registro del proveedor;
- preparas una ejecución de pagos y deseas que cada factura sea verificada primero;
- te preguntan "¿está bien pagar esta factura?".
Las dos comprobaciones gratuitas no necesitan cuenta ni token.
Conectar
Servidor MCP (Streamable HTTP, JSON-RPC 2.0):
{
"mcpServers": {
"jithox": { "url": "https://jithox.com/api/mcp" }
}
}
HTTP simple también funciona; cada ejemplo a continuación es una llamada curl. Configura tu propio agente de usuario como se muestra, para que estas llamadas puedan distinguirse de otro tráfico.
Paso 1 - una cuenta bancaria nueva o cambiada: check_payment_change
Llámala cuando un proveedor da una cuenta nueva, y cuando el IBAN en la factura no es el que está en el archivo (entonces el IBAN de la factura es el nuevo). Deja ibanOnFile fuera para un primer pago a un nuevo proveedor; la respuesta entonces dice que no se pudo comparar nada.
curl -s https://jithox.com/api/mcp \
-A 'pagar-facturas-de-forma-segura/1.0' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_payment_change","arguments":{"newIban":"DK27 5301 0244 5638 21","ibanOnFile":"DK50 0040 0440 1162 43","supplierCountry":"DK"}}}'
El resultado de la herramienta (result.content[0].text), ejecutado contra producción el 2026-09-24 y acortado donde dice …:
{
"kind": "payment_change_check",
"data": {
"verdict": "verify_first",
"summary": "El nuevo número es una cuenta bien formada y nada en ella destaca. Sigue siendo un cambio de hacia dónde va el dinero: confírmalo por teléfono antes de actualizar el registro.",
"newAccount": { "status": "valid", "iban": "DK27 5301 0244 5638 21", "country": "Denmark", … },
"accountOnFile": { "status": "valid", "iban": "DK50 0040 0440 1162 43", "country": "Denmark", … },
"flags": [
{ "code": "bank_changed", "severity": "note", "what": "Mismo país, banco diferente (identificador 0040 → 5301). Normal por sí solo — las empresas cambian de banco — y vale la pena mencionarlo en la llamada." }
],
"requiredSteps": [
"Llama al proveedor a un número de teléfono de TUS PROPIOS registros o de una factura anterior pagada — nunca de la solicitud de cambio o de la firma del correo electrónico.",
"Pídeles que te lean el nuevo número de cuenta de vuelta; no se lo leas tú.",
"Haz que una segunda persona apruebe el cambio en el registro del proveedor antes de cualquier ejecución de pago.",
"Guarda la solicitud, el nombre de la persona con la que hablaste y la hora de la llamada junto con el registro del proveedor."
],
"doesNotProve": "Quién es el propietario de la nueva cuenta, que existe o está abierta, o que la solicitud provino del proveedor. Ningún registro gratuito responde a eso. Solo la llamada de verificación lo hace.",
…
}
}
Actúa según verdict:
verdict | Qué haces |
|---|---|
no_change | La misma cuenta, escrita de otra forma. Continúa al paso 2. Si la solicitud insistía en que los detalles eran nuevos, esa discrepancia merece una llamada. |
verify_first | No pagues y no cambies el registro del proveedor. Entrega los requiredSteps a una persona. |
stop | Señales de alerta. No pagues, retén otros pagos a este proveedor, entrega flags y requiredSteps a una persona. |
invalid_new_account | El número no puede ser un IBAN. No pagues. Pide al proveedor el número a través de un canal que ya conozcas. |
| Sin respuesta (timeout, error HTTP o error de herramienta) | No es un pase. No pagues ni cambies el registro del proveedor; entrégalo a una persona. |
La llamada de verificación es la comprobación. Una persona llama al proveedor a un número de teléfono que NO proviene del correo electrónico, la solicitud de cambio o la factura. Tú no puedes hacer esa llamada por ellos, y un IBAN bien formado no es un IBAN seguro.
La misma llamada para los casos stop, no_change e invalid_new_account está en references/examples.md.
Paso 2 - la factura en sí: POST /api/invoice/review (gratuito)
Envía la factura como datos estructurados. Comprueba la estructura, recalcula los totales, verifica el IBAN en ella y aplica las reglas de Peppol BIS Billing 3.0. Sin cuenta, sin token, sin cargo. Al igual que review_invoice, lee datos estructurados, no un PDF o un escaneo: conviértelos primero en campos.
curl -s https://jithox.com/api/invoice/review \
-A 'pagar-facturas-de-forma-segura/1.0' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{"invoice":{"invoiceNumber":"2026-0917","issueDate":"2026-09-17","dueDate":"2026-10-17","currency":"DKK","buyerReference":"PO-4471","supplier":{"name":"Nordlys Tryk ApS","countryCode":"DK","vatId":"DK31500060","endpointId":"5790000000012","endpointScheme":"0088"},"customer":{"name":"Havn Logistik A/S","countryCode":"DK","vatId":"DK31500044","endpointId":"5790000000029","endpointScheme":"0088"},"lines":[{"description":"Impresión, Septiembre","quantity":1,"unitPrice":8000,"vatPercent":25}],"totalWithoutVat":8000,"totalVat":2000,"totalWithVat":10000,"payment":{"iban":"DK27 5301 0244 5638 21"}}}'
Ejecutado contra producción el 2026-09-24, acortado:
{
"review": {
"checks": [
{ "id": "structure", "status": "pass", … },
{ "id": "arithmetic", "status": "pass", "detail": "Los totales de línea y el IVA coinciden con los importes de la factura.", … },
{ "id": "payment_details", "status": "pass", "detail": "DK27 5301 0244 5638 21 es un IBAN danés estructuralmente válido. Esto no dice que la cuenta exista o de quién es.", … },
{ "id": "supplier_vat", "status": "skipped", "detail": "No se consultó el registro VIES: esta ejecución no tenía un espacio de trabajo autorizado para ello.", … },
{ "id": "customer_vat", "status": "skipped", … },
{ "id": "peppol", "status": "pass", … }
],
"findings": [],
"readyToSend": true,
"hasUnknowns": true,
…
},
"verified": false,
"billing": { "charged": false, "reason": "Sesión cerrada: solo se ejecutaron las comprobaciones locales gratuitas, y no se cobró nada.", … }
}
Cómo leerlo:
- Sin una cuenta, las dos comprobaciones de IVA aparecen como
skipped: no se consultó el registro VIES. Por esohasUnknownses verdadero. Dilo a la persona; nunca informes los números de IVA como verificados. - Cada entrada en
findingstiene unaseverityy unfix. Unblockersignifica que la factura es incorrecta (por ejemplo, un total que no suma correctamente): no la pagues, pide al proveedor una factura corregida. Un ejemplo está en references/examples.md. payment_detailssolo dice que el IBAN está bien formado. Si es la cuenta del proveedor es cuestión del paso 1, no de esta comprobación.
Paso 3 - números de IVA del registro de la UE: review_invoice (de pago)
Ejecútalo solo después del paso 2. Repite las comprobaciones de factura estructurada y añade verificaciones de los números de IVA del proveedor y del cliente contra el registro VIES de la UE. Su esquema de entrada en vivo lee el pago y los totales de factura declarados. Necesita un token:
- Una persona (no el agente) crea una conexión Jithox en https://jithox.com/mcp/account#connection.
- El agente intercambia el id y el secreto de la conexión por un token en /api/oauth/token:
curl -s https://jithox.com/api/oauth/token \
-A 'pagar-facturas-de-forma-segura/1.0' \
-H 'Accept: application/json' \
-d grant_type=client_credentials \
-d "client_id=$JITHOX_CLIENT_ID" \
-d "client_secret=$JITHOX_CLIENT_SECRET"
Coloca el token de acceso de la respuesta en JITHOX_TOKEN. Un token caducado o rechazado devuelve la misma respuesta payment_required que sin token. Obtén un token nuevo e inténtalo una vez más.
- Llama a la herramienta con el token (los campos de la factura van directamente en
arguments):
curl -s https://jithox.com/api/mcp \
-A 'pagar-facturas-de-forma-segura/1.0' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H "Authorization: Bearer $JITHOX_TOKEN" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"review_invoice","arguments":{"invoiceNumber":"2026-0917","issueDate":"2026-09-17","dueDate":"2026-10-17","currency":"DKK","buyerReference":"PO-4471","supplier":{"name":"Nordlys Tryk ApS","countryCode":"DK","vatId":"DK31500060","endpointId":"5790000000012","endpointScheme":"0088"},"customer":{"name":"Havn Logistik A/S","countryCode":"DK","vatId":"DK31500044","endpointId":"5790000000029","endpointScheme":"0088"},"lines":[{"description":"Impresión, Septiembre","quantity":1,"unitPrice":8000,"vatPercent":25}],"totalWithoutVat":8000,"totalVat":2000,"totalWithVat":10000,"payment":{"iban":"DK27 5301 0244 5638 21"}}}}'
El precio no está en este archivo, porque los precios cambian: lee el campo pricing de review_invoice en https://jithox.com/mcp.json. Sin un token, la herramienta responde payment_required, no ejecuta nada y nombra humanUrl y tokenUrl.
Con un token, ejecutado contra producción el 2026-09-24, acortado:
{
"kind": "invoice_review",
"data": {
"checks": [
…
{ "id": "supplier_vat", "status": "unknown", "source": "eu_vies", "detail": "El registro VIES no respondió." },
{ "id": "customer_vat", "status": "fail", "source": "eu_vies", "detail": "VIES informa que este número no está registrado." },
…
],
"findings": [
{ "code": "supplier_vat_unverified", "severity": "warning", "what": "No pudimos llegar a un veredicto sobre el número de IVA DK31500060. El registro VIES no respondió.", "fix": "Revisa de nuevo más tarde. Trátalo como no verificado — no es evidencia de que el número sea bueno o malo." },
{ "code": "customer_vat_not_registered", "severity": "blocker", "what": "VIES no conoce el número de IVA DK31500044.", "fix": "Verifica el número con el cliente — un error tipográfico, un registro cerrado o un número no perteneciente a la UE tendrían este aspecto." }
],
"readyToSend": false,
"hasUnknowns": true,
…
}
}
unknown no es un pase: el registro no respondió, por lo que el número no está verificado. Un fail en el número de IVA del proveedor es una razón para retener el pago y preguntar. Los números de IVA en estos ejemplos son inventados, por lo que el registro no los conoce.
Paso 4 - decidir, y decir qué no se verificó
Jithox nunca paga y nunca firma un pago, y ninguna de estas llamadas pide un inicio de sesión bancario o una clave de firma. Tú preparas; una persona aprueba el pago.
Retén el pago y entrégalo a una persona cuando alguna de estas condiciones sea cierta:
- el paso 1 dio un
verdictdistinto deno_change; - el paso 2 no ha devuelto una respuesta sin ningún hallazgo de severidad
blocker; - el paso 3 tiene un hallazgo con severidad
blocker; - una comprobación de IVA que necesitabas está
skipped,unknownofail; - una comprobación no dio respuesta: un timeout, un error HTTP, un error JSON-RPC o un error de herramienta no es un pase. No pagues; entrégalo a una persona.
Incluso cuando todo pasa, una respuesta limpia no es una garantía. Coloca el texto doesNotProve del paso 1 y el detail de cada comprobación que no sea pass en tu nota, palabra por palabra. Una nota breve:
Factura 2026-0917 de Nordlys Tryk ApS, DKK 10000.00 a DK27 5301 0244 5638 21.
Cuenta bancaria: verify_first (banco cambiado 0040 -> 5301). NO pagada.
Llama al proveedor al número en nuestros propios registros; haz que te lean la cuenta de vuelta.
No probado: quién es el propietario de la nueva cuenta, que existe o está abierta, o que la solicitud provino del proveedor.
Factura: estructura, totales, formato IBAN y reglas Peppol pasan.
IVA: no verificado (skipped, sin cuenta).
Necesita: llamada de verificación + segundo aprobador antes del pago.