Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

ExpenseBot

NPM · @EXPENSEBOT/MCP-SERVER-AUTH · 2 COMPONENTS · SCANNED SEP 20

Capture receipts, scan Gmail, analyze spending, and create reviewed reports from AI assistants.

0 this week 79 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 95 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
Schema Quality & AI Usability64
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 14361 tokens (~239/item across 60 items; 60 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management91
  • Stability check failed: the tool surface changed between 0.6.22 and 0.6.25: 0 tool removals, 3 breaking changes, 4 additions. See how to fix → Fail
Tool Coverage98
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 92% of tool parameters carry a description.Partial
  • Structured output schemas are declared (57% of tools); any adoption earns full credit.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "send_report_to_accounting" implies "send" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 61 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the ExpenseBot MCP server?

ExpenseBot runs locally as an npm package, launched with npx -y @expensebot/mcp-server-auth. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @expensebot/mcp-server-auth

# add to Claude Code
claude mcp add totesmagotes-mcp-server-auth -- npx -y @expensebot/mcp-server-auth
// .cursor/mcp.json
{
  "mcpServers": {
    "totesmagotes-mcp-server-auth": {
      "command": "npx",
      "args": [
        "-y",
        "@expensebot/mcp-server-auth"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "totesmagotes-mcp-server-auth": {
      "command": "npx",
      "args": [
        "-y",
        "@expensebot/mcp-server-auth"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add totesmagotes-mcp-server-auth -- npx -y @expensebot/mcp-server-auth
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "totesmagotes-mcp-server-auth": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@expensebot/mcp-server-auth"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add totesmagotes-mcp-server-auth --command npx --arg -y --arg @expensebot/mcp-server-auth
# ~/.hermes/config.yaml
mcp_servers:
  totesmagotes-mcp-server-auth:
    command: "npx"
    args: ["-y", "@expensebot/mcp-server-auth"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "totesmagotes-mcp-server-auth": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@expensebot/mcp-server-auth"
      ]
    }
  }
}
# add to Vellum
assistant mcp add totesmagotes-mcp-server-auth -t stdio -c npx -a -y @expensebot/mcp-server-auth
// mcp.json
{
  "mcpServers": {
    "totesmagotes-mcp-server-auth": {
      "command": "npx",
      "args": [
        "-y",
        "@expensebot/mcp-server-auth"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 87 to 91.

  • 17 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 77 to 81.

  • 16 Sept 26 −3

    No change was recorded against any check on this day. Stability & Change Management went from 97 to 77.

  • 15 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 94 to 97.

  • 13 Sept 26 −1

    No change was recorded against any check on this day. Stability & Change Management went from 97 to 91.

  • 11 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 94 to 97.

  • 10 Sept 26 +10
    • Known CVEs: unverified → pass security
    • Dependency health: unverified → 0.84 functional
  • 9 Sept 26 −11
    • Known CVEs: pass → unverified security
    • Stability: fail → unverified security
    • Tool safety: pass → unverified security
    • Stability: fail → pass security
    • Schema quality: 12464 → 14361 functional
    • Schema quality: 12464 → 14239 functional
    • Dependency health: 0.84 → unverified functional
    • Capabilities: pass → unverified functional
    • Tool coverage: 100 → unverified functional
    • First check of Tool coverage: 57 functional
    • Package version: 0.6.22 → 0.6.25 functional
    • Package version: 0.6.22 → 0.6.23 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed npm/@expensebot/mcp-server-auth@0.6.25

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 95 packages
Packages resolved 95
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 60 exposed · ~13,408 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add_cash_expense ~366

Add an expense without a receipt, or record money a client provided in advance for expenses. Writes directly to the user's expense spreadsheet after confirmation. For an ordinary expense, call list_categories first and provide a configured Expense Account. For a client advance, set isClientAdvance=true and clientName; ExpenseBot reuses or creates the canonical client group, applies Cash advance received, and stores the amount as a negative expense. Use this only for money supplied by a client before related spending, never for vendor refunds, reimbursements, earned fees, retainers, or generic deposits. Use the Manual expense link from get_spreadsheet_url instead when the user needs a reviewed form for multiple entries, credits/refunds, tax or tip breakdowns, per diem, or incomplete details.

NameTypeReqDescription
categorystringA configured Expense Account returned by list_categories. Do not invent a category.
citystringCity/location
clientNamestringClient name for a client advance, in ordinary language. ExpenseBot resolves the canonical Client – Name group.
currencystringCurrency code (default: USD)
datestringyesExpense date (YYYY-MM-DD)
isClientAdvancebooleanTrue only when a client supplied money in advance for expenses. Requires clientName and does not require category.
merchantstringMerchant/vendor name for an ordinary expense. Not needed for a client advance; ExpenseBot derives it from clientName.
notesstringNotes or description
subtotalnumberSubtotal before tax
taxnumberTax amount
tipnumberTip amount
totalnumberyesPositive amount paid or received. ExpenseBot stores a client advance as negative.

No output schema declared.

No examples provided.

add_income ~337

Log exactly one user-confirmed income payment manually (cash, check, Stripe payout, etc.). Never loop this tool over a statement, export, table, or multi-row list. For two or more payments, use add_income_from_csv for CSV/TSV/text or add_income_from_file for an image/PDF; those tools stage a duplicate-checked preview and require confirmation before writing. Writes to the Income tab of the user's expense spreadsheet. Useful for income that isn't auto-detected from Gmail or Plaid. Call list_income_categories first and use one of its fixed tax categories; an omitted category defaults to Service income and an unknown category is rejected.

NameTypeReqDescription
amountnumberyesIncome amount (>0)
categorystringA category returned by list_income_categories (optional; defaults to Service income)
currencystringCurrency code (default: home currency)
datestringIncome date (YYYY-MM-DD). Defaults to today.
descriptionstringWhat the income was for
feesnumberProcessor/transfer fees deducted
notesstring
paymentMethodstringyesHow you got paid. Canonical rails are Cash, Check, Bank transfer, Wallet app, Credit/Debit card, Payment processor, or Other; common labels such as Stripe and Venmo are normalized.
referencestringInvoice or transaction reference
sourcestringyesWho paid you (client name, customer, etc.)
tagstringTag for client/project attribution
taxCollectednumberSales tax/GST/HST collected

No output schema declared.

No examples provided.

add_income_from_csv ~592

Import income from a CSV/TSV/text export (Stripe, PayPal, Square, Cash App, Venmo, OnlyFans, Patreon, Clips4Sale, Ko-fi, Gumroad, Etsy, Uber/Lyft/DoorDash driver exports, bank statements, and similar; max 500 KB). Same two-step contract as add_income_from_file: STEP 1 call with csvContent and WITHOUT confirm parses the file with the same platform-agnostic importer as the app's Add Income screen (platform detection, fee handling, refunds, source aliases, ISO dates) and returns a duplicate-checked preview with a previewId. NOTHING is saved in step 1. Show the user the parsed rows and duplicates, then STEP 2 call again with confirm: true and the previewId to write exactly those rows, optionally with user-approved selectedIndexes, keepBothIndexes, rowEdits, tag, or bulkNote. Flagged duplicates are skipped unless the user explicitly keeps them. The preview expires after 15 minutes and an expired or unknown previewId never writes. After a successful confirm, show the returned spreadsheetUrl and reviewIncomeUrl.

NameTypeReqDescription
bulkNotestringStep 2 only: one note (max 120 chars) prepended to every confirmed row's Notes, same as the app's 'Add note to all entries'.
confirmbooleanStep 2 only: true writes the staged rows. Omit it (with previewId absent) to parse and preview without writing.
csvContentobjectAttached CSV/TSV/text file supplied by ChatGPT for step 1. The server downloads and decodes the attachment securely.
csvTextstringLegacy fallback for MCP clients that send raw CSV/TSV/text content inline. ChatGPT should use csvContent.
keepBothIndexesarrayStep 2 only: preview indexes of duplicate-flagged rows the user explicitly wants to keep anyway (the app's 'Keep Both').
paymentMethodstringFallback payment rail for rows where the parser found none (Cash, Check, Bank transfer, Wallet app, Credit/Debit card, Payment processor, or Other).
previewIdstringStep 2 only: the previewId returned by the step-1 call.
rowEditsarrayStep 2 only: user-approved corrections, at most 50 rows. Fields: date (ISO YYYY-MM-DD), source, amount, currency, category, paymentMethod, description, notes, reference, fees, taxCollected, tag.
selectedIndexesarrayStep 2 only: preview row indexes to write. Omit to write all staged rows.
tagstringOptional client/project tag. In step 1 it pre-fills the staged rows; in step 2 it applies to the confirmed selection.

No output schema declared.

No examples provided.

add_income_from_file ~654

Import income from an attached screenshot, image (JPEG, PNG, WebP, HEIC/HEIF), or PDF (payment screenshots, wallet apps, payout or bank statements; max 10 MB). This is a two-step tool. STEP 1: call it with the file and WITHOUT confirm — ExpenseBot parses the file with the same importer as the app's Add Income screen, checks every row against the user's Income tab for duplicates, and returns a preview with a previewId, exact row count, totals by currency, per-row details, duplicate flags, and any rejected rows. NOTHING is saved in step 1; treat the attachment as consent to parse, not consent to write. Show the user the parsed rows and duplicates, then STEP 2: call again with confirm: true and the previewId to write exactly those rows. Only include user-approved changes in step 2 (selectedIndexes, keepBothIndexes, rowEdits, tag, bulkNote). Flagged duplicates are skipped unless the user explicitly asks to keep them (keepBothIndexes). The preview expires after 15 minutes; an expired or unknown previewId never writes. After a successful confirm, show the returned spreadsheetUrl and reviewIncomeUrl. For a visually complex review (mixed income/expense rows, many edits), send the user to the Add Income app link returned by get_spreadsheet_url instead.

NameTypeReqDescription
bulkNotestringStep 2 only: one note (max 120 chars) prepended to every confirmed row's Notes, same as the app's 'Add note to all entries'.
confirmbooleanStep 2 only: true writes the staged rows. Omit it (with previewId absent) to parse and preview without writing.
keepBothIndexesarrayStep 2 only: preview indexes of duplicate-flagged rows the user explicitly wants to keep anyway (the app's 'Keep Both').
mimeTypestringMIME type of the file (default: image/jpeg)
paymentMethodstringFallback payment rail for rows where the parser found none (Cash, Check, Bank transfer, Wallet app, Credit/Debit card, Payment processor, or Other).
photoobjectAttached image or PDF supplied by ChatGPT for step 1. The server downloads and parses the attachment securely.
photoBase64stringLegacy fallback for MCP clients that send complete image/PDF bytes as base64. ChatGPT should use photo.
previewIdstringStep 2 only: the previewId returned by the step-1 call.
rowEditsarrayStep 2 only: user-approved corrections, at most 50 rows. Fields: date (ISO YYYY-MM-DD), source, amount, currency, category, paymentMethod, description, notes, reference, fees, taxCollected, tag.
selectedIndexesarrayStep 2 only: preview row indexes to write. Omit to write all staged rows.
tagstringOptional client/project tag. In step 1 it pre-fills the staged rows; in step 2 it applies to the confirmed selection.

No output schema declared.

No examples provided.

add_mileage_entry ~270

Log a business mileage trip in ExpenseBot. Useful for realtors, consultants, contractors, and anyone who drives for work. Requires the user to have configured their mileage rate (cents/km or cents/mi) and unit (mi/km) in ExpenseBot Settings. The trip writes a row to their expense spreadsheet with the calculated dollar value. Use the Mileage and travel link from get_spreadsheet_url instead when the user needs Google Maps route calculation, mileage settings, repeated trips, calendar/rideshare import, per diem, or visual review.

NameTypeReqDescription
categorystringOverride the user's default mileage category (optional)
citystringCity (optional)
datestringTrip date (YYYY-MM-DD). Defaults to today.
destinationstringDestination address or location (optional)
distancenumberyesDistance traveled in the user's configured unit (miles or km)
notesstringOptional user-supplied context stored with the mileage entry.
purposestringyesBusiness purpose / description of the trip (e.g., 'Client meeting at 1234 Main St')
roundTripbooleanIf true, doubles the distance (return trip)
tagstringTag for client/project attribution (optional)

No output schema declared.

No examples provided.

check_compliance ~119

Use only when the user explicitly asks to check an existing report for compliance issues such as missing business purpose or policy violations. Creating a report, excluding Personal expenses, sharing a report, or billing a client is not a compliance request; never call this tool automatically as a preflight or follow-up for those workflows.

NameTypeReqDescription
reportIdstringyesReport ID to check
userRequeststringyesThe user's exact request explicitly asking for compliance, policy, audit, substantiation, or business-purpose analysis. Do not paraphrase or invent intent.
NameTypeReqDescription
dataobject
messagestring
successbooleanyes

No examples provided.

check_feature ~80

Check whether ExpenseBot supports a specific feature ('does ExpenseBot support X', 'can it integrate with Y'). Searches the public knowledge base and returns a confidence-scored answer + related questions. Works with or without authentication.

NameTypeReqDescription
featurestringyesFeature or integration to check (e.g., 'Xero', 'mileage tracking', 'Plaid')
NameTypeReqDescription
dataobject
messagestring
successbooleanyes

No examples provided.

check_tax_deductibility ~162

Look up whether a specific expense type or purchase is tax-DEDUCTIBLE (business write-off rules) based on the user's country/jurisdiction. This is a deductibility *advice* tool — use it for questions like 'is Uber deductible', 'can I write off home office', 'are client dinners 50% or 100%'. Do NOT use it for questions about tax REFUNDS received as income (use get_spending_summary with a 'tax refunds' query for those — they're routed to the Income tab, not deduction rules).

NameTypeReqDescription
categorystring
merchantstring
querystringyesDeductibility question (e.g., 'is Uber tax deductible', 'home office write-off rules')
NameTypeReqDescription
dataobject
messagestring
successbooleanyes

No examples provided.

correct_expenses ~382

Safely correct the category, business purpose, or explicit attendees on an exact bounded set of recorded expenses. Examples: 'categorize these as Travel', 'add Client kickoff dinner as the business purpose for these meals', or 'add Fred, Rob, and Lamar to last night's business meal'. First use search_expenses to identify the exact rows, then pass their full expenseId values. A grounded preview is automatic: first call with confirm omitted/false, show the exact count and proposed before-to-after changes, and ask once for approval. Only after explicit approval repeat the same operationId, selection, and change with confirm:true. A premature confirm:true is converted to preview. Attendee names must come explicitly from the user; never infer them. attendeeMode add preserves existing attendees, while replace substitutes only the attendee segment. Business purpose and attendees preserve the structured Notes field, including card, description, inbox, and other typed segments. Formula Notes and changes that exceed the Notes limit are skipped safely. The confirmed result reports applied/conflicted/failed counts and supports Undo. This tool does not omit duplicates, change amounts or dates, infer business context, or run broad Calendar matching. For unsupported or more than 100-row cleanup, send the user to https://www.expensebot.ai/review-expenses?source=mcp.

NameTypeReqDescription
changeobjectExactly one correction. The selected type determines which matching value field is required.
confirmbooleanOmit/false for preview; true only after explicit approval.
operationIdstringyesStable idempotency key generated once for preview and reused unchanged.
selectionobjectExact expenses returned by search_expenses and approved for this bounded correction.
statusbooleanRead operation status using operationId.
undobooleanUndo a completed correction within its Undo window.

No output schema declared.

No examples provided.

create_client_invoice ~300

Create the exact invoice previously returned by prepare_client_invoice. This is a confirmed write: it revalidates the report snapshot and client identity, creates a private editable Google Doc plus private PDF and DOCX copies, records the issued invoice, and supersedes an older active invoice for the same report. It does not send email or create an Income row. If tax is positive, confirmTax must be true.

NameTypeReqDescription
advanceAppliednumber
billToEmailstring
clientAddressstring
clientNamestringIn in-app chat, the full client name shown on the invoice.
confirmTaxbooleanTrue only after the user confirms the displayed tax label and rate.
customLineItemsarray
invoiceNumberstring
issueDatestringIn in-app chat, a calendar-valid YYYY-MM-DD invoice date.
markupPctnumber
mentionSupportingReceiptsboolean
operationIdstringOptional retry key. Reuse it after an uncertain response.
paymentTermsstring
preparationIdstringShort-lived ID returned by prepare_client_invoice.
receiptIdsarray
reportIdstringIn in-app chat, the saved report ID to prepare and confirm.
taxLabelstring
taxPctnumber

No output schema declared.

No examples provided.

create_report ~457

Create an expense report from a clear date, client, project, trip, category, or merchant request. Tags are ExpenseBot's grouping layer for clients, projects, project codes, and trips; call list_tags when the user's intended group is unclear. For requests such as 'all expenses in August except personal', set excludePersonal=true; this excludes both the Personal tag and Personal expense category, matching ExpenseBot's Report Wizard. Returns the report summary, exact report link, Bill Client link, applied filters, and a prefilled Report Wizard fallback for criteria that need visual review. Reports scoped to an existing client/project/trip group include matching expenses that are not already assigned to another ordinary report. Can optionally share with recipients. If no unreported matches remain, create no duplicate report and explain that the expenses are already in Reports. Terminal results also include role-appropriate accountingHandoffUrls from the server capability matrix and the existing reviewed file-export workflow. Use only the exact destination the user requested; the link opens the reviewed app flow and does not mean an export occurred. Complete the requested report directly; do not call check_compliance, get_report_details, or tax/deductibility tools before or after it unless the user explicitly asks for that separate analysis.

NameTypeReqDescription
categoriesarrayOptional configured expense categories to include in the report.
dateRangeTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
excludePersonalbooleanExclude expenses whose Tag is Personal or whose Expense Category is Personal.
excludedCategoriesarrayExpense categories to exclude from the report.
excludedTagsarrayExisting ExpenseBot groups to exclude from the report.
recipientRolestringAccess for every shareWith recipient. Use reviewer for one-report review, comments, approval, or change requests. Use accountant only when the user explicitly wants ongoing report management and acco…
shareWitharrayEmail addresses to share the report with
tagsarrayExisting ExpenseBot groups to include, such as a client, project, project code, property, or trip. Use list_tags first when uncertain.
titlestringCustom report title

No output schema declared.

No examples provided.

export_report ~82

Get a short-lived direct PDF download for one exact authorized expense report, plus the exact highlighted in-app report link. Use the in-app report for CSV, XLSX, receipt ZIP (when available), comments, invoicing, and other visually reviewed actions. Use list_reports first to find the reportId.

NameTypeReqDescription
reportIdstringyesReport ID from list_reports

No output schema declared.

No examples provided.

fix_compliance ~57

Bulk-fix compliance issues in a report (e.g., apply the same business purpose to all flagged expenses).

NameTypeReqDescription
actionstringyes
reportIdstringyes
valuestringyesThe value to apply

No output schema declared.

No examples provided.

get_accounting_integration_status ~220

Check whether an accounting destination is connected and read-only setup state for the owner. Returns the selected organization/company/business, stored connection state, rollout state, and the single setup link for connecting or reconnecting the destination. When an existing ExpenseBot report is available, pass reportId so the link opens that exact report's provider setup control instead of the general Reports setup. This is read-only and never posts accounting data. Agent-driven posting is currently available only for Zoho Books (zoho_books); QuickBooks Online (quickbooks), Xero (xero), Wave (wave), and FreeAgent (freeagent, beta) are accepted here for connection/setup status only and report writesAuthorized=false until their canonical planning path is shared.

NameTypeReqDescription
providerstringyesAccounting destination provider. QuickBooks Online, Xero, Wave, FreeAgent (beta), or Zoho Books.
reportIdstringOptional existing ExpenseBot report ID. When supplied, setupUrl opens this exact report and highlights the selected accounting provider's setup control.
NameTypeReqDescription
dataobjectPer-provider connection and rollout state.
messagestring
successbooleanyes

No examples provided.

get_accounting_push_status ~131

Read the authoritative posting and reconciliation status for one ExpenseBot report at an accounting destination. Use after a timeout or uncertain response before considering any retry. Returns status, submission time, posting mode, posted receipt count, any public error, and whether reconciliation is required. Never re-post a completed report or a report marked needs_reconciliation; show that state to the owner instead. This tool is read-only and owner-account only.

NameTypeReqDescription
providerstringyesAccounting destination provider used for the prior posting attempt.
reportIdstringyesExact ExpenseBot report ID from the prior proposal or posting attempt.
NameTypeReqDescription
dataobject
messagestring
successbooleanyes

No examples provided.

get_client_advance_balances ~169

Read the same per-client advance balances shown in ExpenseBot's Client advances section. Use for questions like 'how much of Acme's advance remains?', 'which client floats are still open?', or 'do I owe a client a refund?'. A negative ledger balance means money remains to refund; a positive balance means the client owes the user. Returns the existing app handoff for Refund leftover or Bill Client. Read-only: never records a refund, creates an invoice, or recomputes the ledger in model prose.

NameTypeReqDescription
clientEmailstringClient account email. Accountants may use this only for an accepted ExpenseBot client.
clientNamestringOptional client name or canonical Client tag. Omit to list every open balance backed by a recorded client advance.
NameTypeReqDescription
balancesarray
dataobject
homeCurrencystring
messagestring
successbooleanyes

No examples provided.

get_client_invoice ~149

Get the full financial and delivery summary for one issued client invoice, including subtotal, markup, tax, advance applied, balance due, dates, status, source report, and private Google Doc/PDF/DOCX links when available. Provide invoiceId or invoiceNumber — one is required; invoiceNumber is accepted only when it is unique. Read-only.

NameTypeReqDescription
clientEmailstringClient account email. Accountants may use this only for an accepted ExpenseBot client.
invoiceIdstringStable invoice ID from list_client_invoices. Required unless invoiceNumber is supplied.
invoiceNumberstringHuman invoice number when invoiceId is unavailable; it must identify one unique invoice.
NameTypeReqDescription
invoiceobjectThe invoice record. Absent only on the error branch (not-found), which never carries structuredContent.
messagestring
successbooleanyes

No examples provided.

get_credits_refunds ~174

List card refunds, cashback/rewards, and statement credits that ExpenseBot has already recorded — either as negative expenses or matched against the original charge. Examples: 'did my refund come through', 'show my statement credits', 'was that return recorded'. Returns the most recent items (default 25, newest first); narrow with dateRange. Read-only: it never scans cards, changes review decisions, or adds rows.

NameTypeReqDescription
clientEmailstringClient account email. Accountants may use this only for an accepted ExpenseBot client.
dateRangeobjectOptional open-ended or closed window to narrow results. Supply startDate, endDate, or both; supplied bounds are inclusive YYYY-MM-DD dates.
limitnumberMaximum results to return (default 25, max 100).
NameTypeReqDescription
creditsarray
dataobject
messagestring
refundsarray
successbooleanyes

No examples provided.

get_deep_analytics ~125

Run deeper, multi-step analytics on the user's expenses. Use for explanatory questions like 'why did my spending increase' or 'compare Q1 vs Q2'. Takes 10-30 seconds (runs as a background job, polled automatically). Returns: { message, data: { ..., sampleMeta? } } where sampleMeta.isTruncated indicates whether the agent saw the full dataset.

NameTypeReqDescription
dateRangeTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
querystringyesThe analytics question to answer
NameTypeReqDescription
dataobject|nullInline branch: computed analytics, or null when no spreadsheet / no data.
estimatedTimenumberAsync branch only: seconds.
jobIdstringAsync branch only.
messagestringHuman-readable narrative (both branches).
pollEndpointstringAsync branch only.
pollIntervalnumberAsync branch only: milliseconds.
responsestringChat alias of message.
successbooleanAsync branch only.
typestringAsync branch only: "analytics_pending" — poll pollEndpoint or call poll_analytics with jobId.

No examples provided.

get_expense_by_id ~110

Fetch a single expense row by its sheet row number or by its ExpenseBot expenseId (the exact Receipt ID in Column Q). Returns the row's headers + values + a labeled {header → value} map so you can refer to a specific expense the user mentioned. Read-only.

NameTypeReqDescription
expenseIdstringExact full ExpenseBot Receipt ID from Column Q
rowNumberinteger1-indexed sheet row (row 1 is headers, so ≥ 2)
NameTypeReqDescription
expenseobjectThe expense record.
reviewExpenseUrlstring
rowNumberintegerResolved sheet row for the expense.
successbooleanyes

No examples provided.

get_expense_splits ~218

Show how an expense was split across categories, clients, properties, or business vs personal portions. Returns the single parent payment with its nested allocation lines — split lines are never counted as separate expenses, so totals stay correct. Examples: 'how is that expense split', 'what was the business portion of that bill', 'show the allocation for this receipt'. Read-only — splits are edited in ExpenseBot's Review workspace.

NameTypeReqDescription
clientEmailstringClient account email. Accountants may use this only for an accepted ExpenseBot client.
dateRangeobjectOptional open-ended or closed window to search for split expenses. Supply startDate, endDate, or both; supplied bounds are inclusive YYYY-MM-DD dates.
limitnumberMax parent expenses to return (default 25, max 100).
onlySplitbooleanReturn only expenses with active splits (default true). Set false to inspect an unsplit Receipt ID.
receiptIdstringOptional Receipt ID for one expense.
NameTypeReqDescription
dataobject
messagestring
splitsarray
successbooleanyes

No examples provided.

get_income_summary ~313

Get income totals, breakdowns, and analytics from the Income tab. Covers Schedule C / T2125 income, Schedule B drill-in (interest, dividends, tax refunds, security deposits), rental income, and per-source / per-payment-method / per-category / per-month / per-tag breakdowns. Schedule-C-style category exclusions match year-end T6 routing (security deposits, refunds excluded from taxable totals). Examples: 'income YTD', 'income by source', 'rental income by property', 'interest income this year', 'dividends YTD', 'tax refunds 2024', 'income this year vs last' (YoY). Supports period comparison phrasing — YoY ('vs last year'), MoM ('vs last month'), QoQ ('Q1 vs Q2'), same-month-prev-year. Returns: { message, data: { total, breakdown?, comparison?, sampleMeta? } }.

NameTypeReqDescription
dateRangeTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
groupBystringHow to group the breakdown
incomeTagPrefixstringOptional tag-prefix shortcut (e.g., 'Prop –' for rental income, 'Client –' for client billings, 'Wedding –' for events). When set, the tool filters to income rows tagged with this prefix.
querystringNatural language income question (e.g., 'income YTD by source', 'rental income last month')
NameTypeReqDescription
dataobject|nullInline branch: computed analytics, or null when no spreadsheet / no data.
estimatedTimenumberAsync branch only: seconds.
jobIdstringAsync branch only.
messagestringHuman-readable narrative (both branches).
pollEndpointstringAsync branch only.
pollIntervalnumberAsync branch only: milliseconds.
responsestringChat alias of message.
successbooleanAsync branch only.
typestringAsync branch only: "analytics_pending" — poll pollEndpoint or call poll_analytics with jobId.

No examples provided.

get_last_receipt_result ~222

Check the authoritative final outcome of a receipt image/PDF batch submitted with submit_receipt. After submit_receipt returns submissionId, call this tool with that exact ID using the polling interval and time allowance in the submit_receipt response. A small batch allows at least 5 minutes; larger batches allow longer. A pending result is normal and must not trigger a duplicate resubmission. Returns added, duplicate, skipped, or errored verdicts with exact counts and up to 10 processed receipt summaries. found:false is pending and has no terminal verdict; found:true is terminal. On completion, tell the user what happened and show spreadsheetUrl plus reviewExpensesUrl. This is for uploaded receipts; use get_scan_status for Gmail scans. Read-only.

NameTypeReqDescription
submissionIdstringExact submissionId returned by submit_receipt. Strongly preferred because it binds the result to this upload instead of an earlier receipt.
withinSecondsintegerFallback lookback window when submissionId is unavailable (30-3600 seconds; default 600).
NameTypeReqDescription
countsobject
dataobject
foundbooleanyes
messagestringyes
receiptsarray
reviewExpensesUrlstring
spreadsheetUrlstring|null
statestringPresent on pending polls for a specific submission.
submissionIdstring|null
successbooleanyes
timestampstring|null
verdictstringTerminal branch only.

No examples provided.

get_mileage_summary ~186

Mileage analytics — totals, breakdowns by month / client / purpose / category, plus deduction framing (cents-per-mile or cents-per-km × distance, country-aware IRS / CRA rates). Examples: 'mileage this year', 'miles driven for Acme', 'mileage by month', 'mileage deduction estimate', 'business miles last quarter'. Supports YoY / MoM / QoQ comparison phrasing. Returns: { message, data: { totalDistance, deductionEstimate?, breakdown?, comparison?, sampleMeta? } }.

NameTypeReqDescription
dateRangeTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
groupBystringHow to group the breakdown
querystringNatural language mileage question (e.g., 'mileage this year', 'miles driven for Acme client')
NameTypeReqDescription
dataobject|null
messagestring
successbooleanPresent only on the error branch (out of scope) / async path.

No examples provided.

get_monthly_books_review ~145

Month-end summary of the user's books for one calendar month: income recorded, money spent, net, top spending categories and merchants, plus alerts for anything unusual that month. Examples: 'how did last month go', 'close out my books for June', 'monthly review', 'what did I make and spend in May'. Defaults to the last completed month. Figures come from the user's own recorded data; advisory notes are estimates, not tax advice.

NameTypeReqDescription
clientEmailstringClient account email. Accountants may use this only for an accepted ExpenseBot client.
periodstringCalendar month in YYYY-MM format. Defaults to the last completed month.
NameTypeReqDescription
dataobject
messagestring
successbooleanyes

No examples provided.

get_per_tag_pnl ~256

Per-tag P&L — revenue, cost, profit, and margin grouped by tag (per-client, per-property, per-event, per-realtor-deal). Requires both income AND expense rows to be tagged with matching labels. Common tag-prefix shortcuts: 'Prop –' (rentals), 'Client –' (client billings), 'Wedding –' (events), 'Realtor –' (real estate deals). Examples: 'per-tag P&L this year', 'profit by client', 'profit by property', 'profit on the Smith wedding', 'per-client P&L this year vs last' (YoY). Supports YoY / MoM / QoQ comparison phrasing. Margin renders as multiplier in loss territory. Defaults to year-to-date if no date range given.

NameTypeReqDescription
dateRangeTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
querystringNatural language per-tag P&L question
tagPrefixstringOptional prefix to limit which tags are bucketed (e.g., 'Prop –' for properties only, 'Client –' for clients only). When omitted, all tags are included.
NameTypeReqDescription
dataobject|nullInline branch: computed analytics, or null when no spreadsheet / no data.
estimatedTimenumberAsync branch only: seconds.
jobIdstringAsync branch only.
messagestringHuman-readable narrative (both branches).
pollEndpointstringAsync branch only.
pollIntervalnumberAsync branch only: milliseconds.
responsestringChat alias of message.
successbooleanAsync branch only.
typestringAsync branch only: "analytics_pending" — poll pollEndpoint or call poll_analytics with jobId.

No examples provided.

get_pnl ~229

Compute Profit & Loss (P&L / net income / margin) by combining the Income tab with expense tabs. Examples: 'am I profitable this year', 'P&L for Q1', 'net income last quarter', 'what's my margin', 'P&L this year vs last' (YoY). Supports period comparison — YoY, MoM, QoQ, same-month-prev-year. Margin renders as multiplier in loss territory ('expenses 5.4× revenue') so the user gets a readable signal instead of '-436.9% margin'. Returns: { message, data: { revenue, expenses, netIncome, margin, comparison?, sampleMeta? } }.

NameTypeReqDescription
clientEmailstringClient account email. Accountants may use this only for an accepted ExpenseBot client.
dateRangeTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
querystringNatural language P&L question (e.g., 'P&L for Q1 2025', 'am I profitable')
NameTypeReqDescription
dataobject|nullInline branch: computed analytics, or null when no spreadsheet / no data.
estimatedTimenumberAsync branch only: seconds.
jobIdstringAsync branch only.
messagestringHuman-readable narrative (both branches).
pollEndpointstringAsync branch only.
pollIntervalnumberAsync branch only: milliseconds.
responsestringChat alias of message.
successbooleanAsync branch only.
typestringAsync branch only: "analytics_pending" — poll pollEndpoint or call poll_analytics with jobId.

No examples provided.

get_pricing ~60

Get current ExpenseBot pricing for all plans (Free Trial, Standard, Pro Add-On, Deep Scan, Accountants). Useful when the user asks 'how much does this cost' or 'what's the difference between plans'. Works with or without authentication.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_recent_activity ~159

Show what the user (or their AI assistants) has recently done in ExpenseBot via this MCP server: which tools were called, when, with what arguments, and whether they succeeded. This is a log of assistant TOOL CALLS, not the processing history of a document. Useful for questions like 'what did I do this week' or 'which tools has my assistant run', and to give the user transparency into AI-assisted actions. Returns the most recent N entries from the audit log (default 20, max 100).

NameTypeReqDescription
actionIdstringOptional: filter to a single tool/action name
limitinteger
sinceDaysintegerOnly show actions from the last N days (default 7)
NameTypeReqDescription
actionsarrayyes
countintegeryes
successbooleanyes

No examples provided.

get_report_details ~137

Get full details of a specific expense report including all expenses, totals, and compliance status. Use only when the user explicitly asks to inspect an existing report's details. Never call this as a preflight or follow-up to creating, sharing, or billing from a report; those tools already return the required result and links.

NameTypeReqDescription
clientEmailstringClient account email. Accountants may use this only for an accepted ExpenseBot client.
reportIdstringyesThe report/spreadsheet ID
userRequeststringyesThe user's exact request asking to inspect this report. Do not paraphrase or invent diagnostic intent.
NameTypeReqDescription
reportobjectyesThe full stored report record.
successbooleanyes

No examples provided.

get_scan_status ~112

Check the authoritative status of the user's Gmail receipt scans. Returns the active scan lock, the same live phase and item progress shown by ExpenseBot's in-app status pill, queued or attention-needed years, completed calendar years, current merchant/category exclusions, and recent outcomes. Call when the user asks whether a scan is running, finished, stuck, or what it is doing. When complete, show the returned spreadsheetUrl or reviewExpensesUrl; when setup or reconnection is needed, show gmailScanUrl. Read-only.

Input schema present but exposes no named parameters.

NameTypeReqDescription
dataobject
gmailScanUrlstring|null
latestScanobject|nullMost recent scan outcome (success, emailsFound, emailsTagged, timestamp).
lockobjectScan-lock state (active, startedAt, ageSeconds, dispatchComplete, pendingProcessingCount).
messagestring
reviewExpensesUrlstring|null
scanInProgressboolean
spreadsheetUrlstring|null
statusstring|nullScan lifecycle state.
successbooleanyes

No examples provided.

get_signup_link ~84

Get the ExpenseBot signup link. Use this when the user doesn't have an account yet, or when their MCP token is missing/expired and they need to sign up or get a new token. Returns a signup URL with a 60-day free trial — no credit card required.

NameTypeReqDescription
utmSourcestringOptional UTM source (defaults to 'mcp')

No output schema declared.

No examples provided.

get_spending_summary ~183

Summarize the user's recorded expenses with totals and breakdowns by category, merchant, month, tag, source, or payment method. Supports date ranges, period comparisons, and total, count, or average metrics. Read-only. Returns: { message, data: { total, breakdown?, comparison?, sampleMeta? } }.

NameTypeReqDescription
categoriesarrayOptional configured expense categories to include in the summary.
clientEmailstringClient account email. Accountants may use this only for an accepted ExpenseBot client.
dateRangeTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
groupBystring
metricstring
querystringNatural language question (e.g., 'how much did I spend in March', 'top merchants this quarter')
NameTypeReqDescription
dataobject|nullInline branch: computed analytics, or null when no spreadsheet / no data.
estimatedTimenumberAsync branch only: seconds.
jobIdstringAsync branch only.
messagestringHuman-readable narrative (both branches).
pollEndpointstringAsync branch only.
pollIntervalnumberAsync branch only: milliseconds.
responsestringChat alias of message.
successbooleanAsync branch only.
typestringAsync branch only: "analytics_pending" — poll pollEndpoint or call poll_analytics with jobId.

No examples provided.

get_spreadsheet_url ~622

Return the user's master ExpenseBot Google Sheet plus authenticated ExpenseBot workspace links, each with a label and a description of when to use it. Use this when the user asks to open, view, check, or edit their spreadsheet; review expenses or income; manually scan Gmail; reconcile; connect or manage a bank/credit card; open Automation Hub or General Settings; create or open reports; or asks where a submitted receipt went. Choose and show the one or two links relevant to the request instead of listing the entire catalog. After a receipt submission, prefer Review expenses plus the Google Sheet. After an income write, prefer Review income plus the Sheet. For a Gmail scan or connection request, use the Scan Gmail link, which opens the existing Gmail scanning interface. Bank/card requests use the Reconcile link; configuration requests use the returned Automation Hub or General Settings link. Category, G/L, and account-code requests use Category management; client, project, and trip groups use Group management; questions about what counts as Personal use Personal rules. For client billing setup, use the returned clientBillingHandoffs instead of giving a generic dashboard tour: manageClients creates or manages the client list, tagReadyExpenses opens Review Expenses filtered to blank or default-Business rows, and createClientReport opens report creation by group after expenses have been assigned. Choose the one next step that matches the user's current state. If the user names a client and an exact expense scope and asks the assistant to do the work, use search_expenses and group_expenses instead; show its grounded preview and require explicit confirmation before changing any rows. When the user asks to choose receipt images from Google Photos, use the returned Google Photos link; it opens the existing authenticated picker and handles any required Google consent in ExpenseBot. When they ask where ExpenseBot stores receipt files, return the Drive folder link only when i…

Input schema present but exposes no named parameters.

NameTypeReqDescription
dashboardUrlstringyes
dataobjectyes
gmailActionNeededUrlstringyes
gmailScanUrlstringyes
messagestringyes
reportsUrlstringyes
reviewExpensesUrlstringyes
reviewIncomeUrlstringyes
spreadsheetIdstringyes
spreadsheetUrlstringyes
successbooleanyes

No examples provided.

get_subscription_audit ~160

Subscription audit — wraps the Subscription Auditor engine to find recurring charges, duplicates, price increases, and trial-conversion suspects in the user's expenses. Examples: 'recurring subscriptions', 'duplicate subscriptions', 'price increases', 'trial conversions', 'subscriptions over $20/month'. Returns: { message, data: { recurring, duplicates, priceIncreases, trialConversions, totalMonthlyCost, sampleMeta? } }.

NameTypeReqDescription
dateRangeTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
focusstringNarrow the audit to a single category (default: all)
querystringNatural language subscription question (e.g., 'find duplicate subscriptions', 'price increases this year')
NameTypeReqDescription
dataobject|null
messagestring
successbooleanPresent only on the error branch (out of scope) / async path.

No examples provided.

get_trip_suggestions ~188

Show ExpenseBot's current high-confidence Trip Intelligence proposals from Review Expenses. Read-only: never groups, tags, creates reports, or writes to the spreadsheet. Each proposal returns strict YYYY-MM-DD dates, evidence, locations, and the exact Receipt IDs with expected current tags. Do not infer a client/project from geography. When nextAction is present, use exactly its group_expenses params with confirm:false, show the canonical preview, then ask for explicit confirmation before any write. Never send confirm:true from this read result alone. In accountant clientEmail mode this tool can read accepted clients but may return no executable nextAction; hand off to Review Expenses or the owner's own assistant connection to apply.

NameTypeReqDescription
clientEmailstringClient account email. Accountants may use this only for an accepted ExpenseBot client.
limitintegerMaximum high-confidence proposals to return (default 3).
NameTypeReqDescription
countinteger
messagestring
proposalsarrayRead-only trip proposals; accepting one continues through group_expenses.
successbooleanyes

No examples provided.

group_expenses ~638

Group an exact set of recorded expenses for a client, project, trip, job, or other user-named purpose. Examples: 'group my Mexico meals for client Rob', 'put these Vegas expenses under the Vegas project', or 'group these for client Rob and create a report'. The user does not need to know about tags: ExpenseBot resolves the requested name against existing groups and proposes creating one only when needed. Use exact expenseId values returned by search_expenses. A grounded preview is automatic for every bulk request; the user does not need to ask for one. First call with confirm omitted/false, show the returned exact rows, count, totals, proposed group, exclusions, and conflicts, then ask for approval. Only after explicit user approval, repeat the same operationId and selection with confirm:true. A premature confirm:true is converted to preview. When the request includes a report, set createReport:true on that confirmed group_expenses call and use its report result; do not run a separate broader create_report query. For 'without personal expenses', set excludePersonal:true; ExpenseBot removes Personal-tagged and Personal-category rows before preview so their Personal marker is never overwritten. The confirmed operation returns exact report and Bill Client links. Expenses already assigned to another ordinary report are excluded; if none remain, no duplicate report is created and the result links to Reports instead. Keep the user-facing response concise and do not add unsolicited tax or substantiation advice. Do not call check_compliance, get_report_details, or tax/deductibility tools before or after this workflow unless the user explicitly asks for that separate analysis. In user-facing prose call the destination a group, not a tag. Treat preview totals as provisional; after confirmation use only the terminal result's exact count, total, and currency without reconciling it against the preview. A returned Bill Client URL opens the reviewed billing handoff and does not m…

NameTypeReqDescription
approveNewGroupbooleanTrue only when the preview says a new group is required.
confirmbooleanOmit/false for preview; true only after explicit approval.
createReportbooleanCreate a report from the exact eligible grouped expenses.
excludePersonalbooleanExclude Personal-tagged and Personal-category expenses from both grouping and the exact report.
excludedCategoriesarrayExpense categories to exclude before preview and grouping.
excludedTagsarrayExisting groups to exclude before preview and grouping.
groupobjectThe user-named destination group to apply to every eligible selected expense.
operationIdstringyesStable idempotency key generated once for the preview and reused unchanged.
reportTitlestringOptional title when createReport is true; otherwise ExpenseBot derives one from the group.
selectionobjectExact expenses returned by search_expenses and approved for this bounded operation.
statusbooleanRead operation status using operationId.
undobooleanUndo a completed grouping within its undo window.

No output schema declared.

No examples provided.

list_categories ~61

List the user's configured expense categories and billing accounts. Use this BEFORE calling tools that need a category (add_cash_expense, add_mileage_entry, create_report) so you pass the user's actual category names, not guesses. Returns the live list from their spreadsheet.

Input schema present but exposes no named parameters.

NameTypeReqDescription
billingAccountsarrayBilling/card accounts, when configured.
categoriesarrayyesExpense categories for the user.
successbooleanyes

No examples provided.

list_client_invoices ~199

List the user's issued client invoices (accounts receivable) — who owes them money, how much, and when it is due. Examples: 'which invoices are outstanding', 'what does Acme still owe me', 'any overdue invoices', 'how much am I waiting to get paid'. status accepts 'active' (default), 'open', 'overdue', 'needs_review', 'paid', 'void', 'superseded', or 'all'. Returns invoice numbers, status, totals by currency, delivery state, and private document links. Read-only.

NameTypeReqDescription
clientEmailstringClient account email. Accountants may use this only for an accepted ExpenseBot client.
clientNamestringOptional: exact client name (case-insensitive).
limitnumberMax invoices to return (default 25, max 100).
statusstringFilter by invoice status (default active/outstanding).
NameTypeReqDescription
invoicesarrayyes
successbooleanyes

No examples provided.

list_income_categories ~46

List ExpenseBot's fixed income tax categories. Unlike Expense Accounts, these are not user-configured. Use this BEFORE calling add_income so you pass an exact canonical category instead of guessing.

Input schema present but exposes no named parameters.

NameTypeReqDescription
categoriesarrayyes
legacyarrayDeprecated income categories still accepted on read.
notesstring
successbooleanyes

No examples provided.

list_reports ~143

List the user's expense reports with pagination. Filter by status (All, Draft, Submitted, Shared). Each exact report includes its app, Bill Client, and accounting handoff URLs. Use the matching accounting URL only when the user explicitly asks to send or export that report; the app keeps organization, mapping, preview, and final confirmation.

NameTypeReqDescription
clientEmailstringClient account email. Accountants may use this only for an accepted ExpenseBot client.
filterstringOptional report-status filter; All returns every authorized status.
limitintegerMaximum reports to return on this page.
pageintegerOne-based results page to return.
NameTypeReqDescription
creationStatusstringyesProvenance of the listing, e.g. "existing_only".
filterstring
limitinteger
pageinteger
reportsarrayPresent when the user has reports.
responseGuidancestring
successbooleanyes

No examples provided.

list_tags ~83

List the user's configured groups. ExpenseBot stores clients, projects, project codes, properties, and trips as tags (for example 'Client: Acme', 'Vegas Trip', or 'Property: 123 Main'). Use this when the user asks 'what groups/projects/clients do I have?' and before filtering, grouping, or reporting when the intended existing name is unclear.

Input schema present but exposes no named parameters.

NameTypeReqDescription
successbooleanyes
tagsarrayyesClient / project / trip groups (Column K values).

No examples provided.

mark_client_invoice_paid ~130

Mark an issued client invoice as paid after explicit confirmation. Requires a strict calendar-valid paidDate in YYYY-MM-DD format. This updates the accounts-receivable invoice record only; it never creates or moves an Income row. Record the actual payment separately or link an existing Income row.

NameTypeReqDescription
invoiceIdstringyesStable invoice ID from list_client_invoices.
paidAmountnumberOptional amount received.
paidDatestringyesCalendar-valid payment date in YYYY-MM-DD format.
paidViastringOptional payment method or source, such as bank transfer or check.

No output schema declared.

No examples provided.

parse_expense ~86

Parse a natural language expense description into structured fields. Does NOT add the expense — just returns the parsed fields for review. Example: "Lunch at Chipotle $15.50 today" → {merchant: "Chipotle", total: 15.50, ...}

NameTypeReqDescription
textstringyesNatural language expense (e.g., "Coffee at Starbucks $6.50 yesterday")

No output schema declared.

No examples provided.

Common questions

What is the ExpenseBot MCP server?

ExpenseBot is an MCP server listed in the public MCP registry as io.github.TotesMagotes/mcp-server-auth. Capture receipts, scan Gmail, analyze spending, and create reviewed reports from AI assistants. This page covers its npm package (@expensebot/mcp-server-auth).

Is the ExpenseBot MCP server safe to use?

ExpenseBot scores 79 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the ExpenseBot MCP server expose?

ExpenseBot exposes 60 tools: search_expenses, get_spending_summary, get_deep_analytics, create_report, list_reports, and 55 more. Their descriptions and schemas cost roughly 13,408 tokens of context every time the server is loaded.

Is the ExpenseBot MCP server still maintained?

ExpenseBot is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the ExpenseBot MCP server under?

ExpenseBot declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.