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:
[](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.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessSyncing