Skip to main content
Glama
junter1989k-ai

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:

[![Deploy with Vercel](https://vercel.com/button)](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.