mcp-expense-tracker

Registra gastos con categorías, totales acumulados y resúmenes mensuales: pregúntale a Claude a dónde fue el dinero y obtén un desglose claro.

Documentación

Registra gastos desde Claude con un servidor MCP gratuito

Servidor MCP para seguimiento de gastos: registra gastos de negocio, recibos y kilometraje con un rastreador de gastos. Recibos, kilometraje y gastos que se convierten en líneas de factura.

Funciona con Claude Desktop, Claude Code, Cursor y cualquier cliente del Protocolo de Contexto de Modelo. Se ejecuta en tu propia máquina, o alojado sin instalación.

Página del producto: https://mcp.zovo.one/s/expense-tracker — 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 igual. Luego apunta un cliente MCP a https://mcp.zovo.one/mcp/expense-tracker mediante 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/expense-tracker/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 expense-tracker.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 compila sin configuración adicional.

git clone https://github.com/theluckystrike/mcp-expense-tracker.git
cd mcp-expense-tracker
npm install && npm run build

Luego apunta tu cliente al punto de entrada compilado:

{
  "mcpServers": {
    "expense-tracker": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-expense-tracker/dist/index.js"]
    }
  }
}

@theluckystrike/mcp-expense-tracker aún no está publicado en npm, por lo que un comando npx -y @theluckystrike/mcp-expense-tracker fallará. Las tres rutas anteriores son las que funcionan y cada una es verificada por CI.

expense-tracker demo

Espejo de solo lectura de mcp-servers/servers/expense-tracker. Consulta MIRROR.md.

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 registra, categoriza, divide el IVA y queda listo para refacturar. Este servidor MCP mantiene un libro local de tus gastos de negocio: cada importe se guarda en unidades menores 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 divide sin repetirlo), las reglas de comerciante categorizan los gastos nuevos por sí solas, 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 en la forma de líneas de partida 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 ruta que funciona; ambos se verifican a continuación.

Un clic (.mcpb): descarga expense-tracker.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": {
    "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"]
    }
  }
}

La forma npx anterior empieza a funcionar 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, configura MCP_LICENSE_KEY en el mismo bloque de configuración, o llama a license_activate una vez con tu clave.

Herramientas

HerramientaQué hace
expense_addRegistra 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 completa con las reglas de comerciante. billable por defecto es verdadero cuando se proporciona un project y falso en caso contrario, y la respuesta siempre indica qué valor se usó
expense_settingsLee o establece los valores predeterminados que expense_add usa cuando una llamada no menciona ninguno: default_vat_rate, default_currency
expense_listLista los gastos en un rango de fechas, filtrados por proyecto, categoría o facturable, con totales por moneda
expense_updateCambia 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_deleteElimina un gasto por id. El archivo del recibo en sí se deja intacto
receipt_attachAdjunta un archivo de recibo a un gasto. El archivo debe existir; se almacenan su ruta y sha256
category_rulesEstablece o lista 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_summaryTotales para un rango agrupados por categoría, proyecto, mes o comerciante, con el bruto, neto e IVA por moneda
mileage_addRegistra un viaje en km o millas y lo valora con la tabla de tarifas (o tu propia tarifa)
expense_exportEscribe el rango en csv, xlsx o json y devuelve la ruta. Nunca escribe un archivo parcial
expense_to_invoicePrevisualiza los gastos facturables no facturados de un proyecto como líneas de partida 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 no hay coincidencias devuelve count: 0, sin fx_note, y la razón simple. Nunca marca nada como refacturado
expense_mark_rebilledMarca gastos como refacturados una vez que la factura existe, por ids o por proyecto, rango de fechas y currency. invoice_number es obligatorio
license_statusMuestra el modo gratuito o Pro
license_activateActiva 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ónTarifaUnidadMonedaQué supone
PL1,15kmPLNUn coche de más de 900 cm3. El límite polaco es PLN 0,89/km hasta 900 cm3, y hay tarifas separadas para motocicletas y ciclomotores
UK0,45millaGBPUn 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
US0,70millaUSDLa 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
EU0,30kmEURUna asignación genérica por kilómetro. No hay una tarifa única de la UE; cada estado miembro establece la suya

Detrás de estos números no hay deliberadamente tablas de año, vehículo o umbral: una tabla que parece autoritativa pero está desactualizada por 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, el tramo 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 el array 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 vuelven como tres grupos. Para obtener una sola factura, proporciona el destino 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]. Aquí nada obtiene ni inventa una tarifa; una moneda sin tarifa se rechaza por nombre. Sin fx_rates, un rango mixto devuelve la llamada exacta a hacer 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, por lo que una tarifa predeterminada en la factura no puede 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 como [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 toca solo los gastos facturables aún no refacturados en él, por lo que facturar el grupo en EUR no puede marcar el de PLN. mcp-time-tracker factura las horas en el mismo proyecto; este servidor factura lo que el proyecto te costó.

Gratis vs Pro

GratisPro
Registrar gastos, kilometraje y recibosIlimitadoIlimitado
expense_list y expense_summaryÚltimos 30 díasHistorial completo
Proyectos3Ilimitados
Reglas de categoría5Ilimitadas
Exportación CSV y JSONHasta 200 filasIlimitada
Exportación xlsxNoSí
expense_to_invoice20 elementos a la vez, markup_percent incluidoElementos ilimitados
Multimoneda, división de IVA, hash de recibosSíSí

Un límite nunca escribe un archivo parcial y nunca trunca silenciosamente: la exportación se rechaza sin nada en 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 menores en la moneda propia del gasto, y cada importe impreso lleva su código de moneda, por ejemplo EUR 61.50. Cuántas unidades menores 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 menores, 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 menores aunque normalmente se cotice sin ellos.

El monto 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 el neto más el 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 misma moneda; las monedas nunca se suman entre sí ni se convierten. El dinero de kilometraje es round(distance * rate) en la moneda de la tarifa. Las fechas están en formato ISO YYYY-MM-DD.

Privacidad

Si data.json alguna vez es ilegible o no es JSON válido, no se trata como "sin gastos aún". 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, de modo 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 procesan con hash 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.

Creado por theluckystrike.

Un perfil de negocio para todo el conjunto

Tu identidad se almacena una vez, en ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/profile/business.json, y cada servidor del conjunto 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

¿Hay 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 los lista o exporta. 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 con 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: