Communitygithub.com

paiement-factures-securise

Utilisez cette compétence pour payer des factures en toute sécurité : exécutez les vérifications en direct de Jithox avant qu'un agent ne paie une facture fournisseur ou ne modifie le compte bancaire d'un fournisseur.

Qu'est-ce que paiement-factures-securise ?

Cette compétence est conçue pour les agents IA (comme Claude Code, Cursor ou tout client MCP) qui traitent des paiements de factures ou des modifications de coordonnées bancaires de fournisseurs. Elle empêche les fraudes courantes sur les factures – en particulier les détournements de paiement – en imposant un flux de vérification multi-étapes avant que l'argent ne soit transféré. La compétence interagit avec l'API Jithox via le protocole MCP (Streamable HTTP, JSON-RPC 2.0) ou directement via HTTP REST. Elle comprend quatre étapes : (1) `check_payment_change` pour comparer un nouvel IBAN avec le compte enregistré et exiger un rappel téléphonique humain comme mesure de sécurité critique ; (2) un contrôle gratuit de la structure de la facture, des totaux, du format IBAN et des règles Peppol BIS Billing 3.0 via `POST /api/invoice/review` ; (3) `review_invoice` (payant, avec token) qui répète les vérifications précédentes et valide les numéros de TVA des fournisseurs et des clients auprès du registre VIES de l'UE ; (4) une décision humaine finale avec une documentation complète des résultats et des éléments non vérifiés. L'agent ne paie jamais et ne signe jamais ; il prépare les vérifications et les transmet à une personne pour approbation. Les vérifications gratuites ne nécessitent ni compte ni token. La compétence insiste sur le fait qu'un IBAN valide ne prouve pas la propriété du compte – seul un rappel téléphonique auprès du fournisseur (en utilisant un numéro connu, pas celui de la demande) le fait.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/victor-emmanuel-c/jithox-mcp/tree/main/skills/pay-invoices-safely

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Payer les factures en toute sécurité

Vous êtes sur le point de payer une facture fournisseur ou de modifier le compte bancaire d'une fiche fournisseur. Avant que de l'argent ne soit transféré, exécutez les vérifications ci-dessous et transmettez leurs résultats à la personne qui approuve le paiement.

Utilisez cette compétence lorsque :

  • un fournisseur (ou quelqu'un se faisant passer pour le fournisseur) envoie de nouvelles coordonnées bancaires ;
  • l'IBAN sur une facture diffère du compte présent dans la fiche fournisseur ;
  • vous préparez une exécution de paiement et souhaitez que chaque facture soit d'abord vérifiée ;
  • on vous demande « cette facture est-elle payable ? ».

Les deux vérifications gratuites ne nécessitent ni compte ni token.

Connexion

Serveur MCP (HTTP streamable, JSON-RPC 2.0) :

{
  "mcpServers": {
    "jithox": { "url": "https://jithox.com/api/mcp" }
  }
}

Le HTTP simple fonctionne également ; chaque exemple ci-dessous est un appel curl. Définissez votre propre user-agent comme indiqué, afin que ces appels puissent être distingués des autres trafics.

Étape 1 – Un compte bancaire nouveau ou modifié : check_payment_change

Appelez-le lorsqu'un fournisseur fournit un nouveau compte, et lorsque l'IBAN sur la facture n'est pas celui du fichier (dans ce cas, l'IBAN de la facture est le nouveau). Laissez ibanOnFile vide pour un premier paiement à un nouveau fournisseur ; la réponse indiquera alors que rien n'a pu être comparé.

curl -s https://jithox.com/api/mcp \
  -A 'pay-invoices-safely/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"}}}'

Le résultat de l'outil (result.content[0].text), exécuté en production le 2026-09-24 et raccourci là où il y a des … :

{
  "kind": "payment_change_check",
  "data": {
    "verdict": "verify_first",
    "summary": "Le nouveau numéro est un compte bien formé et rien ne se démarque. Il s'agit néanmoins d'un changement de destination des fonds : confirmez-le par téléphone avant de mettre à jour la fiche.",
    "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": "Même pays, banque différente (identifiant 0040 → 5301). Normal en soi — les entreprises changent de banque — et bon à mentionner lors de l'appel." }
    ],
    "requiredSteps": [
      "Appelez le fournisseur sur un numéro de téléphone provenant de VOS propres archives ou d'une facture précédente et payée — jamais celui de la demande de modification ou de sa signature électronique.",
      "Demandez-lui de vous lire le nouveau numéro de compte ; ne le lisez pas vous-même.",
      "Faites approuver la modification de la fiche fournisseur par une deuxième personne avant toute exécution de paiement.",
      "Conservez la demande, le nom de la personne à qui vous avez parlé et l'heure de l'appel avec la fiche fournisseur."
    ],
    "doesNotProve": "Qui possède le nouveau compte, qu'il existe ou est ouvert, ou que la demande émane du fournisseur. Aucun registre gratuit ne répond à ces questions. Seul le rappel le fait.",
    …
  }
}

