MCP Server

Jithox payment preflight: check an invoice payment before your AI agent pays

com.jithox/jithox
Business & Operations Legal & Compliance Public & reachable MCP 2025-11-25

What this MCP does

Performs EU business checks including VAT, IBAN, Peppol, Belgian company lookups, invoice validation, document generation, and structured file transformation.

check_payment_change
Check a supplier's bank-detail change before the vendor record is touched: returns no_change, verify_first, stop or invalid_new_account with call-back steps. It never says an account is safe. Free, no token.
Read only
Input schema
{'type': 'object', 'required': ['newIban'], 'properties': {'newIban': {'type': 'string', 'description': 'The account number in the change request, as written — spaces and dashes are fine, e.g. "DE89 3704 0044 0532 0130 00".'}, 'ibanOnFile': {'type': 'string', 'description': 'The account currently on the vendor record.'}, 'supplierCountry': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'maxLength': 2, 'minLength': 2, 'description': 'ISO 3166-1 alpha-2 country where the supplier is established, e.g. BE.'}}}
Output schema
{'type': 'object', 'required': ['kind', 'data'], 'properties': {'data': {'type': 'object'}, 'kind': {'type': 'string'}, 'evidence': {'type': 'object', 'description': 'Signed decision evidence, present when a signing key is configured.'}}}
check_peppol_ready
Check your own invoice against 21 published Peppol BIS Billing 3.0 rules, and whether the customer's Peppol address is registered; each finding names the rule and the fix. A listed subset, not the official validator. Free, no token.
Read only
Input schema
{'type': 'object', 'properties': {'lines': {'type': 'array', 'items': {'type': 'object', 'properties': {'quantity': {'type': 'number'}, 'unitPrice': {'type': 'number'}, 'vatPercent': {'type': 'number', 'description': 'The VAT rate on this line, as a percentage, e.g. 21.'}, 'description': {'type': 'string'}, 'lineNetAmount': {'type': 'number', 'description': 'The line total excluding VAT, when you already computed it.'}}}, 'maxItems': 1000}, 'currency': {'type': 'string', 'maxLength': 8, 'description': 'Three-letter currency code (BT-5), e.g. EUR.'}, 'customer': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'endpointId': {'type': 'string', 'description': "The party's Peppol address — the identifier the network delivers to, e.g. a Belgian enterprise number."}, 'countryCode': {'type': 'string', 'maxLength': 2, 'description': 'ISO 3166-1 alpha-2 country code, e.g. BE.'}, 'endpointScheme': {'type': 'string', 'maxLength': 10, 'description': 'The four-digit EAS code the address is stated under, e.g. "0208" for a Belgian enterprise number.'}}, 'description': 'The customer, the receiver.'}, 'supplier': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'endpointId': {'type': 'string', 'description': "The party's Peppol address — the identifier the network delivers to, e.g. a Belgian enterprise number."}, 'countryCode': {'type': 'string', 'maxLength': 2, 'description': 'ISO 3166-1 alpha-2 country code, e.g. BE.'}, 'endpointScheme': {'type': 'string', 'maxLength': 10, 'description': 'The four-digit EAS code the address is stated under, e.g. "0208" for a Belgian enterprise number.'}}, 'description': 'You, the sender.'}, 'totalVat': {'type': 'number', 'description': 'Total VAT (BT-110).'}, 'issueDate': {'type': 'string', 'maxLength': 40, 'description': 'The issue date (BT-2).'}, 'totalWithVat': {'type': 'number', 'description': 'Invoice total including VAT (BT-112).'}, 'invoiceNumber': {'type': 'string', 'description': 'The invoice number (BT-1).'}, 'buyerReference': {'type': 'string', 'description': 'The reference the customer asked you to put on the invoice (BT-10). Peppol requires this OR an order reference.'}, 'orderReference': {'type': 'string', 'description': 'The purchase order number (BT-13).'}, 'documentCharges': {'type': 'array', 'items': {'type': 'object', 'properties': {'amount': {'type': 'number', 'description': 'The amount, excluding VAT (BT-92 for an allowance, BT-99 for a charge).'}, 'reason': {'type': 'string', 'description': 'Why, e.g. "Discount" or "Freight".'}, 'vatPercent': {'type': 'number', 'description': 'The VAT rate it is taxed at, e.g. 21 (BT-96 / BT-103).'}}}, 'maxItems': 100, 'description': 'Charges on the WHOLE invoice, e.g. freight (BG-21).'}, 'totalWithoutVat': {'type': 'number', 'description': 'Invoice total excluding VAT (BT-109).'}, 'documentAllowances': {'type': 'array', 'items': {'type': 'object', 'properties': {'amount': {'type': 'number', 'description': 'The amount, excluding VAT (BT-92 for an allowance, BT-99 for a charge).'}, 'reason': {'type': 'string', 'description': 'Why, e.g. "Discount" or "Freight".'}, 'vatPercent': {'type': 'number', 'description': 'The VAT rate it is taxed at, e.g. 21 (BT-96 / BT-103).'}}}, 'maxItems': 100, 'description': 'Discounts on the WHOLE invoice, not on one line (BG-20).'}}}
Output schema
{'type': 'object', 'required': ['kind', 'data'], 'properties': {'data': {'type': 'object'}, 'kind': {'type': 'string'}}}
check_vat_list
Check up to 20 rows of EU VAT numbers in EU VIES, row for row; a malformed or non-EU row is judged locally (`not_covered`, never `invalid`). UNKNOWN COSTS NOTHING, and the balance must cover the whole call (20 credits for 20 rows) before it runs. Optional requesterVatId adds a consultation number registered to you; a requester VIES refuses costs nothing. 1 credit (EUR 0.01) per answered row; needs a bearer token.
Read only
Input schema
{'type': 'object', 'required': ['rows'], 'properties': {'rows': {'type': 'array', 'items': {'type': 'object', 'required': ['vatId'], 'properties': {'vatId': {'type': 'string', 'description': 'The VAT number as written, WITH its two-letter country prefix, e.g. "BE0400378485" or "NL 8558.76.323.B01".'}, 'reference': {'type': 'string', 'description': 'Your own label for the row — a customer number, a name. It is echoed back, never interpreted.'}}}, 'maxItems': 200, 'minItems': 1, 'description': 'The list: 1 to 20 rows per call.'}, 'requesterVatId': {'type': 'string', 'maxLength': 20, 'description': 'Your OWN EU VAT number with country prefix (e.g. BE0403170701). Never stored.'}}}
Output schema
{'type': 'object', 'required': ['kind', 'data', 'billing'], 'properties': {'data': {'type': 'object'}, 'kind': {'type': 'string'}, 'billing': {'type': 'object'}}}
kbo_company_search
Look up an EU company by VAT or enterprise number in the EU VIES register, Belgian KBO/BCE included: name, VAT id, address, status. 2 credits (EUR 0.02) per successful call; needs a bearer token.
Read only
Input schema
{'type': 'object', 'required': ['vatNumber'], 'properties': {'vatNumber': {'type': 'string', 'maxLength': 40, 'description': 'EU VAT number, with or without its country prefix — e.g. "BE0123456789", "NL855876323B01", "DE811569869" or the bare Belgian enterprise number "0123456789".'}, 'countryCode': {'type': 'string', 'default': 'BE', 'description': 'ISO 3166-1 alpha-2 country code of the issuing EU member state (uppercase), e.g. BE, NL, DE, FR.'}}}
Output schema
{'type': 'object', 'required': ['kind', 'data', 'billing'], 'properties': {'data': {'type': 'object'}, 'kind': {'type': 'string'}, 'billing': {'type': 'object'}}}
lookup_peppol_participant
Ask the live Peppol registers whether a third party can receive e-invoices, which document types, and who to call when a send fails. Never a promise that an invoice arrives. Free, no token.
Read only
Input schema
{'type': 'object', 'required': ['identifier'], 'properties': {'scheme': {'type': 'string', 'maxLength': 10, 'description': 'The four-digit Peppol scheme the number is registered under, when you know it: "0208" for a Belgian enterprise number (the mandatory primary scheme for Belgian businesses), "9925" for a Belgian VAT number, "0192" for a Norwegian organisation number.'}, 'identifier': {'type': 'string', 'description': 'The customer\'s enterprise or VAT number, as written on the invoice — "BE 0403.170.701", "0403170701" and "BE0403170701" are all accepted.'}}}
Output schema
{'type': 'object', 'required': ['kind', 'data'], 'properties': {'data': {'type': 'object'}, 'kind': {'type': 'string'}}}
preflight_payment
Call once before you move money for a person: compares what they approved (payee, amount, currency) with what is about to be paid and runs the rail's checks (invoice: IBAN, account change). Returns stop, review_required or no_blockers_found with every check and signed evidence. Never pays; a check that did not run is never a pass. Free, no token.
Read only
Input schema
{'type': 'object', 'required': ['rail', 'approved', 'payment'], 'properties': {'rail': {'enum': ['invoice_bank', 'x402', 'card_or_giftcard', 'crypto_bridge'], 'type': 'string', 'description': 'Required: approved.amount and payment.amount/currency (not x402); invoice_bank also approved.payee.name, payment.iban/payeeName; card_or_giftcard approved.payee.merchant, payment.merchant/instrument; crypto_bridge approved.payee.merchant, payment.provider/merchant; x402 approved.amountAtomic/asset/network/payee.payTo, payment.challenge/resourceUrl.'}, 'checks': {'type': 'array', 'items': {'enum': ['vat_register', 'sanctions'], 'type': 'string'}, 'maxItems': 2, 'description': 'Opt-in registers, run only on a connected door.'}, 'invoice': {'type': 'object', 'description': 'The invoice as review_invoice takes it.'}, 'mandate': {'type': 'object', 'properties': {'currency': {'type': 'string', 'pattern': '^[A-Za-z]{3,5}$'}, 'maxAmount': {'type': 'string', 'pattern': '^\\d{1,18}(\\.\\d{1,18})?$'}, 'validUntil': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})$'}, 'maxAmountAtomic': {'type': 'string', 'pattern': '^\\d{1,78}$'}}, 'additionalProperties': False}, 'payment': {'type': 'object', 'properties': {'iban': {'type': 'string'}, 'payTo': {'type': 'string'}, 'payer': {'type': 'string'}, 'amount': {'type': 'string', 'pattern': '^\\d{1,18}(\\.\\d{1,18})?$'}, 'currency': {'type': 'string', 'pattern': '^[A-Za-z]{3,5}$'}, 'merchant': {'type': 'string'}, 'peppolId': {'type': 'string', 'description': 'e.g. 0208:0403170701'}, 'provider': {'type': 'string'}, 'challenge': {'type': 'object'}, 'payeeName': {'type': 'string'}, 'instrument': {'enum': ['card', 'giftcard'], 'type': 'string'}, 'acceptIndex': {'type': 'integer', 'maximum': 63, 'minimum': 0}, 'resourceUrl': {'type': 'string'}, 'supplierVatId': {'type': 'string', 'maxLength': 32}, 'supplierCountry': {'type': 'string', 'description': 'ISO 3166-1 alpha-2, e.g. BE.'}}, 'additionalProperties': False}, 'approved': {'type': 'object', 'required': ['currency', 'payee'], 'properties': {'asset': {'type': 'string'}, 'payee': {'type': 'object', 'properties': {'iban': {'type': 'string'}, 'name': {'type': 'string'}, 'payTo': {'type': 'string'}, 'merchant': {'type': 'string'}}, 'additionalProperties': False}, 'amount': {'type': 'string', 'pattern': '^\\d{1,18}(\\.\\d{1,18})?$'}, 'network': {'type': 'string'}, 'purpose': {'type': 'string'}, 'currency': {'type': 'string', 'pattern': '^[A-Za-z]{3,5}$'}, 'amountAtomic': {'type': 'string', 'pattern': '^\\d{1,78}$'}}, 'additionalProperties': False}, 'ibanOnFile': {'type': 'string', 'description': 'The account on the vendor record.'}, 'instructionSource': {'enum': ['human', 'ingested_content', 'third_party'], 'type': 'string'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'required': ['kind', 'data'], 'properties': {'data': {'type': 'object'}, 'kind': {'type': 'string'}, 'evidence': {'type': 'object', 'description': 'Signed decision evidence, present when a signing key is configured.'}}}
review_invoice
Check one structured invoice before it is sent: Peppol fields, totals and both VAT numbers in EU VIES, with a fix per finding and the UBL XML. It never sends, and a VAT check VIES did not answer is `unknown`, never a pass. It does not look the receiver up: check_peppol_ready does. 8 credits (EUR 0.08) per review the VAT register answered; needs a bearer token.
Read only
Input schema
{'type': 'object', 'required': ['invoiceNumber', 'issueDate', 'supplier', 'customer', 'lines'], 'properties': {'note': {'type': 'string'}, 'lines': {'type': 'array', 'items': {'type': 'object', 'required': ['description', 'quantity', 'unitPrice'], 'properties': {'quantity': {'type': 'number', 'exclusiveMinimum': 0}, 'unitCode': {'type': 'string', 'maxLength': 10, 'description': 'UN/ECE Rec 20 unit code, e.g. "HUR".'}, 'lineTotal': {'type': 'number', 'description': 'Caller-stated line total excluding VAT, compared with quantity × unit price by this review.'}, 'unitPrice': {'type': 'number', 'minimum': 0, 'description': 'Price per unit, excluding VAT.'}, 'vatPercent': {'type': 'number', 'maximum': 100, 'minimum': 0, 'description': 'VAT rate as a percentage (0–100).'}, 'description': {'type': 'string'}, 'taxCategory': {'enum': ['S', 'Z', 'E', 'AE', 'K', 'G', 'O', 'L', 'M'], 'type': 'string', 'description': 'Override the derived UNCL5305 VAT category.'}, 'lineNetAmount': {'type': 'number', 'description': 'Caller-stated line total excluding VAT (BT-131), used by the shared Peppol arithmetic rules.'}}}, 'maxItems': 500, 'minItems': 1}, 'dueDate': {'type': 'string', 'format': 'date'}, 'payment': {'type': 'object', 'properties': {'iban': {'type': 'string', 'description': 'IBAN written on the invoice.'}}, 'description': 'Payment instruction carried by the invoice, when it names an IBAN.'}, 'currency': {'type': 'string', 'description': 'ISO 4217 currency code (uppercase).'}, 'customer': {'type': 'object', 'required': ['name', 'countryCode'], 'properties': {'city': {'type': 'string'}, 'name': {'type': 'string'}, 'email': {'type': 'string'}, 'vatId': {'type': 'string', 'description': 'Legal / VAT registration id, e.g. "BE0123456789".'}, 'street': {'type': 'string'}, 'endpointId': {'type': 'string', 'description': 'Peppol participant endpoint identifier, e.g. a GLN.'}, 'postalZone': {'type': 'string', 'maxLength': 20}, 'countryCode': {'type': 'string', 'description': 'ISO 3166-1 alpha-2 country code (uppercase), e.g. BE.'}, 'endpointScheme': {'type': 'string', 'maxLength': 10, 'description': 'Endpoint scheme id (EAS code), e.g. "0208" for a Belgian enterprise number or "0088" for a GLN.'}, 'registrationName': {'type': 'string'}}, 'description': 'Buyer / accounting customer party, including an optional draft e-mail recipient.'}, 'supplier': {'type': 'object', 'required': ['name', 'countryCode'], 'properties': {'city': {'type': 'string'}, 'iban': {'type': 'string', 'description': 'IBAN written on the invoice.'}, 'name': {'type': 'string'}, 'vatId': {'type': 'string', 'description': 'Legal / VAT registration id, e.g. "BE0123456789".'}, 'street': {'type': 'string'}, 'endpointId': {'type': 'string', 'description': 'Peppol participant endpoint identifier, e.g. a GLN.'}, 'postalZone': {'type': 'string', 'maxLength': 20}, 'countryCode': {'type': 'string', 'description': 'ISO 3166-1 alpha-2 country code (uppercase), e.g. BE.'}, 'endpointScheme': {'type': 'string', 'maxLength': 10, 'description': 'Endpoint scheme id (EAS code), e.g. "0208" for a Belgian enterprise number or "0088" for a GLN.'}, 'registrationName': {'type': 'string'}}, 'description': 'Seller / accounting supplier party, including an optional IBAN for the payment check.'}, 'totalVat': {'type': 'number', 'description': 'Caller-stated total VAT (BT-110), used by the arithmetic rule checks.'}, 'issueDate': {'type': 'string', 'format': 'date'}, 'totalWithVat': {'type': 'number', 'description': 'Caller-stated invoice total including VAT (BT-112), used by the arithmetic rule checks.'}, 'invoiceNumber': {'type': 'string', 'description': 'Human-readable invoice number, e.g. "INV-2026-0001".'}, 'buyerReference': {'type': 'string', 'description': 'Buyer reference (BT-10), e.g. a PO or cost-centre code.'}, 'orderReference': {'type': 'string', 'description': 'Purchase order reference (BT-13). Peppol requires this OR a buyer reference.'}, 'totalWithoutVat': {'type': 'number', 'description': 'Caller-stated invoice total excluding VAT (BT-109), used by the arithmetic rule checks.'}}}
Output schema
{'type': 'object', 'required': ['kind', 'data', 'billing'], 'properties': {'data': {'type': 'object'}, 'kind': {'type': 'string'}, 'billing': {'type': 'object'}}}
verify_iban
Check an IBAN's structure and check digits for 70+ countries, offline. It never claims the account exists or who owns it. Free, no token.
Read only
Input schema
{'type': 'object', 'required': ['iban'], 'properties': {'iban': {'type': 'string', 'description': 'The account number to check, as written — spaces and dashes are fine, e.g. "BE68 5390 0754 7034".'}, 'expectedCountry': {'type': 'string', 'maxLength': 2, 'minLength': 2, 'description': 'Optional ISO 3166-1 alpha-2 country of the party being paid.'}}}
Output schema
{'type': 'object', 'required': ['kind', 'data'], 'properties': {'data': {'type': 'object'}, 'kind': {'type': 'string'}}}
Removed
transcribe_and_slice_audio
Sept. 28, 2026, 2:40 a.m.
Removed
parse_receipt_vision
Sept. 28, 2026, 2:40 a.m.
Removed
monitor_sources
Sept. 28, 2026, 2:40 a.m.
Removed
generate_pdf_invoice
Sept. 28, 2026, 2:40 a.m.
Removed
format_peppol_invoice
Sept. 28, 2026, 2:40 a.m.
Removed
file_to_data_transform
Sept. 28, 2026, 2:40 a.m.
Removed
file_to_data_inspect
Sept. 28, 2026, 2:40 a.m.
Removed
fetch_web_markdown
Sept. 28, 2026, 2:40 a.m.
Removed
draft_social_content
Sept. 28, 2026, 2:40 a.m.
Removed
core_condition
Sept. 28, 2026, 2:40 a.m.
Removed
check_vat_list_format
Sept. 28, 2026, 2:40 a.m.
Removed
analyze_kbo_financials
Sept. 28, 2026, 2:40 a.m.
Added
preflight_payment
Sept. 28, 2026, 2:40 a.m.
Changed
check_peppol_ready
Sept. 28, 2026, 2:40 a.m.
Changed
review_invoice
Sept. 28, 2026, 2:40 a.m.
Changed
monitor_sources
Sept. 26, 2026, 2:40 a.m.
Changed
draft_social_content
Sept. 26, 2026, 2:40 a.m.
Changed
parse_receipt_vision
Sept. 26, 2026, 2:40 a.m.
Changed
analyze_kbo_financials
Sept. 26, 2026, 2:40 a.m.
Changed
transcribe_and_slice_audio
Sept. 26, 2026, 2:40 a.m.
Changed
fetch_web_markdown
Sept. 26, 2026, 2:40 a.m.
Changed
check_vat_list_format
Sept. 26, 2026, 2:40 a.m.
Changed
check_vat_list
Sept. 26, 2026, 2:40 a.m.
Changed
file_to_data_transform
Sept. 26, 2026, 2:40 a.m.
Changed
file_to_data_inspect
Sept. 26, 2026, 2:40 a.m.
Changed
check_payment_change
Sept. 26, 2026, 2:40 a.m.
Changed
lookup_peppol_participant
Sept. 26, 2026, 2:40 a.m.
Changed
check_peppol_ready
Sept. 26, 2026, 2:40 a.m.
Changed
verify_iban
Sept. 26, 2026, 2:40 a.m.
Changed
core_condition
Sept. 26, 2026, 2:40 a.m.