Zovo Expense Report MCP
Generates PDF reimbursement reports and Excel workbooks from receipt data, including policy checks for duplicates, missing receipts, and mileage calculations.
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://expense-report.zovo.one/mcpWhat its tools do
2 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Generate PDF reimbursement reports from receipt data
- Create Excel workbooks with line items and totals
- Check policies for duplicates and missing receipts
- Calculate mileage reimbursement using IRS rates
Source and maintenance
Protocol and capabilities
- Server
- expense-report 1.0.0
- MCP protocol negotiated in check
- 2025-11-25
- 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_expense_report — Generate expense report
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.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"lines"
],
"properties": {
"lines": {
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"date": {
"type": [
"number",
"string",
"null"
],
"description": "Date, e.g. 2026-10-02 or Oct 2 2026."
},
"rate": {
"type": [
"number",
"string",
"null"
],
"description": "Exchange rate into the report currency for this line, e.g. 1.08 (1 EUR = 1.08 USD). For mileage lines, the mileage rate: per km or per mile as written; a rate with no unit follows the distance unit."
},
"miles": {
"type": [
"number",
"string",
"null"
],
"description": "For mileage: miles driven, e.g. 42."
},
"notes": {
"anyOf": [
{
"type": "string",
"maxLength": 10000
},
{
"type": "null"
}
],
"description": "Notes such as attendees or purpose, e.g. Dinner with Acme team."
},
"amount": {
"type": [
"number",
"string",
"null"
],
"description": "Amount as on the receipt, e.g. 412.30 or \"€45.00\"."
},
"receipt": {
"type": [
"boolean",
"string",
"null"
],
"description": "Receipt attached: yes or no."
},
"category": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"description": "Category, e.g. Airfare, Lodging, Meals, Ground transport, Mileage. Inferred from the merchant when missing."
},
"currency": {
"anyOf": [
{
"type": "string",
"maxLength": 10
},
{
"type": "null"
}
],
"description": "Currency when not the report currency, e.g. EUR."
},
"merchant": {
"anyOf": [
{
"type": "string",
"maxLength": 10000
},
{
"type": "null"
}
],
"description": "Merchant or description, e.g. Delta Air Lines."
},
"quantity": {
"type": [
"number",
"string",
"null"
],
"description": "Optional: number of nights, days, people or units, e.g. 3. With amount, amount is the line total; without amount, amount = quantity x unit_price."
},
"paid_with": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"description": "Optional: same as payment_method, e.g. personal card."
},
"unit_price": {
"type": [
"number",
"string",
"null"
],
"description": "Optional: price of one unit (one night, one ticket), e.g. 96.33. Used only when amount is missing."
},
"payment_method": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"description": "How it was paid, e.g. personal card, cash, corporate card (corporate card lines are not reimbursed)."
}
},
"additionalProperties": {}
},
{
"type": "string"
},
{
"type": "null"
}
]
}
},
{
"type": "string"
}
],
"description": "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": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"description": "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": {
"type": [
"number",
"string",
"null"
],
"description": "Optional: cash advance already received, subtracted from the total due, e.g. 200 or \"$200\"."
},
"purpose": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
],
"description": "Optional: business purpose of the trip or period, e.g. Client visit to Acme in Denver."
},
"approver": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
],
"description": "Optional: manager who approves the report, e.g. Sam Patel."
},
"currency": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Optional: currency of the report total, e.g. USD (default), EUR, GBP."
},
"line_cap": {
"type": [
"number",
"string",
"null"
],
"description": "Optional: flag any single line above this amount, e.g. 500. Default: no cap."
},
"timezone": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"description": "Optional: the user's IANA timezone for the default report date, e.g. Asia/Ho_Chi_Minh or America/New_York."
},
"date_order": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "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": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
],
"description": "Optional: department or cost center, e.g. Sales West."
},
"report_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Optional: date printed on the report, e.g. 2026-10-25. Default: today in the timezone you pass, else today in UTC."
},
"mileage_rate": {
"type": [
"number",
"string",
"null"
],
"description": "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": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
],
"description": "Optional: name printed on the report, e.g. Jordan Lee. Left blank for handwriting when not given."
},
"flag_weekends": {
"type": [
"boolean",
"string",
"null"
],
"description": "Optional: flag Saturday and Sunday expenses (default true)."
},
"exchange_rates": {
"anyOf": [
{
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": [
"number",
"string"
]
}
},
{
"type": "string"
}
]
},
{
"type": "null"
}
],
"description": "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": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"description": "Optional: country whose public holidays are flagged, e.g. US (default), GB, CA, or none."
},
"receipt_required_over": {
"type": [
"number",
"string",
"null"
],
"description": "Optional: receipts are required for items of this amount or more, e.g. 75 (default 75)."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"report",
"totals",
"categories",
"flags",
"excluded",
"lines_preview",
"notes",
"policy",
"downloads"
],
"properties": {
"flags": {
"type": "array",
"items": {
"type": "object",
"required": [
"line",
"type",
"message"
],
"properties": {
"line": {
"type": "number"
},
"type": {
"type": "string"
},
"message": {
"type": "string"
}
},
"additionalProperties": false
}
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"policy": {
"type": "array",
"items": {
"type": "string"
}
},
"report": {
"type": "object",
"required": [
"employee",
"department",
"purpose",
"period_start",
"period_end",
"currency",
"report_date"
],
"properties": {
"purpose": {
"type": "string"
},
"currency": {
"type": "string"
},
"employee": {
"type": "string"
},
"department": {
"type": "string"
},
"period_end": {
"type": [
"string",
"null"
]
},
"report_date": {
"type": "string"
},
"period_start": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
},
"totals": {
"type": "object",
"required": [
"reimbursable",
"advance",
"total_due",
"employee_owes",
"lines",
"included_lines",
"excluded_lines",
"flagged_lines"
],
"properties": {
"lines": {
"type": "number"
},
"advance": {
"type": "number"
},
"total_due": {
"type": "number"
},
"reimbursable": {
"type": "number"
},
"employee_owes": {
"type": "number"
},
"flagged_lines": {
"type": "number"
},
"excluded_lines": {
"type": "number"
},
"included_lines": {
"type": "number"
}
},
"additionalProperties": false
},
"excluded": {
"type": "array",
"items": {
"type": "object",
"required": [
"line",
"merchant",
"amount",
"currency",
"reason"
],
"properties": {
"line": {
"type": "number"
},
"amount": {
"type": [
"number",
"null"
]
},
"reason": {
"type": "string"
},
"currency": {
"type": "string"
},
"merchant": {
"type": "string"
}
},
"additionalProperties": false
}
},
"downloads": {
"type": "object",
"required": [
"pdf",
"xlsx"
],
"properties": {
"pdf": {
"type": "string"
},
"xlsx": {
"type": "string"
}
},
"additionalProperties": false
},
"categories": {
"type": "array",
"items": {
"type": "object",
"required": [
"category",
"amount",
"count"
],
"properties": {
"count": {
"type": "number"
},
"amount": {
"type": "number"
},
"category": {
"type": "string"
}
},
"additionalProperties": false
}
},
"lines_preview": {
"type": "array",
"items": {
"type": "object",
"required": [
"line",
"date",
"merchant",
"category",
"amount",
"currency",
"amount_in_report_currency",
"included",
"flags"
],
"properties": {
"date": {
"type": "string"
},
"line": {
"type": "number"
},
"flags": {
"type": "number"
},
"amount": {
"type": [
"number",
"null"
]
},
"category": {
"type": "string"
},
"currency": {
"type": "string"
},
"included": {
"type": "boolean"
},
"merchant": {
"type": "string"
},
"amount_in_report_currency": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}{
"title": "Generate expense report",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}generate_expense_report_from_file — Generate expense report from file
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.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"file"
],
"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": "The expense list as a CSV or Excel (.xlsx) file with columns such as Date, Merchant, Category, Amount, e.g. october-expenses.xlsx."
},
"period": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"description": "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": {
"type": [
"number",
"string",
"null"
],
"description": "Optional: cash advance already received, subtracted from the total due, e.g. 200 or \"$200\"."
},
"purpose": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
],
"description": "Optional: business purpose of the trip or period, e.g. Client visit to Acme in Denver."
},
"approver": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
],
"description": "Optional: manager who approves the report, e.g. Sam Patel."
},
"currency": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Optional: currency of the report total, e.g. USD (default), EUR, GBP."
},
"line_cap": {
"type": [
"number",
"string",
"null"
],
"description": "Optional: flag any single line above this amount, e.g. 500. Default: no cap."
},
"timezone": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"description": "Optional: the user's IANA timezone for the default report date, e.g. Asia/Ho_Chi_Minh or America/New_York."
},
"date_order": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "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": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
],
"description": "Optional: department or cost center, e.g. Sales West."
},
"report_date": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "null"
}
],
"description": "Optional: date printed on the report, e.g. 2026-10-25. Default: today in the timezone you pass, else today in UTC."
},
"mileage_rate": {
"type": [
"number",
"string",
"null"
],
"description": "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": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
],
"description": "Optional: name printed on the report, e.g. Jordan Lee. Left blank for handwriting when not given."
},
"flag_weekends": {
"type": [
"boolean",
"string",
"null"
],
"description": "Optional: flag Saturday and Sunday expenses (default true)."
},
"exchange_rates": {
"anyOf": [
{
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": [
"number",
"string"
]
}
},
{
"type": "string"
}
]
},
{
"type": "null"
}
],
"description": "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": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"description": "Optional: country whose public holidays are flagged, e.g. US (default), GB, CA, or none."
},
"receipt_required_over": {
"type": [
"number",
"string",
"null"
],
"description": "Optional: receipts are required for items of this amount or more, e.g. 75 (default 75)."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"report",
"totals",
"categories",
"flags",
"excluded",
"lines_preview",
"notes",
"policy",
"downloads"
],
"properties": {
"flags": {
"type": "array",
"items": {
"type": "object",
"required": [
"line",
"type",
"message"
],
"properties": {
"line": {
"type": "number"
},
"type": {
"type": "string"
},
"message": {
"type": "string"
}
},
"additionalProperties": false
}
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"policy": {
"type": "array",
"items": {
"type": "string"
}
},
"report": {
"type": "object",
"required": [
"employee",
"department",
"purpose",
"period_start",
"period_end",
"currency",
"report_date"
],
"properties": {
"purpose": {
"type": "string"
},
"currency": {
"type": "string"
},
"employee": {
"type": "string"
},
"department": {
"type": "string"
},
"period_end": {
"type": [
"string",
"null"
]
},
"report_date": {
"type": "string"
},
"period_start": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
},
"totals": {
"type": "object",
"required": [
"reimbursable",
"advance",
"total_due",
"employee_owes",
"lines",
"included_lines",
"excluded_lines",
"flagged_lines"
],
"properties": {
"lines": {
"type": "number"
},
"advance": {
"type": "number"
},
"total_due": {
"type": "number"
},
"reimbursable": {
"type": "number"
},
"employee_owes": {
"type": "number"
},
"flagged_lines": {
"type": "number"
},
"excluded_lines": {
"type": "number"
},
"included_lines": {
"type": "number"
}
},
"additionalProperties": false
},
"excluded": {
"type": "array",
"items": {
"type": "object",
"required": [
"line",
"merchant",
"amount",
"currency",
"reason"
],
"properties": {
"line": {
"type": "number"
},
"amount": {
"type": [
"number",
"null"
]
},
"reason": {
"type": "string"
},
"currency": {
"type": "string"
},
"merchant": {
"type": "string"
}
},
"additionalProperties": false
}
},
"downloads": {
"type": "object",
"required": [
"pdf",
"xlsx"
],
"properties": {
"pdf": {
"type": "string"
},
"xlsx": {
"type": "string"
}
},
"additionalProperties": false
},
"categories": {
"type": "array",
"items": {
"type": "object",
"required": [
"category",
"amount",
"count"
],
"properties": {
"count": {
"type": "number"
},
"amount": {
"type": "number"
},
"category": {
"type": "string"
}
},
"additionalProperties": false
}
},
"lines_preview": {
"type": "array",
"items": {
"type": "object",
"required": [
"line",
"date",
"merchant",
"category",
"amount",
"currency",
"amount_in_report_currency",
"included",
"flags"
],
"properties": {
"date": {
"type": "string"
},
"line": {
"type": "number"
},
"flags": {
"type": "number"
},
"amount": {
"type": [
"number",
"null"
]
},
"category": {
"type": "string"
},
"currency": {
"type": "string"
},
"included": {
"type": "boolean"
},
"merchant": {
"type": "string"
},
"amount_in_report_currency": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}{
"title": "Generate expense report from file",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}Prompts
Not advertised
Resources
1 advertised
expense-report-widget — Zovo Expense Report view
Interactive view for Zovo Expense Report.
ui://widget/expense-report-v1-1.0.0-de15990f07e09266d741f072644b554d7400451ed69de4ed94b1d5e87db32699.htmlexpense-report-widget-legacy — Zovo Expense Report view (previous versions)
ui://widget/expense-report-{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
- 1021 ms
- 95th percentile latency
- 1021 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1021 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 zovo-expense-report-mcp https://expense-report.zovo.one/mcpCodex
codex mcp add zovo-expense-report-mcp --url https://expense-report.zovo.one/mcpCursor
{
"mcpServers": {
"zovo-expense-report-mcp": {
"url": "https://expense-report.zovo.one/mcp"
}
}
}Cline
{
"mcpServers": {
"zovo-expense-report-mcp": {
"type": "streamableHttp",
"url": "https://expense-report.zovo.one/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"zovo-expense-report-mcp": {
"type": "http",
"url": "https://expense-report.zovo.one/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http zovo-expense-report-mcp https://expense-report.zovo.one/mcpClaude Desktop
https://expense-report.zovo.one/mcpWindsurf
{
"mcpServers": {
"zovo-expense-report-mcp": {
"serverUrl": "https://expense-report.zovo.one/mcp"
}
}
}Let your agent find its tools
Find servers like Zovo Expense Report MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.