norway-invoice-mcp
README.md
# Norway Invoice MCP ๐ณ๐ด โ How can my AI agent send a Peppol/EHF e-invoice in Norway?
<!-- 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": {
"norway-invoice": {
"type": "http",
"url": "https://inv-no.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:
[](https://vercel.com/new/clone?repository-url=https://github.com/junter1989k-ai/norway-invoice-mcp)
```bash
git clone https://github.com/junter1989k-ai/norway-invoice-mcp && cd norway-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 **Norway B2B electronic invoices** over the **Peppol** network in **Peppol BIS 3.0 / EHF (EN 16931)** format via **Storecove**, a certified Peppol Access Point. It builds the structured invoice, computes the Norwegian VAT (MVA) breakdown, and delivers it under the merchant's own Storecove account. Stateless, bring-your-own credentials, never stores anything.
**Live endpoint:** `https://inv-no.wishpool.app/mcp` ยท Registry: `app.wishpool/norway-invoice-mcp`
## Why now โ the mandate (elektronisk faktura EHF)
Norway is moving to mandatory structured e-invoicing over Peppol BIS 3.0 / EHF for domestic B2B: the parliament (**Stortinget**) has adopted the reform and the **sending obligation applies from 2027-01-01**. EHF (Elektronisk Handelsformat) is Peppol BIS Billing 3.0 based. Paper and plain-PDF invoices no longer satisfy the B2B obligation.
## Quick start
```json
{
"mcpServers": {
"norway-invoice": {
"type": "http",
"url": "https://inv-no.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 (organisasjonsnummer scheme `0192`). Returns `can_receive`. **The safe pre-flight.** |
| `create_invoice` | Build a Peppol BIS 3.0 / EHF invoice from seller + buyer (Norwegian VAT `NO<9 digits>MVA` / organisasjonsnummer, address) and line items (description, net unit price, VAT rate 25/15/12/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 NOK. Norwegian VAT (MVA) rates: **25** (standard), **15** (food/groceries), **12** (transport/accommodation and other low-rate services), **0** (zero-rated/exempt/reverse charge). Parties identified by **Norwegian VAT** (`NO<9 digits>MVA`) and/or **organisasjonsnummer** (9 digits); Peppol routing scheme **0192**.
**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 @15%` โ taxable **300.00** / vat **65.00** (50 + 15) / total **365.00**
- `2ร50 @25% + 3ร10 @15% + 1ร40 @12% + 1ร25 @0%` โ taxable **195.00** / vat **34.30** (25 + 4.50 + 4.80 + 0) / total **229.30**
- rounding: `33.33 @25%` โ 33.33 ร 0.25 = 8.3325 โ vat **8.33** / total **41.66**
## 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: 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 :3247
node test/e2e.js # VAT math + Peppol/EHF 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-no.wishpool.app/privacy).
## Sister servers
Local invoices, one family: Denmark Peppol/NemHandel (inv-dk) ยท Belgium Peppol BIS (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 the Nordics, 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.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessSyncing