mcp-invoice
Servidor MCP gratuito y alojado: crea facturas con líneas de impuestos e IVA, genera PDFs profesionales, y sigue el estado de pago — desde Claude o cualquier cliente MCP.
Documentación
Genera y envía facturas desde Claude con un servidor MCP gratuito
Servidor MCP para generación de facturas: un generador de facturas que puede crear una factura PDF numerada con IVA para tus clientes. Facturas numeradas con líneas de impuestos, renderizadas en un PDF profesional.
Funciona con Claude Desktop, Claude Code, Cursor y cualquier cliente del Model Context Protocol. Se ejecuta en tu propia máquina, o alojado sin necesidad de instalación.
Página del producto: https://mcp.zovo.one/s/invoice — qué hace, las herramientas que expone y un endpoint de token en vivo.
Instalación
Alojado, nada que instalar. Obtén un token de https://mcp.zovo.one/mcp/connect (la página de conexión) o https://mcp.zovo.one/mcp/token (el mismo token como JSON); se emite uno anónimo gratuito al instante y una clave Pro funciona de la misma manera. Luego apunta un cliente MCP a https://mcp.zovo.one/mcp/invoice a través de streamable-http y envía el token como Authorization: Bearer <token>.
Si tu cliente no puede configurar cabeceras, coloca el token en la ruta en su lugar: https://mcp.zovo.one/mcp/invoice/t/<token>. Ambas formas funcionan. La URL desnuda sin token responde 401 en tools/call, por lo que el token no es opcional.
Claude Desktop, un clic. Descarga invoice.mcpb desde la última versión y haz doble clic en él.
Desde el código fuente. El espejo es autocontenido: cada dependencia de @theluckystrike/* está incluida, por lo que un clon nuevo se compila sin configuración adicional.
git clone https://github.com/theluckystrike/mcp-invoice-generator.git
cd mcp-invoice-generator
npm install && npm run build
Luego apunta tu cliente al punto de entrada compilado:
{
"mcpServers": {
"invoice": {
"command": "node",
"args": ["/absolute/path/to/mcp-invoice-generator/dist/index.js"]
}
}
}
@theluckystrike/mcp-invoice-generatoraún no está publicado en npm, por lo que un comandonpx -y @theluckystrike/mcp-invoice-generatorfallará. Las tres rutas anteriores son las que funcionan y cada una es verificada por CI.

Espejo de solo lectura de mcp-servers/servers/invoice. Consulta MIRROR.md.
Listado en el AI Product Index — endpoint remoto en vivo en mcp.zovo.one/s/invoice, plan gratuito, sin registro.
Destacado en Awesome MCP Servers — listado del directorio | endpoint alojado en vivo, plan gratuito, sin registro.
Di "haz una factura para Acme, 12 horas a 90 EUR, vencimiento en 14 días" y obtén un PDF real que puedes enviar. Este servidor MCP almacena tu perfil de negocio y tus clientes, asigna un número de factura secuencial que nunca se reutiliza, calcula el subtotal, cualquier descuento, una línea de impuestos por cada tipo de IVA y el total en unidades monetarias enteras, y renderiza un PDF A4 con tus datos de emisor y pago, una tabla de elementos ajustada y un bloque de totales adecuado. También registra pagos y, en Pro, informa qué está vencido y por cuántos días. Todo se almacena en archivos JSON simples en tu propia máquina; nada se sube a ningún lugar.
En el Registro Oficial de MCP (io.github.theluckystrike/invoice-pdf-billing-generator).
Crea facturas numeradas con líneas de impuestos y un PDF real desde el chat, sin necesidad de un SaaS de facturación.
Instalación en 60 segundos
La publicación en npm para @theluckystrike/mcp-invoice está pendiente. Hasta entonces, el paquete de un clic .mcpb o un clon+compilación
es la ruta que funciona, ambas verificadas a continuación.
Un clic (.mcpb): descarga invoice.mcpb desde la última versión y haz doble clic en él en Claude Desktop:
https://github.com/theluckystrike/mcp-servers/releases/latest
(claude_desktop_config.json):
{
"mcpServers": {
"invoice": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-invoice"]
}
}
}
Claude Code:
claude mcp add invoice -- npx -y @theluckystrike/mcp-invoice
(.cursor/mcp.json):
{
"mcpServers": {
"invoice": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-invoice"]
}
}
}
La forma npx anterior comienza a funcionar en el momento en que se publica el paquete. Hasta entonces, usa el paquete .mcpb anterior, o
compila desde el código fuente con exactamente estos tres comandos:
git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-servers
npm install
npm run build -w packages/mcp-license -w servers/invoice
Luego apunta el command de tu cliente a node con un argumento: la ruta absoluta a servers/invoice/dist/index.js.
Para ejecutar en modo Pro, establece MCP_LICENSE_KEY en el mismo bloque de configuración, o llama a license_activate una vez con tu clave.
Herramientas
| Herramienta | Qué hace |
|---|---|
business_set | Almacena el perfil del emisor: nombre, dirección, correo electrónico, ID de IVA, IBAN, banco, logotipo, moneda predeterminada, tipo de impuesto predeterminado, condiciones de pago, prefijo de factura. tax_rate, vat_rate y vat se aceptan como alias para default_tax_rate, y cualquier campo no reconocido se informa en lugar de descartarse |
client_add | Añade o actualiza un cliente (nombre, dirección, correo electrónico, ID de IVA). Un registro idéntico a uno ya almacenado se rechaza, indicando el id que lo contiene, por lo que el mismo cliente no puede almacenarse dos veces |
client_delete | Elimina un cliente almacenado que nada utiliza. Se rechaza, indicando el documento, mientras una factura, presupuesto, nota de crédito, orden de compra, depósito, estado de cuenta o programación recurrente aún lo referencie |
client_list | Lista los clientes almacenados con sus ids |
invoice_create | Crea una factura a partir de líneas de elementos; asigna el siguiente número, calcula descuento, impuestos por tipo y total. Los elementos pueden llevar un currency por línea, y una mezcla se rechaza en lugar de facturarse como una sola moneda. Si el cliente se crea a partir de un nombre simple, la respuesta indica que el bloque BILL TO no tiene dirección y cómo añadirla |
invoice_from_hours | Atajo: factura a un cliente por N horas a una tarifa horaria. target_currency + fx_rates emiten la factura en otra moneda (tú proporcionas la tasa); entry_ids regresan con el nuevo número de factura para que las horas registradas puedan cerrarse con el entry_mark_billed del rastreador de tiempo |
invoice_list | Lista facturas, filtradas por estado, cliente y rango de fechas de emisión |
invoice_get | Registro completo almacenado para un número de factura |
invoice_mark_paid | Registra un pago total o parcial; informa el saldo pendiente |
invoice_pdf | Renderiza el PDF A4 y devuelve la ruta del archivo. La respuesta llama al archivo PDF solo cuando lo es |
overdue_report | Facturas impagadas vencidas, días de retraso, totales pendientes por moneda. Gratuito |
license_status | Muestra el modo gratuito o Pro |
license_activate | Activa una clave Pro (verificada sin conexión) |
Recurso: invoices://open devuelve cada factura impagada o parcialmente pagada como JSON.
Indicación: monthly_invoicing revisa qué está impagado y qué está vencido durante un mes, y luego redacta la siguiente factura.
Lo que puedes decir
| Tú dices | Herramienta |
|---|---|
| "Configura mi negocio: Acme Consulting, EUR, 23% IVA, condiciones de 14 días." | business_set |
| "Añade un cliente: Beta Corp, su ID de IVA es..., correo billing@beta.example." | client_add |
| "Lista mis clientes." | client_list |
| "Elimina ese cliente duplicado Beta Corp." | client_delete |
| "Factura a Acme por 12 horas a 90 EUR más 300 EUR de configuración, 23% IVA, PDF." | invoice_create + invoice_pdf |
| "Cobra a Beta Corp por 5 horas a 120 EUR." | invoice_from_hours |
| "Muéstrame cada factura impagada de agosto." | invoice_list |
| "Trae la factura INV-2026-0007." | invoice_get |
| "Marca INV-2026-0007 como pagada en su totalidad." | invoice_mark_paid |
| "¿Qué facturas están impagadas y vencidas?" | overdue_report |
| "¿Estoy en el plan gratuito o en Pro?" | license_status |
Ejemplo práctico
Desde docs/USER_VALUE_R2.md, la solicitud exacta probada de extremo a extremo y verificada de forma independiente contra la
aritmética.
You: Invoice Acme for 12 hours of API work at 90 EUR plus a 300 EUR setup fee,
23% VAT, due in 14 days, and give me the PDF.
invoice_create {
client: "Acme", currency: "EUR", due_days: 14,
items: [
{ description: "API work", quantity: 12, unit_price: 90, tax_rate: 23 },
{ description: "Setup fee", quantity: 1, unit_price: 300, tax_rate: 23 }
]
}
-> INV-2026-0001, client "Acme" created with no address on file
invoice_pdf { number: "INV-2026-0001" }
-> /Users/you/.../invoice/pdf/INV-2026-0001.pdf
Assistant: Created INV-2026-0001 for Acme.
API work 12 h x EUR 90.00 = EUR 1080.00
Setup fee 1 x EUR 300.00 = EUR 300.00
Subtotal EUR 1380.00
Tax 23% on EUR 1380.00 EUR 317.40
Total EUR 1697.40
Note: Acme was created from a bare name with no address. Add one with
client_add before you send this. PDF: INV-2026-0001.pdf
La aritmética: 12 x 90 = 1080,00, más 300,00 = 1380,00 de subtotal; 23% de 1380,00 = 317,40; total 1697,40 EUR. Cada importe en el PDF y en la respuesta de texto lleva su código de moneda, nada se muestra nunca como un número simple.
Gratis vs Pro
| Gratis | Pro | |
|---|---|---|
| Facturas | 3 por mes calendario | Ilimitadas |
overdue_report | Sí, ilimitado | Sí, ilimitado |
| Lleva la línea "Generated with mcp-invoice by theluckystrike" | Sin marca | |
| Logotipo en el PDF | No | Sí |
| Prefijo de factura personalizado | No, fijo INV | Sí |
| Clientes, líneas de impuestos, descuentos, pagos, multimoneda | Sí | Sí |
Pro es un pago único de $19, o $39 por cada servidor de la colección, de por vida.
Números y dinero
Los números de factura son PREFIX-YYYY-NNNN. El contador se persiste por prefijo y año y se escribe antes de almacenar la factura, por lo que un fallo quema un número en lugar de reutilizarlo; los números existentes también se escanean para que un archivo de datos restaurado nunca pueda devolver un número que ya esté en un documento enviado.
Cada valor monetario impreso en cualquier lugar — precios unitarios por línea, importes por línea, subtotal, descuento, cada línea de impuestos, el total y el saldo pendiente, en la respuesta de texto y en el PDF — lleva su código de moneda, por ejemplo EUR 1080.00. Ningún importe se muestra nunca como un número simple.
Todos los importes se mantienen como unidades monetarias enteras. Cuántas componen una unidad proviene de una tabla ISO 4217, no de una suposición: 2 para la mayoría de las monedas, 0 para JPY, KRW, VND, CLP, ISK y el resto de la lista de cero decimales, 3 para BHD, IQD, JOD, KWD, LYD, OMR y TND, 4 para CLF y UYW. KWD 1.234 es 1234 unidades menores, no 123. La tabla es idéntica a la de mcp-expense-tracker, porque los dos servidores intercambian importes y una moneda que tiene 3 decimales en uno y 2 en el otro reescalaría el dinero por diez. HUF tiene 2 decimales: ISO 4217 le asigna dos dígitos menores aunque normalmente se cotice sin ellos. El redondeo es por línea y luego se suma: el bruto de cada línea se redondea primero, se aplica un discount_percent a nivel de factura y se redondea por línea, el impuesto se calcula y redondea por línea y luego se agrupa en una línea por tipo, y los totales son sumas enteras simples de esos valores ya redondeados. Por lo tanto, un total impreso nunca puede discrepar de las líneas impresas. Las fechas son ISO YYYY-MM-DD.
Cómo almacena los datos
El perfil de negocio, los clientes, las facturas y el contador de números se encuentran en
${XDG_DATA_HOME:-~/.local/share}/mcp-servers/invoice/ como archivos JSON separados, más una subcarpeta pdf/
que contiene los PDF renderizados. Cada llamada de mutación (business_set, client_add, invoice_create,
invoice_from_hours, invoice_mark_paid) se ejecuta dentro de locked(), que toma un archivo de bloqueo de asesoría en
.../invoice/.lock durante la duración de la llamada; esto es lo que hace segura la asignación de números cuando dos
facturas se crean en el mismo segundo, ya que la lectura del contador, el incremento y la escritura de la factura ocurren todos
bajo un mismo bloqueo. Los guardados van a un archivo temporal y se renombran en su lugar. Para respaldar tus datos de facturación,
copia todo el directorio de datos invoice/, incluyendo pdf/ si también quieres los archivos renderizados; siempre pueden
regenerarse a partir de los registros almacenados con invoice_pdf.
Si uno de esos archivos JSON es ilegible o no es JSON válido, nunca se trata como "vacío". El archivo se
mueve a un lado byte por byte como <name>.json.corrupt-<timestamp>, se escribe un marcador <name>.json.corrupt,
y cada herramienta devuelve data file is corrupt; moved to ...; nothing was written hasta que restaures una copia
buena y elimines el marcador. Un clients.json truncado ya no puede ser reemplazado silenciosamente por una lista
de clientes vacía.
Límites y advertencias honestas
- El plan gratuito permite 3 facturas por mes calendario; el contador se reinicia el día 1.
overdue_reporty todo lo demás (clientes, líneas de impuestos, descuentos, pagos, multimoneda) no tiene restricciones en el plan gratuito. - Los clientes nunca se miden: la lista de clientes es ilimitada en el plan gratuito y en Pro.
client_addaún rechaza un registro idéntico a uno almacenado, yclient_deleteelimina un cliente no utilizado, por lo que un registro mal escrito o duplicado siempre puede deshacerse sin una clave de licencia. Un cliente al que cualquier documento haga referencia no puede eliminarse. - Los PDF gratuitos llevan una pequeña línea de pie de página "Generated with mcp-invoice"; Pro la elimina y añade un logotipo.
- Crear una factura para un nombre de cliente que el servidor nunca ha visto crea ese cliente sin dirección;
la respuesta lo indica y nombra
client_addcomo la solución, pero nada te impide enviar un PDF con un bloque BILL TO de nombre simple si ignoras la nota. - Este servidor omite el envío de correos electrónicos, los enlaces de pago y la sincronización con software de contabilidad: produce el PDF y el registro; hacer que llegue al cliente depende de ti.
- La conversión de moneda no se realiza en ningún lugar; la moneda de una factura se fija en la creación y cada línea debe usar importes ya en esa moneda.
Solución de problemas
npxse cuelga o no encuentra el paquete: la publicación npm de este paquete está pendiente. Usa el paquete.mcpbo la ruta de clonar y compilar indicada arriba hasta que esté disponible.- Usar el paquete
.mcpb: se instala directamente en Claude Desktop; no hay un paso de configuración separado. - Usar la ruta de clonación: el binario del servidor es
servers/invoice/dist/index.jsdespués denpm run build. Apunta elcommandde tu cliente anodecon esa ruta absoluta como único argumento. - Versión de Node: requiere Node >= 18. Verifica con
node -v. - Monedas mixtas: un artículo puede llevar su propio
currency. Cada línea de una misma factura debe coincidir con la moneda de la factura; una mezcla se rechaza y el mensaje indica la llamada de conversión a realizar (expense_to_invoicecontarget_currencyyfx_rates) en lugar de facturar silenciosamente una línea en EUR bajo un encabezado en USD. Si no haycurrencyen la factura, una única moneda de artículo acordada se convierte en la de la factura. - Sin perfil de negocio aún: la facturación nunca se bloquea por ello.
invoice_createyinvoice_from_hoursemiten el documento con el emisor provisional "Your business" y lo indican en una línea; ejecutabusiness_set {name, address, vat_id, iban}y renderiza el PDF de nuevo para reemplazarlo. - El renderizado del PDF falla o se ve mal:
invoice_pdfusapdfkit, un renderizador puro en JS sin dependencia nativa, por lo que los fallos casi siempre se deben a un campobusiness_setfaltante o mal formado (revisainvoice_getprimero) más que a un problema del entorno. - "3 facturas este mes" aparece inesperadamente: el límite gratuito es por mes calendario en todos los clientes,
no por cliente.
invoice_listmuestra lo que ya ha contado contra ese límite. - No aparece nada / fallos silenciosos: los registros van solo a stderr, nunca a stdout. En Claude Desktop revisa
Configuración -> Desarrollador -> el archivo de registro del servidor; en Claude Code revisa la terminal o
--mcp-debug.
Privacidad
Todos los datos permanecen locales, en ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/invoice/. No hay llamadas de red: las claves de licencia se verifican sin conexión con una clave pública compilada en el paquete, y los PDF se renderizan en tu máquina.
Se combina con
- mcp-time-tracker, la salida de
invoice_summaryallí se mapea directamente a los artículos de línea deinvoice_createaquí. - mcp-spreadsheet, extrae artículos de línea o listas de clientes de una hoja antes de facturar.
- mcp-price-tracker, factura a un cliente por algo cuyo precio has rastreado.
- office-suite, todos los servidores hermanos detrás de una instalación, una entrada de configuración.
- Guía: Create an invoice PDF from a chat message with an MCP server
Preguntas frecuentes
Sí. La tasa de impuesto es por artículo de línea. El bloque de totales imprime una línea de impuesto por cada tasa distinta, por lo que una línea al 23% y una línea de cargo inverso al 0% aparecen por separado y el total suma correctamente.
Es una sola página A4 con bloques de emisor y cliente, fechas, una tabla de líneas con impuesto por línea, subtotal, líneas de impuesto, total y detalles de pago con IBAN y referencia. Añade la dirección del cliente con client_add
primero; de lo contrario, BILL TO muestra solo el nombre.
INV-YYYY-NNNN, asignados en secuencia y nunca reutilizados. El prefijo es configurable con business_set;
un prefijo distinto de INV es una función Pro.
No. El renderizado es local con pdfkit, y los registros de facturas viven en
~/.local/share/mcp-servers/invoice/. El servidor no realiza ninguna llamada de red.
Los montos son unidades menores enteras. Cada línea se redondea una vez, luego se suman las líneas, por lo que 12 h a 90 EUR más 300 EUR con IVA al 23% da 1380.00 más 317.40 = 1697.40 sin residuo de punto flotante.
Construido por theluckystrike.
Un perfil de negocio para toda la suite
Tu identidad se almacena una vez, en ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/profile/business.json,
y cada servidor de la suite la lee: el emisor de facturas, el membrete de docx, el emisor
recurrente, la tasa de IVA predeterminada de expense-tracker, la zona horaria de time-tracker y timezone, y los
membretes de currículum y contrato. Configúralo una vez con business_set (invoice o docx) - nunca lo
repitas en ningún otro lugar. Una dirección de correo electrónico solo se toma de ese perfil o de un
argumento explícito; cuando no hay ninguna almacenada, los documentos muestran [add: email] y la herramienta lo indica en lugar de
permitir que alguien improvise una dirección.
Preguntas frecuentes
¿Hay un servidor MCP gratuito para facturas?
Sí. El servidor de facturas en mcp.zovo.one es un servidor MCP gratuito para facturas: crea facturas con artículos de línea con líneas de impuesto e IVA desde Claude o cualquier cliente MCP, renderiza un PDF profesional y rastrea el estado de pago. Tres facturas por mes calendario son gratuitas, sin instalación requerida: pegas una URL alojada en tu cliente.
¿Cómo genero una factura desde Claude?
Conecta el endpoint alojado https://mcp.zovo.one/mcp/invoice (copia la URL tokenizada de mcp.zovo.one/mcp/connect), luego di: 'Factura a Acme por 12 horas a 90 EUR con IVA al 23%, vencimiento en 14 días.' Claude crea la factura numerada y devuelve un PDF.
Usa estos documentos como un servidor MCP
Cualquier cliente MCP (Claude, Cursor, Windsurf, VS Code) puede leer la documentación de este repositorio directamente a través de GitMCP — sin instalación:
- URL de Docs MCP: https://gitmcp.io/theluckystrike/mcp-invoice