Romania Invoice MCP π·π΄ β How can my AI agent issue an e-Factura factura electronica in Romania?
Use it in 60 seconds
Paste this into your MCP client config (Claude Desktop, Cursor, Windsurf, or any MCP-capable agent):
{
"mcpServers": {
"romania-invoice": {
"type": "http",
"url": "https://inv-ro.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/romania-invoice-mcp && cd romania-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 issue Romania e-Factura electronic invoices (factura electronica) into the national ANAF/SPV system. It builds UBL 2.1 CIUS-RO XML (Romania's CIUS of EN 16931) and uploads it under the merchant's own ANAF access token. Stateless, bring-your-own credentials, never stores anything.
Live endpoint: https://inv-ro.wishpool.app/mcp Β· Registry: app.wishpool/romania-invoice-mcp
Quick start
{
"mcpServers": {
"romania-invoice": {
"type": "http",
"url": "https://inv-ro.wishpool.app/mcp",
"headers": {
"x-anaf-token": "<your ANAF access token>",
"x-anaf-cif": "RO12345678"
}
}
}
}
You complete a one-time ANAF OAuth in your browser with your qualified digital certificate and hold the access token (~90 days) + refresh token (~365 days). Requests default to the ANAF test rail (no fiscal effect); add x-anaf-mode: production for the live rail. Your certificate never reaches this server.
Tools
| Tool | What it does |
|---|---|
create_invoice | Build a UBL 2.1 CIUS-RO invoice from customer CIF + name + address + lines (name, qty, net unit price, VAT rate 19/9/5/0) and upload to ANAF e-Factura. Returns index_incarcare + computed VAT totals. |
query_invoice | Poll ANAF status by index_incarcare: PROCESSING (in prelucrare), ACCEPTED (ok), REJECTED (nok); returns download_id when finished. |
download_invoice_result | Download the ANAF response ZIP (base64) by download_id β signed XML if accepted, error report if rejected. |
Amounts are in RON. No cancel at API level β corrections are new invoices. Token refresh is out of scope in v1 (the merchant refreshes via their own ANAF OAuth app).
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.
Endpoints wrapped (ANAF e-Factura REST)
- Base: TEST
https://api.anaf.ro/test/FCTEL/restΒ· PRODhttps://api.anaf.ro/prod/FCTEL/rest - Upload:
POST /upload?standard=UBL&cif={cif}(raw UBL XML body) βindex_incarcare - Status:
GET /stareMesaj?id_incarcare={index}β starein prelucrare|ok|nok - Download:
GET /descarcare?id={id_descarcare}β ZIP
Develop
node test/serve.js # local server on :3232
node test/e2e.js # protocol + validation + VAT math + UBL structure + fake-token live probes
Safety
Pure stateless translation layer over the national ANAF e-Factura API. The qualified certificate and OAuth stay with the merchant; the access token travels per-request in a header, nothing is stored. Privacy policy.
Sister servers
Local invoices, one family: Mexico CFDI (inv-mx) Β· Brazil NF-e (inv-br) Β· Chile DTE (inv-cl) Β· Peru CPE (inv-pe) Β· India GST (inv-in). Local payments in 81 countries: mcp.wishpool.app.
MIT licensed.