fatturapa-mcp-server
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., "@fatturapa-mcp-server extract supplier and total from invoice.xml"
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.
fatturapa-mcp-server
English
The problem
Every project integrating FatturaPA reimplements the same validation, parsing and SDI error handling from scratch. The result: weeks of repeated work, hidden bugs and no standardization.
Related MCP server: Italy Invoice MCP
The solution
Seven AI tools installable in one line — document parsing, anomaly detection on received invoices, multi-invoice reporting, Italian and EU VAT verification via VIES, structural XML checks and offline SDI error lookup.
Status: beta. See Known limitations before relying on validation results.
Who is it for
Python developers and AI teams working on Italian electronic invoicing systems who want to integrate Claude without reimplementing FatturaPA compliance from scratch on every project.
What is this?
An MCP (Model Context Protocol) server that gives AI assistants seven ready-to-use tools for working with Italian electronic invoices (FatturaPA) and the SDI (Sistema di Interscambio) system — no plumbing required.
Tools
Tool | Input | What it does |
|
| Checks that the XML is well-formed and has the FatturaPA root structure. ⚠️ Not yet a full schema validation — see Known limitations |
|
| Extracts supplier, customer, amounts, line items and metadata from a valid FatturaPA document |
|
| Returns description, category and resolution hint for SDI error codes (offline). ⚠️ The table is being realigned with the official list — see Known limitations |
|
| Validates an Italian P.IVA (VAT number) using the official MEF checksum algorithm — no network call |
|
| Verifies any EU VAT number against the live VIES REST API; degrades gracefully when the service is down |
|
| Detects anomalies in a FatturaPA XML document: inconsistent totals, wrong VAT, future dates, invalid P.IVA, missing recipient, incomplete line items, negative amounts, missing payment info |
|
| Aggregates multiple FatturaPA XML documents into a single report with statistics, supplier/customer breakdown and anomaly summary |
Quick start
Option A — uvx (no install required)
uvx fatturapa-mcp-serverOption B — pip
pip install fatturapa-mcp-server
fatturapa-mcp-serverClaude Desktop configuration
Add the following block to your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"fatturapa": {
"command": "uvx",
"args": ["fatturapa-mcp-server"],
"env": { "FATTURAPA_ALLOWED_ROOTS": "/path/to/your/invoices" }
}
}
}FATTURAPA_ALLOWED_ROOTS lists the only folders the server may read (: separated
on macOS/Linux, ; on Windows). Without it every file_path read is refused and
documents must be passed as xml_content. This is deliberate: the server is driven
by an AI agent reading untrusted documents.
After restarting Claude Desktop you will see seven new tools in the tool panel.
Known limitations (v0.3.2)
An audit against the official AdE schema (FatturaPA v1.2.3) with synthetic invoices found the following. They are being fixed in the next releases; until then:
validate_invoiceis structural only. The bundled XSD files are stubs: an invoice with an unknown document type (TD99), an invalid currency (EURO) or missing mandatory blocks is reported asvalid: true. Do not use it as a substitute for SDI validation.lookup_sdi_error: several codes have descriptions that differ from the official list (e.g.00001is "invalid file name"), and some codes are missing.Batches (lots): when a file contains more than one invoice, only the first one is fully analysed.
Encoding: XML declared as ISO-8859-1 / windows-1252 may be decoded incorrectly.
.p7msigned files are not supported yet: extract the XML first.Report: credit notes (TD04) are added instead of subtracted; totals across different currencies are summed.
Amounts are returned as floats.
What is solid today: coherence checks (totals, VAT, P.IVA checksum, dates), fail-closed file access, XXE protection, VIES degradation when the service is down.
Changelog / Release history
Wave | Tools / Features | Release |
Wave 1 |
| v0.1.0 |
Wave 2 | PyPI publication, CI/CD, security audit, full coverage | v0.1.0 |
Wave 3 | Context propagation, structured logging, progress reporting, roots-based secure file access | v0.1.x |
Wave 4 |
| v0.2.0 |
v0.3.2 stats: 7 tools · 181 tests · 95% coverage, including server startup
What it demonstrates
MCP server with strict mypy typing, tested on Python 3.11, 3.12 and 3.13
Automated security audit — bandit + pip-audit
Guaranteed 80% minimum coverage (currently 95% across 181 tests)
Fail-closed file-system access: reads are refused unless explicitly configured
Published on PyPI — installable anywhere in one line
Bilingual IT/EN — built for Italian and international market
Auditable by design
Every feature in this repository was built through a governed multi-agent pipeline — planner, executor and reviewer as separate roles, each with declared authority and hard quality gates between them.
The coord/ directory is the audit trail. One handoff per task, recording the
files changed and why, the commands run with their PASS/FAIL output, the
assumptions made and how they were verified, and the risks left open. Fifteen
handoffs cover the four development waves listed above.
For regulated work — e-invoicing, tax data, compliance — being able to show how a system was built matters as much as showing that it works. The methodology is documented separately in agentic-dev-pipeline.
Project status
Beta. Tested with synthetic FatturaPA documents checked against the official schema; not yet used in production. See Known limitations. Part of a broader ecosystem: fatturapa-mcp-server → sdi-ops-monitor
Development setup
git clone https://github.com/MaurizioLisanti/fatturapa-mcp-server
cd fatturapa-mcp-server
# Install the package and all dev dependencies
make install # pip install -e ".[dev]"
# Run the full quality gate (lint + typecheck + tests + security)
make checkIndividual targets:
make test # pytest with coverage (fail-under 80 %)
make lint # ruff check + ruff format --check
make typecheck # mypy --strict
make security # bandit -ll + pip-audit
make format # auto-fix formatting and importsMCP Inspector
MCP Inspector lets you call tools interactively from a local web UI — useful during development:
npx @modelcontextprotocol/inspector uvx fatturapa-mcp-server
# Open http://localhost:5173 in your browserRelated projects
sdi-ops-monitor — AWS-based pipeline that receives, stores and routes FatturaPA files from/to SDI. Use together with this MCP server to give Claude end-to-end visibility into your Italian e-invoicing operations.
agentic-dev-pipeline — The governed multi-agent development pipeline this project was built with. The handoffs in
coord/are its output.
Italiano
Il problema
Ogni progetto che integra FatturaPA reimplementa da zero la stessa logica di validazione, parsing e gestione errori SDI. Il risultato: settimane di lavoro ripetuto, bug nascosti e nessuna standardizzazione.
La soluzione
Sette tool AI installabili in una riga — parsing del documento, rilevamento anomalie sulle fatture ricevute, report multi-fattura, verifica P.IVA italiana ed europea via VIES, controlli strutturali dell'XML e lookup errori SDI offline.
Stato: beta. Leggere i Limiti noti prima di fare affidamento sui risultati della validazione.
Per chi è
Developer Python e team AI che lavorano su sistemi di fatturazione elettronica italiana e vogliono integrare Claude senza reimplementare la compliance FatturaPA da zero ad ogni progetto.
Cos'è questo progetto?
Un server MCP (Model Context Protocol) che fornisce agli assistenti AI sette strumenti pronti all'uso per lavorare con le fatture elettroniche italiane (FatturaPA) e il Sistema di Interscambio (SDI).
Strumenti disponibili
Strumento | Input | Cosa fa |
|
| Controlla che l'XML sia ben formato e abbia la struttura radice FatturaPA. ⚠️ Non è ancora una validazione completa contro lo schema — vedi Limiti noti |
|
| Estrae fornitore, cliente, importi, righe dettaglio e metadati da un documento FatturaPA valido |
|
| Restituisce descrizione, categoria e suggerimento di risoluzione per i codici errore SDI (offline). ⚠️ La tabella è in fase di riallineamento con l'elenco ufficiale — vedi Limiti noti |
|
| Valida una P.IVA italiana tramite l'algoritmo di checksum ufficiale MEF — nessuna chiamata di rete |
|
| Verifica qualsiasi partita IVA UE contro l'API REST VIES in tempo reale; risponde in modo degradato se il servizio è irraggiungibile |
|
| Rileva anomalie in un documento FatturaPA XML: totale incoerente, IVA errata, data futura, P.IVA invalida, destinatario mancante, righe incomplete, importo negativo, pagamento mancante |
|
| Aggrega più documenti FatturaPA XML in un unico report con statistiche, riepilogo fornitori/clienti e analisi delle anomalie |
Avvio rapido
Opzione A — uvx (nessuna installazione necessaria)
uvx fatturapa-mcp-serverOpzione B — pip
pip install fatturapa-mcp-server
fatturapa-mcp-serverConfigurazione Claude Desktop
Aggiungere il seguente blocco al file di configurazione di Claude Desktop:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"fatturapa": {
"command": "uvx",
"args": ["fatturapa-mcp-server"],
"env": { "FATTURAPA_ALLOWED_ROOTS": "C:\\percorso\\delle\\fatture" }
}
}
}FATTURAPA_ALLOWED_ROOTS indica le sole cartelle che il server può leggere (separate
da ; su Windows, da : su macOS/Linux). Senza questa variabile ogni lettura da
file_path viene rifiutata e le fatture vanno passate come xml_content. È una
scelta voluta: il server è pilotato da un agente AI che legge documenti non fidati.
Dopo il riavvio di Claude Desktop, i sette strumenti compariranno nel pannello degli strumenti.
Limiti noti (v0.3.2)
Un audit contro lo schema ufficiale AdE (FatturaPA v1.2.3) con fatture sintetiche ha evidenziato i punti seguenti, in correzione nelle prossime release:
validate_invoiceè solo strutturale. Gli XSD inclusi sono stub: una fattura con tipo documento inesistente (TD99), divisa non valida (EURO) o blocchi obbligatori mancanti risultavalid: true. Non sostituisce la validazione dello SDI.lookup_sdi_error: alcune descrizioni non corrispondono all'elenco ufficiale (es.00001è "nome file non valido") e alcuni codici mancano.Lotti: se un file contiene più fatture, solo la prima viene analizzata del tutto.
Encoding: XML dichiarati ISO-8859-1 / windows-1252 possono essere decodificati male.
.p7m: i file firmati non sono ancora supportati; estrarre prima l'XML.Report: le note di credito (TD04) vengono sommate invece che sottratte; totali in valute diverse vengono sommati.
Gli importi sono restituiti come float.
Già solido oggi: controlli di coerenza (totali, IVA, checksum P.IVA, date), accesso ai file fail-closed, protezione XXE, gestione di VIES quando il servizio non risponde.
Changelog / Storico release
Wave | Tool / Funzionalità | Release |
Wave 1 |
| v0.1.0 |
Wave 2 | Pubblicazione PyPI, CI/CD, security audit, coverage completa | v0.1.0 |
Wave 3 | Propagazione contesto, logging strutturato, progress reporting, accesso file sicuro via roots | v0.1.x |
Wave 4 |
| v0.2.0 |
Statistiche v0.3.2: 7 tool · 181 test · 95% di coverage, avvio del server incluso
Cosa dimostra tecnicamente
MCP server con strict typing mypy, testato su Python 3.11, 3.12 e 3.13
Security audit automatico — bandit + pip-audit
Coverage minima garantita all'80% (attualmente 95% su 181 test)
Accesso al filesystem fail-closed: le letture sono negate salvo configurazione esplicita
Pubblicato su PyPI — installabile ovunque con una riga
Bilingue IT/EN — pensato per mercato italiano e internazionale
Tracciabilita by design
Ogni funzionalita di questo repository e stata costruita con una pipeline multi-agente governata — planner, executor e reviewer come ruoli distinti, ciascuno con autorita dichiarata e quality gate obbligatori tra una fase e l'altra.
La cartella coord/ e la pista di controllo. Un handoff per task, con i file
modificati e il motivo, i comandi eseguiti con esito PASS/FAIL, le assunzioni
fatte e come sono state verificate, i rischi lasciati aperti. Quindici handoff
coprono le quattro wave di sviluppo elencate sopra.
Nel lavoro su ambiti regolati — fatturazione elettronica, dati fiscali, compliance — poter mostrare come un sistema e stato costruito conta quanto mostrare che funziona. La metodologia e documentata separatamente in agentic-dev-pipeline.
Stato del progetto
Beta. Testato con fatture FatturaPA sintetiche verificate contro lo schema ufficiale; non ancora usato in produzione. Vedi Limiti noti. Parte di un ecosistema più ampio: fatturapa-mcp-server → sdi-ops-monitor
Setup per lo sviluppo
git clone https://github.com/MaurizioLisanti/fatturapa-mcp-server
cd fatturapa-mcp-server
# Installa il pacchetto e tutte le dipendenze di sviluppo
make install # pip install -e ".[dev]"
# Esegui il quality gate completo (lint + typecheck + test + security)
make checkTarget individuali:
make test # pytest con coverage (fail-under 80 %)
make lint # ruff check + ruff format --check
make typecheck # mypy --strict
make security # bandit -ll + pip-audit
make format # correzione automatica formattazione e importMCP Inspector
MCP Inspector permette di invocare gli strumenti in modo interattivo da una web UI locale — utile durante lo sviluppo:
npx @modelcontextprotocol/inspector uvx fatturapa-mcp-server
# Aprire http://localhost:5173 nel browserProgetti correlati
sdi-ops-monitor — Pipeline AWS per ricevere, archiviare e instradare i file FatturaPA da/verso il SDI. Da usare insieme a questo server MCP per dare a Claude visibilità end-to-end sulle operazioni di fatturazione elettronica italiana.
agentic-dev-pipeline — La pipeline di sviluppo multi-agente governata con cui questo progetto è stato costruito. Gli handoff in
coord/ne sono l'output.
License / Licenza
Available Tools
7 toolscheck_pivaA
Validate an Italian VAT number using the official MEF checksum algorithm.
Performs format validation and the Ministry of Economy checksum algorithm. No network call — fully local computation.
Args: piva: Italian VAT number string. May include or omit the "IT" prefix. Expected: 11 digits after stripping prefix and whitespace. ctx: Optional MCP context for structured log emission.
Returns: A CheckPivaResult with keys: valid (bool): Whether the P.IVA passes format and checksum checks. piva (str): Normalised P.IVA (11 digits, no prefix). reason (str | None): Failure reason if valid is False, else None.
Inputs: piva (required). Returns: piva, valid, reason
extract_invoice_dataA
Extract key fields from a validated FatturaPA XML document.
Parses the header and first body section to return structured invoice metadata. Never logs or persists XML content — only derived values are returned. Missing fields yield None rather than raising KeyError.
When file_path is given the document is read from disk; the path is
checked against the roots configured in FATTURAPA_ALLOWED_ROOTS before
any read is attempted. Pass xml_content directly to skip file I/O.
Args: xml_content: Raw XML string of a validated FatturaPA document. ctx: Optional MCP context for structured log emission. file_path: Optional filesystem path to read the document from. Checked against allowed roots before reading.
Returns: An ExtractResult TypedDict with supplier, customer, invoice header fields, and aggregated line_items from all body sections.
Raises: PermissionError: If file_path is outside the configured allowed roots. ValueError: If neither xml_content nor file_path is provided. lxml.etree.XMLSyntaxError: If the XML is not well-formed.
Inputs: file_path, xml_content. Returns: currency, line_items, invoice_date, total_amount, +8 more
find_invoice_anomaliesA
Detect inconsistencies and anomalies in a FatturaPA XML document.
Checks eight anomaly categories: document total mismatch, VAT calculation error, future invoice date, invalid Italian P.IVA checksum, missing or suspicious destination code, incomplete line items, unjustified negative amount, and missing payment data. Never logs or persists XML content.
When file_path is given the document is read from disk; the path is
checked against the roots configured in FATTURAPA_ALLOWED_ROOTS before
any read is attempted. Pass xml_content directly to skip file I/O.
Args: xml_content: Raw XML string of the FatturaPA document. ctx: Optional MCP context for structured log emission. file_path: Optional filesystem path to read the document from. Checked against allowed roots before reading.
Returns: A FindAnomaliesResult with keys: anomalies_found (int): Total number of anomalies detected. anomalies (list): All anomaly records. warnings (list): Only warning-severity anomalies. errors (list): Only error-severity anomalies. is_clean (bool): True when no anomalies are found.
Raises: PermissionError: If file_path is outside the configured allowed roots. ValueError: If neither xml_content nor file_path is provided. lxml.etree.XMLSyntaxError: If the XML is not well-formed.
Inputs: file_path, xml_content. Returns: errors, is_clean, warnings, anomalies, +1 more
generate_invoice_reportA
Aggregate a batch of FatturaPA XML documents into a structured report.
Processes each invoice through extract_invoice_data and find_invoice_anomalies, then aggregates the results into totals, supplier/customer breakdowns, and an anomaly summary. Documents that cannot be parsed are counted separately in the errors list; they do not affect the monetary totals. Never logs or persists XML content.
Progress notifications: one step per invoice (1..N), then a final step (N+1) for the aggregation phase.
Args:
xml_contents: List of raw FatturaPA XML strings to process.
title: Optional report title; defaults to "Invoice Report".
ctx: Optional MCP context for structured log emission.
Returns: An InvoiceReportResult TypedDict with aggregated statistics, party breakdowns (suppliers/customers), and an anomaly summary.
Inputs: xml_contents (required), title. Returns: title, errors, currency, customers, +8 more
lookup_sdi_errorA
Look up an SDI error code and return its human-readable description.
Uses a local static table of official AdE error codes. No network call required.
Args: error_code: SDI error code string (e.g., "00001", "00002"). ctx: Optional MCP context for structured log emission.
Returns: A LookupResult with keys: code (str): The queried error code. description (str): Official Italian description. category (str): Error category (e.g., "STRUTTURA", "CONTENUTO"). resolution (str): Suggested resolution hint.
Raises: ValueError: If error_code is not found in the known error table.
Inputs: error_code (required). Returns: code, category, resolution, description
validate_invoiceA
Validate a FatturaPA XML document against the appropriate XSD schema.
Auto-detects schema version (v1.2 or v1.3) from the XML namespace. Returns a structured result without logging any XML content.
When file_path is given the document is read from disk; the path is
checked against the roots configured in FATTURAPA_ALLOWED_ROOTS before
any read is attempted. Pass xml_content directly to skip file I/O.
Args: xml_content: Raw XML string of the FatturaPA document. ctx: Optional MCP context for structured log emission. file_path: Optional filesystem path to read the document from. Checked against allowed roots before reading.
Returns: A ValidateResult with keys: valid (bool): Whether the document passed XSD validation. version (str): Detected schema version ("1.2", "1.3", or "unknown"). errors (list[str]): Validation error messages, empty if valid.
Raises: PermissionError: If file_path is outside the configured allowed roots. ValueError: If neither xml_content nor file_path is provided.
Inputs: file_path, xml_content. Returns: valid, errors, version
verify_piva_viesA
Verify a VAT number against the EU VIES (VAT Information Exchange System).
Calls the official EU VIES REST endpoint with a configurable timeout. On timeout or service unavailability, returns a degraded response with source="unavailable" rather than raising — the caller must handle this case.
Args: country_code: Two-letter ISO 3166-1 alpha-2 country code (e.g., "IT"). vat_number: VAT number without the country prefix (e.g., "12345678901"). ctx: Optional MCP context for structured log emission.
Returns: A VerifyPivaViesResult with keys: valid (bool): Whether VIES confirmed the VAT number as active. name (str | None): Registered business name, if disclosed by VIES. address (str | None): Registered address, if disclosed by VIES. source (str): "vies" if live response, "unavailable" if service down.
Inputs: vat_number (required), country_code (required). Returns: name, valid, source, address
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 7 tools
Each tool targets a clearly distinct action: schema validation, field extraction, error-code lookup, local VAT checksum, network VIES verification, anomaly detection, and batch reporting. The only superficially similar pair, check_piva vs verify_piva_vies, is explicitly differentiated (local MEF checksum vs live EU VIES call).
All tools follow a consistent snake_case verb_noun pattern (validate_invoice, extract_invoice_data, lookup_sdi_error, check_piva, verify_piva_vies, find_invoice_anomalies, generate_invoice_report). No mixed conventions or vague verbs.
Seven tools is well-scoped for a FatturaPA validation and analysis server, with each tool earning its place covering a distinct stage of the document lifecycle plus supporting VAT/error lookups.
Validation, extraction, anomaly detection, aggregation, and VAT/error lookups cover the analytical surface well. Minor gaps remain around document creation/generation or SDI submission, but the apparent purpose (validation and analysis) is fully supported.
Maintenance
Related MCP Connectors
Italy FatturaPA invoices for AI agents: build FPR12 XML, transmit to the SdI, query status.
Validate, extract, repair and generate French Factur-X / EN16931 invoices via AgentForge API
Italian e-invoicing (FatturaPA/SdI), Peppol, KSeF, ZUGFeRD, and PDF invoice generation via POP
Italian tax + anti-fraud: CF, P.IVA, IBAN, ATECO, IMU, F24, FatturaPA, NIS2. 23 free + 5 with key.
Related MCP Servers
- 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.346 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to issue Italian FatturaPA electronic invoices and transmit them to the SdI via Invoicetronic. Supports creating and querying invoices with Italian VAT rates.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to locally parse, validate, audit, explain, generate, and convert XRechnung and ZUGFeRD/Factur-X e-invoices using official rule sets, fully offline with no API keys required.Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables natural-language management of FattureInCloud invoicing, clients, suppliers, and e-invoice workflows, with extensions for marking invoices as paid and caching payment accounts/VAT types.MIT