Romania Invoice MCP
README.md
# Romania Invoice MCP 🇷🇴 — How can my AI agent issue an e-Factura factura electronica in Romania?
<!-- 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": {
"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](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/romania-invoice-mcp)
```bash
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
```json
{
"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` · PROD `https://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}` → stare `in prelucrare` | `ok` | `nok`
- Download: `GET /descarcare?id={id_descarcare}` → ZIP
## Develop
```bash
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](https://inv-ro.wishpool.app/privacy).
## 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](https://mcp.wishpool.app).
MIT licensed.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessSyncing