mcp-einvoicing-be
This server provides tools for Belgian electronic invoicing, covering validation, generation, transformation, and lookup operations.
Validate Belgian E-Invoices (
validate_invoice_be): Validate a UBL 2.1 XML invoice against Belgian business rules (EN 16931) with a choice of profile overlays — Peppol BIS Billing 3.0, PINT-BE, or Mercurius — returning structured per-rule errors and warnings.Validate Against PINT-BE Rules (
validate_pint_be): Validate an invoice specifically against PINT-BE rules published by the National Bank of Belgium (NBB), which adds Belgian-specific mandatory elements on top of EN 16931.Generate Belgian E-Invoice XML (
generate_invoice_be): Generate a fully compliant UBL 2.1 Belgian e-invoice XML from structured data, applying the correctcustomizationIDandprofileIDfor Peppol BIS 3.0 or PINT-BE profiles.Transform JSON to UBL XML (
transform_to_ubl): Convert a structured JSON invoice payload to UBL 2.1 XML without validation — useful as a conversion step before separate validation or platform submission.Look Up Belgian VAT/Enterprise Numbers (
lookup_vat_be): Query the BCE/KBO public database for a Belgian enterprise number to retrieve legal name, address, legal form, status, and NACE activity codes.Check Peppol Participant Registration (
check_peppol_participant_be): Verify whether a Belgian company is registered as a Peppol participant via SMP/SML, returning registration status, supported document types, and the SMP access point URL.List Supported Invoice Document Types (
get_invoice_types_be): Retrieve supported Belgian e-invoice document types (invoice, credit note, debit note) with their UBLcustomizationIDandprofileIDvalues for each profile.
mcp-einvoicing-be 🇧🇪
English | Francais | Nederlands
Introduction
mcp-einvoicing-be is an MCP (Model Context Protocol) server that exposes tools for Belgian electronic invoicing. It covers the full Belgian e-invoicing ecosystem: Peppol BIS Billing 3.0, UBL 2.1/2.3, the PINT-BE extension (National Bank of Belgium), and the Mercurius network for public-sector invoicing. The server is part of the mcp-einvoicing-* family of country-specific servers, all built on top of mcp-einvoicing-core, which provides the shared validation engine, UBL abstractions, and Peppol network utilities.
Related MCP server: mcp-facture-electronique-fr
Installation
Requirements
Python ≥ 3.11
mcp-einvoicing-core(installed automatically as a dependency)
Using uv (recommended)
uv add mcp-einvoicing-beUsing pip
pip install mcp-einvoicing-beFrom source
git clone https://github.com/cmendezs/mcp-einvoicing-be.git
cd mcp-einvoicing-be
uv sync --all-extrasConfiguration
Add the server to your MCP client configuration. For Claude Desktop, edit claude_desktop_config.json:
{
"mcpServers": {
"einvoicing-be": {
"command": "uvx",
"args": ["mcp-einvoicing-be"]
}
}
}For a local development install:
{
"mcpServers": {
"einvoicing-be": {
"command": "uv",
"args": ["run", "mcp-einvoicing-be"],
"cwd": "/path/to/mcp-einvoicing-be"
}
}
}Environment variables
Variable | Description | Default |
| API key for the Belgian BCE/KBO enterprise database | — |
| Peppol environment: |
|
| Override the SML lookup URL | (auto) |
| Logging level: |
|
Available Tools
validate_invoice_be
Validates a UBL 2.1 XML invoice against Belgian business rules (EN 16931 + PINT-BE or Peppol BIS 3.0 + Mercurius overlay).
Parameter | Type | Required | Description |
|
| yes | Raw UBL 2.1 XML content |
|
| no |
|
Returns a ValidationResult with valid, errors, and warnings (each carrying the failed rule ID and a human-readable message).
validate_pint_be
Validates an invoice against the PINT-BE-specific business rules published by the National Bank of Belgium (NBB). Wraps the PINT-BE Schematron rules on top of the EN 16931 base.
Parameter | Type | Required | Description |
|
| yes | Raw UBL 2.1 XML content |
generate_invoice_be
Generates a valid UBL 2.1 Belgian e-invoice XML document from structured data.
Parameter | Type | Required | Description |
|
| yes | Invoice fields (see |
|
| no |
|
The InvoiceInput object supports:
{
"invoice_number": "INV-2024-001",
"issue_date": "2024-01-15",
"due_date": "2024-02-14",
"currency_code": "EUR",
"supplier": { "name": "...", "vat_number": "BE0123456789", "address": {...} },
"customer": { "name": "...", "vat_number": "BE0987654321", "address": {...} },
"lines": [{ "description": "...", "quantity": 1, "unit_price": 100.00, "vat_rate": 21.0 }]
}Returns a UBL 2.1 XML string.
transform_to_ubl
Converts a structured JSON invoice payload to UBL 2.1 XML without full validation. Useful as a first step before validation.
Parameter | Type | Required | Description |
|
| yes | Source invoice data (same shape as |
lookup_vat_be
Looks up a Belgian enterprise number (VAT number) against the BCE/KBO public database.
Parameter | Type | Required | Description |
|
| yes | Belgian VAT/enterprise number, e.g. |
Returns enterprise name, registered address, legal status, and NACE activity codes.
check_peppol_participant_be
Checks whether a Belgian company is registered as a Peppol participant by querying the SMP/SML network.
Parameter | Type | Required | Description |
|
| yes | Peppol participant ID (e.g. |
Returns registration status, supported document type identifiers, and the SMP access point endpoint URL.
get_invoice_types_be
Returns the list of supported Belgian e-invoice document types (invoice, credit note, debit note) with their UBL customizationID and profileID values for each profile.
No input parameters required.
Architecture
mcp-einvoicing-be/
├── src/
│ └── mcp_einvoicing_be/
│ ├── __init__.py
│ ├── server.py # MCP server entry point & tool registration
│ ├── tools/
│ │ ├── __init__.py
│ │ ├── validation.py # validate_invoice_be, validate_pint_be
│ │ ├── generation.py # generate_invoice_be
│ │ ├── transformation.py # transform_to_ubl
│ │ └── lookup.py # lookup_vat_be, check_peppol_participant_be, get_invoice_types_be
│ ├── models/
│ │ ├── __init__.py
│ │ ├── invoice.py # InvoiceInput, InvoiceLine, ValidationResult
│ │ └── party.py # Supplier, Customer, Address
│ ├── standards/
│ │ ├── __init__.py
│ │ ├── peppol_bis_3.py # Peppol BIS Billing 3.0 rules & customization IDs
│ │ ├── ubl.py # UBL 2.1 namespace constants & XML helpers
│ │ ├── pint_be.py # PINT-BE (NBB) Schematron rules
│ │ └── mercurius.py # Mercurius network config & overlay rules
│ └── utils/
│ ├── __init__.py
│ └── helpers.py # VAT number normalization, date formatting, etc.
├── tests/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_tools/
│ │ ├── __init__.py
│ │ ├── test_validation.py
│ │ ├── test_generation.py
│ │ └── test_transformation.py
│ └── fixtures/
│ ├── invoice_valid_peppol.xml
│ ├── invoice_valid_pint_be.xml
│ └── invoice_invalid.xml
├── .github/
│ └── workflows/
│ ├── ci.yml
│ └── publish.yml
├── pyproject.toml
├── CHANGELOG.md
├── CONTRIBUTING.md
└── LICENSERelationship to mcp-einvoicing-core
mcp-einvoicing-core provides:
Shared UBL 2.1/2.3 XML parsing and serialization utilities
EN 16931 base validation rules (syntax + semantic)
Peppol network client (SMP lookup, SML resolution)
Common Pydantic base models (
BaseInvoice,BaseParty,BaseValidationResult)
mcp-einvoicing-be adds Belgium-specific logic on top:
PINT-BE Schematron rules (NBB publication)
Mercurius network endpoint configuration and overlay rules
BCE/KBO enterprise database integration
Belgian VAT number normalization (BTW/TVA format)
customizationIDandprofileIDvalues specific to the Belgian Peppol corner
Contributing
Contributions are welcome. Please open an issue to discuss significant changes before submitting a pull request.
git clone https://github.com/cmendezs/mcp-einvoicing-be.git
cd mcp-einvoicing-be
uv sync --all-extras
uv run pytest
uv run ruff check src tests
uv run mypy srcAll pull requests must:
Pass the full test suite (
pytest)Pass linting (
ruff check)Pass type checking (
mypy)Include or update tests for any changed behaviour
Reference the relevant rule ID(s) when fixing a validation issue
See CONTRIBUTING.md for full guidelines.
Other e-invoicing MCP servers
Country | Server |
🌍 Global | |
🇧🇪 Belgium | |
🇧🇷 Brazil | |
🇫🇷 France | |
🇩🇪 Germany | |
🇮🇹 Italy | |
🇵🇱 Poland | |
🇪🇸 Spain |
License
This project is licensed under the Apache 2.0 — see LICENSE for details.
Changelog
See CHANGELOG.md for a full list of changes by version.
Maintenance
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/cmendezs/mcp-einvoicing-be'
If you have feedback or need assistance with the MCP directory API, please join our Discord server