Invoice numberer
This MCP server lets you batch-number PDF invoices locally and offline, stamping correlative numbers on every page without modifying originals.
Process PDF files or all PDFs in given folders, non-recursively.
Sort inputs by natural filename order, modification date, or provided order.
Format numbers with templates like
F-{n:4}and set start or end numbers.Place numbers by left/right/top/bottom edge and millimeters from each edge.
Customize font, size, color, and optional background box with color and margin.
Optionally merge all numbered invoices into one PDF and/or produce a ZIP.
Write numbered copies to an output folder, defaulting to
numeradasbeside the first file.Use dry-run mode to report assigned numbers without writing anything.
Open password-protected PDFs when a password is supplied; numbered copies are unprotected.
Keep PDFs local with no network access and leave original files unchanged.
numerador-facturas
Numera facturas PDF en lote desde el navegador. Estampa un número correlativo
(F-0001, F-0002…) en todas las páginas de cada factura y te devuelve un ZIP listo
para entregar. Todo ocurre del lado del cliente: los PDFs nunca salen de tu equipo.
Resuelve el trámite de foliar o numerar un lote de facturas sin subir documentos sensibles a ningún servicio y sin software de escritorio.
Web: https://nuncaeslupus.github.io/numerador-facturas/
Inicio rápido
make sync # npm install
make dev # servidor localAbre el navegador, arrastra tus PDFs, define la plantilla de numeración y descarga el ZIP.
Related MCP server: invovate-mcp-server
Ejemplo
Plantilla F-{n:4} sobre tres archivos empezando en el número 1:
plantilla "F-{n:4}", número 7 -> F-0007
rango de 3 archivos, inicio 1 -> del 1 al 3
factura-1.pdf -> F-0001_factura-1.pdf
factura-2.pdf -> F-0002_factura-2.pdf
factura-3.pdf -> F-0003_factura-3.pdfEl número se estampa en cada página; la salida es un ZIP con un PDF por factura y/o un único PDF con todas unidas.
Uso
Archivos — elige o arrastra los PDFs. Se ordenan por nombre (orden natural:
2antes que10) o por fecha de modificación; luego puedes reordenarlos arrastrando o con ↑ ↓.Numeración — plantilla con un marcador:
{n:4}rellena con ceros (0007),{n}sin ceros. Indica el número inicial o el final; el otro se calcula según el número de archivos. Si das ambos y no cuadran, avisa.Posición y aspecto — haz clic en la vista previa o escribe la distancia en mm desde la izquierda/derecha y desde arriba/abajo (por defecto, 10 mm de la esquina superior derecha). Así funciona igual en A4 y en recibos más bajos. Fuente, tamaño y color del número, y un recuadro opcional detrás con su color y margen.
Resultado — un ZIP con un PDF por factura (
F-0001_original.pdf) y/o un único PDF con todas juntas.
Los PDFs protegidos se abren: si piden contraseña, la página la pregunta (no se guarda). La copia numerada sale sin protección. Los archivos que no se pueden leer se avisan arriba de la lista y no se numeran.
Disponible en español, inglés, francés, italiano, alemán y chino (según el idioma del
navegador, o el que elijas arriba). La configuración se recuerda en el navegador
(localStorage).
Privacidad
Sitio estático sin backend. La página lleva una Content-Security-Policy que solo permite
cargar recursos del propio sitio, y un test comprueba que el código no hace peticiones de
red (fetch, XHR, WebSocket…).
Usar desde una IA (MCP)
La web no tiene API: lo que usa un LLM es mcp/, un servidor MCP sin UI que
reutiliza el código de src/ y se ejecuta en tu equipo, sin red. La propia web explica cómo
instalarlo y sirve el .mcpb para Claude Desktop y un
llms.txt para los LLM.
Desarrollo
Vite + TypeScript, @cantoo/pdf-lib (pdf-lib con soporte de cifrado) para estampar y unir, pdf.js para la vista previa y fflate para el ZIP.
make sync # npm install
make dev # servidor local
make check # formato, lint, tipos, build y testsLos tests usan PDFs sintéticos. Cada push a main se publica en GitHub Pages
(.github/workflows/deploy.yml).
Este repo sigue el flujo spec → diseño → ejecución de
claude-arsenal: ver
status/specification.md y status/plan.md.
Proyectos relacionados
claude-arsenal — flujo spec-driven para Claude Code y cola de tareas con gates.
drawspec — spec declarativo de diagramas → SVG/PNG/texto limpio, escribible por LLMs; incluye servidor MCP.
doc-control — permite a agentes de IA editar documentos Word como cambios con control de versiones.
literary-critic — análisis de manuscritos con LLM como lo haría un editor profesional.
integral-job-search — búsqueda de empleo centrada en el candidato, dentro de Claude Code.
Licencia
MIT — ver LICENSE.
Available Tools
1 toolnumber_invoicesNumerar facturasA
Stamps a correlative number (F-0001, F-0002…) on every page of each PDF invoice in a batch and writes numbered copies to a new folder. Numera facturas PDF en lote. Runs locally and offline: the PDFs stay on this computer and the originals are not modified.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Last number. Given alone, the first is worked out from the file count | |
| zip | No | Also write a ZIP of the numbered PDFs | |
| font | No | Helvetica | |
| x_mm | No | Distance from that edge, in mm | |
| y_mm | No | Distance from that edge, in mm | |
| color | No | Number color, #rrggbb | #000000 |
| merge | No | Also write one PDF with every invoice joined | |
| paths | Yes | Absolute paths of PDF files, or folders whose PDFs are all taken (not recursive) | |
| start | No | First number. Defaults to 1 | |
| from_x | No | Horizontal reference edge | right |
| from_y | No | Vertical reference edge | top |
| dry_run | No | Report which number each file would get, writing nothing | |
| size_pt | No | Font size in points | |
| sort_by | No | name: natural order (2 before 10). date: oldest modified first. given: as listed | name |
| password | No | Password of protected PDFs. It passes through the chat: ask only if the tool reports locked files. Numbered copies come out unprotected | |
| template | No | Number format with one marker: {n:4} pads to 4 digits (0007), {n} does not pad | F-{n:4} |
| box_color | No | Box color, #rrggbb | #ffffff |
| background | No | Draw a box behind the number | |
| box_pad_mm | No | Margin between number and box edge | |
| output_dir | No | Absolute folder for the results. Defaults to 'numeradas' beside the first file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false; the description reinforces this by explaining the write goes to copies in a new folder while originals are untouched, and that everything runs locally and offline. It stops short of describing failure modes (locked PDFs, bad paths) or what the tool reports back.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and the output destination. The Spanish restatement 'Numera facturas PDF en lote' largely duplicates the title 'Numerar facturas' and is the only wasted line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter tool with no output schema, the description covers the core behavior and the non-destructive local guarantee but says nothing about what the call returns (e.g., which numbers were assigned, where files landed) or how dry_run output differs. An agent can call it, but not predict the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 95%, so the 20 parameters are already well documented in the schema. The description only adds the numbering-format illustration (F-0001), without explaining start/end ranges, sort order, dry_run, or password handling. Baseline 3 applies when the schema carries the weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (stamps a correlative number) with a concrete example format (F-0001, F-0002…), names the resource (PDF invoices in a batch), and states the outcome (numbered copies written to a new folder). There is no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope (batch of PDF invoices) is clear and there are no sibling tools to disambiguate against, but the description never states when to reach for it versus alternatives, nor any exclusions or prerequisites. Usage must be inferred from the scenario rather than being spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.0- First observed
number_invoices
TDQS
Scored across 1 tool
There is only one tool, so there is no possibility of misselection between competing tools. Its purpose (batch-numbering PDF invoices) is stated clearly and unambiguously.
The single name 'number_invoices' follows a clean verb_noun snake_case pattern. No competing conventions exist to create inconsistency.
The server has a deliberately narrow, single-purpose scope, so one tool is defensible rather than an oversight. It is on the thin side (no separate preview/configure operations), which keeps it just below a perfect score.
Core behavior (stamp sequential numbers, write to a new folder, leave originals untouched) is covered, but obvious adjacent operations are absent: choosing a prefix or starting number, dry-run/preview, resuming numbering across batches, or undoing a run. Agents can work around these only by post-processing output themselves.
Maintenance
Related MCP Connectors
Create PDF invoices from your AI chat: clients, numbering, VAT, overdue reports. All data is local.
Create PDF invoices from your AI chat: clients, numbering, VAT, overdue reports. All data is local.
Create PDF invoices from your AI chat: clients, numbering, VAT, overdue reports. All data is local.
Make PDF invoices from your AI chat: clients, numbering, VAT, overdue reports. All data is local.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables the generation of professional PDF invoices and their distribution via email using customizable templates. It allows users to create, manage, and send invoices with standard business fields like tax rates and line items through natural language.319 npm2MIT
- AlicenseAqualityDmaintenanceCreate invoices from any MCP client via the Invovate API — compute totals and generate PDF, JSON, or UBL invoices in 11 languages. Exposes four tools: calculate_invoice_totals (no API key needed), generate_invoice_pdf, generate_invoice_ubl, and get_invoice_capabilities.4125 npm1MIT
- AlicenseAqualityAmaintenanceEnables AI agents to inspect and work with PDF files entirely on the local machine, covering page counts, metadata, layout, encryption permissions, scan-vs-text detection, and page rendering. Generated results land in a temporary workspace as short artifact ids that can be chained between tools and exported to real folders on request.1251 PyPI1Apache 2.0
- AlicenseAqualityCmaintenanceTurns invoice details from an MCP client conversation into calculated totals and formatted Excel workbooks in JPY, USD, or EUR, using integer minor-unit arithmetic and grouped tax rounding. Supports mixed tax rates, Excel formulas with cached totals, and A4 print-ready layouts, writing files locally with no network access or API key.2441 npmMIT