Koskamo

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.

Zovo Expense Report MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-08Published by Zovo
MCP endpoint (Streamable HTTP)
https://expense-report.zovo.one/mcp
Vendor documentation

What its tools do

2 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

2 of 2 have a description · 2 of 2 declare behavior hints · 2 of 2 with parameters document them all

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

Community listingRegistry 1.0.0

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

Makes expense reimbursement reports (PDF + Excel) from expense lines. Read the user's receipt photos yourself and pass one line per receipt to generate_expense_report (date, merchant, category, amount, currency, payment_method, receipt). Use generate_expense_report_from_file for an attached CSV or Excel list. Report the total due first, then the flags and any lines left out of the total.

Tools

2 advertised

generate_expense_report — Generate expense report
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

generate_expense_report input schema
{
  "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)."
    }
  }
}
generate_expense_report output schema
{
  "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
}
generate_expense_report annotations
{
  "title": "Generate expense report",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
generate_expense_report_from_file — Generate expense report from file
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

generate_expense_report_from_file input schema
{
  "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)."
    }
  }
}
generate_expense_report_from_file output schema
{
  "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
}
generate_expense_report_from_file annotations
{
  "title": "Generate expense report from file",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

expense-report-widget — Zovo Expense Report view

Advertised by the server during the last successful anonymous check.

Interactive view for Zovo Expense Report.

expense-report-widget URI
ui://widget/expense-report-v1-1.0.0-de15990f07e09266d741f072644b554d7400451ed69de4ed94b1d5e87db32699.html

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

expense-report-widget-legacy — Zovo Expense Report view (previous versions)

Advertised by the server during the last successful anonymous check.

expense-report-widget-legacy URI template
ui://widget/expense-report-{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
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.

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 zovo-expense-report-mcp https://expense-report.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 zovo-expense-report-mcp --url https://expense-report.zovo.one/mcp

Cursor

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

Cline

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

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start zovo-expense-report-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "zovo-expense-report-mcp": {
      "type": "http",
      "url": "https://expense-report.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 zovo-expense-report-mcp https://expense-report.zovo.one/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://expense-report.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": {
    "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.