Per Diem MCP
Cálculos de viáticos y asignaciones de viaje: viajes de varios días, medios días, tarifas por ciudad, reclamaciones exportables.
Documentación
mcp-per-diem
Servidor MCP para dietas de viaje. Dietas legales según las tablas de tarifas que publican las autoridades fiscales, y los viajes que has presupuestado con ellas.
Funciona con Claude Desktop, Claude Code, Cursor y cualquier cliente del Model Context Protocol. Se ejecuta en tu propia máquina, o alojado sin instalación.
Página del producto: https://mcp.zovo.one/s/per-diem — 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 de https://mcp.zovo.one/mcp/token (el mismo token como JSON); se emite uno anónimo gratuito al momento y una clave Pro funciona igual. Luego apunta un cliente MCP a https://mcp.zovo.one/mcp/per-diem mediante streamable-http y envía el token como Authorization: Bearer <token>.
Si tu cliente no puede configurar cabeceras, pon el token en la ruta en su lugar: https://mcp.zovo.one/mcp/per-diem/t/<token>. Ambas formas funcionan. La URL desnuda sin token responde 401 en tools/call, así que el token no es opcional.
Claude Desktop, un clic. Descarga per-diem.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, así que un clon nuevo se compila sin configuración adicional.
git clone https://github.com/theluckystrike/mcp-per-diem.git
cd mcp-per-diem
npm install && npm run build
Luego apunta tu cliente al punto de entrada compilado:
{
"mcpServers": {
"per-diem": {
"command": "node",
"args": ["/absolute/path/to/mcp-per-diem/dist/index.js"]
}
}
}
@theluckystrike/mcp-per-diemaún no está publicado en npm, así que un comandonpx -y @theluckystrike/mcp-per-diemfallará. Las tres rutas anteriores son las que funcionan y cada una está cubierta por CI.

