per-diem

Daily travel allowances from bundled public rate tables: Poland, HMRC and GSA CONUS.

Should I use this

Quality & Safety

A
Description quality
98%
Schema completeness
89%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,556Tokens (tool definitions)
~2.4 KBTypical response size
Moderate attention impact (2.00% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "per-diem": {
      "command": "uvx",
      "args": [
        "https://github.com/theluckystrike/mcp-servers/releases/download/v0.22.0/per-diem.mcpb"
      ]
    }
  }
}

Runnable packages

mcpbhttps://github.com/theluckystrike/mcp-servers/releases/download/v0.22.0/per-diem.mcpb0.22.0stdio

Remote endpoints

https://mcp.zovo.one/mcp/per-diemstreamable-http

What it can do

Tool inventory

Tools (9)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢perdiem_rates(scheme, country, city)

List a scheme's bundled daily allowance rates with the authority, instrument, source URL and effective date they came from. Filter by country or city. Free and unlimited.

Input Schema

{
  "type": "object",
  "properties": {
    "scheme": {
      "type": "string",
      "enum": [
        "pl",
        "uk",
        "us"
      ],
      "description": "\"pl\" Polish delegation regulation, \"uk\" HMRC benchmark scale rates, \"us\" GSA CONUS standard. Omit for every scheme"
    },
    "country": {
      "type": "string",
      "description": "Country name or ISO code, e.g. Germany or DE. Matched exactly first, then as a substring"
    },
    "city": {
      "type": "string",
      "description": "City or locality name, for the schemes that publish per-city rates"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢perdiem_calc(scheme, destination, start, end, timezone, ...)

Calculate the daily travel allowance for one trip: the amount per day and the total in the scheme's currency, with the partial-day fraction and the meal deductions the scheme's own rule applies. Free and unlimited.

Input Schema

{
  "type": "object",
  "properties": {
    "scheme": {
      "type": "string",
      "enum": [
        "pl",
        "uk",
        "us"
      ],
      "description": "\"pl\" Polish delegation regulation, \"uk\" HMRC benchmark scale rates, \"us\" GSA CONUS standard"
    },
    "destination": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Country or locality, e.g. \"Germany\", \"Poland\", \"United Kingdom\", \"United States\""
    },
    "start": {
      "type": "string",
      "minLength": 1,
      "description": "When the trip began, ISO 8601 WITH a zone: \"2026-03-28T22:00:00+01:00\", or \"2026-03-28T22:00\" together with timezone"
    },
    "end": {
      "type": "string",
      "minLength": 1,
      "description": "When it ended, same form as start. It must be after start as an instant"
    },
    "timezone": {
      "type": "string",
      "description": "IANA id such as \"Europe/Warsaw\". Required when start or end carries no offset; also the zone the US scheme counts calendar days in"
    },
    "meals_provided": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "breakfast",
            "lunch",
            "dinner"
          ]
        }
      },
      "description": "Per day, in order: the free meals the traveller was given that day, e.g. [[\"breakfast\"],[\"breakfast\",\"lunch\"]]. Each one reduces that day's allowance by the scheme's own percentage or amount"
    },
    "meals_provided_daily": {
      "$ref": "#/properties/meals_provided/items",
      "description": "The same free meals on every day. Ignored for any day that meals_provided already names"
    },
    "lodging_nights": {
      "type": "integer",
      "minimum": 0,
      "maximum": 366,
      "description": "Nights of accommodation. What this pays depends on the scheme and the answer says so"
    },
    "late_evening": {
      "type": "array",
      "items": {
        "type": "boolean"
      },
      "description": "UK only, per day: the journey was ongoing at 8pm and a meal was bought after it, which adds the 10.00 GBP supplement"
    },
    "fiscal_year": {
      "type": "string",
      "description": "US only, e.g. \"FY2025\". Defaults to the current bundled fiscal year"
    }
  },
  "required": [
    "scheme",
    "destination",
    "start",
    "end"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡trip_record(name, scheme, destination, start, end, ...)

Calculate a trip and save it under a name, traveller taken from the shared business profile; returns the TRIP-YYYY-NNNN id. An identical record is refused and named, spending no slot. Free: 5 trips a calendar month.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "What to call it, e.g. \"Berlin client workshop\""
    },
    "scheme": {
      "type": "string",
      "enum": [
        "pl",
        "uk",
        "us"
      ],
      "description": "\"pl\" Polish delegation regulation, \"uk\" HMRC benchmark scale rates, \"us\" GSA CONUS standard"
    },
    "destination": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Country or locality, e.g. \"Germany\", \"Poland\", \"United Kingdom\", \"United States\""
    },
    "start": {
      "type": "string",
      "minLength": 1,
      "description": "When the trip began, ISO 8601 WITH a zone: \"2026-03-28T22:00:00+01:00\", or \"2026-03-28T22:00\" together with timezone"
    },
    "end": {
      "type": "string",
      "minLength": 1,
      "description": "When it ended, same form as start. It must be after start as an instant"
    },
    "timezone": {
      "type": "string",
      "description": "IANA id such as \"Europe/Warsaw\". Required when start or end carries no offset; also the zone the US scheme counts calendar days in"
    },
    "meals_provided": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "breakfast",
            "lunch",
            "dinner"
          ]
        }
      },
      "description": "Per day, in order: the free meals the traveller was given that day, e.g. [[\"breakfast\"],[\"breakfast\",\"lunch\"]]. Each one reduces that day's allowance by the scheme's own percentage or amount"
    },
    "meals_provided_daily": {
      "$ref": "#/properties/meals_provided/items",
      "description": "The same free meals on every day. Ignored for any day that meals_provided already names"
    },
    "lodging_nights": {
      "type": "integer",
      "minimum": 0,
      "maximum": 366,
      "description": "Nights of accommodation. What this pays depends on the scheme and the answer says so"
    },
    "late_evening": {
      "type": "array",
      "items": {
        "type": "boolean"
      },
      "description": "UK only, per day: the journey was ongoing at 8pm and a meal was bought after it, which adds the 10.00 GBP supplement"
    },
    "fiscal_year": {
      "type": "string",
      "description": "US only, e.g. \"FY2025\". Defaults to the current bundled fiscal year"
    },
    "traveller": {
      "type": "string",
      "maxLength": 200,
      "description": "Who travelled. Defaults to the shared business profile's name"
    },
    "purpose": {
      "type": "string",
      "maxLength": 2000,
      "description": "Why the trip happened; kept on the record and carried onto the expense payload"
    },
    "project": {
      "type": "string",
      "maxLength": 200,
      "description": "Project or client this belongs to; carried onto the expense payload"
    }
  },
  "required": [
    "name",
    "scheme",
    "destination",
    "start",
    "end"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢trip_list(scheme, destination, traveller, project, from, ...)

List saved trips with the scheme, destination, dates and total on each, and a total per currency. Filter by scheme, destination, traveller, project and start date range. Free and unlimited.

Input Schema

{
  "type": "object",
  "properties": {
    "scheme": {
      "type": "string",
      "enum": [
        "pl",
        "uk",
        "us",
        "all"
      ],
      "description": "Default \"all\""
    },
    "destination": {
      "type": "string",
      "description": "Only trips to a destination containing this text"
    },
    "traveller": {
      "type": "string",
      "description": "Only trips by this traveller"
    },
    "project": {
      "type": "string",
      "description": "Only trips on this project"
    },
    "from": {
      "type": "string",
      "description": "YYYY-MM-DD, earliest start date"
    },
    "to": {
      "type": "string",
      "description": "YYYY-MM-DD, latest start date"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴trip_delete(trip)

Delete one saved trip and free the free-tier slot it held that month. A trip that has been exported or has an expense booked against it is refused with the blocker named, and nothing is written. Free and unlimited.

Input Schema

{
  "type": "object",
  "properties": {
    "trip": {
      "type": "string",
      "minLength": 1,
      "description": "Trip id such as TRIP-2026-0001, or an exact or partial trip name. A partial name matching more than one trip is refused with the list"
    }
  },
  "required": [
    "trip"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢trip_export(trip, category, billable, split_lodging, mark_exported)

Return the exact expense_add arguments for a saved trip: one payload for subsistence and, with split_lodging, one for lodging. It writes nothing in the expense-tracker server; only mark_exported changes this trip. Pro.

Input Schema

{
  "type": "object",
  "properties": {
    "trip": {
      "type": "string",
      "minLength": 1,
      "description": "Trip id such as TRIP-2026-0001, or an exact or partial trip name"
    },
    "category": {
      "type": "string",
      "maxLength": 200,
      "description": "Expense category to put on the payload. Default \"travel\""
    },
    "billable": {
      "type": "boolean",
      "description": "Rebillable to the client. Default: true when the trip has a project, false otherwise"
    },
    "split_lodging": {
      "type": "boolean",
      "description": "Return lodging as its own expense rather than folded into the subsistence total. Default true"
    },
    "mark_exported": {
      "type": "boolean",
      "description": "Stamp exported_at on the trip so a later export can see it already went out. Default false"
    }
  },
  "required": [
    "trip"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢perdiem_report(from, to, scheme, traveller)

Total saved trips per scheme and calendar month, bucketed by start date: trips, days, subsistence and lodging, each in the scheme's own currency, with the trip ids behind every figure. Pro.

Input Schema

{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "description": "YYYY-MM, earliest month by start date"
    },
    "to": {
      "type": "string",
      "description": "YYYY-MM, latest month by start date"
    },
    "scheme": {
      "type": "string",
      "enum": [
        "pl",
        "uk",
        "us",
        "all"
      ],
      "description": "Default \"all\""
    },
    "traveller": {
      "type": "string",
      "description": "Only this traveller"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢license_status

Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪license_activate(key)

Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.

Input Schema

{
  "type": "object",
  "properties": {
    "key": {
      "type": "string",
      "description": "License key from checkout, MCPL1.<payload>.<signature>"
    }
  },
  "required": [
    "key"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded9 tools
verifiedversion not recorded9 tools