Agissez en fonction du verdict :

verdictCe que vous faites
no_changeLe même compte, écrit différemment. Passez à l'étape 2. Si la demande insistait sur la nouveauté des coordonnées, cette incohérence mérite un appel.
verify_firstNe payez pas et ne modifiez pas la fiche fournisseur. Transmettez les requiredSteps à une personne.
stopDrapeaux rouges. Ne payez pas, bloquez les autres paiements à ce fournisseur, transmettez flags et requiredSteps à une personne.
invalid_new_accountLe numéro ne peut pas être un IBAN. Ne payez pas. Demandez le numéro au fournisseur via un canal que vous connaissez déjà.
Pas de réponse (timeout, erreur HTTP ou erreur d'outil)Ce n'est pas une réussite. Ne payez pas et ne modifiez pas la fiche fournisseur ; transmettez à une personne.

Le rappel est la vérification. Une personne appelle le fournisseur sur un numéro de téléphone qui NE provient PAS de l'e-mail, de la demande de modification ou de la facture. Vous ne pouvez pas passer cet appel pour elle, et un IBAN bien formé n'est pas un IBAN sûr.

Le même appel pour les cas stop, no_change et invalid_new_account se trouve dans references/examples.md.

Étape 2 – La facture elle-même : POST /api/invoice/review (gratuit)

Envoyez la facture sous forme de données structurées. Il vérifie la structure, recalcule les totaux, vérifie l'IBAN et applique les règles Peppol BIS Billing 3.0. Pas de compte, pas de token, rien n'est facturé. Comme review_invoice, il lit des données structurées, pas un PDF ou un scan : convertissez-les d'abord en champs.

curl -s https://jithox.com/api/invoice/review \
  -A 'pay-invoices-safely/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":"Impression, septembre","quantity":1,"unitPrice":8000,"vatPercent":25}],"totalWithoutVat":8000,"totalVat":2000,"totalWithVat":10000,"payment":{"iban":"DK27 5301 0244 5638 21"}}}'

Exécuté en production le 2026-09-24, raccourci :

{
  "review": {
    "checks": [
      { "id": "structure", "status": "pass", … },
      { "id": "arithmetic", "status": "pass", "detail": "Les totaux des lignes et la TVA correspondent aux montants de la facture.", … },
      { "id": "payment_details", "status": "pass", "detail": "DK27 5301 0244 5638 21 est un IBAN danois structurellement valide. Cela ne signifie pas que le compte existe ou à qui il appartient.", … },
      { "id": "supplier_vat", "status": "skipped", "detail": "Le registre VIES n'a pas été interrogé : cette exécution n'avait pas d'espace de travail autorisé pour cela.", … },
      { "id": "customer_vat", "status": "skipped", … },
      { "id": "peppol", "status": "pass", … }
    ],
    "findings": [],
    "readyToSend": true,
    "hasUnknowns": true,
    …
  },
  "verified": false,
  "billing": { "charged": false, "reason": "Déconnecté : seules les vérifications locales gratuites ont été exécutées, rien n'a été facturé.", … }
}

Comment lire :

  • Sans compte, les deux vérifications de TVA sont skipped : le registre VIES n'a pas été interrogé. C'est pourquoi hasUnknowns est true. Dites-le à la personne ; ne rapportez jamais les numéros de TVA comme vérifiés.
  • Chaque entrée dans findings a une severity et un fix. Un blocker signifie que la facture est erronée (par exemple, un total qui ne correspond pas) : ne la payez pas, demandez une facture corrigée au fournisseur. Un exemple se trouve dans references/examples.md.
  • payment_details indique seulement que l'IBAN est bien formé. Savoir s'il s'agit du compte du fournisseur relève de l'étape 1, pas de cette vérification.

Étape 3 – Numéros de TVA depuis le registre européen : review_invoice (payant)

Exécutez cette étape uniquement après l'étape 2. Elle répète les vérifications structurées de la facture et ajoute les vérifications des numéros de TVA du fournisseur et du client auprès du registre VIES de l'UE. Son schéma d'entrée en direct lit le paiement et les totaux déclarés de la facture. Elle nécessite un token :

  1. Une personne (pas l'agent) crée une connexion Jithox sur https://jithox.com/mcp/account#connection.
  2. L'agent échange l'identifiant et le secret de la connexion contre un token sur /api/oauth/token :
curl -s https://jithox.com/api/oauth/token \
  -A 'pay-invoices-safely/1.0' \
  -H 'Accept: application/json' \
  -d grant_type=client_credentials \
  -d "client_id=$JITHOX_CLIENT_ID" \
  -d "client_secret=$JITHOX_CLIENT_SECRET"

Placez le token d'accès de la réponse dans JITHOX_TOKEN. Un token expiré ou refusé donne la même réponse payment_required que l'absence de token. Récupérez un nouveau token et réessayez une fois.

  1. Appelez l'outil avec le token (les champs de la facture vont directement dans arguments) :
curl -s https://jithox.com/api/mcp \
  -A 'pay-invoices-safely/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":"Impression, septembre","quantity":1,"unitPrice":8000,"vatPercent":25}],"totalWithoutVat":8000,"totalVat":2000,"totalWithVat":10000,"payment":{"iban":"DK27 5301 0244 5638 21"}}}}'

Le prix ne figure pas dans ce fichier, car les prix changent : lisez le champ pricing de review_invoice dans https://jithox.com/mcp.json. Sans token, l'outil répond payment_required, n'exécute rien et indique humanUrl et tokenUrl.

Avec un token, exécuté en production le 2026-09-24, raccourci :

{
  "kind": "invoice_review",
  "data": {
    "checks": [
      …
      { "id": "supplier_vat", "status": "unknown", "source": "eu_vies", "detail": "Le registre VIES n'a pas répondu." },
      { "id": "customer_vat", "status": "fail", "source": "eu_vies", "detail": "VIES indique que ce numéro n'est pas enregistré." },
      …
    ],
    "findings": [
      { "code": "supplier_vat_unverified", "severity": "warning", "what": "Nous n'avons pas pu rendre de verdict sur le numéro de TVA DK31500060. Le registre VIES n'a pas répondu.", "fix": "Réexaminez plus tard. Considérez-le comme non vérifié — ce n'est pas une preuve que le numéro est bon ou mauvais." },
      { "code": "customer_vat_not_registered", "severity": "blocker", "what": "VIES ne connaît pas le numéro de TVA DK31500044.", "fix": "Vérifiez le numéro auprès du client — une faute de frappe, une inscription fermée ou un numéro hors UE ressembleraient à cela." }
    ],
    "readyToSend": false,
    "hasUnknowns": true,
    …
  }
}

unknown n'est pas une réussite : le registre n'a pas répondu, donc le numéro n'est pas vérifié. Un fail sur le numéro de TVA du fournisseur est une raison de bloquer le paiement et de demander. Les numéros de TVA dans ces exemples sont fictifs, donc le registre ne les connaît pas.

Étape 4 – Décidez et indiquez ce qui n'a pas été vérifié

Jithox ne paie jamais et ne signe jamais un paiement, et aucun de ces appels ne demande un identifiant bancaire ou une clé de signature. Vous préparez ; une personne approuve le paiement.

Bloquez le paiement et transmettez-le à une personne lorsque l'une des conditions suivantes est vraie :

  • l'étape 1 a donné un verdict autre que no_change ;
  • l'étape 2 n'a pas renvoyé de réponse sans résultat de sévérité blocker ;
  • l'étape 3 a un résultat de sévérité blocker ;
  • une vérification de TVA dont vous aviez besoin est skipped, unknown ou fail.
  • une vérification n'a donné aucune réponse : un timeout, une erreur HTTP, une erreur JSON-RPC ou une erreur d'outil n'est pas une réussite. Ne payez pas ; transmettez à une personne.

Même lorsque tout réussit, une réponse propre n'est pas une garantie. Mettez le texte doesNotProve de l'étape 1 et le detail de chaque vérification qui n'est pas pass dans votre note, mot pour mot. Une note courte :

Facture 2026-0917 de Nordlys Tryk ApS, DKK 10000.00 vers DK27 5301 0244 5638 21.
Compte bancaire : verify_first (banque changée 0040 -> 5301). NON payé.
  Appelez le fournisseur au numéro dans nos propres archives ; demandez-lui de lire le compte.
  Non prouvé : qui possède le nouveau compte, qu'il existe ou est ouvert, ou que la demande émane du fournisseur.
Facture : structure, totaux, format IBAN et règles Peppol réussis.
TVA : non vérifiée (ignorée, pas de compte).
Nécessite : rappel + seconde approbation avant paiement.

Skills associés