Zovo Expense Report
Server Details
Make an expense report from your receipts and get reimbursed.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 2 tools
The two tools split cleanly by input modality: structured expense lines/objects versus an attached CSV/XLSX file. There is a real overlap zone — a file the agent can already read could go to either tool — but the descriptions explicitly resolve it by telling the agent to prefer sending parsed lines to generate_expense_report. The shared output and shared refusal rules (bank statements) are stated identically in both, which reinforces rather than muddies the boundary.
Both names follow the same verb_noun pattern with a shared stem (generate_expense_report, generate_expense_report_from_file), and the '_from_file' suffix clearly signals the variation axis. No mixed casing or verb styles.
Two tools is on the thin side, but for a narrowly scoped report-generation server it maps exactly to the two realistic input paths (pasted/structured lines vs. attached sheet), so neither feels gratuitous. The only weakness is that a third input path (receipt images/PDFs) is deliberately left to the calling agent instead of being a tool.
The surface covers the full lifecycle of producing a deliverable: input parsing, validation/ambiguity flagging, policy checks, and dual output (PDF + Excel). Gaps are real but workable and explicitly disclosed — no image/PDF receipt reading, no exchange-rate lookup, and no submission to an employer system, all of which the agent is told to handle itself.
Available Tools
2 toolsgenerate_expense_reportGenerate expense reportARead-onlyInspect
Use this when the user wants an expense report or reimbursement form from their receipts: read the receipts, e-mails or chosen charges yourself and send lines as objects, one per business expense, {date, merchant, amount, currency, category}, plus payment method, receipt yes/no, notes, or miles for mileage; for a stay of several nights send {merchant, amount (the stay total), quantity} or {merchant, quantity, unit_price}. Free text is only a fallback: clear lines are read from it, and any line that is ambiguous (several amounts, a breakdown that does not match its total, an unclear multiplier) is not counted and is returned under "Not counted, check these" for you to send again as structured lines. Phrases: "make an expense report from my receipts", "expense reimbursement form", "mileage reimbursement". Send each receipt once at its total; do not add subtotal, tax-included, cash tendered, change or card payment lines. A bank or card statement is not an expense report: ask the user which charges are business expenses and send only those. When free text has a Total that does not match its lines, the Total is used and the line is flagged for a check. Returns a PDF report (employee, department, period, purpose, line table, category subtotals, advances, total due, signature block), an Excel file, and policy flags (missing receipts, duplicates, weekends and holidays, outside the period, alcohol in meals, per-line cap) as warnings. Lines in another currency without a rate stay out of the total. Does not read images itself, look up exchange rates, or submit anything to an employer system.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | Expense lines, best as objects converted from what the user pasted or photographed: a list like [{"date":"2026-10-02","merchant":"Delta Air Lines","category":"Airfare","amount":412.30,"receipt":true}], or, as a fallback, text with one expense per line, e.g. "10/02/2026 Delta Air Lines, Airfare, 412.30". Mileage: {"date":"2026-10-03","merchant":"Office to client","miles":42}. | |
| period | No | Optional: report period, e.g. "October 2026" or "2026-10-01 to 2026-10-15". Lines outside it are flagged. Default: first to last line date (no period flags). | |
| advance | No | Optional: cash advance already received, subtracted from the total due, e.g. 200 or "$200". | |
| purpose | No | Optional: business purpose of the trip or period, e.g. Client visit to Acme in Denver. | |
| approver | No | Optional: manager who approves the report, e.g. Sam Patel. | |
| currency | No | Optional: currency of the report total, e.g. USD (default), EUR, GBP. | |
| line_cap | No | Optional: flag any single line above this amount, e.g. 500. Default: no cap. | |
| timezone | No | Optional: the user's IANA timezone for the default report date, e.g. Asia/Ho_Chi_Minh or America/New_York. | |
| date_order | No | Optional: MDY (US) or DMY for dates like 03/10/2026. Default: decided once for the whole list (a day above 12 decides it; otherwise day first for GBP, EUR, AUD, NZD and INR reports, month first for others). | |
| department | No | Optional: department or cost center, e.g. Sales West. | |
| report_date | No | Optional: date printed on the report, e.g. 2026-10-25. Default: today in the timezone you pass, else today in UTC. | |
| mileage_rate | No | Optional: mileage rate in the report currency or in cents, e.g. 0.70, "70 cents" or "0.30 per km". A rate with no unit is per km for km distances and per mile for mile distances. Default for USD reports: the IRS business rate for the line date (2025: 70 cents; 2026: 72.5 cents to June 30, 76 cents from July 1). | |
| employee_name | No | Optional: name printed on the report, e.g. Jordan Lee. Left blank for handwriting when not given. | |
| flag_weekends | No | Optional: flag Saturday and Sunday expenses (default true). | |
| exchange_rates | No | Optional: rates into the report currency, e.g. {"EUR": 1.08, "GBP": 1.27} (1 EUR = 1.08 USD). A line's own rate or converted amount wins. | |
| holiday_country | No | Optional: country whose public holidays are flagged, e.g. US (default), GB, CA, or none. | |
| receipt_required_over | No | Optional: receipts are required for items of this amount or more, e.g. 75 (default 75). |
Output Schema
| Name | Required | Description |
|---|---|---|
| flags | Yes | |
| notes | Yes | |
| policy | Yes | |
| report | Yes | |
| totals | Yes | |
| excluded | Yes | |
| downloads | Yes | |
| categories | Yes | |
| lines_preview | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds substantial behavior beyond that: it names the returned artifacts (PDF with employee, department, period, line table, category subtotals, advances, total due, signature block; Excel file), the policy flags raised (missing receipts, duplicates, weekends/holidays, out-of-period, alcohol in meals, per-line cap), and the handling rules for duplicates, totals mismatches, and unconverted currencies. No behavior contradicts the read-only annotation, since the tool produces documents rather than mutating external systems.
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?
It is front-loaded with the use case and contains little pure filler, but it is one dense run-on paragraph chained with semicolons and commas, including a nested bracket list that is hard to parse on first read. The formatting rules, ambiguity handling, and output description would be far more scannable as short labeled sections.
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 17-parameter tool with one required parameter, the description covers the required 'lines' input in depth, discloses the return set (even though an output schema exists), and states limits and side effects precisely. Optional parameters are fully documented in the schema, so nothing an agent needs to invoke this 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?
Schema coverage is 100%, so the baseline is 3; the description earns extra by prescribing the preferred object shape per expense, giving the multi-night-stay alternatives ({merchant, amount, quantity} vs {merchant, quantity, unit_price}), and defining free text as a strict fallback with a named failure bucket ('Not counted, check these'). It leaves most optional fields (advance, approver, timezone, date_order, receipt_required_over) to the schema, which is acceptable given full 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?
States a concrete verb and artifact ('generate an expense report... from their receipts'), enumerates the accepted line shapes, and closes with explicit non-capabilities ('does not read images itself, look up exchange rates, or submit anything'). The repeated emphasis on sending structured lines yourself implicitly separates it from the sibling generate_expense_report_from_file, which takes a file instead of caller-built lines.
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?
Opens with an explicit trigger ('Use this when the user wants an expense report or reimbursement form'), adds recognized user phrases, and gives a real exclusion: 'A bank or card statement is not an expense report: ask the user which charges are business expenses and send only those.' It also states what to do when input is ambiguous rather than guessing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_expense_report_from_fileGenerate expense report from fileARead-onlyInspect
Use this when the user attaches a CSV or Excel (.xlsx) list of chosen business expenses and wants an expense report or reimbursement form from it; if you can read the file yourself, prefer sending its expense lines as objects to generate_expense_report. Reads simple user-made sheets (Date, Merchant, Category, Amount, Currency, Payment method, Receipt, Reimbursable, Miles, Notes) and expense-tool exports such as Expensify, Concur, SAP, Navan, Ramp, Brex, Spendesk, Pleo, Payhawk and Zoho Expense. A bank or card statement export (balance, account or booking-date columns, salary rows) is refused: ask the user which charges are business expenses and send only those. Returns the same PDF report, Excel file and policy flags as generate_expense_report. Pasted text sent to generate_expense_report is read the same strict way: clear lines are counted, and ambiguous ones are returned for you to send again as structured lines. Does not read receipt images or PDFs of receipts (read those yourself and use generate_expense_report), and does not submit anything to an employer system.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | The expense list as a CSV or Excel (.xlsx) file with columns such as Date, Merchant, Category, Amount, e.g. october-expenses.xlsx. | |
| period | No | Optional: report period, e.g. "October 2026" or "2026-10-01 to 2026-10-15". Lines outside it are flagged. Default: first to last line date (no period flags). | |
| advance | No | Optional: cash advance already received, subtracted from the total due, e.g. 200 or "$200". | |
| purpose | No | Optional: business purpose of the trip or period, e.g. Client visit to Acme in Denver. | |
| approver | No | Optional: manager who approves the report, e.g. Sam Patel. | |
| currency | No | Optional: currency of the report total, e.g. USD (default), EUR, GBP. | |
| line_cap | No | Optional: flag any single line above this amount, e.g. 500. Default: no cap. | |
| timezone | No | Optional: the user's IANA timezone for the default report date, e.g. Asia/Ho_Chi_Minh or America/New_York. | |
| date_order | No | Optional: MDY (US) or DMY for dates like 03/10/2026. Default: decided once for the whole list (a day above 12 decides it; otherwise day first for GBP, EUR, AUD, NZD and INR reports, month first for others). | |
| department | No | Optional: department or cost center, e.g. Sales West. | |
| report_date | No | Optional: date printed on the report, e.g. 2026-10-25. Default: today in the timezone you pass, else today in UTC. | |
| mileage_rate | No | Optional: mileage rate in the report currency or in cents, e.g. 0.70, "70 cents" or "0.30 per km". A rate with no unit is per km for km distances and per mile for mile distances. Default for USD reports: the IRS business rate for the line date (2025: 70 cents; 2026: 72.5 cents to June 30, 76 cents from July 1). | |
| employee_name | No | Optional: name printed on the report, e.g. Jordan Lee. Left blank for handwriting when not given. | |
| flag_weekends | No | Optional: flag Saturday and Sunday expenses (default true). | |
| exchange_rates | No | Optional: rates into the report currency, e.g. {"EUR": 1.08, "GBP": 1.27} (1 EUR = 1.08 USD). A line's own rate or converted amount wins. | |
| holiday_country | No | Optional: country whose public holidays are flagged, e.g. US (default), GB, CA, or none. | |
| receipt_required_over | No | Optional: receipts are required for items of this amount or more, e.g. 75 (default 75). |
Output Schema
| Name | Required | Description |
|---|---|---|
| flags | Yes | |
| notes | Yes | |
| policy | Yes | |
| report | Yes | |
| totals | Yes | |
| excluded | Yes | |
| downloads | Yes | |
| categories | Yes | |
| lines_preview | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive and closed-world, but the description adds substantial behavior beyond them: the refusal path for bank statements with the recommended recovery (ask which charges are business expenses), the list of recognized expense-tool export formats, the returned artifacts (PDF, Excel, policy flags), and the strict-line parsing behavior where ambiguous lines are handed back for resubmission.
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 usage condition and the sibling alternative are front-loaded in the first sentence, and the refusal/limitation clauses are grouped afterward. It is dense and long, and the sentence about pasted text sent to generate_expense_report is somewhat tangential to this tool, but nearly every clause carries actionable 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 17-parameter tool with a nested file object, the description covers input format acceptance, refusal cases, recovery instructions, and output artifacts, with the output schema handling return details. An agent has everything needed to decide whether to call it and what to expect.
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% and each of the 17 parameters carries its own explanation and defaults, so the schema does the heavy lifting. The description contributes context about the recognized input columns (Date, Merchant, Category, Amount, Miles, etc.) but says nothing about the optional report-shaping parameters, which is acceptable at baseline 3.
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?
States a specific verb and resource ('generate an expense report ... from an attached CSV or Excel list') and explicitly names the sibling generate_expense_report as the alternative path. An agent can distinguish the two tools without opening either schema.
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?
Gives explicit positive conditions (user attaches a CSV/.xlsx expense list), an explicit alternative ('if you can read the file yourself, prefer sending its expense lines as objects to generate_expense_report'), and explicit exclusions (bank/card statement exports are refused; receipt images and PDFs are not read; nothing is submitted to an employer system). The routing decision is fully determined by the text.
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.
2 tool updates
- First observed
generate_expense_report - First observed
generate_expense_report_from_file
Related MCP Connectors
Log expenses, receipts and mileage from chat: auto-categorise, split VAT, summarise, export, rebill.
Log expenses, receipts and mileage from chat: auto-categorise, split VAT, summarise, export, rebill.
Receipt ingestion, Gmail capture, expense analysis, and reviewed reports for AI-agent workflows.
Log business expenses with the VAT split and mileage, total them, export CSV or XLSX.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables tracking business trip expenses and calculating settlements using Google Sheets, with natural language parsing of expenses.4 npmMIT
- AlicenseAqualityAmaintenanceEnables Claude to read and write expense reports, expenses, unassigned card transactions, receipts, and travel trips, with all writes confirmation-gated.41558 npmMIT
- AlicenseBqualityBmaintenanceEnables agents to review local travel expenses against fictional policy rules, preview and build immutable XLSX/PDF/DOCX/ZIP claim packages, and track submission, approval, and reimbursement status. Runs entirely offline with SQLite storage, receipt imports, exports, and portable backups.6MIT
- AlicenseNot gradedqualityCmaintenanceEnables secure expense claim management with tools for listing, submitting, approving, and refunding expenses. It layers ThunderID scopes, runtime policy decisions, and application rules to authorize each call, with a full audit trail.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.