Per Diem MCP
Cálculos de diárias e auxílios de viagem: viagens de múltiplos dias, meios-dias, tarifas por cidade, reivindicações exportáveis.
Documentação
mcp-per-diem
Servidor MCP para diárias de viagem a trabalho. Diárias legais conforme as tabelas de tarifas que as autoridades fiscais publicam, e as viagens que você precificou com elas.
Funciona com Claude Desktop, Claude Code, Cursor e qualquer cliente do Model Context Protocol. Roda na sua própria máquina ou hospedado, sem instalação.
Página do produto: https://mcp.zovo.one/s/per-diem — o que faz, as ferramentas que expõe e um endpoint de token ao vivo.
Instalação
Hospedado, nada para instalar. Obtenha um token em https://mcp.zovo.one/mcp/connect (a página de conexão) ou https://mcp.zovo.one/mcp/token (o mesmo token em JSON); um token anônimo gratuito é emitido na hora e uma chave Pro funciona da mesma forma. Depois aponte um cliente MCP para https://mcp.zovo.one/mcp/per-diem via streamable-http e envie o token como Authorization: Bearer <token>.
Se o seu cliente não puder definir cabeçalhos, coloque o token no caminho: https://mcp.zovo.one/mcp/per-diem/t/<token>. Ambas as formas funcionam. A URL simples sem token responde 401 em tools/call, então o token não é opcional.
Claude Desktop, um clique. Baixe per-diem.mcpb da última versão e clique duas vezes nele.
A partir do código-fonte. O espelho é autocontido: toda dependência @theluckystrike/* é incluída, então um clone novo compila sem configuração extra.
git clone https://github.com/theluckystrike/mcp-per-diem.git
cd mcp-per-diem
npm install && npm run build
Depois aponte seu cliente para o ponto de entrada compilado:
{
"mcpServers": {
"per-diem": {
"command": "node",
"args": ["/absolute/path/to/mcp-per-diem/dist/index.js"]
}
}
}
@theluckystrike/mcp-per-diemainda não está publicado no npm, então um comandonpx -y @theluckystrike/mcp-per-diemfalhará. Os três caminhos acima são os que funcionam e cada um é testado pelo CI.

Espelho somente leitura de mcp-servers/servers/per-diem. Veja MIRROR.md.
Calcule a diária diária de viagem a trabalho conforme as tabelas de tarifas que as autoridades fiscais realmente publicam, e mantenha as viagens que você precificou. Você informa para onde foi, quando saiu e quando voltou, e quais refeições outra pessoa pagou; ele retorna o valor por dia e o total, na moeda do próprio esquema, com a regra de dia parcial e cada dedução de refeição exibida ao lado do número que a produziu. Três esquemas acompanham: o regulamento de delegação polonês (nacional e por país), as taxas de referência HMRC para viagens dentro do Reino Unido e o padrão CONUS M&IE e hospedagem do GSA dos EUA. As tabelas são arquivos incluídos, não um feed ao vivo, então a mesma viagem precificada duas vezes dá a mesma resposta, e cada tarifa traz o regulamento, a URL de origem e a data em que entrou em vigor. Nada sai da sua máquina.
Criado por theluckystrike.
No Registro oficial de MCP (io.github.theluckystrike/per-diem).
Instalação
Um clique (.mcpb): baixe per-diem.mcpb da última versão e clique duas vezes nele no Claude Desktop:
https://github.com/theluckystrike/mcp-servers/releases/latest
Hospedado, sem instalação: aponte um cliente baseado em URL para https://mcp.zovo.one/mcp/per-diem. GET https://mcp.zovo.one/mcp/connect gera um token e imprime uma URL pronta.
A publicação no npm para @theluckystrike/mcp-per-diem está pendente, então a linha npx abaixo retorna 404 hoje.
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 ou .cursor/mcp.json): a mesma entrada do Claude Desktop.
Ferramentas
| ferramenta | o que faz |
|---|---|
perdiem_rates | Lista as tarifas incluídas de um esquema com a autoridade, o instrumento, a URL de origem e a data de vigência. Filtre por país ou cidade. |
perdiem_calc | Precifica uma viagem: a diária por dia e o total, com a fração de dia parcial e as deduções de refeição que a regra do esquema aplica. |
trip_record | Calcula uma viagem e a salva sob um nome, com o viajante do perfil de negócios compartilhado. |
trip_list | Lista viagens salvas com um total por moeda. |
trip_delete | Exclui uma viagem salva que não foi exportada e não tem despesa lançada contra ela, e libera o slot do plano gratuito que ela ocupava. |
trip_export | Os argumentos exatos de expense_add para uma viagem salva, um payload por moeda, para o servidor de controle de despesas. |
perdiem_report | Totais por esquema e por mês calendário, na moeda de cada esquema. |
license_status | Gratuito ou Pro, e onde fazer upgrade. |
license_activate | Ativa uma chave Pro. Verificada offline. |
Gratuito vs Pro
| Gratuito | Pro | |
|---|---|---|
perdiem_rates, perdiem_calc | Sim, ilimitado | Sim |
| Viagens salvas por mês calendário | 5, pela data de início | Ilimitado |
trip_list | Sim, ilimitado | Sim |
trip_delete | Sim, ilimitado | Sim |
trip_export | Não | Sim |
perdiem_report | Não | Sim |
Obter Pro: US$ 19 pagamento único, ou US$ 39 pelo pacote.
O que está nas tabelas e o que deliberadamente não está
Cada tabela em src/tables/ traz um header com a autoridade, o instrumento, a URL de origem, a data em que as tarifas entraram em vigor e a data em que foram lidas. perdiem_rates retorna esse cabeçalho com as tarifas, para que a procedência viaje junto com o número.
A regra para o que está nelas: um valor que não pudesse ser afirmado com confiança a partir do texto público do regulamento foi omitido, não adivinhado. Um valor de diária acaba em uma declaração de imposto. Um valor errado que parece autoritativo é pior do que um ausente, porque um ausente é recusado pelo nome e você vai procurá-lo.
| tabela | incluída | omitida |
|---|---|---|
| Polônia, nacional | A diária diária de 45,00 PLN, o valor fixo de hospedagem de 150 por cento e as regras de dia parcial e refeições | O valor fixo de transporte local de 20 por cento está listado, mas não é pago: não é subsistência |
| Polônia, exterior | 34 países do anexo, com a diária e sua moeda | Os outros cerca de 90 países e todos os limites de hospedagem por país. Um país ausente significa "não verificado aqui", não "não existe tarifa" |
| Reino Unido, nacional | Todas as quatro taxas de referência HMRC (faixas de 5, 10 e 15 horas e o suplemento de fim de noite) | Nada |
| Reino Unido, exterior | Nada. O arquivo acompanha uma lista de tarifas vazia e um cabeçalho informando isso | Toda a tabela de tarifas por cidade do exterior: cerca de 250 cidades vezes oito valores cada, na moeda do destino. Esta versão não pôde afirmá-los com confiança, então nenhum foi incluído. perdiem_calc {scheme:"uk"} recusa um destino estrangeiro pelo nome e aponta para a página do HMRC |
| EUA, GSA | O padrão CONUS M&IE e o teto de hospedagem para FY2025 e FY2026, com o detalhamento de refeições publicado | As cerca de 300 localidades não padrão (Nova York, São Francisco e as demais). Um destino que não é uma delas recebe a tarifa padrão de qualquer forma, que é o que esta tabela fornece |
As tarifas mudam. Verifique o effective_date em qualquer resposta antes de confiar nela e leia o source_url se a viagem for recente.
Regras que a calculadora aplica
- Início e fim são instantes, não relógios de parede. Passe ISO 8601 com offset (
2026-03-28T22:00:00+01:00) ou uma data/hora local mais umtimezoneIANA. As horas decorridas são uma diferença de época, então uma viagem através de uma mudança de relógio é 23 ou 25 horas, não 24. - Polônia conta períodos de 24 horas a partir da partida. Abaixo de 24 horas no nacional: nada abaixo de 8 horas, metade da diária de 8 a 12, a diária inteira acima de 12. Acima de 24 horas: uma diária inteira por período, depois metade para um restante de até 8 horas e uma inteira acima. No exterior, a escala é um terço até 8 horas, metade acima de 8 e até 12, inteira acima. Refeições gratuitas descontam 25/50/25 por cento de um dia nacional e 15/30/30 de um estrangeiro.
- O Reino Unido paga por faixa: 5,00 GBP a partir de 5 horas fora, 10,00 GBP a partir de 10, 25,00 GBP a partir de 15 quando a viagem está em andamento às 20h, nada abaixo de 5. Uma refeição fornecida remove sua parcela da faixa, proporcionalmente. O HMRC declara o princípio ("a tarifa não é paga por uma refeição que foi fornecida"); a aritmética proporcional é a leitura deste servidor, e ele informa isso na resposta.
- Os EUA contam dias calendário no fuso do destino, a 75 por cento do M&IE no primeiro e no último dia. Uma refeição fornecida é deduzida pelo seu próprio valor publicado, e os 5,00 USD de incidentes nunca são deduzidos. A hospedagem é um teto para reembolso com recibo, não uma diária que é paga; a resposta informa isso toda vez.
- Moedas nunca são somadas. Não há taxa de câmbio neste servidor, então uma diária em PLN e uma em EUR permanecem dois valores.
Exportação para o controle de despesas
trip_export retorna os argumentos exatos de expense_add para o servidor expense-tracker, um payload por moeda, e não grava nada por conta própria. Isso é deliberado: o expense-tracker não publica um ponto de entrada de biblioteca, e seu contador de id, suas regras de categoria, sua divisão de IVA e seus padrões de moeda vivem dentro do próprio manipulador expense_add sob seu próprio bloqueio. Anexar uma linha diretamente ao seu data.json produziria uma despesa sem nenhum desses aplicados: uma que parece nativa e não é. Devolver os argumentos é o mesmo contrato que kanban usa para o timer_start do time-tracker.
Nenhum vat_rate é definido no payload. Uma diária legal é uma verba, não uma compra, então não há IVA de entrada a recuperar sobre ela.
Uma percepção medida
Correspondência de substring em um nome de país é como uma diária é silenciosamente precificada à tarifa de outro país.
A primeira versão resolvia um destino por nome exato, depois código ISO, depois country.includes(destination). Uma viagem a Omã voltou precificada, em EUR, sem aviso: "romania".includes("oman") é true, então pegou a diária de 42,00 EUR da Romênia. Omã não está entre os 34 países que esta versão inclui, então a resposta correta era uma recusa nomeando a lacuna. Em vez disso, o chamador recebeu um número confiante, na moeda errada, de um país a 3.000 km de distância.
A correção é uma linha, o fallback é uma correspondência de prefixo de quatro caracteres ou mais, e é verificada em test/adversarial.test.mjs. A forma geral vale mais que a correção: uma correspondência difusa é segura quando um erro é barato e cara quando um erro é silencioso. Aqui um erro produz um valor de imposto, então o fallback tem que falhar de forma fechada. A tabela ser deliberadamente parcial é exatamente o que torna o fallback de substring perigoso: com uma tabela completa, a linha errada é um quase acerto, e com uma parcial é uma linha que nunca deveria ter correspondido.
Privacidade
Tudo permanece na sua máquina. As viagens são JSON em ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/per-diem/. As tabelas de tarifas são arquivos dentro do pacote. Não há chamada de rede em nenhum lugar deste servidor, nenhuma conta e nenhuma chave de API. As chaves de licença são verificadas offline.
Licença
MIT. Suporte: support@zovo.one
Use estes documentos como um servidor MCP
Qualquer cliente MCP (Claude, Cursor, Windsurf, VS Code) pode ler a documentação deste repositório diretamente via GitMCP — sem instalação:
- URL de documentos MCP: https://gitmcp.io/theluckystrike/mcp-per-diem