POP | Electronic Invoicing for Europe

by getpopapi

Not rated
GitHub

About

Generate compliant e-invoices (Peppol UBL, PDF, FatturaPA XML) and submit them directly to the Peppol Network, the Italian SdI and more

Details

Author
getpopapi
Categories
Finance

Setup

Install POP | Electronic Invoicing for Europe in your MCP client (Claude Desktop, Cursor, Windsurf, and others).

Repository: https://github.com/getpopapi/pop-mcp

Follow the installation instructions in the repository README, then restart your MCP client.

Generate compliant e-invoices (Peppol UBL, PDF, FatturaPA XML) and submit them directly to the Peppol Network, the Italian SdI and more

MCP (Model Context Protocol) server forPOP— enabling LLMs to generate, submit, and manage Italian e-invoices (FatturaPA/SdI), Peppol, KSeF, ZUGFeRD/Factur-X, and PDF invoices directly from AI assistants.

npm:@getpopapi/pop-mcp·Remote:https://mcp.popapi.io/mcp

Remote MCP (HTTP) — fastest way to get started

Don't want to install anything?pop-mcpruns as a hosted, multi-tenant MCP server at:

Head topopapi.ioto grab a license key, then point any MCP-speaking client at that URL with your key as a Bearer token. No local install, noPOP_API_KEYenv var, no build step — this is the recommended way to trypop-mcpfor most people. Use the local stdio setup below only if you specifically need a Claude Desktop config running a process on your own machine.

This endpoint speaks MCP2026-07-28, which is fully stateless: there is noinitializehandshake and no session to open or track. Every request is self-contained — it names its own protocol version and capabilities — and the server answers it independently. Because of that, this is amulti-tenantendpoint: it never reads a fixedPOP_API_KEYfrom its own environment. Every request must carry your own POP license key as a Bearer token:

Authorization: Bearer <your_license_key>

A missing or malformedAuthorizationheader returns a401witherror_code: "unauthorized_user"before any POP API call is made. An invalid-but-well-formed key is passed straight through to POP's API and surfaces whatever error POP returns (unauthorized_user,insufficient_level, etc.) — the server does not re-validate keys itself.

Any modern MCP HTTP client can connect: Claude (remote connector), the OpenAI Responses API, n8n,MCP Inspector, or a custom integration — not just Claude Desktop. All invoice, status, advanced, and onboarding tools are available; onboarding tools use their ownonboarding_tokenper call and don't require the Bearer key.

Discover the server's supported protocol versions and capabilities (optional — clients can also just calltools/listortools/calldirectly and handle a version-negotiation error inline):

curl -X POST https://mcp.popapi.io/mcp \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_license_key_here" \ -H "MCP-Protocol-Version: 2026-07-28" \ -H "Mcp-Method: server/discover" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "server/discover", "params": { "_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientCapabilities": {} } } }'

List the available tools — every request is self-contained, so_meta(protocol version + client capabilities) travels on every call, not just the first one:

curl -X POST https://mcp.popapi.io/mcp \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_license_key_here" \ -H "MCP-Protocol-Version: 2026-07-28" \ -H "Mcp-Method: tools/list" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": { "_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientCapabilities": {} } } }'

The tool catalog is identical for every license key, sotools/listandserver/discoverresponses carry a one-hour public cache hint (ttlMs: 3600000, cacheScope: "public") — clients and gateways may cache them across tenants.

MCP-Protocol-VersionandMcp-Methodare required on every request(per SEP-2243), and must match the body's_meta.protocolVersionandmethodexactly, or the server rejects the request with a400and JSON-RPC error-32020(HeaderMismatch).tools/callrequests additionally require anMcp-Nameheader matchingparams.name.

Configure it to connect tohttps://mcp.popapi.io/mcpwith headerAuthorization: Bearer <your_license_key>.

This endpoint runs as a Vercel serverless function (api/mcp.tssrc/mcpHandler.ts). To run it locally:npx vercel dev(requiresvercel linkto the project first).

POPis a cloud service for electronic invoice generation and delivery, supporting:

