Skip to main content
Glama
junter1989k-ai

peru-invoice-mcp

README.md
# Peru Invoice MCP 🇵🇪 — How can my AI agent issue a factura o boleta electrónica in Peru?

<!-- 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": {
    "peru-invoice": {
      "type": "http",
      "url": "https://inv-pe.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/peru-invoice-mcp)

```bash
git clone https://github.com/junter1989k-ai/peru-invoice-mcp && cd peru-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 **Peru electronic CPE** (comprobante de pago electrónico — **factura** for B2B, **boleta** for consumers), declared to **SUNAT**. Aggregation layer: two interchangeable OSE/PSE backends — [Nubefact](https://www.nubefact.com) and [APISUNAT](https://apisunat.com) (PSE cloud) — behind the same tools. Stateless, bring-your-own credentials, never stores anything.

**Live endpoint:** `https://inv-pe.wishpool.app/mcp` · Registry: `app.wishpool/peru-invoice-mcp`

## Quick start

```json
{
  "mcpServers": {
    "peru-invoice": {
      "type": "http",
      "url": "https://inv-pe.wishpool.app/mcp",
      "headers": {
        "x-nubefact-ruta": "https://api.nubefact.com/api/v1/<your-hash>",
        "x-nubefact-token": "<your-token>"
      }
    }
  }
}
```

A free **DEMO** account at [nubefact.com](https://www.nubefact.com) gives you both a RUTA and a TOKEN (menu Api-Integración). The **same credentials** switch to production at the account level (numbering resets on go-live), so results report `mode: "nubefact-account"` honestly — verify demo vs production in your Nubefact dashboard.

### Or use APISUNAT (second backend)

Prefer [APISUNAT](https://apisunat.com)? Send its headers instead — the server auto-selects the backend from whichever credential you send (or force it with the tool's optional `provider` field: `"nubefact"` / `"apisunat"`):

```json
"headers": {
  "x-apisunat-persona-id": "<your-persona-id>",
  "x-apisunat-persona-token": "<your-persona-token>",
  "x-apisunat-ruc": "<your-11-digit-RUC>"
}
```

Free self-signup at [apisunat.com](https://apisunat.com); a **DEV** persona lets you test without sending to SUNAT before switching the persona to production (`mode: "apisunat-account"`). APISUNAT signs and sends your CPE with your persona's certificate (PSE model); this server only forwards the credentials.

## Tools

| Tool | What it does |
|---|---|
| `create_invoice` | Issue a **factura** (buyer 11-digit RUC) or **boleta** (consumer DNI/none). You supply `serie` (F001/B001) and the next `numero`; item prices go in **including IGV**, and this layer computes `valor_unitario`, `subtotal`, **IGV 18%** and totals. Returns the SUNAT link + PDF/XML. |
| `query_invoice` | Status check by `comprobante_type` + `serie` + `numero`: `ACCEPTED` / `PENDING` / `REJECTED`, plus `anulado` and PDF/XML/CDR links. |
| `cancel_invoice` | Void (anular — comunicación de baja) a CPE at SUNAT with a `motivo`. Asynchronous: confirm later with `query_invoice`. |

> ⚠️ **Numbering is merchant-managed.** This server is stateless and does **not** track sequences — the caller supplies `serie` and the next `numero`. Reusing a `numero` is rejected by SUNAT; skipping one leaves a gap.

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. The cap applies to the invoice total in **PEN**.

## Develop

```bash
node test/serve.js   # local server on :3229
node test/e2e.js     # protocol + validation + IGV math + fake-cred live probes
```

## Safety

Pure stateless translation layer. The SUNAT certification burden sits with the chosen backend (Nubefact or APISUNAT, OSE/PSE); credentials travel per-request in headers, nothing is stored. [Privacy policy](https://inv-pe.wishpool.app/privacy).

## Sister servers

Local payments in 81 countries, one family: [mcp.wishpool.app](https://mcp.wishpool.app) · Taiwan e-invoice 電子發票 included. Invoice family live: **Mexico CFDI 4.0** (`inv-mx.wishpool.app`). More invoice countries coming: Brazil NF-e · Chile DTE · Colombia · India GST · Poland KSeF · Italy SdI.

MIT licensed.