Odometry Mileage Log MCP
An MCP server that converts user-inputted trip data into an IRS-style mileage log and reimbursement total. It applies standard mileage rates based on trip dates, checks odometer continuity, flags commuting trips, and generates downloadable PDF and Excel reports for tax or expense purposes.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://mileage-log.zovo.one/mcpWhat you can do with it
- Generate an IRS-style mileage log from typed trip details
- Calculate reimbursement totals using employer or standard rates
- Download printable PDF and Excel mileage reports
- Flag commuting trips and missing business purposes
Source and maintenance
Protocol and capabilities
- Server
- mileage-log 1.0.0
- MCP protocol
- 2025-06-18
- Tools
- 2 advertised
- Resources
- 1 advertised
- Resource templates
- 1 advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
},
"resources": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
2 advertised
generate_mileage_log — Generate mileage log
Use this when the user wants a mileage log, mileage log template, mileage log for taxes, printable mileage log, mileage log in Excel, or mileage reimbursement report from trips they drove ("turn these trips into a mileage log for my taxes", "reconstruct my mileage log from my calendar"). Takes typed trips (date, from, to, purpose, miles or odometer start/end), recurring trips (for example weekdays in a month) and/or an attached CSV/XLSX file. Applies the IRS standard mileage rate for each trip's date (2025: 70 cents; Jan-Jun 2026: 72.5 cents; Jul-Dec 2026: 76 cents per business mile; medical, moving and charity rates) or a custom employer rate, checks odometer continuity, flags commuting and missing purposes, and totals by month, purpose and client. Returns a PDF mileage log and an XLSX file. Does not look up distances between addresses, track GPS, or give tax advice. Do not use for a single quick mileage total with no trip list (use calculate_mileage_reimbursement).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"file_name": {
"type": "string",
"description": "Original file name if known, e.g. statement.pdf."
},
"mime_type": {
"type": "string",
"description": "Media type if known, e.g. application/pdf."
},
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
}
},
"description": "Optional trip spreadsheet the user attached (CSV, TSV or XLSX) with columns such as Date, From, To, Purpose, Miles, or Odometer start and Odometer end, e.g. trips.xlsx."
},
"trips": {
"type": "array",
"items": {
"type": "object",
"required": [
"date"
],
"properties": {
"to": {
"type": "string",
"maxLength": 120,
"description": "Destination (the IRS requires it), e.g. \"Client A - 410 Main St, Austin TX\"."
},
"date": {
"type": "string",
"maxLength": 40,
"description": "Date of the trip, YYYY-MM-DD, e.g. \"2026-10-05\". Turn weekdays like \"Mon\" into real dates from the conversation."
},
"from": {
"type": "string",
"maxLength": 120,
"description": "Start location, e.g. \"Office\" or \"Home\"."
},
"miles": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "Miles driven as the user gives them, e.g. 12.4. If the user says \"12.4 mi round trip\", 12.4 is already the total: pass 12.4 with round_trip false. Leave out when odometer readings are given."
},
"client": {
"type": "string",
"maxLength": 80,
"description": "Optional client, customer, project or property for totals by client, e.g. \"Acme Corp\" or \"123 Oak Ln listing\"."
},
"purpose": {
"type": "string",
"maxLength": 200,
"description": "Business purpose (the IRS requires it), e.g. \"Quarterly review meeting\" or \"Home visit, patient care\"."
},
"category": {
"enum": [
"business",
"medical",
"moving",
"charity",
"commute",
"personal"
],
"type": "string",
"description": "business (default), medical, moving (Armed Forces only), charity, commute (logged, not reimbursed) or personal (logged, not reimbursed)."
},
"round_trip": {
"type": "boolean",
"description": "true only when miles is the ONE-WAY distance and the driver came back the same way (\"6.2 mi each way\"): miles are doubled. Ignored when odometer readings are given."
},
"odometer_end": {
"type": "number",
"maximum": 9999999,
"minimum": 0,
"description": "Odometer reading at the end of the trip, e.g. 41254.8. Miles = end - start."
},
"odometer_start": {
"type": "number",
"maximum": 9999999,
"minimum": 0,
"description": "Odometer reading at the start of the trip, e.g. 41230."
}
}
},
"maxItems": 500,
"description": "Typed trips, one per drive, e.g. [{\"date\":\"2026-10-05\",\"from\":\"Office\",\"to\":\"Client A\",\"purpose\":\"Sales meeting\",\"miles\":12.4}]."
},
"vehicle": {
"type": "string",
"maxLength": 80,
"description": "Optional vehicle description printed on the log, e.g. \"2021 Toyota Camry\". No VIN or plate needed."
},
"log_title": {
"type": "string",
"maxLength": 80,
"description": "Title printed on the log, e.g. \"October 2026 mileage\"."
},
"recurring": {
"type": "array",
"items": {
"type": "object",
"required": [
"start_date",
"end_date",
"miles"
],
"properties": {
"to": {
"type": "string",
"maxLength": 120,
"description": "Destination, e.g. \"Riverside Clinic\"."
},
"from": {
"type": "string",
"maxLength": 120,
"description": "Start location, e.g. \"Office\"."
},
"miles": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "Miles per occurrence as given, e.g. 18 (the round-trip total if the user says \"18 mi round trip\")."
},
"client": {
"type": "string",
"maxLength": 80,
"description": "Optional client or project, e.g. \"Riverside Clinic\"."
},
"purpose": {
"type": "string",
"maxLength": 200,
"description": "Business purpose, e.g. \"Patient home visits\"."
},
"category": {
"enum": [
"business",
"medical",
"moving",
"charity",
"commute",
"personal"
],
"type": "string",
"description": "business (default), medical, moving, charity, commute or personal."
},
"end_date": {
"type": "string",
"maxLength": 20,
"description": "Last date of the repeat (inclusive), YYYY-MM-DD, e.g. \"2026-10-31\"."
},
"weekdays": {
"type": "array",
"items": {
"enum": [
"sun",
"mon",
"tue",
"wed",
"thu",
"fri",
"sat"
],
"type": "string"
},
"maxItems": 7,
"description": "Days of the week it happens, default Monday-Friday, e.g. [\"mon\",\"wed\",\"fri\"]."
},
"round_trip": {
"type": "boolean",
"description": "true only if miles is one-way and should be doubled."
},
"start_date": {
"type": "string",
"maxLength": 20,
"description": "First date of the repeat, YYYY-MM-DD, e.g. \"2026-10-01\"."
}
}
},
"maxItems": 20,
"description": "Repeating trips, e.g. \"every weekday in October, 18 mi to the clinic\" -> [{\"start_date\":\"2026-10-01\",\"end_date\":\"2026-10-31\",\"to\":\"Clinic\",\"purpose\":\"Patient visits\",\"miles\":18}]."
},
"skip_dates": {
"type": "array",
"items": {
"type": "string",
"maxLength": 20
},
"maxItems": 60,
"description": "Dates to leave out of recurring trips (holidays, PTO), YYYY-MM-DD, e.g. [\"2026-10-12\"]."
},
"driver_name": {
"type": "string",
"maxLength": 80,
"description": "Optional driver name printed on the log, e.g. \"Dana Lee\"."
},
"regular_workplace": {
"type": "string",
"maxLength": 80,
"description": "Name of the user's regular office or workplace, e.g. \"Main St office\", to flag home-to-office commuting."
},
"year_end_odometer": {
"type": "number",
"maximum": 9999999,
"minimum": 0,
"description": "Odometer at the end of the year (or of the log period), e.g. 52120."
},
"year_start_odometer": {
"type": "number",
"maximum": 9999999,
"minimum": 0,
"description": "Odometer at the start of the year (or of the log period), e.g. 38500. With year_end_odometer it gives total miles and business-use percentage."
},
"custom_rate_per_mile": {
"type": "number",
"maximum": 5,
"minimum": 0,
"description": "Employer or contract reimbursement rate in US dollars per mile for business trips, e.g. 0.60. Leave out to use the IRS standard mileage rate for each trip date."
},
"home_office_is_principal_place": {
"type": "boolean",
"description": "true if the user's home office is their principal place of business (then trips from home are not flagged as commuting)."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"kind",
"title",
"period",
"rate_basis",
"totals",
"vehicle_use",
"rates_used",
"by_month",
"by_purpose",
"by_client",
"flags",
"preview",
"source",
"notes",
"downloads"
],
"properties": {
"kind": {
"type": "string"
},
"flags": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"title": {
"type": "string"
},
"period": {
"type": "string"
},
"source": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"totals": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"preview": {
"type": "array",
"items": {}
},
"by_month": {
"type": "array",
"items": {}
},
"by_client": {
"type": "array",
"items": {}
},
"downloads": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"by_purpose": {
"type": "array",
"items": {}
},
"rate_basis": {
"type": "string"
},
"rates_used": {
"type": "array",
"items": {}
},
"vehicle_use": {}
},
"additionalProperties": false
}{
"title": "Generate mileage log",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}calculate_mileage_reimbursement — Calculate mileage reimbursement
Use this when the user asks for a mileage reimbursement calculator, mileage deduction, or the IRS mileage rate 2026 applied to a number of miles ("how much can I deduct for 4,200 business miles", "my employer pays 0.70 a mile how much do I get", "odometer 41230 to 46890 how many business miles"). Applies the IRS standard mileage rate for the date driven (2025: 70 cents; Jan-Jun 2026: 72.5 cents; Jul-Dec 2026: 76 cents per business mile; medical/moving 21, 20.5, 23.5 cents; charity 14 cents), splits miles across the July 1, 2026 rate change, compares a custom employer rate with the IRS rate, and turns odometer readings into miles. Does not build a trip-by-trip log (use generate_mileage_log), look up distances, or give tax advice.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"date": {
"type": "string",
"maxLength": 20,
"description": "When the miles were driven, YYYY-MM-DD or YYYY-MM, e.g. \"2026-08-15\" or \"2026-03\". Picks the IRS rate for that date. Default: today."
},
"miles": {
"type": "number",
"maximum": 1000000,
"minimum": 0,
"description": "Miles to reimburse or deduct, e.g. 4200. Leave out when odometer_start and odometer_end are given."
},
"category": {
"enum": [
"business",
"medical",
"moving",
"charity"
],
"type": "string",
"description": "business (default), medical, moving (Armed Forces only) or charity."
},
"segments": {
"type": "array",
"items": {
"type": "object",
"required": [
"miles",
"date"
],
"properties": {
"date": {
"type": "string",
"maxLength": 20,
"description": "Date or month of these miles, e.g. \"2026-05\" or \"2026-09-30\"."
},
"miles": {
"type": "number",
"maximum": 1000000,
"minimum": 0,
"description": "Miles in this part, e.g. 1800."
}
}
},
"maxItems": 60,
"description": "Miles split by date when they straddle a rate change, e.g. [{\"miles\":1800,\"date\":\"2026-05\"},{\"miles\":2400,\"date\":\"2026-09\"}]."
},
"odometer_end": {
"type": "number",
"maximum": 9999999,
"minimum": 0,
"description": "Odometer reading at the end, e.g. 46890."
},
"odometer_start": {
"type": "number",
"maximum": 9999999,
"minimum": 0,
"description": "Odometer reading at the start, e.g. 41230."
},
"personal_miles": {
"type": "number",
"maximum": 1000000,
"minimum": 0,
"description": "Personal or commuting miles inside the odometer range to subtract, e.g. 900."
},
"custom_rate_per_mile": {
"type": "number",
"maximum": 5,
"minimum": 0,
"description": "Employer or contract rate in US dollars per mile, e.g. 0.70 or 0.60. The IRS amount is shown next to it."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"kind",
"category",
"miles",
"amount",
"amount_text",
"rate_basis",
"lines",
"irs_amount",
"custom",
"odometer",
"alternatives",
"notes"
],
"properties": {
"kind": {
"type": "string"
},
"lines": {
"type": "array",
"items": {}
},
"miles": {
"type": "number"
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"amount": {
"type": "number"
},
"custom": {},
"category": {
"type": "string"
},
"odometer": {},
"irs_amount": {
"type": "number"
},
"rate_basis": {
"type": "string"
},
"amount_text": {
"type": "string"
},
"alternatives": {
"type": "array",
"items": {}
}
},
"additionalProperties": false
}{
"title": "Calculate mileage reimbursement",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
1 advertised
mileage-log-widget — Odometry Mileage Log view
Interactive view for Odometry Mileage Log.
ui://widget/mileage-log-v1-1.0.0-f63e91781887378660577273db9ca7976db9777226ac02e2150b3178d750c04b.htmlmileage-log-widget-legacy — Odometry Mileage Log view (previous versions)
ui://widget/mileage-log-{version}.html30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 760 ms
- 95th percentile latency
- 760 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 760 ms · metadata changed · 2 tool(s), 1 resource(s), 1 resource template(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http odometry-mileage-log-mcp https://mileage-log.zovo.one/mcpCodex
codex mcp add odometry-mileage-log-mcp --url https://mileage-log.zovo.one/mcpCursor
{
"mcpServers": {
"odometry-mileage-log-mcp": {
"url": "https://mileage-log.zovo.one/mcp"
}
}
}Cline
{
"mcpServers": {
"odometry-mileage-log-mcp": {
"type": "streamableHttp",
"url": "https://mileage-log.zovo.one/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"odometry-mileage-log-mcp": {
"type": "http",
"url": "https://mileage-log.zovo.one/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http odometry-mileage-log-mcp https://mileage-log.zovo.one/mcpClaude Desktop
{
"mcpServers": {
"odometry-mileage-log-mcp": {
"url": "https://mileage-log.zovo.one/mcp"
}
}
}Windsurf
{
"mcpServers": {
"odometry-mileage-log-mcp": {
"serverUrl": "https://mileage-log.zovo.one/mcp"
}
}
}Let your agent find its tools
Find servers like Odometry Mileage Log MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.