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-diem ainda não está publicado no npm, então um comando npx -y @theluckystrike/mcp-per-diem falhará. Os três caminhos acima são os que funcionam e cada um é testado pelo CI.

per-diem demo

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

ferramentao que faz
perdiem_ratesLista 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_calcPrecifica 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_recordCalcula uma viagem e a salva sob um nome, com o viajante do perfil de negócios compartilhado.
trip_listLista viagens salvas com um total por moeda.
trip_deleteExclui 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_exportOs argumentos exatos de expense_add para uma viagem salva, um payload por moeda, para o servidor de controle de despesas.
perdiem_reportTotais por esquema e por mês calendário, na moeda de cada esquema.
license_statusGratuito ou Pro, e onde fazer upgrade.
license_activateAtiva uma chave Pro. Verificada offline.

Gratuito vs Pro

GratuitoPro
perdiem_rates, perdiem_calcSim, ilimitadoSim
Viagens salvas por mês calendário5, pela data de inícioIlimitado
trip_listSim, ilimitadoSim
trip_deleteSim, ilimitadoSim
trip_exportNãoSim
perdiem_reportNãoSim

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.

tabelaincluídaomitida
Polônia, nacionalA 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çõesO valor fixo de transporte local de 20 por cento está listado, mas não é pago: não é subsistência
Polônia, exterior34 países do anexo, com a diária e sua moedaOs 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, nacionalTodas as quatro taxas de referência HMRC (faixas de 5, 10 e 15 horas e o suplemento de fim de noite)Nada
Reino Unido, exteriorNada. O arquivo acompanha uma lista de tarifas vazia e um cabeçalho informando issoToda 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, GSAO padrão CONUS M&IE e o teto de hospedagem para FY2025 e FY2026, com o detalhamento de refeições publicadoAs 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 um timezone IANA. 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: