EU e-invoicing and business checks (EN 16931, Peppol, VAT, sanctions)

io.github.wsystemdevPublished by GitHub account wsystemdevv1.0.4Updated Oct 30, 2026

EN 16931/XRechnung e-invoice validate+create, Peppol routing, EU VAT/EORI, sanctions, KYB. Free tier

VerifiedStreamable HTTPWeb executableFinanceSecurity & MonitoringBusiness & Commerce

Overview

AI-generated overview

Remote MCP server for EU business checks: VAT and EORI validation, company registers, sanctions screening, KYB and EN 16931 e-invoice validation, creation and…

What you can do
  • Validate EU VAT numbers against VIES, singly or in batches of up to 100, with name, address and consultation number
  • Validate EU EORI customs numbers, singly or in batches
  • Look up companies in official European business registers and screen names against EU, UN, OFAC and UK sanctions lists
  • Combine VAT, register and sanctions checks into a KYB verdict or a scored due-diligence report
  • Validate, parse and create EN 16931, XRechnung and Peppol BIS 3 e-invoices, and check whether a buyer can receive e-invoices
  • Test a full e-invoice send flow in a sandbox and check France's official list of approved e-invoicing platforms
When to use it
Useful when an assistant has to check supplier or customer VAT, EORI or registry details, screen counterparties for sanctions, or work with EU e-invoices such as XRechnung, Factur-X or Peppol BIS 3 during onboarding, invoicing or compliance workflows.
Requirements
A remote streamable HTTP endpoint; no local install. No API key is required for the free tier of 20 tool calls per day per MCP session, with additional per-IP and shared limits. An optional API key is sent in the X-API-Key header or as an Authorization Bearer token for higher volume.
Before you install
Free-tier limits are low and shared, and paid API keys or x402 per-call payments in USDC on Base are needed beyond them. Sanctions matches are a screening aid requiring human review, and results are not legal or tax advice. Fallback VAT results from national registers are not VIES audit proof. The sandbox send tool never reaches a real buyer, and live Peppol transmission is not available.

Installation

In SourceWeft

  1. Open EU e-invoicing and business checks (EN 16931, Peppol, VAT, sanctions) in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.wsystemdev%2Feu-business-data-mcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "eu-e-invoicing-and-business-checks-en-16": {
      "type": "http",
      "url": "https://api.wsystem.dev/mcp/"
    }
  }
}

README

EU Business Data MCP – VAT, EORI, company registry, sanctions, KYB & e-invoicing

A remote MCP server and x402 pay-per-call API for European business data checks, aimed at AI agents and KYB/onboarding/invoicing workflows.

Maker disclosure: built and operated by W System. This is our own commercial product. The code is MIT-licensed.

Remote MCP endpoint (streamable HTTP)

https://api.wsystem.dev/mcp/

Free tier, no signup: 20 tool calls per day per MCP session. Direct clients (Claude Code, Cursor, mcp-remote and others connecting from your own machine) also get at most 20 per IP, so opening more sessions doesn't add calls. Claude.ai / Claude Desktop custom connectors call from Anthropic's cloud (outbound range 160.79.104.0/21), so those calls are counted per session, not per IP; all keyless traffic from that range shares 2,000 lookups per day (verify_batch / verify_eori_batch count one per number). New keyless sessions: 1,500 per IP per day (3,000 per Anthropic address). Limits reset at 00:00 UTC; live values: https://api.wsystem.dev/mcp/limits

Optional API key for volume: send X-API-Key: <key> (or Authorization: Bearer <key>) with every MCP request. Keyed calls use the key's monthly units (same weights as the REST API) instead of the free tier. Keys: https://wsystem.dev/pricing (Starter EUR 19/month, 5,000 units; Pro EUR 49/month, 25,000 units; there is no free key). Keys in the URL are not accepted. How to add one in Claude: docs/mcp-claude-cursor.md.

Server card: https://api.wsystem.dev/server-card · Website: https://wsystem.dev · LLM summary: https://wsystem.dev/llms.txt

Example client config:

json
{ "mcpServers": { "eu-business-data": { "type": "http", "url": "https://api.wsystem.dev/mcp/" } } }

Tools (14)

ToolWhat it does
verify_vatValidate an EU VAT number live against VIES (27 EU states + XI), with name/address and optional consultation number
verify_batchValidate several VAT numbers at once
lookup_companyLook up a company in European business registries
screen_sanctionsFuzzy-match a name against EU / UN / UK / US sanctions lists
kyb_checkCombined KYB: VAT validity + registry + sanctions screening
verify_eoriValidate an EU EORI number (customs)
verify_eori_batchValidate several EORI numbers at once
validate_einvoiceValidate a UBL or CII e-invoice against the official EN 16931 and XRechnung rules: errors with rule IDs, plain-English messages and fix hints
parse_einvoiceRead an incoming e-invoice (UBL Invoice/CreditNote, CII, or the XML inside a ZUGFeRD / Factur-X PDF as base64) into one JSON shape: seller, buyer, dates, references, totals, VAT breakdown, payment/IBAN, lines, attachments. Values as written, no validation (use validate_einvoice). Guide: read XRechnung / ZUGFeRD as JSON
create_einvoiceTurn simple JSON into a validated UBL 2.1 invoice (EN 16931, XRechnung or Peppol BIS 3 structure)
einvoice_route"Can I e-invoice this company?": VIES + Peppol Directory + country B2B mandate + recommended format
send_einvoice_sandboxSANDBOX: verify buyer VAT + sanctions → create/validate EN 16931 → route → mock transport (nothing transmitted) → Ed25519-signed evidence receipt
due_diligence_reportVAT, register, sanctions, EORI, GLEIF LEI and Peppol in one report with risk flags and a timestamp
check_fr_pa_registryFrance: is this e-invoicing platform on the official DGFiP list of Plateformes Agréées (PA)? Name or website in; approved / awaiting interop tests / not found, registration date and official source out (also free as REST: GET https://api.wsystem.dev/fr/pa-registry?name=Pennylane)

Quick answers

When VIES is down (fallback) and UK numbers

  • VIES is retried with backoff. If a member state is still MS_UNAVAILABLE/timing out, the result comes from that country's free official source: PL Biała lista (Ministry of Finance), CZ ARES (VAT register status), FI YTJ open data (VAT register), FR Recherche d'entreprises / SIRENE (company active + VAT key; no free French VAT-registration API exists).
  • Otherwise the last successful VIES answer for that number is returned, labelled with its date. Otherwise member_state_unavailable.
  • Fallback results have fallback: true, fallback_type (national_source | last_vies_result), source, legal_status, vies_error, and no consultation number. National registers show domestic status, which is not VIES audit proof. Turn off with fallback=false.
  • No free automated source for DE (BZSt eVatR requires a German requester VAT ID), ES (certificate), IT (captcha), NL, BE, HU (NAV technical user), DK.
  • GET /vies/status: EC VIES per-country availability, cached 5 min, free.
  • GB: accepted and HMRC check-digit validated, but the live HMRC lookup is not switched on yet (HMRC production access pending). GB numbers return status: member_state_unavailable, valid: null, error: HMRC_LIVE_ACCESS_PENDING: not a validity result, not cached and not billed. XI (Northern Ireland) is checked in VIES.

Integration guides

Step-by-step guides (every snippet tested against the live API): docs/

Website with a free VAT and EORI checker: https://wsystem.dev REST API docs and a free API key (no card): https://api.wsystem.dev/docs?ref=mcp-github

Pricing

  • MCP endpoint: free, 20 tool calls per day per MCP session (details and the shared limit for Claude connector traffic above). With an API key in X-API-Key: Starter EUR 19/month (5,000 units) or Pro EUR 49/month (25,000 units). When a free limit is reached, the tool returns an error that names the limit and explains how to add a key.
  • REST API with x402 on the same host (https://api.wsystem.dev, e.g. GET /verify?vat=..., POST /verify/batch, GET /company?q=..., sanctions, KYB and EORI routes): after the free allowance, calls are paid per request with x402 in USDC on Base: about $0.01 per single check, $0.10 per batch, $0.045 per KYB check. Unpaid calls get HTTP 402 with the payment requirements.
  • Apify Actors (pay per event), see below.

Also on Apify

The same checks are available as Apify Actors (pay per event), and through Apify's hosted MCP server:

Blog: https://wsystem.hashnode.dev

Ready-made examples (run in one click on Apify)

Each example opens a pre-filled run with real sample output, so you can see the result format before you pay for anything:

Run it yourself

bash
pip install -r requirements.txtuvicorn vatcheck.server:app --port 8000     # REST at /, MCP at /mcp/# or stdio MCP:python -m vatcheck.mcp_server stdio

x402 is off unless X402_ENABLED=1 and X402_PAY_TO are set (see vatcheck/x402.py).

Data sources & disclaimer

Data comes live from public sources such as the European Commission VIES and EORI services, public business registries and official sanctions lists. Not affiliated with the European Commission or any authority. Results are not legal or tax advice.

License

MIT. See LICENSE.

Source: README.md at commit c33d398

Tools

14

verify_vat

Validate an EU VAT number against the official European Commission VIES service (27 EU states + XI Northern Ireland). Use when asked whether a VAT ID is valid/active, before zero-rated reverse-charge B2B invoices, or to get a company's registered name/address from its VAT number. Input: VAT with country prefix, e.g. 'IE6388047V', 'DE811193231' (spaces/dots ok). Returns status: valid | invalid | invalid_format | member_state_unavailable (VIES/member state down - retry later, valid=null) | error, plus name, address (if the member state discloses them; DE/ES often don't) and consultation_number (audit proof) when requester is set. UK (GB) VAT checks are coming soon: until HMRC live access is granted, GB numbers return status member_state_unavailable, valid=null, error HMRC_LIVE_ACCESS_PENDING (not charged). For >1 number use verify_batch.

Parametersvatrequiredrequester

verify_batch

Validate up to 100 EU VAT numbers in one call via VIES (supplier/customer list cleanup, onboarding, invoice runs). Same per-item result as verify_vat; items with member_state_unavailable should be retried later (GB items stay member_state_unavailable until HMRC live access is granted; they are not charged).

Parametersvatsrequiredrequester

lookup_company

Look up a company in official European business registers by name or registry number. country: FR (SIREN), NO (org.nr), FI (Y-tunnus), CZ (ICO), PL (KRS number), EE, or any other ISO code / 'LEI' (GLEIF). Returns legal name, ID, status/active, address, VAT ID, activity code and official source link. Use to confirm a company exists and is active, find its registry number, or map a name to a VAT ID.

Parameterslimitqueryrequiredcountry

screen_sanctions

Screen a person or company name against official EU, UN, OFAC SDN and UK sanctions lists. Fuzzy matching with transliteration; returns candidate matches with 0-100 scores, list, programme, DOB. A potential match needs human review; this is a screening aid, not legal advice.

Parametersnamerequiredcountrythresholdbirth_year

kyb_check

One-call KYB check of a supplier/customer: EU VAT validation (VIES) + official business register + EU/UN/OFAC/UK sanctions screening, returning a pass / review / fail verdict with reasons. company: a VAT ID ('FR40303265045'), a company name, or a registry id; country: optional ISO code (e.g. 'NO').

Parameterscompanyrequiredcountryrequester

verify_eori

Validate an EU EORI (customs Economic Operators Registration and Identification) number, e.g. 'SE5560360793', 'DE1234567890123', against the official European Commission EOS service. Use for import/export, customs declarations and freight-forwarder onboarding. Returns valid/invalid and trader name/address only when the trader consented to publication. UK (GB) EORIs are not in EOS (HMRC checks those); XI EORIs are.

Parameterseorirequired

verify_eori_batch

Validate up to 100 EU EORI numbers in one call via the official EC EOS service (customs / import-export KYB).

Parameterseorisrequired

validate_einvoice

Validate an EU e-invoice XML (UBL 2.1 Invoice/CreditNote or UN/CEFACT CII, e.g. XRechnung, Factur-X/ZUGFeRD XML) against the official CEN EN 16931 rules and, for XRechnung, the KoSIT XRechnung 3.0 rules. Returns valid, and every error with its rule ID (e.g. BR-CO-10), a plain-English message, XPath and a fix hint. rules: auto | en16931 | xrechnung. Slovak sellers also get eFaktúra field checks (FR SR transposition v1.12, warnings with ruleset SK-FS); Norwegian sellers get NO-LAW field checks. Peppol-specific rules are not checked yet. For PDFs use the REST endpoint POST /einvoice/validate.

Parametersxmlrequiredrules

parse_einvoice

Read an incoming EU e-invoice into one JSON shape: seller, buyer, dates, references, totals, VAT breakdown, payment/IBAN, lines and attachments. Accepts UBL 2.1 Invoice/CreditNote or UN/CEFACT CII XML (XRechnung, Peppol BIS 3, Factur-X XML) in xml, or a ZUGFeRD/Factur-X PDF as base64 in pdf_base64. Use when asked to read, extract or book a received e-invoice. Values are returned as written in the invoice; this does NOT validate it (use validate_einvoice for that).

Parametersxmlpdf_base64

create_einvoice

Create a validated EU e-invoice (UBL 2.1) from simple JSON. invoice = {format: en16931|xrechnung|peppol-bis3, invoice_number, issue_date (YYYY-MM-DD), due_date?, tax_point_date?, delivery_date?, currency (EUR), buyer_reference?, seller: {name, vat_id, street, city, postal_code, country, email, phone, contact_name, company_id?, company_id_scheme?, legal_form?}, buyer: {...}, lines: [{description, quantity, unit_price, unit?, vat_category (S|Z|E|AE|K|G|O), vat_rate}], payment: {iban, bic?, terms?}}. Totals and VAT breakdown are computed; returns {valid, xml, totals, errors}.

Parametersinvoicerequired

einvoice_route

'Can I e-invoice this company?' id = EU VAT number (e.g. 'BE0403170701') or Peppol id ('0208:0403170701'). Returns VIES VAT status, Peppol registration (Peppol Directory, then SML/SMP; BIS 3 invoice support), the country's B2B e-invoice mandate (dates, format, source) and the recommended format for create_einvoice. France's PPF directory is not included yet.

Parametersidrequired

send_einvoice_sandbox

SANDBOX ONLY - never reaches a real buyer. Runs the full send flow on an invoice (same JSON as create_einvoice): VIES check of the buyer VAT, sanctions screen of the buyer name, EN 16931 create + validate, route lookup (Peppol/mandate), transport hand-off and an Ed25519-signed evidence receipt (JWS). transport: "mock" (simulated, default), "recommand" or "e-invoice-be" (the UBL is really submitted to that Peppol access point's sandbox, addressed to W System's own sandbox company; the partner document id is returned). Use it to build and test an integration before live sending exists.

Parametersinvoicerequiredtransport

due_diligence_report

Counterparty due-diligence report in one call: VIES VAT, official business register, EU/UN/OFAC/UK sanctions, EC EORI, GLEIF LEI and Peppol e-invoice route, with deterministic risk flags, 0-100 risk score, pass/review/fail verdict, sources and UTC timestamp. company: VAT ID (best), registry number or name; country: ISO code for names.

Parameterscompanyrequiredcountry

check_fr_pa_registry

Is this e-invoicing platform on France's official list of Plateformes Agréées (PA)? name = platform or company name (e.g. 'Pennylane'), website = its site (e.g. 'https://www.acubeapi.com/'); give at least one. Checks the DGFiP lists on impots.gouv.fr: registered PAs (with registration date) and operators awaiting interoperability tests. Returns on_official_list, status (approved | awaiting_interop_tests | possible_match | not_found), scored matches, list date and the official source. Use for supplier due diligence before the French reform (receive from 1 Sep 2026, SMEs issue from 1 Sep 2027). A 'solution compatible' is not a PA itself. Unofficial copy; the official lists prevail.

Parametersnamelimitwebsite

Version history

1
  1. v1.0.4LatestOct 29, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts