Skip to main content
Glama
junter1989k-ai

netherlands-invoice-mcp

Netherlands Invoice MCP ๐Ÿ‡ณ๐Ÿ‡ฑ โ€” How can my AI agent send a Peppol e-invoice (e-factuur) in the Netherlands?

Use it in 60 seconds

Paste this into your MCP client config (Claude Desktop, Cursor, Windsurf, or any MCP-capable agent):

{
  "mcpServers": {
    "netherlands-invoice": {
      "type": "http",
      "url": "https://inv-nl.wishpool.app/mcp"
    }
  }
}

Nothing to install. Credentials, when you need them, travel as HTTP headers on each request and are never stored โ€” see the threat model.

Or run it yourself

Would you rather not send production credentials to a server you do not control? Deploy this identical code to your own account and point your agent at your own URL:

Deploy with Vercel

git clone https://github.com/junter1989k-ai/netherlands-invoice-mcp && cd netherlands-invoice-mcp && npx vercel --prod

MIT-licensed. Self-hosting removes us from the picture entirely, at no cost and with no loss of function.


Remote MCP server that lets any AI agent send Netherlands B2B electronic invoices (e-factuur) over the Peppol network in Peppol BIS 3.0 / EN 16931 format via Storecove, a certified Peppol Access Point. It builds the structured invoice, computes the Dutch VAT breakdown, and delivers it under the merchant's own Storecove account. Stateless, bring-your-own credentials, never stores anything.

Live endpoint: https://inv-nl.wishpool.app/mcp ยท Registry: app.wishpool/netherlands-invoice-mcp

Why now โ€” the highest Peppol adoption in Europe

The Netherlands has mandated Peppol e-invoicing for B2G since 2017 and has one of the highest Peppol adoption rates in Europe for B2B. B2B stays voluntary today, but EU-wide ViDA mandatory e-invoicing is expected by 2030 โ€” sending structured Peppol invoices (e-factuur) now is future-proof and already how most Dutch businesses exchange invoices.

Quick start

{
  "mcpServers": {
    "netherlands-invoice": {
      "type": "http",
      "url": "https://inv-nl.wishpool.app/mcp",
      "headers": {
        "x-storecove-key": "your-storecove-api-key"
      }
    }
  }
}

Sign up at storecove.com โ€” the merchant is the Peppol Access Point account holder. Request a free 30-day sandbox account from Storecove for a test key (sandbox does not need production onboarding). Create your sender under Senders to get the legalEntityId you pass as seller_legal_entity_id. Sandbox vs production is determined by the account your key belongs to โ€” the base URL is the same. Authentication is HTTP Bearer with your key. Your key stays with you and travels per-request; this server never stores it.

Tools

Tool

What it does

check_recipient

Peppol participant discovery โ€” is the buyer reachable on Peppol before you send? Pass the identifier (KVK number scheme 0106, or VAT scheme 9944). Returns can_receive. The safe pre-flight.

create_invoice

Build a Peppol BIS 3.0 invoice from seller + buyer (Dutch VAT NLxxxxxxxxxBxx / KVK number, address) and line items (description, net unit price, VAT rate 21/9/0, quantity), then submit over Peppol via Storecove. Returns a submission guid + computed VAT totals (taxable, vat, total).

get_delivery_evidence

Fetch the proof of what was sent and the Peppol delivery status by guid.

Amounts are in EUR. Dutch VAT (btw) rates: 21 (standard), 9 (reduced), 0 (zero-rated/exempt/reverse charge). Parties identified by Dutch VAT (NLxxxxxxxxxBxx) and/or KVK number (Chamber of Commerce, 8 digits).

No cancel over Peppol โ€” to reverse an invoice you issue a credit note (a new invoice). create_invoice needs seller_legal_entity_id (your Storecove sender id). Owner policy guardrails ride optional headers (x-agentpay-max-amount, x-agentpay-approval-above, x-agentpay-allowed-tools) โ€” set by the human owner in client config; the agent cannot relax them.

VAT math (deterministic)

Per line amountExcludingVat = round2(quantity ร— unit_price); grouped by (rate, category) into taxSubtotals (taxableAmount, taxAmount = round2(taxable ร— rate / 100)); gross amountIncludingVat = taxable + tax. Examples:

  • 100 + 50 both @21% โ†’ taxable 150.00 / vat 31.50 / total 181.50

  • 200 @21% + 100 @9% โ†’ taxable 300.00 / vat 51.00 (42 + 9) / total 351.00

  • 2ร—50 @21% + 3ร—10 @9% + 1ร—25 @0% โ†’ taxable 155.00 / vat 23.70 (21 + 2.70 + 0) / total 178.70

Endpoints wrapped (Storecove REST)

  • Base: https://api.storecove.com/api/v2 (single base URL; auth = HTTP Bearer with your API key)

  • Send: POST /document_submissions โ€” JSON { legalEntityId, routing, document:{ documentType:"invoice", invoice:{โ€ฆ} } } โ†’ { guid }

  • Evidence: GET /document_submissions/{guid}/evidence โ€” proof of what was sent + Peppol delivery status

  • Discovery: POST /discovery/receives โ€” JSON { documentTypes, network, metaScheme, scheme, identifier } โ†’ { code:"OK", email }

  • Verified probe (2026-07-10): a fake Bearer key really hits api.storecove.com/api/v2 โ†’ 403 {"errors":[{"source":"generic","details":"Not Authorized"}]} (endpoint alive; BYO = the merchant's own key validates).

Develop

node test/serve.js   # local server on :3244
node test/e2e.js     # VAT math + Peppol JSON structure + protocol + validation + policy + fake-key live probe

Safety

Pure stateless translation layer over the Storecove REST API. Storecove is the certified Peppol Access Point under the merchant's own account; this service never signs, never onboards, and never stores anything. The API key travels per-request in a header, and funds are never touched โ€” this issues tax invoices, it does not move money. Privacy policy.

Sister servers

Local invoices, one family: Belgium Peppol (inv-be) ยท Italy FatturaPA (inv-it) ยท Malaysia MyInvois (inv-my) ยท Mexico CFDI (inv-mx) ยท Brazil NF-e (inv-br) ยท India GST (inv-in). Storecove also covers Luxembourg and the Nordics on Peppol โ€” those sister countries replicate this exact server. Local logistics: logi.wishpool.app. Local payments in 81 countries: mcp.wishpool.app.

MIT licensed.