Validate UAE PINT AE and Saudi ZATCA e-invoices: UBL, official Schematron, QR, fix hints.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
API key from [email protected] (catalogue and free tools work without it)
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Format check of a UAE Tax Registration Number (15 digits) and derivation of the TIN / Peppol participant identifier (scheme 0235 = first 10 digits). Free. Example: trn '100 1234 5670 0003'. Response: result with verdict (ACCEPTED | ACCEPTED_WITH_WARNINGS | REJECTED), findings[] (id, severity, message, fields, location, fix_hint, source = xsd | schematron | preflight), counts, ruleset version and timings, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Documents are validated in memory and never stored or logged.
UAE Tax Registration Number as printed (spaces/dashes allowed).
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http einvoice-preflight https://einvoice.noahsarch.tech/mcp
Headers
X-API-Key (optional, not in the config above): API key from [email protected] (catalogue and free tools work without it)Format check of a UAE Tax Registration Number (15 digits) and derivation of the TIN / Peppol participant identifier (scheme 0235 = first 10 digits). Free. Example: trn '100 1234 5670 0003'. Response: result with verdict (ACCEPTED | ACCEPTED_WITH_WARNINGS | REJECTED), findings[] (id, severity, message, fields, location, fix_hint, source = xsd | schematron | preflight), counts, ruleset version and timings, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Documents are validated in memory and never stored or logged.
| Argument | Type | Description |
|---|---|---|
| trn* | string | UAE Tax Registration Number as printed (spaces/dashes allowed). |
{
"type": "object",
"title": "check_trnArguments",
"required": [
"trn"
],
"properties": {
"trn": {
"type": "string",
"title": "Trn",
"description": "UAE Tax Registration Number as printed (spaces/dashes allowed)."
}
}
}Seller/buyer (names, TRN, endpoint, legal registration, emirate), dates, currency, totals, VAT breakdown, line count, payment means, attachments and the detected rule set — without validating. Free. Response: result with verdict (ACCEPTED | ACCEPTED_WITH_WARNINGS | REJECTED), findings[] (id, severity, message, fields, location, fix_hint, source = xsd | schematron | preflight), counts, ruleset version and timings, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Documents are validated in memory and never stored or logged.
| Argument | Type | Description |
|---|---|---|
| xml* | string |
{
"type": "object",
"title": "extract_summaryArguments",
"required": [
"xml"
],
"properties": {
"xml": {
"type": "string",
"title": "Xml",
"description": ""
}
}
}Rule ids, severities and texts from the installed PINT AE Schematron (shared PINT rules and the -ae jurisdiction rules), filterable by severity or text, with fix hints where we have them. Free. Example: contains 'TaxPointDate'. Response: result with verdict (ACCEPTED | ACCEPTED_WITH_WARNINGS | REJECTED), findings[] (id, severity, message, fields, location, fix_hint, source = xsd | schematron | preflight), counts, ruleset version and timings, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Documents are validated in memory and never stored or logged.
| Argument | Type | Description |
|---|---|---|
| contains | any | Filter by text, e.g. 'TaxPointDate', 'ibr-co', 'BTAE-16'. |
| severity | any | |
| jurisdiction | string |
{
"type": "object",
"title": "list_rulesArguments",
"properties": {
"contains": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Contains",
"default": null,
"description": "Filter by text, e.g. 'TaxPointDate', 'ibr-co', 'BTAE-16'."
},
"severity": {
"anyOf": [
{
"enum": [
"fatal",
"warning"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Severity",
"default": null,
"description": ""
},
"jurisdiction": {
"enum": [
"ae",
"ae-sb"
],
"type": "string",
"title": "Jurisdiction",
"default": "ae",
"description": ""
}
}
}Batch preflight for a go-live check or an ERP regression suite: per-document verdicts, readiness percentage, the most frequent rejection rules across the batch, optional printable HTML. Charged per document. Response: result with verdict (ACCEPTED | ACCEPTED_WITH_WARNINGS | REJECTED), findings[] (id, severity, message, fields, location, fix_hint, source = xsd | schematron | preflight), counts, ruleset version and timings, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Documents are validated in memory and never stored or logged.
| Argument | Type | Description |
|---|---|---|
| format | string | 'html' adds a self-contained printable report in result.html. |
| documents* | array | Up to 100 documents. |
| preflight | boolean | |
| jurisdiction | string |
{
"type": "object",
"$defs": {
"DocumentIn": {
"type": "object",
"title": "DocumentIn",
"required": [
"xml"
],
"properties": {
"xml": {
"type": "string",
"title": "Xml",
"maxLength": 3000000,
"minLength": 20
},
"name": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"title": "Name",
"default": null,
"description": "Label for the row (file name, invoice number)."
}
},
"additionalProperties": false
}
},
"title": "readiness_reportArguments",
"required": [
"documents"
],
"properties": {
"format": {
"enum": [
"json",
"html"
],
"type": "string",
"title": "Format",
"default": "json",
"description": "'html' adds a self-contained printable report in result.html."
},
"documents": {
"type": "array",
"items": {
"$ref": "#/$defs/DocumentIn"
},
"title": "Documents",
"description": "Up to 100 documents."
},
"preflight": {
"type": "boolean",
"title": "Preflight",
"default": true,
"description": ""
},
"jurisdiction": {
"enum": [
"auto",
"ae",
"ae-sb",
"sa"
],
"type": "string",
"title": "Jurisdiction",
"default": "auto",
"description": ""
}
}
}Full preflight of one UBL Invoice or CreditNote: XML well-formedness, UBL 2.1 XSD, the official PINT AE Schematron (≈300 rules incl. the UAE jurisdiction overlay) or the ZATCA pre-check, plus advisory cross-checks. Returns a verdict and every finding with rule id, severity, fields, location and fix hint. Example: xml '<Invoice …>', jurisdiction 'auto'. Response: result with verdict (ACCEPTED | ACCEPTED_WITH_WARNINGS | REJECTED), findings[] (id, severity, message, fields, location, fix_hint, source = xsd | schematron | preflight), counts, ruleset version and timings, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Documents are validated in memory and never stored or logged.
| Argument | Type | Description |
|---|---|---|
| xml* | string | The UBL 2.1 Invoice or CreditNote XML as a string. |
| preflight | boolean | Also run the advisory Noah's Arch checks (nae-*/nksa-*: TRN/TIN consistency, emirate codes, VAT rates, totals cross-check, dates). |
| include_info | boolean | Include info-level notes (e.g. test-data TRNs). |
| jurisdiction | string | 'ae' PINT AE Billing, 'ae-sb' PINT AE Self-Billing, 'sa' ZATCA (KSA), or 'auto' (from CustomizationID / ProfileID). |
{
"type": "object",
"title": "validate_invoiceArguments",
"required": [
"xml"
],
"properties": {
"xml": {
"type": "string",
"title": "Xml",
"description": "The UBL 2.1 Invoice or CreditNote XML as a string."
},
"preflight": {
"type": "boolean",
"title": "Preflight",
"default": true,
"description": "Also run the advisory Noah's Arch checks (nae-*/nksa-*: TRN/TIN consistency, emirate codes, VAT rates, totals cross-check, dates)."
},
"include_info": {
"type": "boolean",
"title": "Include Info",
"default": false,
"description": "Include info-level notes (e.g. test-data TRNs)."
},
"jurisdiction": {
"enum": [
"auto",
"ae",
"ae-sb",
"sa"
],
"type": "string",
"title": "Jurisdiction",
"default": "auto",
"description": "'ae' PINT AE Billing, 'ae-sb' PINT AE Self-Billing, 'sa' ZATCA (KSA), or 'auto' (from CustomizationID / ProfileID)."
}
}
}Decode the base64 TLV of a Saudi e-invoice QR into seller name, VAT number, timestamp, totals, hash, signature and key tags, with phase detection and format issues. Free. Response: result with verdict (ACCEPTED | ACCEPTED_WITH_WARNINGS | REJECTED), findings[] (id, severity, message, fields, location, fix_hint, source = xsd | schematron | preflight), counts, ruleset version and timings, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Documents are validated in memory and never stored or logged.
| Argument | Type | Description |
|---|---|---|
| qr* | string | Base64 TLV content of a ZATCA QR code. |
{
"type": "object",
"title": "zatca_qr_decodeArguments",
"required": [
"qr"
],
"properties": {
"qr": {
"type": "string",
"title": "Qr",
"description": "Base64 TLV content of a ZATCA QR code."
}
}
}Encode the five phase-1 fields (plus optional phase-2 hash/signature/key tags) into the base64 TLV string that goes into the QR image and the UBL QR reference. Free. Response: result with verdict (ACCEPTED | ACCEPTED_WITH_WARNINGS | REJECTED), findings[] (id, severity, message, fields, location, fix_hint, source = xsd | schematron | preflight), counts, ruleset version and timings, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Documents are validated in memory and never stored or logged.
| Argument | Type | Description |
|---|---|---|
| timestamp* | string | ISO 8601, e.g. 2026-10-31T14:05:00Z |
| vat_total* | string | e.g. '150.00' |
| public_key | any | Base64 (phase 2). |
| vat_number* | string | KSA VAT number: 15 digits, starts and ends with 3. |
| seller_name* | string | |
| invoice_hash | any | Base64 SHA-256 of the invoice (phase 2). |
| total_with_vat* | string | e.g. '1150.00' |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Oct 31, 2026.
| ecdsa_signature | any | Base64 (phase 2). |
| certificate_signature | any | Base64 (phase 2, simplified invoices). |
{
"type": "object",
"title": "zatca_qr_encodeArguments",
"required": [
"seller_name",
"vat_number",
"timestamp",
"total_with_vat",
"vat_total"
],
"properties": {
"timestamp": {
"type": "string",
"title": "Timestamp",
"description": "ISO 8601, e.g. 2026-10-31T14:05:00Z"
},
"vat_total": {
"type": "string",
"title": "Vat Total",
"description": "e.g. '150.00'"
},
"public_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Public Key",
"default": null,
"description": "Base64 (phase 2)."
},
"vat_number": {
"type": "string",
"title": "Vat Number",
"description": "KSA VAT number: 15 digits, starts and ends with 3."
},
"seller_name": {
"type": "string",
"title": "Seller Name",
"description": ""
},
"invoice_hash": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Invoice Hash",
"default": null,
"description": "Base64 SHA-256 of the invoice (phase 2)."
},
"total_with_vat": {
"type": "string",
"title": "Total With Vat",
"description": "e.g. '1150.00'"
},
"ecdsa_signature": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Ecdsa Signature",
"default": null,
"description": "Base64 (phase 2)."
},
"certificate_signature": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Certificate Signature",
"default": null,
"description": "Base64 (phase 2, simplified invoices)."
}
}
}