mileage-log
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mileage-logLog a 12-mile business trip to the client office today."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-mileage-log
MCP server for a mileage log for deductible driving: trips, effective-dated rates, summaries and a CSV export. Mileage log for deductible driving: trips, effective-dated rates, summaries and CSV export.
Works with Claude Desktop, Claude Code, Cursor and any Model Context Protocol client. Runs on your own machine, or hosted with no install.
Install
Hosted, nothing to install. Get a token from https://mcp.zovo.one/mcp/connect (the connect page) or https://mcp.zovo.one/mcp/token (the same token as JSON); a free anonymous one is issued on the spot and a Pro key works the same way. Then point an MCP client at https://mcp.zovo.one/mcp/mileage-log over streamable-http and send the token as Authorization: Bearer <token>.
If your client cannot set headers, put the token in the path instead: https://mcp.zovo.one/mcp/mileage-log/t/<token>. Both forms work. The bare URL with no token answers 401 on tools/call, so the token is not optional.
Claude Desktop, one click. Download mileage-log.mcpb from the latest release and double-click it.
From source. The mirror is self-contained: every @theluckystrike/* dependency is vendored, so a fresh clone builds with no extra setup.
git clone https://github.com/theluckystrike/mcp-mileage-log.git
cd mcp-mileage-log
npm install && npm run buildThen point your client at the built entry point:
{
"mcpServers": {
"mileage-log": {
"command": "node",
"args": ["/absolute/path/to/mcp-mileage-log/dist/index.js"]
}
}
}
@theluckystrike/mcp-mileage-logis not published on npm yet, so annpx -y @theluckystrike/mcp-mileage-logcommand will fail. The three paths above are the working ones and each is exercised by CI.
Read-only mirror of mcp-servers/servers/mileage-log. See MIRROR.md.
In the official MCP Registry (io.github.theluckystrike/mileage-log).
An mcp mileage tracker that keeps the mileage log freelancers need at tax time, the moment the drive happens instead of reconstructed from memory in April. Log each trip with the date, from and to, the distance in miles or km, the purpose and the category (business, medical, moving, charitable, personal); set the rates that apply to you as an effective-dated series per jurisdiction and category; and the summary prices every trip at the rate in force on the day it was driven, per category and per currency. When the log is right, one call exports it as CSV to hand to your accountant. Everything stays on this machine; there is no account and no network call.
Built by theluckystrike.
npm publish for @theluckystrike/mcp-mileage-log is pending, so npx -y @theluckystrike/mcp-mileage-log returns 404 today. Until then, a clone+build is the working path.
Related MCP server: gnucash-mcp
Install
Claude Desktop
macOS ~/Library/Application Support/Claude/claude_desktop_config.json, Windows %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"mileage-log": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-mileage-log"]
}
}
}Claude Code
claude mcp add mileage-log -- npx -y @theluckystrike/mcp-mileage-logCursor
~/.cursor/mcp.json (global) or .cursor/mcp.json (project), same entry as Claude Desktop.
Tools
tool | what it does |
| Log one trip: date, from, to, distance in miles or km, purpose, category. Returns |
| List trips oldest first, with the rate and amount each earns; filter by date range and category |
| Remove a trip by its exact id, for entries made by mistake. The id is not reissued |
| Set what one mile or km is worth for one category in one jurisdiction from a date forward. A series, not one global number |
| Every rate on file, grouped by jurisdiction and category with effective dates in order |
| A date range (default the current year): per-category distance, the rate each trip earned, and the deductible amount, per currency |
| The log as CSV for an accountant: date, from, to, distance, category, rate, amount. Pro |
| Free or Pro, and the key |
Rates are a series, and none ship with the server
Tax authorities change their mileage rates, usually every year, so this server never holds one global rate: rate_set adds a rate for a jurisdiction, a category and a unit from an effective date, and each trip earns the rate in force on its own day. No rates ship with this server, and the example below is an EXAMPLE, not a statement of current law. Verify the figures that apply to you before you file.
An example rate set (illustrative only):
rate_set jurisdiction:"US federal (EXAMPLE)" category:business rate:0.70 unit:miles currency:USD effective_from:2026-01-01
rate_set jurisdiction:"US federal (EXAMPLE)" category:business rate:0.655 unit:miles currency:USD effective_from:2025-01-01
rate_set jurisdiction:"US federal (EXAMPLE)" category:medical rate:0.21 unit:miles currency:USD effective_from:2026-01-01
rate_set jurisdiction:"US federal (EXAMPLE)" category:charitable rate:0.14 unit:miles currency:USD effective_from:2026-01-01A 2025 trip then prices at 0.655 and a 2026 trip at 0.70, automatically. If your trips are in km and your rate is per mile (or the other way around), the distance is converted with the exact factor (1 mile = 1.609344 km) before pricing.
Free vs Pro
Free | Pro | |
Trips per calendar month | 20 | Unlimited |
Trip list and mileage summary | Yes | Yes |
Rates per jurisdiction and category | 1 (overwrite stays free) | Unlimited series |
CSV export for the accountant | No | Yes |
The monthly cap is counted on the month of the trip date, so reconstructing last year's log at tax time does not consume this month's allowance. The log itself is never metered: reading, listing and summarizing stay free for good.
Get Pro: https://mcp.zovo.one/buy/mileage-log -- $19 one-time for this server, or $39 for the bundle.
Money and rounding
A trip's deductible amount is its distance times the effective rate, rounded half-up to the cent per trip, and every total is the sum of those rounded per-trip amounts: a total can never drift from the lines it is made of, and the CSV export reconciles line by line with the summary. The arithmetic is integer-only (distances as thousandths of a unit, rates as thousandths of a currency unit), so 12.5 miles at 0.70 a mile is exactly 875 cents, never 874.99999. Miles and km are kept apart and never added together; amounts are kept per currency and never mixed. When a trip's unit differs from the rate's, the distance is converted first (1 mile = 1.609344 km exactly) and rounded half-up to the thousandth of the rate's unit, then priced.
Privacy
All data stays local, in ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/mileage-log/. Three files: trips.json, rates.json, counter.json. Nothing is sent anywhere, there is no account, no API key and no network call in this server at all. License keys are verified offline. Nothing this server computes is tax advice; the rates you enter are your own figures to verify.
Built by theluckystrike. https://github.com/theluckystrike
Available Tools
9 toolslicense_activateActivate licenseA
Activate a Pro key (MCPL1.xxx.yyy) from checkout: verified offline against a built-in public key, saved to your config file. A wrong, malformed or expired key is refused, unsaved. license_status reads it back.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | License key from the checkout confirmation page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that verification happens offline against a built-in public key, that the key is persisted to the config file, and that invalid keys are refused and left unsaved. This is substantial transparency for an activation tool, though it could mention overwriting an existing key or the exact return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence front-loads the main action, source, verification method, and persistence. The second sentence efficiently covers error handling and points to the related read-back tool. Every clause adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single-parameter tool with no output schema and no annotations, the description covers activation behavior, verification mechanism, persistence, error outcomes, and how to read the result later. The only minor gap is an explicit statement of what the function returns upon success or failure, but the phrase 'refused, unsaved' implies a feedback mechanism. Overall, it is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the 'key' parameter at 100% coverage, so the baseline is 3. The description adds meaningful semantics by giving the concrete key format ('MCPL1.xxx.yyy'), confirming the key comes from the checkout page, and explaining that malformed or expired keys will be rejected. This goes beyond the schema's one-line description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Activate a Pro key'), the exact key format ('MCPL1.xxx.yyy'), the source ('from checkout'), and the core mechanism ('verified offline against a built-in public key'). It also differentiates itself from the sibling license_status by noting that license_status reads the activation back, so there is no ambiguity about which tool does what.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this when you have a Pro key from checkout that needs to be activated. It also points to license_status as the read-back tool, which implies when to use a related sibling. It does not explicitly spell out 'do not use for checking status' or list other alternatives, but the context is strong enough to avoid misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
license_statusLicense statusA
Report this server's licence state: product, tier free or pro, licence id, expiry, the key source and the upgrade URL. No arguments, no network. Explains a free-tier refusal; license_activate installs a key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden of behavioral disclosure. It discloses that the call is local ('no network') and argument-free, and it mentions a specific explanatory behavior. The word 'Report' implies read-only, though it does not explicitly state non-destructive or permission requirements; this is adequate for a status command.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence lists the output fields; the second adds constraints and the sibling pointer. Every clause contributes meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool with no output schema, the description lists the expected output fields, behavioral constraints, and the relevant alternative tool. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters and the description reinforces this with 'No arguments'. It adds value by listing the reported fields, helping an agent understand what the empty input will yield. The baseline for zero-parameter tools is high, and the description meets it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Report'), a clear resource ('this server's licence state'), and enumerates the exact fields returned. It also names the sibling 'license_activate' as the tool that does something different, so an agent can distinguish them immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage constraints: no arguments, no network, and explains a free-tier refusal. It also directs the agent to license_activate when the task is to install a key, serving as an explicit pointer to the relevant alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mileage_exportExport the log as CSV for an accountantA
The mileage log as CSV, one row per trip, oldest first: date, from, to, distance, unit, category, the rate applied (the one in force on the trip's day), the currency and the amount, plus purpose, jurisdiction, effective_from and id. The amount column is a bare number a spreadsheet reads. Refuses while any non-personal trip in the window is unpriced, so an accountant never receives a log with silent gaps. Pro.
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | No | End of the range, YYYY-MM-DD. Default December 31 of the current year | |
| from_date | No | Start of the range, YYYY-MM-DD. Default January 1 of the current year |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It discloses a critical behavior: it refuses to export if any non-personal trip in the window is unpriced, and it specifies ordering and the bare-number format of the amount column. This is valuable context beyond what the schema provides, though it does not mention other potential failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose. It efficiently lists the output columns and key behaviors in a few sentences. The trailing 'Pro.' is slightly ambiguous but does not detract significantly from the overall clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple export tool with no output schema, the description adequately covers the output format, ordering, and a critical failure condition. It does not cover authentication or other edge cases, but these are not typically expected in tool descriptions. The description provides enough information for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters have descriptions in the schema (100% coverage), so the description adds no additional parameter semantics. It does not need to compensate since the schema already explains the date range, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool exports the mileage log as CSV, specifies the exact row structure (one row per trip, oldest first) and lists all columns. This distinctly differentiates it from sibling tools like mileage_summary or trip_list, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The title and description imply this is for exporting a CSV log for an accountant, which indicates when to use it. However, it does not explicitly mention alternatives or conditions when not to use it, so the guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mileage_summarySummarize a date rangeA
The deductible mileage for a date range, per category: trips, distance kept per unit, the rate each trip earned (the one in force on its day), and the deductible amount, totalled per currency. Trips with no applicable rate are listed with the reason, not silently dropped. Defaults to the current calendar year. Never metered.
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | No | End of the range, YYYY-MM-DD. Default December 31 of the current year | |
| category | No | Only this category: business, medical, moving, charitable, personal | |
| from_date | No | Start of the range, YYYY-MM-DD. Default January 1 of the current year |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden of behavioral disclosure. It discloses a key edge-case behavior (trips without a rate are listed with reason, not dropped) and includes the cryptic 'Never metered' note, which likely indicates no rate-limit impact. It does not explicitly state read-only behavior, but that is implied for a summary tool. No contradictions with annotations (none present).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the purpose, lists the output components, includes a crucial edge-case behavior, and states defaults. Every sentence earns its place, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description sufficiently explains what the tool returns (trips, distance kept per unit, rate per trip, deductible amount per currency). It also covers the edge case of trips without rates, states defaults, and is concise enough for an agent to call it correctly. No critical missing information is apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, meaning all parameters (to_date, category, from_date) are already documented in the schema with their defaults and allowed values. The description adds minimal new semantic value—it reiterates the default calendar year (already in schema) and mentions 'per category' which is also in the schema. Baseline of 3 is appropriate given high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: summarizing deductible mileage for a date range, broken down by category, with specific metrics (trips, distance, rate, deductible amount). It also includes behavioral details like 'Trips with no applicable rate are listed with the reason, not silently dropped' and 'Never metered,' which distinguish it from siblings like trip_list or mileage_export. The verb 'summarize' is implicit but the scope and output are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context about defaults (current calendar year) and what the tool does, but it does not explicitly contrast with sibling tools or state when to use this versus alternatives like trip_list or mileage_export. Usage is implied rather than explicitly guided, with no 'when-not-to-use' or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rate_listList the rates on fileA
List every mileage rate on file, grouped by jurisdiction and category with the effective-from dates in order: the series each trip is priced from. Reads only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It explicitly states 'Reads only,' discloses grouping and ordering behavior, and clarifies that it returns the full rate series. This is solid transparency for a simple list operation, though it does not describe output format details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the action and resource, then adds grouping and ordering details without any filler. Every phrase contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool, the description provides the essential behavioral context: what is listed, how it is organized, and that it is safe to call. It could mention return format or potential size, but nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the description confirms the scope ('every mileage rate on file'), leaving no ambiguity about what the call returns. The baseline for a parameterless tool is high, and the description fully satisfies it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a clear resource ('every mileage rate on file') and adds distinguishing details: grouping by jurisdiction and category, and inclusion of effective-from dates. This makes it easy to tell apart from siblings like rate_set and mileage_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'the series each trip is priced from' gives useful context for when to use this tool: when you need the rate series used for trip pricing. It does not explicitly name alternatives or exclusions, but the context is clear enough for a zero-parameter read tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rate_setSet a mileage rateA
Set what one mile or km is worth for one category in one jurisdiction from a date forward: the jurisdiction label, the category, the rate per unit, the currency, and the date it takes effect. Rates form a series per jurisdiction and category, and each trip earns the rate in force on the day it was driven. No rate ships with this server; the figures are yours to verify. Free tier: one rate per jurisdiction and category; the year-over-year series is Pro.
| Name | Required | Description | Default |
|---|---|---|---|
| rate | Yes | The rate per unit in currency units, to the thousandth, e.g. 0.70 for 70 cents a mile | |
| unit | Yes | The distance unit the rate prices | |
| category | Yes | Which category this prices: business, medical, moving, charitable, personal | |
| currency | Yes | ISO code the rate is in | |
| jurisdiction | Yes | A label for the rate set, e.g. US federal or Canada federal. It is a label, not legal advice | |
| effective_from | Yes | The date the rate starts to apply, YYYY-MM-DD. May be in the future: authorities announce next year's rate ahead of time |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavior. It clearly indicates this is a mutating operation (setting a rate), explains the series semantics and that trips earn the rate in force on the day driven, and notes that no rates ship with the server (data must be user-provided). It also discloses free-tier limits. This goes beyond the schema and gives the agent a solid mental model, though it does not detail error conditions or overwrite behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact but not skeletal. It front-loads the core action in the first sentence, then adds necessary context (series, earning logic, data verification, free tier). Every sentence contributes value and the structure flows logically. It is slightly longer than minimal but earns its length with material context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and no annotations, the description covers the essential behavioral contract: what is set, how the series works, how rates apply to trips, the effective date flexibility, and free-tier constraints. It does not mention response format or error handling, but those are often inferred from the tool's purpose. The description is strong enough for an agent to call it correctly in most contexts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds high-level context (e.g., 'each trip earns the rate in force on the day it was driven' clarifies effective_from, and 'the figures are yours to verify' hints at data ownership), but it does not add per-parameter syntax beyond what the schema already states. It supplements the schema meaningfully without being essential, so 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise action ('Set what one mile or km is worth') and specifies the exact scope: one category, one jurisdiction, from a date forward. It clearly distinguishes the write operation from siblings like rate_list by framing it as an act of setting, and adds context about the rate series and earning logic. This is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when the tool is used (to define or update a rate) and provides useful context about the rate series and effective dates, but it does not explicitly direct the agent away from alternatives or name sibling tools. For example, it never says 'to view rates, use rate_list'. The guidance is implicit rather than explicit, so a 3 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trip_addLog a tripA
Log one drive in the mileage log: the date, where from and to, the distance in miles or km, the purpose, and the category (business, medical, moving, charitable, personal). Returns its TR-YYYY-NNNN id. Free tier: 20 trips per calendar month, counted on the month of the trip date.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Where it ended, e.g. Client site, 2 Mill Lane | |
| date | Yes | The day the trip was driven, YYYY-MM-DD. A future date is refused: the trip cannot have been driven yet | |
| from | Yes | Where the trip started, e.g. Home office, 14 Nowa Street | |
| note | No | ||
| unit | Yes | miles or km; spellings like mi and kilometre are accepted | |
| purpose | Yes | Why the trip was made, e.g. Site visit for the Kowalski refit | |
| category | Yes | One of: business, medical, moving, charitable, personal. Personal trips are kept for the record and priced only if a rate exists | |
| distance | Yes | How far, to the thousandth of the unit, e.g. 12.5 | |
| jurisdiction | No | Which rate set prices this trip, when more than one jurisdiction has a rate for its category. Omit when only one does |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It discloses the return of a trip ID and the free-tier limit, but it does not explicitly state that this is a mutating operation, any required authentication, or potential side effects. The description is not misleading, but it under-discloses for a write operation without annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and key fields, then the return ID, then the free-tier constraint. Every sentence earns its place with no filler, making it concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (9 params, 7 required) and no output schema, the description covers the core purpose, return value, and a key constraint (free tier). The schema covers parameter details, and the description does not need to explain those. It is complete enough for an agent to call the tool correctly, though it could mention the rejection of future dates (already in schema) or error behavior, but those are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89%, so the schema already documents most parameters well. The description reiterates the field names but does not add new meaning beyond what the schema provides (e.g., it doesn't explain the note or jurisdiction fields, but those are covered in the schema). With high coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Log one drive in the mileage log') and enumerates the key fields (date, from, to, distance, purpose, category). It distinguishes this tool from siblings by its verb and resource focus—logging versus listing, removing, or exporting trips. The return of a TR-YYYY-NNNN id is also mentioned, adding specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: it's for adding a trip to the mileage log, and it mentions the free-tier monthly limit, which is a usage constraint. However, it does not explicitly state when not to use it or mention alternatives like trip_remove or trip_list, so it lacks the exclusionary guidance needed for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trip_listList tripsA
List trips in the mileage log, oldest first: date, from, to, distance, category, and the amount each earns under the rate in force on its day (or the plain reason it is unpriced). Filter by date range and category. Reads only.
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | No | Only trips dated on or before this, YYYY-MM-DD | |
| category | No | Only trips of this category: business, medical, moving, charitable, personal | |
| from_date | No | Only trips dated on or after this, YYYY-MM-DD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It explicitly says 'Reads only,' which is a strong safety disclosure. It also discloses ordering ('oldest first'), the exact fields returned, and the pricing behavior (earnings under the rate in force on its day, or the plain reason it is unpriced). This goes well beyond a generic 'list trips' and gives the agent a clear model of what the tool does and what it returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The core action and ordering are front-loaded, the return fields are listed compactly, and the filter capability is stated in a short final sentence. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description is nearly complete: it states ordering, fields, pricing behavior, and filters. The only minor gap is that it doesn't describe pagination or result limits, but for a mileage log list this is a small omission. The read-only annotation absence is compensated by the explicit 'Reads only' statement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters with formats and meanings. The description adds the filter dimensions ('Filter by date range and category') but does not add syntax or format details beyond what the schema provides. Baseline 3 is appropriate because the schema does the heavy lifting and the description doesn't need to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List trips'), a clear resource ('the mileage log'), and a precise scope: oldest first, with the fields returned and the pricing behavior. It also distinguishes itself from siblings by noting it is read-only and by naming the filter dimensions (date range and category), so an agent can tell it apart from mileage_summary, mileage_export, and trip_add without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool: when you need a chronological list of trips with per-trip earnings and filters. It does not explicitly name alternatives or exclusions, but the read-only note and the filter semantics provide enough context to select it over trip_add, trip_remove, rate_set, and mileage_summary. A small gap is that it doesn't explicitly say 'use mileage_summary for totals' or 'use mileage_export for file output,' but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trip_removeRemove a tripA
Remove one trip from the mileage log by its exact TR-YYYY-NNNN id, for entries made by mistake. The id is not reissued: a gap in the TR series is the record that a trip was removed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The exact trip id, e.g. TR-2026-0003 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses a key behavioral trait: the id is not reissued and a gap in the TR series is the record of removal. This is valuable beyond the schema. It doesn't mention irreversibility explicitly, but the gap statement strongly implies permanence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The core action and identifier format are front-loaded, and the behavioral note about id gaps is a meaningful addition that earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter removal tool with no output schema, the description is nearly complete. It covers what, when, and a key behavioral consequence. It could mention that removal is permanent, but the gap statement already implies it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the id parameter with an example. The description reinforces the exact format but doesn't add much beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Remove'), a specific resource ('one trip from the mileage log'), and a precise identifier format ('exact TR-YYYY-NNNN id'). It clearly distinguishes this from sibling tools like trip_add and trip_list by focusing on removal by exact id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says this is for 'entries made by mistake', which gives a clear context for when to use it. It doesn't explicitly name alternatives or exclusions, but the context is clear enough for an agent to select this tool over trip_add or trip_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.22.0- First observed
license_activate - First observed
license_status - First observed
mileage_export - First observed
mileage_summary - First observed
rate_list - First observed
rate_set - First observed
trip_add - First observed
trip_list - First observed
trip_remove
TDQS
Scored across 9 tools
The trip add/list/remove and rate set/list tools are clearly separated, and license_activate/status are distinct. mileage_summary and mileage_export both report trip data, but their descriptions differentiate totals versus raw CSV output, so only mild ambiguity exists.
Trip and rate tools consistently follow object_verb naming like trip_add, trip_list, rate_set, and rate_list. mileage_summary and license_status break the verb pattern with noun suffixes, but the object prefix and intuitive wording keep naming mostly predictable.
Nine tools cover trip entry/listing/removal, rate management, reporting/export, and licensing without redundant operations. This is a well-scoped set for a focused mileage-log server.
Core workflows are covered: log trips, configure rates, view summaries, export data, and manage licensing. The main gaps are the lack of a trip update/edit operation and no single-trip lookup by id, but users can remove and re-add trips and list all trips.
Maintenance
Related MCP Connectors
Mileage log for deductible driving: trips, effective-dated rates, summaries and CSV export.
Czech mileage logbook (kniha jizd): AI journey drafts, statutory reimbursement, XLSX export
Personal finance tracker — log transactions, view summaries, and browse a dashboard
Log expenses, receipts and mileage from chat: auto-categorise, split VAT, summarise, export, rebill.
Related MCP Servers
- AlicenseBqualityAmaintenanceEnables local-first personal finance management through deterministic tools for importing, categorizing, and analyzing bank transactions.36MIT
- AlicenseAqualityAmaintenanceFull double-entry accounting on local GnuCash books: transactions (single and batch), invoices and bills, budgets, investment lots, scheduled transactions, reconciliation, and reports. Multi-currency and multi-book aware, with a plain-text audit trail of every write. Your data never leaves your machine.2798770MIT
- FlicenseAqualityCmaintenanceTracks personal expenses with tools to add, edit, and summarize expenses, storing data locally in SQLite.3-
- FlicenseAqualityCmaintenanceEnables local tracking and management of monthly expenses, including adding, listing, deleting expenses, setting budgets, and viewing monthly summaries and category breakdowns.6-