Sweden Invoice MCP πΈπͺ β How can my AI agent send a Peppol e-invoice (e-faktura) in Sweden?
Use it in 60 seconds
Paste this into your MCP client config (Claude Desktop, Cursor, Windsurf, or any MCP-capable agent):
{
"mcpServers": {
"sweden-invoice": {
"type": "http",
"url": "https://inv-se.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:
git clone https://github.com/junter1989k-ai/sweden-invoice-mcp && cd sweden-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 Sweden B2B/B2G electronic invoices (e-faktura) 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 Swedish VAT (moms) breakdown, and delivers it under the merchant's own Storecove account. Stateless, bring-your-own credentials, never stores anything.
Live endpoint: https://inv-se.wishpool.app/mcp Β· Registry: app.wishpool/sweden-invoice-mcp
Why now β the Swedish mandate
Sweden mandates structured Peppol BIS e-invoicing (e-faktura) for public-sector suppliers (B2G) since 2019-04-01 β paper and PDF are not accepted for B2G. B2B is voluntary today and expected to follow the EU ViDA (VAT in the Digital Age) timeline. Peppol is already the de-facto Swedish rail, so sending B2B over Peppol now is future-proof.
Quick start
{
"mcpServers": {
"sweden-invoice": {
"type": "http",
"url": "https://inv-se.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 (organisationsnummer scheme 0007, or VAT scheme 9955). Returns can_receive. The safe pre-flight. |
create_invoice | Build a Peppol BIS 3.0 invoice from seller + buyer (Swedish VAT SExxxxxxxxxx01 / organisationsnummer, address) and line items (description, net unit price, VAT rate 25/12/6/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 SEK. Swedish VAT (moms) rates: 25 (standard), 12 (food/lodging), 6 (books/newspapers/passenger transport), 0 (zero-rated/exempt/reverse charge). Parties identified by Swedish VAT (SExxxxxxxxxx01) and/or organisationsnummer (10 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 + 50both @25% β taxable 150.00 / vat 37.50 / total 187.50200 @25% + 100 @6%β taxable 300.00 / vat 56.00 (50 + 6) / total 356.002Γ50 @25% + 3Γ10 @12% + 1Γ25 @0%β taxable 155.00 / vat 28.60 (25 + 3.60 + 0) / total 183.60- rounding:
10.10 @25%β vat 2.53 (from 2.525) / total 12.63
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 :3237
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 Finland, Norway, Denmark, the Netherlands and Luxembourg on Peppol β those sister countries replicate this exact server. Local logistics: logi.wishpool.app. Local payments in 81 countries: mcp.wishpool.app.
MIT licensed.