- 🇮🇹Italian e-invoicing (FatturaPA/SdI)— compliant with D.Lgs. 127/2015
- 🇪🇺Peppol— pan-European cross-border B2B invoicing (UBL 2.1)
- 📄PDF invoices— branded, with email delivery
- ✅Validation— fiscal codes, VAT numbers, document pre-submission checks
- 🗄️Preservation— Italian legal archival (conservazione sostitutiva)

- Node.js >= 20
- A
POPlicense key
- For SdI/Peppol submission: active integration on your POP account (Basic/Growth plan)

New to POP?Visitpopapi.ioto create your account and get your license key.

API-only users can activate their account and obtain alicense_keywith this flow:
- Open
https://popapi.io/otp-login/
- Enter your email address
- Receive a one-time password (OTP) by email and enter it
- Complete the configuration wizard
- Open
https://popapi.io/→Account > API
- Copy the default generatedlicense_key

- Your account includes one defaultlicense_key, visible underAccount > API
- You can generate additional keys linked to the same account from that same page
- Everylicense_keymust be treated as a secret credential — do not commit it to source control
- Get yourlicense_key
- Test it withGET /account-profile
- Send one document-generation request with a real payload
- Add optional delivery integrations only after local generation works

git clone https://github.com/getpopapi/pop-mcp cd pop-mcp npm install npm run build

Set your POP license key as an environment variable:

export POP_API_KEY=your_license_key_here

Add to yourclaude_desktop_config.json:

{ "mcpServers": { "pop": { "command": "pop-mcp", "env": { "POP_API_KEY": "your_license_key_here" } } } }
{ "mcpServers": { "pop": { "command": "node", "args": ["/path/to/pop-mcp/dist/cli.js"], "env": { "POP_API_KEY": "your_license_key_here" } } } }

- macOS:~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:%APPDATA%\Claude\claude_desktop_config.json
- Linux:~/.config/Claude/claude_desktop_config.json

Thelicense_keyis always injected automatically fromPOP_API_KEY— never pass it manually.

Generate an Italian FatturaPA XML document. Optionally submit it to the SdI (Sistema di Interscambio).

Integration options forintegration.use:

- "sdi-via-pop"or"sdi"— Submit via POP SdI
- "pop-to-webhook"— Deliver to a webhook (requiresid)
- "fatture-in-cloud"— Deliver to Fatture in Cloud

{ "license_key": "YOUR_LICENSE_KEY", "user_agent": "pop-mcp", "user_agent_version": "1.0.0", "data": { "...invoice fields..." }, "integration": { "use": "sdi-via-pop", "action": "create" } }

integrationis omitted whensubmit_to_sdiisfalseand no override is provided (XML-only generation).

Generate a Peppol UBL 2.1 document. Optionally submit it to the Peppol network.

Integration options forintegration.use:

- "peppol-via-pop"or"peppol"— Submit via POP Peppol
- "pop-to-webhook"— Deliver to a webhook (requiresid)

{ "license_key": "YOUR_LICENSE_KEY", "user_agent": "pop-mcp", "user_agent_version": "1.0.0", "data": { "...invoice fields..." }, "integration": { "use": "peppol-via-pop", "action": "create" } }

Generate a branded PDF invoice. Optionally email it to up to 3 recipients.

{ "license_key": "YOUR_LICENSE_KEY", "user_agent": "pop-mcp", "user_agent_version": "1.0.0", "data": { "...invoice fields...", "pdf": { "doc_type_title": "Invoice", "logo_url": "https://example.com/logo.png", "head": { "store_info_address": "Via Roma 1, 00100 Roma IT", "billing": [] }, "total_tax": "22.00", "email_invoice": { "to": ["customer@example.com"] } } } }

Generate a Polish KSeF FA(3) XML invoice or credit note. Optionally submit it through a configured KSeF provider integration.

