Zovo Expense Tracker MCP Server
Realiza un seguimiento de gastos, categoriza el gasto y genera informes a partir de archivos locales. Servidor MCP offline-first, nivel gratuito, sin registro.
Documentación
Registra gastos desde Claude con un servidor MCP gratuito
En el Registro oficial de MCP (io.github.theluckystrike/expense-tracker-receipts-mileage).
![]()
Di "12,30 euros en Adobe, software, facturable a Acme" y se registrará, categorizará, dividirá el IVA y estará listo para refacturar. Este servidor MCP mantiene un libro local de tus gastos de negocio: cada importe se guarda en unidades mínimas enteras en su propia moneda, vat_rate divide el bruto del recibo en neto e IVA (configúralo una vez con expense_settings y cada gasto posterior se dividirá sin repetirlo), las reglas de comerciante categorizan los nuevos gastos automáticamente, los recibos se adjuntan por ruta y sha256 para que una auditoría pueda demostrar que el archivo no ha cambiado, y los viajes de negocio se valoran con una tabla de kilometraje integrada. Los resúmenes agrupan por categoría, proyecto, mes o comerciante, siempre por moneda y nunca mezclados. Exporta a CSV, xlsx o JSON, y expense_to_invoice entrega los gastos facturables de un proyecto a mcp-invoice exactamente con la forma de partidas que invoice_create espera. Todo se almacena en un archivo JSON plano en tu propia máquina; nada se sube a ningún sitio.
Registra recibos y kilometraje en el chat, divide el IVA y refactúralos en una factura, sin necesidad de un SaaS de gastos.
Instalación en 60 segundos
La publicación en npm para @theluckystrike/mcp-expense-tracker está pendiente. Hasta entonces, el paquete de un clic .mcpb o un clon+compilación son la vía funcional, ambos verificados abajo.
Un clic (.mcpb): descarga expense-tracker.mcpb desde la última versión y haz doble clic en Claude Desktop:
https://github.com/theluckystrike/mcp-servers/releases/latest
(claude_desktop_config.json):
{
"mcpServers": {
"expense-tracker": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-expense-tracker"]
}
}
}
Claude Code:
claude mcp add expense-tracker -- npx -y @theluckystrike/mcp-expense-tracker
(.cursor/mcp.json):
{
"mcpServers": {
"expense-tracker": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-expense-tracker"]
}
}
}
El formulario npx anterior funciona en cuanto se publique el paquete. Hasta entonces, usa el paquete .mcpb de arriba, 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/expense-tracker
Luego apunta el command de tu cliente a node con un argumento: la ruta absoluta a servers/expense-tracker/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 |
|---|---|
expense_add | Registrar un gasto: importe, moneda, categoría, comerciante, fecha, proyecto, nota, ruta del recibo, indicador de facturable, tipo de IVA. Una categoría vacía se rellena desde las reglas de comerciante. billable por defecto es true cuando se proporciona un project y false en caso contrario, y la respuesta siempre indica qué valor se usó |
expense_settings | Leer o establecer los valores predeterminados que expense_add usa cuando una llamada no menciona ninguno: default_vat_rate, default_currency |
expense_list | Listar gastos en un rango de fechas, filtrados por proyecto, categoría o facturable, con totales por moneda |
expense_update | Cambiar cualquier campo de un gasto almacenado por id. rebilled: false borra tanto el marcador de refacturado como el número de factura. El importe, la moneda y vat_rate se rechazan en un gasto ya refacturado a menos que pases unlink_rebill: true, que borra el enlace de refacturación, porque la factura cobró otra cosa |
expense_delete | Eliminar un gasto por id. El archivo del recibo en sí se deja intacto |
receipt_attach | Adjuntar un archivo de recibo a un gasto. El archivo debe existir; su ruta y sha256 se almacenan |
category_rules | Establecer o listar las reglas de comerciante a categoría. Una coincidencia sin metacaracteres de regex es una subcadena simple; una con ellos se compila solo si no puede retroceder exponencialmente, y un patrón como (a+)+ se rechaza |
expense_summary | Totales para un rango agrupados por categoría, proyecto, mes o comerciante, con el bruto, neto e IVA por moneda |
mileage_add | Registrar un viaje en km o millas y valorarlo desde la tabla de tarifas (o tu propia tarifa) |
expense_export | Escribir el rango en csv, xlsx o json y devolver la ruta. Nunca escribe un archivo parcial |
expense_to_invoice | Previsualizar los gastos facturables no facturados de un proyecto como partidas invoice_create, por moneda, con un margen opcional y un assume_vat_rate opcional. Pasa target_currency + fx_rates para agrupar cada moneda en un solo grupo. Cuando nada coincide, devuelve count: 0, sin fx_note, y la razón simple. Nunca marca nada como refacturado |
expense_mark_rebilled | Marcar gastos como refacturados una vez que existe la factura, por ids o por proyecto, rango de fechas y currency. invoice_number es obligatorio |
license_status | Mostrar el modo gratuito o Pro |
license_activate | Activar una clave Pro (verificada sin conexión) |
Recurso: expenses://month devuelve los totales del mes calendario actual por categoría, por moneda.
Prompt: monthly_close recorre los totales del mes, los gastos facturables aún no facturados y los gastos sin recibo adjunto.
Tarifas de kilometraje
La tabla contiene una tarifa plana por región. Cada fila es una aproximación con una suposición declarada, no un cálculo fiscal:
| Región | Tarifa | Unidad | Moneda | Qué supone |
|---|---|---|---|---|
| PL | 1,15 | km | PLN | Un coche de más de 900 cm³. El límite polaco es PLN 0,89/km hasta 900 cm³, y hay tarifas separadas para motocicletas y ciclomotores |
| UK | 0,45 | milla | GBP | Un coche, dentro de las primeras 10,000 millas de negocio del año fiscal. HMRC paga una tarifa más baja por encima de ese umbral, y tarifas diferentes para motocicletas y bicicletas |
| US | 0,70 | milla | USD | La tarifa estándar de negocio del IRS para un año calendario. El IRS la reemite cada año y la ha cambiado a mitad de año |
| EU | 0,30 | km | EUR | Una asignación genérica por kilómetro. No hay una tarifa única de la UE; cada estado miembro establece la suya |
Deliberadamente no hay tablas de año, vehículo o umbral detrás de estos números: una tabla que parece autoritativa pero está desactualizada un año es peor que una que dice lo que es. Cada respuesta de mileage_add nombra la tarifa que usó y repite esa advertencia, por ejemplo (table rate PL 1.15 PLN/km, an approximation; pass rate_per_km for your exact scheme).
Sin region, las millas usan la tarifa de EE. UU. y los kilómetros la de la UE. rate_per_km anula la tabla con tu propia tarifa para la unidad que pasaste, que es la forma admitida de reclamar un esquema exacto (una clase de motor, una tarifa de mitad de año, la banda por encima de 10,000 millas). currency solo se acepta junto con rate_per_km: una tarifa de tabla se cotiza en su propia moneda, y volver a etiquetar PLN 1,15/km como EUR 1,15/km no convertiría nada y registraría aproximadamente cuatro veces el costo real, por lo que esa llamada se rechaza.
Se combina con el resto de la colección
expense_to_invoice devuelve objetos {description, quantity, unit_price, tax_rate}, que es exactamente la matriz items que mcp-invoice acepta. unit_price es el importe neto, tax_rate es el tipo de IVA registrado en el gasto, por lo que la factura recalcula el mismo impuesto en lugar de cobrarlo dos veces, y el total de la línea vuelve al bruto del recibo. Cuando redondear el impuesto una segunda vez no puede reproducir ese bruto (EUR 0,03 al 23% se divide en 0,02 + 0,01, pero 0,02 gravado al 23% se redondea a 0,00), el unit_price se ajusta en un céntimo si eso hace que la factura cuadre exactamente, y de lo contrario el grupo lleva una línea visible de [rounding adjustment ...] en tax_rate: 0; rounding_adjustment_lines los cuenta.
Monedas mixtas
Una factura lleva una sola moneda, por lo que una semana de horas en USD, un recibo en EUR y una línea de kilometraje en GBP devuelven tres grupos. Para obtener una sola factura, proporciona la moneda objetivo y tus propias tarifas:
expense_to_invoice {project: "Nova", from: "2026-09-01", to: "2026-09-07",
target_currency: "USD", fx_rates: {"EUR": 1.08, "GBP": 1.27}}
fx_rates se lee como "1 unidad de esa moneda = X unidades de target_currency". Cada línea se convierte y se devuelve un grupo, y cada línea convertida lo dice en su propia cara: ... [converted from EUR 12.40 at 1.08]. Nada aquí obtiene o inventa una tarifa; una moneda sin tarifa se rechaza por nombre. Sin fx_rates, un rango mixto devuelve la llamada exacta a realizar en lugar de dejarte que lo averigües.
Un vat_rate almacenado de 0 es una tarifa, no un vacío: un recibo exento sigue exento. Un gasto registrado sin tarifa contiene un importe bruto, y se refactura tal cual con tax_rate: 0 y tax_rate: 0 (VAT unknown, gross rebilled as-is; pass assume_vat_rate to split) en la descripción, para que una tarifa predeterminada en la factura no pueda gravar el recibo dos veces. El valor predeterminado de expense_settings se aplica cuando el gasto se inserta y nunca retroactivamente en el momento de refacturar: cambiar ese valor predeterminado más tarde no debe reescribir el significado fiscal de los recibos ingresados antes de que existiera. Para dividir esas líneas más antiguas de todos modos, pasa assume_vat_rate explícitamente en la llamada a expense_to_invoice y las líneas se marcan con [vat assumed 23%].
Nada se marca como refacturado por esa llamada, y no hay opción para hacerlo: crea la factura primero, luego llama a expense_mark_rebilled con un invoice_number obligatorio. Debido a que una factura lleva una sola moneda, el resultado se agrupa por moneda, cada grupo lleva su propio expense_ids, y pasas un grupo. Marcar por ids es la ruta precisa; marcar por proyecto y rango de fechas además requiere currency, y solo toca los gastos facturables aún no refacturados en él, por lo que facturar el grupo EUR no puede marcar el grupo PLN. mcp-time-tracker factura las horas en el mismo proyecto; este servidor factura lo que el proyecto te costó.
Gratis vs Pro
| Gratis | Pro | |
|---|---|---|
| Registrar gastos, kilometraje y recibos | Ilimitado | Ilimitado |
expense_list y expense_summary | Últimos 30 días | Historial completo |
| Proyectos | 3 | Ilimitados |
| Reglas de categoría | 5 | Ilimitadas |
| Exportación CSV y JSON | Hasta 200 filas | Ilimitada |
| Exportación xlsx | No | Sí |
expense_to_invoice | 20 elementos a la vez, markup_percent incluido | Elementos ilimitados |
| Multimoneda, división de IVA, hash de recibos | Sí | Sí |
Un límite nunca escribe un archivo parcial y nunca trunca silenciosamente: la exportación se rechaza sin nada en el disco, y la herramienta dice qué reducir.
Pro es un pago único de $19, o $39 por cada servidor de la colección, de por vida.
Números y dinero
Cada importe es un número entero de unidades mínimas en la moneda propia del gasto, y cada importe impreso lleva su código de moneda, por ejemplo EUR 61.50. Cuántas unidades mínimas forman 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. Así que KWD 1.234 son 1234 unidades mínimas, no 123. La misma tabla la usa mcp-invoice, porque los dos servidores intercambian importes. HUF tiene 2 decimales aquí: ISO 4217 le da dos dígitos mínimos aunque normalmente se cotice sin ellos.
El importe que registras es el bruto del recibo. vat_rate lo divide redondeando el IVA, no el neto: vat = round(gross * rate / (100 + rate)), net = gross - vat, por lo que neto más IVA siempre es exactamente el bruto y medio céntimo de IVA se redondea hacia arriba en lugar de desaparecer (EUR 0,03 al 23% es neto 0,02 más IVA 0,01). Los resúmenes suman valores por gasto ya redondeados dentro de una sola moneda; las monedas nunca se suman entre sí y nunca se convierten. El dinero del kilometraje es round(distance * rate) en la moneda de la tarifa. Las fechas son ISO YYYY-MM-DD.
Privacidad
Si data.json alguna vez es ilegible o no es JSON válido, no se trata como "sin gastos todavía". El archivo se mueve a un lado byte por byte como data.json.corrupt-<timestamp>, se escribe un marcador data.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, para que un archivo truncado nunca pueda sobrescribirse con una base de datos vacía.
Todos los datos permanecen locales, en ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/expense-tracker/. No hay llamadas de red: los recibos se hashean en tu máquina, las exportaciones se escriben en tu máquina y las claves de licencia se verifican sin conexión con una clave pública compilada en el paquete.
Construido por theluckystrike.
Un perfil de negocio para toda la suite
Tu identidad se guarda una sola 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 principal de time-tracker y timezone, y los
membretes de currículum y contrato. Configúrala una vez con business_set (invoice o docx): nunca la
repites 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
¿Existe un rastreador de gastos MCP gratuito?
Sí. El servidor expense-tracker en mcp.zovo.one es un rastreador de gastos MCP gratuito: registra gastos desde Claude o cualquier cliente MCP con categorías, montos y fechas, y luego listalos o expórtalos. Nivel gratuito, endpoint remoto alojado, nada que instalar.
¿Cómo registro un gasto desde Claude?
Conecta https://mcp.zovo.one/mcp/expense-tracker (URL tokenizada desde mcp.zovo.one/mcp/connect) y di: 'Registra 42.50 EUR para almuerzo de cliente, categoría comidas.' La entrada se almacena localmente primero en tu máquina.
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 MCP de documentos: https://gitmcp.io/theluckystrike/mcp-expense-tracker