io.github.BerkantACUN/efatura-kontrol
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@io.github.BerkantACUN/efatura-kontrolfatura.xml dosyasını GİB kurallarıyla doğrula"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
efatura-kontrol
GİB'e göndermeden önce e-Fatura, e-Arşiv Fatura, e-İrsaliye ve zarf dosyalarını GİB'in kendi kurallarıyla kontrol eder: OASIS UBL 2.1 XSD'si, GİB'in e-Fatura Paketi şematronu (498 kural, 41 kod listesi), satır/vergi/tevkifat/dip toplam aritmetiği ve imza yapısı. Her bulgu satır numarası, GİB'in özgün mesajı, Türkçe açıklama ve düzeltme önerisiyle gelir. Komut satırı, Python kütüphanesi ve MCP sunucusu; hiçbir veri ağa gitmez.
Validates Turkish UBL-TR e-invoices (e-Fatura, e-Arşiv, e-İrsaliye, envelopes) offline with the Revenue Administration's own XSD and schematron rules, plus arithmetic and signature-structure checks; explains every finding in Turkish with a fix. CLI, Python API and MCP server.
mcp-name: io.github.BerkantACUN/efatura-kontrol
$ efatura-kontrol dogrula fatura.xml
fatura.xml: GEÇERSİZ — 1 hata, 1 uyarı, 1 bilgi (fatura / TEMELFATURA / SATIS, 6.2 ms)
HATA sch-GeneralUnitCodeCheck-1 [satır 138]: Geçersiz unitCode niteliği : 'ADET'. Geçerli değerler için kod listesine bakınız.
→ Adet için C62, kilogram KGM, gram GRM, metre MTR, litre LTR, saat HUR, gün DAY, ay MON, kutu BX, paket PA, çift PR yazın.
UYARI hesap-dip-odenecek [satır 134]: Ödenecek tutar vergiler dahil tutar − tevkifat + yuvarlama ile uyuşmuyor: yazılan 18.88, hesaplanan 17.88
→ Tevkifatlı faturada tevkifatı düşün; yuvarlama varsa PayableRoundingAmount yazın.
BILGI imza-yok [satır 3]: Belge elektronik imza taşımıyor; GİB'e gönderilecek belgede XAdES imzası bulunmalıdır, taslak için normaldirNeden
GİB'in şematronu XPath 2.0 ile yazılmış, üç dosyaya bölünmüş, 133 soyut kural ve parça-içerme kullanır; sıradan araçlarla (lxml, çoğu Python şematron kütüphanesi) çalışmaz. Bu yüzden entegratörler hatayı ancak GİB'e ya da özel entegratöre gönderince öğrenir. efatura-kontrol GİB'in şematronunu düzleştirip XSLT 3.0'a bir kez derler (SchXslt2), Saxon ile çalıştırır: belge başına 2–20 ms, GİB'in verdiği mesajın aynısı, üstüne satır numarası ve düzeltme.
Related MCP server: eleata e-invoice MCP server
Kurulum
uvx efatura-kontrol --help # kurulumsuz
pip install efatura-kontrol # ya da kalıcıPython ≥ 3.10; bağımlılıklar lxml ve SaxonC-HE (saxonche, ~40 MB wheel; Windows, macOS, Linux). İlk çalıştırma şematronu derlerken ~0,5 s alır, sonrası milisaniyeler.
Komutlar
Komut | Ne yapar |
| Tam denetim; hata varsa çıkış kodu 1 |
| Senaryo, tip, numara, taraflar (VKN/TCKN), satırlar, vergiler, dip toplamlar, imzalı mı |
| GİB kod listeleri (şematronun fiilen uyguladığı değerler) |
| Bulgu kodunun açıklaması ve düzeltmesi |
| Klasördeki tüm XML'leri paralel denetle; 200 belge (22 MB) ≈ 2 s |
| MCP sunucusu (stdio) |
Belge türü kök elemandan ve cbc:ProfileID'den bulunur; EARSIVFATURA görünce e-Arşiv kuralları (type=earchive) uygulanır. --tur ile zorlanabilir.
MCP sunucusu
Claude Desktop / Claude Code / Cursor için:
{
"mcpServers": {
"efatura-kontrol": { "command": "uvx", "args": ["efatura-kontrol", "mcp"] }
}
}Araçlar (hepsi salt okunur): belge_dogrula(dosya|xml, tur), belge_ozeti(dosya|xml), bulgu_acikla(kod), kod_listesi(liste, ara), kod_listeleri(). Resmî MCP kayıt defterinde io.github.BerkantACUN/efatura-kontrol.
Python
from efatura_kontrol.kontrol import kontrol_et, ozet
rapor = kontrol_et("fatura.xml") # ya da bytes, tur="earsiv"
rapor.gecerli, rapor.sayim("hata"), rapor.sozluk()
for b in rapor.bulgular:
print(b.seviye, b.kod, b.satir, b.mesaj, b.duzeltme)Ne kontrol edilir
Katman | Kaynak | Seviye |
XML iyi biçimlilik, boyut (≤ 50 MB), kök eleman | lxml | hata |
XSD | OASIS UBL 2.1 runtime şemaları (UBL-TR 1.2.1 paketi) + GİB zarf/HRXML şemaları | hata |
Şematron | GİB e-Fatura Paketi (29), | hata |
Aritmetik | satır tutarı = miktar × fiyat − indirim + artırım; vergi = matrah × oran; vergi toplamı; tevkifat = KDV × oran; dip toplamlar (mal/hizmet, indirim, artırım, vergi hariç, vergiler dahil, ödenecek); currencyID tutarlılığı | uyarı |
İmza | ds:Signature var mı, SignedInfo/SignatureValue/X509Certificate/SigningTime/SigningCertificate, Reference URI'leri çözülüyor mu | hata/bilgi |
"Uyarı" GİB'in reddetmeyebileceği ama alıcının reddedeceği şeydir; "bilgi" imza durumu gibi notlardır. HKS (hal) faturalarında dip toplam kuralları farklı olduğundan aritmetik dip kontrolü atlanır.
Bulgu biçimi
{"kod": "sch-GeneralUnitCodeCheck-1", "seviye": "hata", "kaynak": "sematron",
"mesaj": "Geçersiz unitCode niteliği : 'ADET'. …", "gib_mesaj": "…",
"kural": "not(//cbc:UBLVersionID = '2.1') or contains($UnitCodeList, …)",
"konum": "/Q{…}Invoice[1]/Q{…}InvoiceLine[1]/Q{…}InvoicedQuantity[1]/@unitCode",
"satir": 138, "aciklama": "…", "duzeltme": "Adet için C62, …"}Şematron bulgu kodları GİB'in soyut kural adından türetilir (sch-<KuralAdı>-<sıra>); GİB kural sırasını değiştirirse kod kayar, mesaj aynı kalır.
GİB'in kendi örneklerinde sonuç
UBL-TR 1.2.1 paketindeki örnekler (hiçbir şey değiştirmeden):
Örnek | Sonuç |
IDIS_Fatura, SARJ, SARJANLIK, OTV, OZELMATRAH, YTB_* (12 dosya), HKS-Ornek1 (şematron) | geçerli |
TemelFaturaOrnegi | fatura numarası biçimi ( |
TEVKIFAT, ISTISNA-2, HASTANE |
|
ISTISNA-1/2 | TRY dışı para biriminde kur yok |
IadeFaturasiOrnegi | TICARIFATURA'da IADE olmaz; iade referansı eksik |
IHRACAT | imza yapısı eksik (örnek imzasız kesilmiş) |
HKS-Ornek1/2 | XSD: boş |
e-FaturaPaketi/xml/* | UBL 2.0 / TR1.0 eski örnekler, şematron reddediyor |
Yani araç GİB'in kendi paketindeki eskimiş örnekleri bile yakalıyor; ornekler/ altında düzeltilmiş, tam geçerli dört belge var.
Güncel kalma
araclar/paket_indir.py GİB paketlerini indirir (sha256 ile), efatura-kontrol derle kaynak şematronu düzleştirip derler, kod listelerini ve XSD'leri ekler/ altına yazar. CI her çalıştığında güncel GİB paketiyle üretilen çıktının repodakiyle aynı olduğunu doğrular; GİB paketi değiştiğinde iş kırmızıya döner ve yeni sürüm çıkar. Kullanılan paket sürümleri efatura_kontrol.PAKET içinde ve her raporun paket alanında.
Sınırlar
İmza kriptografik olarak doğrulanmaz (sertifika, özet, zaman damgası); yalnız yapısı denetlenir.
GİB'in canlı kontrolleri (mükellef kayıtlı mı, etiket geçerli mi, faaliyet kodu–KDV oranı eşleşmesi, mükerrer numara) bu araçta yoktur; bunlar ancak GİB sisteminde bilinir.
e-Arşiv raporu (
eArsivRaporu) ve e-Defter kapsam dışıdır (sonraki sürüm)."Geçerli" = GİB'in yayımladığı XSD ve şematronu geçer; GİB'in sistem tarafındaki ek kontrolleri için garanti değildir.
Kaynaklar
Paketler, sürümler, şematrona yapılan düzleştirme müdahaleleri ve GİB paketinde bulunan tutarsızlıklar: KAYNAKLAR.md. Değişiklikler: CHANGELOG.md.
MIT lisansı. GİB ile bir bağı yoktur; "GİB", "e-Fatura", "UBL-TR" ilgili kurumların adlarıdır.
Available Tools
5 toolsbelge_dogrulaARead-only
UBL-TR belgesini denetler: XML biçimi, OASIS UBL 2.1 XSD, GİB e-Fatura şematronu (498 kural,
kod listeleri dahil), satır/vergi/tevkifat/dip toplam aritmetiği, imza yapısı. Her bulgu: kod,
seviye (hata/uyari/bilgi), GİB'in özgün mesajı, satır numarası, Türkçe açıklama ve düzeltme.
dosya yerel yol ya da xml belge metni; tur fatura|earsiv|irsaliye|irsaliye-yaniti|
uygulama-yaniti|zarf (verilmezse kök elemandan ve ProfileID'den bulunur). Validates a Turkish
UBL-TR e-invoice with the tax authority's own schematron and returns findings.
| Name | Required | Description | Default |
|---|---|---|---|
| tur | No | ||
| xml | No | ||
| dosya | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses extensive behavioral details: validation checks (XML format, OASIS UBL 2.1 XSD, GİB e-Fatura schematron with 498 rules, arithmetic, signature), and the structure of findings (code, level, original message, line number, Turkish explanation and correction). This goes well beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the main purpose, followed by useful details. It is slightly redundant because the English sentence at the end restates the Turkish opening, but the overall structure is efficient and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three parameters and no schema descriptions, the description covers input selection, type auto-detection, the full validation scope, and output finding structure. An output schema exists, so return handling is already defined; the description still adds useful context, making it complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates fully by explaining the meaning of `dosya` (local path), `xml` (document text), and `tur` (enumerated values and auto-detection from root/ProfileID if omitted). It adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'denetler' (audits) a UBL-TR document and later explicitly says 'Validates a Turkish UBL-TR e-invoice with the tax authority's own schematron and returns findings.' This is a specific verb-resource pair that distinguishes it from siblings like belge_ozeti (summary) or bulgu_acikla (finding explanation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the usage context clear: it is for validation of UBL-TR documents. It explains how to provide input (dosya or xml) and how tur is determined. However, it does not explicitly mention alternatives or when not to use it, so it lacks exclusions but is still clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
belge_ozetiCRead-only
Belgenin kimliği: senaryo, fatura tipi, numara, UUID, tarih, para birimi, satıcı/alıcı (VKN/TCKN, unvan), satırlar (ilk 50), vergiler, dip toplamlar, imzalı mı. Summary of a UBL-TR document: parties, lines, taxes and totals.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | No | ||
| dosya | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a concrete behavioral limitation: only the first 50 lines are included ('satırlar (ilk 50)'), and it mentions a signature flag ('imzalı mı'). This goes beyond the readOnlyHint annotation. However, it says nothing about error handling, parameter precedence, or the relationship between the two input options.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, but it has redundant halves: the Turkish list and the English summary largely overlap. The key behavioral detail (50-line limit) is buried in the Turkish portion rather than front-loaded in the summary sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure is covered elsewhere, but the input side is crucial and unexplained. An agent has no way to know what to pass for 'xml' or 'dosya', nor when this particular summary tool is the right choice relative to its siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the tool description never mentions 'xml' or 'dosya', so an agent gains no extra meaning about input format, expected structure, or whether the parameters are alternatives. The parameter names are mildly self-explanatory but insufficient for confident invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Summary of a UBL-TR document' and enumerates the output components (parties, lines, taxes, totals, signature flag), which is a specific resource-verb pair. It does not explicitly distinguish itself from siblings like 'belge_dogrula' or 'bulgu_acikla', but the summary/validate/explain distinction is reasonably implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the sibling validation/explanation tools, and no indication of whether to pass XML content via 'xml' or a file path via 'dosya'. The description does not mention prerequisites, mutual exclusivity of the two parameters, or what happens if neither is supplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulgu_aciklaARead-only
Bir bulgu kodunun (örn. sch-GeneralUnitCodeCheck-1, hesap-dip-odenecek) Türkçe açıklaması, hangi alanın neden reddedildiği ve nasıl düzeltileceği. Explains a finding code.
| Name | Required | Description | Default |
|---|---|---|---|
| kod | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's content is consistent. It adds behavioral detail about the output (which field was rejected, why, how to fix) and notes the explanation is in Turkish, which is valuable beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with two sentences. The English sentence 'Explains a finding code' is a redundant translation of the Turkish, but it does not add unnecessary length. The main information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool, the description is fairly complete: it explains the purpose, the input, and the output content. The output schema likely covers return structure, so this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no parameter description (0% coverage). The description compensates by identifying the parameter as a finding code and giving examples like 'sch-GeneralUnitCodeCheck-1' and 'hesap-dip-odenecek', clarifying the expected input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool explains a finding code, providing the Turkish explanation, the rejected field, reason, and fix. It includes concrete code examples, distinguishing it from sibling tools that handle documents (belge_ozeti, belge_dogrula) rather than findings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: when you need to explain a finding code. However, it does not explicitly mention alternatives or when not to use this tool, leaving differentiation to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kod_listeleriARead-only
Mevcut GİB kod listelerinin adları ve Türkçe açıklamaları; kaynak paket sürümleri. Names of the available code lists and the GİB package versions this build uses.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds the content scope (available lists, versions) but no additional behavioral details such as ordering, pagination, or failure behavior; it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the main purpose. The bilingual repetition is somewhat redundant, but it is compact and serves a multilingual audience.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only tool with an output schema present, the description covers the essential information: what is returned and the scope ('available'). No prerequisites, permissions, or side effects are relevant, and the read-only annotation covers the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is an empty object, so there is nothing to document. The baseline for a 0-parameter tool is 4, and the description appropriately focuses on the output rather than inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a concrete output: names and Turkish descriptions of available GİB code lists plus package versions. It is not a tautology and the plural scope distinguishes it from the sibling kod_listesi, though it lacks an explicit verb like 'returns' or 'lists'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied: call when you need an inventory of available code lists or build/package versions. No explicit when-to-use/when-not-to-use guidance or mention of the sibling kod_listesi is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kod_listesiBRead-only
GİB kod listesinin değerleri (şematronun fiilen uyguladığı liste): UnitCodeList, TaxType,
InvoiceTypeCodeList, ProfileIDType, CurrencyCodeList, WithholdingTaxTypeWithPercent,
TaxExemptionReasonCodeType, PaymentMeansCodeTypeList... ara ile alt dize filtresi. Values of a
GİB code list as enforced by the schematron.
| Name | Required | Description | Default |
|---|---|---|---|
| ara | No | ||
| liste | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds meaningful context: it specifies the values are 'as enforced by the schematron' (şematronun fiilen uyguladığı liste), clarifying the authoritative source. It also provides a list of example list names, giving insight into valid inputs. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise, using a colon and a list of examples. It is front-loaded with the core purpose. The list of examples is somewhat lengthy but adds value by indicating valid inputs. No wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is an output schema, so return format is covered. However, the description does not explain how to use the 'liste' parameter, what values are valid beyond the given examples, or how the 'ara' filter interacts. Sibling differentiation is also missing. The tool is not fully self-contained for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% – the description does not explain the 'liste' parameter at all. It does mention 'ara' as a substring filter, but does not describe its format or behavior. The example list names partially hint at valid 'liste' values, but the description fails to explicitly define either parameter. Given zero schema coverage, the description insufficiently compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool returns values of a GİB code list and lists example list names (UnitCodeList, TaxType, etc.). It is clear that the tool retrieves code values for a specified list. However, it does not explicitly differentiate from the sibling 'kod_listeleri' which likely lists available code lists, though the name and examples imply this.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus the sibling 'kod_listeleri'. The description mentions the 'ara' substring filter, which hints at usage, but there is no statement of conditions or alternatives. An agent is left to infer when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
belge_dogrula - First observed
belge_ozeti - First observed
bulgu_acikla - First observed
kod_listeleri - First observed
kod_listesi
TDQS
Scored across 5 tools
Each tool has a distinct purpose: summarizing, validating, explaining findings, and accessing code lists. The two code list tools are clearly differentiated by singular/plural and value/name semantics. No two tools could be plausibly confused.
All names use lowercase snake_case and follow a resource-prefix pattern (belge_*, kod_*, bulgu_*). There is minor inconsistency in the suffix type: some are verbs (dogrula, acikla) and some are nouns (ozeti, listesi, listeleri), but the overall pattern remains predictable and readable.
Five tools is well-scoped for a focused e-invoice validation server. Each tool serves a clear need in the workflow of validating, understanding, and correcting UBL-TR documents, with no redundant or extraneous tools.
The tool set covers the full validation workflow: validate a document, get a summary, explain reported findings, and inspect the code lists used by the schematron. There are no obvious dead ends—the outputs of belge_dogrula feed directly into bulgu_acikla and kod_listesi lookups.
Maintenance
Related MCP Connectors
Validiert E-Rechnungen (ZUGFeRD/Factur-X, XRechnung) gegen EN 16931 mit Korrekturvorschlägen.
Validate, generate & convert EU e-invoices (UBL, CII, XRechnung, Factur-X) — EN 16931 pre-validated.
EN 16931: validate invoice data or a UBL/CII file, emit UBL or CII XML. XRechnung, Peppol. Not PDF.
Validate, extract, repair and generate French Factur-X / EN16931 invoices via AgentForge API
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceIntegrates with the Turkish Revenue Administration (GİB) e-Arşiv Fatura system to manage e-invoices via natural language. Users can list, search, create, and cancel invoices, as well as validate Turkish tax numbers and retrieve UBL-TR format XML data.4MIT
- AlicenseAqualityDmaintenanceValidates EU electronic invoices (Peppol, XRechnung, FatturaPA, etc.) and explains validation error codes, enabling AI coding agents to check invoice validity and get fixes before rejection.328 npmMIT
- AlicenseAqualityDmaintenanceValidates electronic invoices (XRechnung, ZUGFeRD, Factur-X, Peppol BIS, etc.) against authority-pinned rules and explains failures.2141 npmMIT
- AlicenseNot gradedqualityCmaintenanceValidates financial documents and payment files (SEPA, UBL/Peppol, camt, ACH) entirely locally.46 npmMIT