- Poland only —transfer_lender.personal_data.tax_id_vat.country_idmust be"PL"with a 10-digit NIP asid_code
- customer_typemust be"company"or"freelance"(no private individuals)
- natureisalways requiredat the top level for KSeF (unlike SdI/Peppol, where it's only required at 0% VAT) — reuses the same SdI nature codes (N1,N2.1,N2.2,N3.1,N3.2,N4, ...) to derive KSeF's internal fiscal variant
- transmitter_datais not used (SdI-only concept)
- payment_data.payment_detailsonly acceptsMP01,MP02/MP03,MP05,MP08— other payment method codes are rejected at generation time
- Base XML generation is available on any plan; provider submission viaintegration.use: "ksef"requires a Basic+ plan and the supplier already enrolled as a KSeF legal entity in the POP dashboard

{ "license_key": "YOUR_LICENSE_KEY", "user_agent": "pop-mcp", "user_agent_version": "1.0.0", "data": { "...invoice fields...", "nature": "N1" }, "integration": { "use": "ksef", "action": "create" } }

integrationis omitted entirely for local XML-only generation (no provider submission).

Returns:raw FA(3) XML (application/xml) for local generation, or JSON (with a UUID) when submitted through a provider integration.

Generate a ZUGFeRD/Factur-X document package: a visual PDF, an EN16931 CII XML, and a hybrid PDF/A-3 with the XML embedded.

This tool has nointegrationparameter — ZUGFeRD generation is local only, with no submit/delivery step.

{ "license_key": "YOUR_LICENSE_KEY", "user_agent": "pop-mcp", "user_agent_version": "1.0.0", "data": { "...invoice fields..." } }

Returns:JSON with generation metadata and three Base64-encoded attachments:

{ "success": true, "data": { "valid": true, "profile": "EN16931", "attachments": { "pdf": { "filename": "...", "mime": "application/pdf", "content_base64": "..." }, "xml": { "filename": "...", "mime": "application/xml", "content_base64": "..." }, "hybrid_pdf": { "filename": "...", "mime": "application/pdf", "content_base64": "..." } }, "validation": { "...": "..." }, "errors": [], "warnings": [] } }

Retrieve the SdI processing status and notifications for a submitted invoice.

{ "license_key": "YOUR_LICENSE_KEY", "integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } }

SdI notification statuses:pending·accepted·rejected·delivery

SdI processing is asynchronous and can take minutes to hours. Retry if no notifications are returned yet.

Retrieve a Peppol document from the network by UUID.

{ "license_key": "YOUR_LICENSE_KEY", "integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "zone": "IT" } }

zoneis omitted from the payload if not provided.

Retrieve an archived SdI (FatturaPA) document from POP storage by UUID.

{ "license_key": "YOUR_LICENSE_KEY", "integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } }

Requires: Basic+ plan with active SdI integration.

Validate an SdI XML document for compliance before submission. Does not submit the document.

{ "license_key": "YOUR_LICENSE_KEY", "skip_business_check": true, "integration": { "xml": "<base64-encoded-xml-string>" } }

Validation checks performed:XML schema conformance · fiscal code format · VAT number validity · required field presence · amount consistency

Requires: Basic+ plan with active SdI integration and registered business.

Archive an SdI document in certified long-term digital storage (conservazione sostitutiva). Italian law requires invoices to be preserved for 10 years.

{ "license_key": "YOUR_LICENSE_KEY", "integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } }

Important:Only call this tool whenpop_get_invoice_statusreturns statusRC(Ricevuta di Consegna) orMC(Mancata Consegna). Do not call for statusesNS,EC,SE, orDT.

Requires: Basic+ plan with active SdI integration.

Generate a Simple Italian Invoice (XML Only)

"Create a FatturaPA invoice for 1000€ + 22% VAT to Rossi SRL (VAT IT12345678901, Milan). My company is Bianchi SRL (VAT IT98765432109, Rome), using payment method bank transfer to IBAN IT60X0542811101000000123456."

"Create and submit to SdI an invoice #45 for consulting services, 500€ + 22% VAT to customer Mario Rossi (fiscal code RSSMRA80A01H501U) in Rome."

"What's the status of SdI invoice with UUID abc123-def456-...?"

"Create a PDF invoice for order #123 and email it tocustomer@example.com."

"Verify SdI document with UUID abc123-... for compliance before submission."

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.