Skip to main content
Glama
junter1989k-ai

Sweden Invoice MCP

README.md
# Sweden Invoice MCP πŸ‡ΈπŸ‡ͺ β€” How can my AI agent send a Peppol e-invoice (e-faktura) in Sweden?

<!-- install-cta -->
## Use it in 60 seconds

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

```json
{
  "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](https://mcp.wishpool.app/trust).

### 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](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/junter1989k-ai/sweden-invoice-mcp)

```bash
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

```json
{
  "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 + 50` both @25% β†’ taxable **150.00** / vat **37.50** / total **187.50**
- `200 @25% + 100 @6%` β†’ taxable **300.00** / vat **56.00** (50 + 6) / total **356.00**
- `2Γ—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

```bash
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](https://inv-se.wishpool.app/privacy).

## 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](https://logi.wishpool.app). Local payments in 81 countries: [mcp.wishpool.app](https://mcp.wishpool.app).

MIT licensed.