Koskamo

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.

Odometry Mileage Log MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Zovo
MCP endpoint (Streamable HTTP)
https://mileage-log.zovo.one/mcp
Vendor documentation

What 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

Community listingRegistry 1.0.0

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
Server-advertised capabilities
{
  "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.

Odometry Mileage Log turns trips into an IRS-style mileage log (date, destination, business purpose, miles, odometer) with the IRS standard mileage rate for each trip date or a custom employer rate, and returns a PDF log and an Excel file. Use generate_mileage_log for a log from trips, recurring trips or an attached CSV/XLSX; use calculate_mileage_reimbursement for a quick amount from a mileage total. Miles come from the user; the tools do not look up distances.

Tools

2 advertised

generate_mileage_log — Generate mileage log
Advertised by the server during the last successful anonymous check.
Advertised read-only

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).

generate_mileage_log input schema
{
  "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)."
    }
  }
}
generate_mileage_log output schema
{
  "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
}
generate_mileage_log annotations
{
  "title": "Generate mileage log",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
calculate_mileage_reimbursement — Calculate mileage reimbursement
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

calculate_mileage_reimbursement input schema
{
  "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."
    }
  }
}
calculate_mileage_reimbursement output schema
{
  "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
}
calculate_mileage_reimbursement annotations
{
  "title": "Calculate mileage reimbursement",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

mileage-log-widget — Odometry Mileage Log view

Advertised by the server during the last successful anonymous check.

Interactive view for Odometry Mileage Log.

mileage-log-widget URI
ui://widget/mileage-log-v1-1.0.0-f63e91781887378660577273db9ca7976db9777226ac02e2150b3178d750c04b.html

MIME type: text/html;profile=mcp-app

mileage-log-widget-legacy — Odometry Mileage Log view (previous versions)

Advertised by the server during the last successful anonymous check.

mileage-log-widget-legacy URI template
ui://widget/mileage-log-{version}.html

MIME type: text/html;profile=mcp-app

30-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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http odometry-mileage-log-mcp https://mileage-log.zovo.one/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add odometry-mileage-log-mcp --url https://mileage-log.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable odometry-mileage-log-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "odometry-mileage-log-mcp": {
      "url": "https://mileage-log.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "odometry-mileage-log-mcp": {
      "type": "streamableHttp",
      "url": "https://mileage-log.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start odometry-mileage-log-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "odometry-mileage-log-mcp": {
      "type": "http",
      "url": "https://mileage-log.zovo.one/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http odometry-mileage-log-mcp https://mileage-log.zovo.one/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "odometry-mileage-log-mcp": {
      "url": "https://mileage-log.zovo.one/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.