Espejo de solo lectura de mcp-servers/servers/per-diem. Consulta MIRROR.md.
Calcula la dieta diaria de viaje para un viaje de negocios según las tablas de tarifas que las autoridades fiscales publican realmente, y guarda los viajes que has presupuestado. Le indicas a dónde fuiste, cuándo saliste y cuándo volviste, y qué comidas pagó otra persona; te devuelve el importe por día y el total, en la moneda propia del esquema, con la regla de día parcial y cada deducción de comida mostrada junto al número que la produjo. Se incluyen tres esquemas: el reglamento de delegación polaco (nacional y por país), las tarifas de escala de referencia de HMRC para viajes dentro del Reino Unido, y el estándar CONUS de M&IE y alojamiento de GSA de EE. UU. Las tablas son archivos incluidos, no una fuente en vivo, así que el mismo viaje calculado dos veces da la misma respuesta, y cada tarifa lleva el reglamento, la URL de origen y la fecha en que entró en vigor. Nada sale de tu máquina.
Creado por theluckystrike.
En el Registro oficial de MCP (io.github.theluckystrike/per-diem).
Instalación
Un clic (.mcpb): descarga per-diem.mcpb desde la última versión y haz doble clic en él en Claude Desktop:
https://github.com/theluckystrike/mcp-servers/releases/latest
Alojado, sin instalación: apunta un cliente basado en URL a https://mcp.zovo.one/mcp/per-diem. GET https://mcp.zovo.one/mcp/connect genera un token e imprime una URL lista.
La publicación en npm de @theluckystrike/mcp-per-diem está pendiente, así que la línea npx de abajo devuelve 404 hoy.
Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"per-diem": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-per-diem"]
}
}
}
Claude Code:
claude mcp add per-diem -- npx -y @theluckystrike/mcp-per-diem
Cursor (~/.cursor/mcp.json o .cursor/mcp.json): la misma entrada que Claude Desktop.
Herramientas
| herramienta | qué hace |
|---|---|
perdiem_rates | Lista las tarifas incluidas de un esquema con la autoridad, el instrumento, la URL de origen y la fecha de vigencia. Filtra por país o ciudad. |
perdiem_calc | Calcula el precio de un viaje: la dieta por día y el total, con la fracción de día parcial y las deducciones de comida que aplica la regla del esquema. |
trip_record | Calcula un viaje y lo guarda bajo un nombre, con el viajero del perfil de negocio compartido. |
trip_list | Lista los viajes guardados con un total por moneda. |
trip_delete | Elimina un viaje guardado que no se haya exportado y que no tenga un gasto registrado contra él, y libera el espacio del nivel gratuito que ocupaba. |
trip_export | Los argumentos exactos de expense_add para un viaje guardado, una carga útil por moneda, para el servidor de seguimiento de gastos. |
perdiem_report | Totales por esquema y por mes calendario, en la moneda propia de cada esquema. |
license_status | Gratuito o Pro, y dónde actualizar. |
license_activate | Activa una clave Pro. Verificada sin conexión. |
Gratuito vs Pro
| Gratuito | Pro | |
|---|---|---|
perdiem_rates, perdiem_calc | Sí, ilimitado | Sí |
| Viajes guardados por mes calendario | 5, por fecha de inicio | Ilimitado |
trip_list | Sí, ilimitado | Sí |
trip_delete | Sí, ilimitado | Sí |
trip_export | No | Sí |
perdiem_report | No | Sí |
Obtén Pro: $19 de pago único, o $39 por el paquete.
Qué hay en las tablas, y qué se omitió deliberadamente
Cada tabla bajo src/tables/ lleva un header con la autoridad, el instrumento, la URL de origen, la fecha en que las tarifas entraron en vigor y la fecha en que se leyeron. perdiem_rates devuelve esa cabecera con las tarifas, así que la procedencia viaja con el número.
La regla sobre qué contienen: un valor que no pudiera afirmarse con confianza a partir del texto público del reglamento se omitió, no se adivinó. Una cifra de dieta termina en una declaración de impuestos. Una cifra incorrecta que parece autorizada es peor que una ausente, porque una ausente se rechaza por nombre y vas a buscarla.
| tabla | incluida | omitida |
|---|---|---|
| Polonia, nacional | La dieta diaria de 45,00 PLN, el importe global de alojamiento del 150 por ciento, y las reglas de día parcial y comidas | El importe global de transporte local del 20 por ciento está listado pero no se paga: no es manutención |
| Polonia, extranjero | 34 países del anexo, con la dieta y su moneda | Los otros aproximadamente 90 países, y cada límite de alojamiento por país. Un país ausente significa "no verificado aquí", no "no existe tarifa" |
| Reino Unido, nacional | Las cuatro tarifas de escala de referencia de HMRC (bandas de 5, 10 y 15 horas y el suplemento de noche avanzada) | Nada |
| Reino Unido, en el extranjero | Nada. El archivo se envía con una lista de tarifas vacía y una cabecera que lo indica | Toda la tabla de tarifas de escala por ciudad en el extranjero: aproximadamente 250 ciudades por ocho cifras cada una, en la moneda de destino. Esta compilación no pudo afirmarlas con confianza, así que ninguna está incluida. perdiem_calc {scheme:"uk"} rechaza un destino extranjero por nombre y señala la página de HMRC |
| EE. UU., GSA | El estándar CONUS de M&IE y el tope de alojamiento para FY2025 y FY2026, con el desglose de comidas publicado | Las aproximadamente 300 localidades no estándar (Nueva York, San Francisco y el resto). Un destino que no sea una de esas toma la tarifa estándar de todos modos, que es lo que da esta tabla |
Las tarifas cambian. Consulta el effective_date en cualquier respuesta antes de confiar en ella, y lee el source_url si el viaje es reciente.
Reglas que aplica la calculadora
- El inicio y el fin son instantes, no relojes de pared. Pasa ISO 8601 con un desfase (
2026-03-28T22:00:00+01:00) o una fecha y hora local más untimezonede IANA. Las horas transcurridas son una diferencia de época, así que un viaje a través de un cambio de hora es de 23 o 25 horas, no 24. - Polonia cuenta períodos de 24 horas desde la salida. Menos de 24 horas en el país: nada por menos de 8 horas, media dieta de 8 a 12, la dieta completa por encima de 12. Más de 24 horas: una dieta completa por período, luego media por un resto de hasta 8 horas y una completa por encima. En el extranjero la escala es un tercio hasta 8 horas, media por encima de 8 y hasta 12, completa por encima. Las comidas gratuitas descuentan 25/50/25 por ciento de un día nacional y 15/30/30 de uno extranjero.
- El Reino Unido paga por banda: 5,00 GBP desde 5 horas fuera, 10,00 GBP desde 10, 25,00 GBP desde 15 cuando el viaje continúa a las 8 p. m., nada por debajo de 5. Una comida proporcionada elimina su parte de la banda, de forma proporcional. HMRC establece el principio ("la tarifa no se paga por una comida que se proporcionó"); la aritmética proporcional es la lectura que hace este servidor, y así lo indica en la respuesta.
- EE. UU. cuenta días calendario en la zona de destino, al 75 por ciento de M&IE en el primer y último día. Una comida proporcionada se deduce por su propio importe publicado, y los 5,00 USD de gastos menores nunca se deducen. El alojamiento es un tope para el reembolso con recibo, no una dieta que se paga; la respuesta lo dice cada vez.
- Las monedas nunca se suman entre sí. No hay tipo de cambio en este servidor, así que una dieta en PLN y una en EUR siguen siendo dos cifras.
Exportación al seguimiento de gastos
trip_export devuelve los argumentos exactos de expense_add para el servidor expense-tracker, una carga útil por moneda, y no escribe nada por sí mismo. Eso es deliberado: expense-tracker no publica un punto de entrada de biblioteca, y su contador de id, sus reglas de categoría, su división de IVA y sus valores predeterminados de moneda viven todos dentro de su propio manejador de expense_add bajo su propio bloqueo. Añadir una fila directamente a su data.json produciría un gasto sin ninguno de esos elementos aplicados: uno que parece nativo y no lo es. Devolver los argumentos es el mismo contrato que kanban usa para el timer_start de time-tracker.
No se establece ningún vat_rate en la carga útil. Una dieta legal es una asignación, no una compra, así que no hay IVA soportado que reclamar sobre ella.
Una idea medida
La coincidencia por subcadena de un nombre de país es cómo una dieta se calcula silenciosamente a la tarifa de otro país.
La primera compilación resolvía un destino por nombre exacto, luego por código ISO, luego por country.includes(destination). Un viaje a Omán volvió calculado, en EUR, sin advertencia: "romania".includes("oman") es true, así que tomó la dieta de Rumanía de 42,00 EUR. Omán no está entre los 34 países que incluye esta compilación, así que la respuesta correcta era un rechazo que nombrara la brecha. En su lugar, el solicitante recibió un número con confianza, en la moneda equivocada, de un país a 3.000 km de distancia.
La corrección es una línea, el respaldo es una coincidencia de prefijo de cuatro caracteres o más, y se verifica en test/adversarial.test.mjs. La forma general vale más que la corrección: una coincidencia difusa es segura cuando un fallo es barato y cara cuando un fallo es silencioso. Aquí un fallo produce una cifra fiscal, así que el respaldo tiene que fallar de forma cerrada. Que la tabla sea deliberadamente parcial es exactamente lo que hace peligroso el respaldo por subcadena: con una tabla completa, la fila equivocada es un casi acierto, y con una parcial es una fila que nunca debería haber coincidido en absoluto.
Privacidad
Todo permanece en tu máquina. Los viajes son JSON bajo ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/per-diem/. Las tablas de tarifas son archivos dentro del paquete. No hay ninguna llamada de red en este servidor, ni cuenta ni clave de API. Las claves de licencia se verifican sin conexión.
Licencia
MIT. Soporte: support@zovo.one
Usa estos documentos como servidor MCP
Cualquier cliente MCP (Claude, Cursor, Windsurf, VS Code) puede leer la documentación de este repositorio directamente mediante GitMCP, sin instalación:
- URL de MCP de documentos: https://gitmcp.io/theluckystrike/mcp-per-diem