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

REMOTE · MCP.EXPENSEBOT.AI · 2 COMPONENTS

Receipt ingestion, Gmail capture, expense analysis, and reviewed reports for AI-agent workflows.

−3 this week 75 Trust /100

Last scanned (23 hours ago)

Scores higher than 64% of remote servers

Reachable. Last reached 4 Nov 2026.

Category Data and Analytics

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security63
Transport & Reachability100
Schema Quality & AI Usability63
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 15464 tokens (~237/item across 65 items; 65 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 Management98
  • Stability check failed: schema churn in the 30 days we've observed: 0 tool removals, 2 breaking changes, 0 auth/transport breaks, 6 additions. See how to fix → Fail
Tool Coverage99
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 98% of tool parameters carry a description.Partial
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety50
  • Injection-marker check failed: the server instructions contains an instruction to conceal the call from the user, the text "never tell the user", at byte 6890 of that field. See how to fix → Fail
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 66 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
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.

  • 4 Nov 26 −3
    • Injection markers: pass → fail ▼ security
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “add_income” rewrote its description, which is the text the model reads security
    • Tool “add_cash_expense” rewrote its description, which is the text the model reads security
    • Tool “correct_expenses” rewrote its description, which is the text the model reads security
    • Tool “add_mileage_entry” rewrote its description, which is the text the model reads security
    • Tool “whatif_tax_setaside” rewrote its description, which is the text the model reads security
    • Tool “whatif_client” rewrote its description, which is the text the model reads security
    • Tool “update_expense” rewrote its description, which is the text the model reads security
    • Tool “submit_receipt” rewrote its description, which is the text the model reads security
    • Tool “share_report” rewrote its description, which is the text the model reads security
    • Tool “search_expenses” rewrote its description, which is the text the model reads security
    • Tool “search” rewrote its description, which is the text the model reads security
    • Tool “scan_gmail” rewrote its description, which is the text the model reads security
    • Tool “process_gmail_receipts” rewrote its description, which is the text the model reads security
    • Tool “parse_expense” rewrote its description, which is the text the model reads security
    • Tool “group_expenses” rewrote its description, which is the text the model reads security
    • Tool “get_trip_suggestions” rewrote its description, which is the text the model reads security
    • Tool “get_spreadsheet_url” rewrote its description, which is the text the model reads security
    • Tool “get_spending_summary” rewrote its description, which is the text the model reads security
    • Tool “get_scan_status” rewrote its description, which is the text the model reads security
    • Tool “get_pnl” rewrote its description, which is the text the model reads security
    • Tool “get_per_tag_pnl” rewrote its description, which is the text the model reads security
    • Tool “get_last_receipt_result” rewrote its description, which is the text the model reads security
    • Tool “get_accounting_integration_status” rewrote its description, which is the text the model reads security
    • Tool “fix_compliance” rewrote its description, which is the text the model reads security
    • Tool “fetch” rewrote its description, which is the text the model reads security
    • Tool “create_report” rewrote its description, which is the text the model reads security
    • New tool “omit_expenses” functional
    • “add_income_from_file” reworded the description of “rowEdits” cosmetic
    • “correct_expenses” reworded the description of “change” cosmetic
    • “check_compliance” reworded the description of “analysisRequested” cosmetic
    • “add_income” reworded the description of “paymentMethod” cosmetic
    • “submit_receipt” reworded the description of “uploadRefs” cosmetic
    • “submit_receipt” reworded the description of “filesToUpload” cosmetic
    • “search_expenses” reworded the description of “tagAssignment” cosmetic
    • “search_expenses” reworded the description of “query” cosmetic
    • “group_expenses” reworded the description of “replaceExistingTags” cosmetic
    • “get_report_details” reworded the description of “checkFreshness” cosmetic
    • “get_report_details” reworded the description of “analysisRequested” cosmetic
    • “get_last_receipt_result” reworded the description of “withinSeconds” cosmetic
    • “get_income_summary” reworded the description of “incomeTagPrefix” cosmetic
    • “fix_compliance” reworded the description of “undo” cosmetic
    • “fix_compliance” reworded the description of “status” cosmetic
    • “fix_compliance” reworded the description of “selection” cosmetic
    • “fix_compliance” reworded the description of “operationId” cosmetic
    • “fix_compliance” reworded the description of “change” cosmetic
    • “create_report” reworded the description of “recipientRole” cosmetic
    • “correct_expenses” reworded the description of “undo” cosmetic
    • “correct_expenses” reworded the description of “status” cosmetic
    • “correct_expenses” reworded the description of “selection” cosmetic
    • “correct_expenses” reworded the description of “operationId” cosmetic
  • 3 Nov 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “get_spreadsheet_url” rewrote its description, which is the text the model reads security
    • Tool “get_last_receipt_result” rewrote its description, which is the text the model reads security
    • MCP protocol: Implements a current MCP spec version (2026-07-28). functional
    • MCP protocol version: 2025-11-25 → 2026-07-28 functional
  • 2 Nov 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • New tool “complete_setup”, which the server declares destructive security
    • Tool “add_income_from_file” rewrote its description, which is the text the model reads security
    • Tool “update_expense” rewrote its description, which is the text the model reads security
    • Tool “trace_document” rewrote its description, which is the text the model reads security
    • Tool “submit_receipt” rewrote its description, which is the text the model reads security
    • Tool “send_report_to_accounting” rewrote its description, which is the text the model reads security
    • Tool “search_expenses” rewrote its description, which is the text the model reads security
    • Tool “scan_gmail_years” rewrote its description, which is the text the model reads security
    • Tool “scan_gmail” rewrote its description, which is the text the model reads security
    • Tool “request_accounting_integration” rewrote its description, which is the text the model reads security
    • Tool “group_expenses” rewrote its description, which is the text the model reads security
    • Tool “get_subscription_audit” rewrote its description, which is the text the model reads security
    • Tool “get_spreadsheet_url” rewrote its description, which is the text the model reads security
    • Tool “get_scan_status” rewrote its description, which is the text the model reads security
    • Tool “get_recent_activity” rewrote its description, which is the text the model reads security
    • Tool “get_monthly_books_review” rewrote its description, which is the text the model reads security
    • Tool “get_mileage_summary” rewrote its description, which is the text the model reads security
    • Tool “get_last_receipt_result” rewrote its description, which is the text the model reads security
    • Tool “get_expense_splits” rewrote its description, which is the text the model reads security
    • Tool “get_expense_by_id” rewrote its description, which is the text the model reads security
    • Tool “get_accounting_integration_status” rewrote its description, which is the text the model reads security
    • Tool “fix_compliance” rewrote its description, which is the text the model reads security
    • Tool “create_report” rewrote its description, which is the text the model reads security
    • Tool “correct_expenses” rewrote its description, which is the text the model reads security
    • Tool “add_mileage_entry” rewrote its description, which is the text the model reads security
    • Tool “add_income” rewrote its description, which is the text the model reads security
    • Tool “add_cash_expense” rewrote its description, which is the text the model reads security
    • New tool “get_setup_status” functional
    • “update_expense” added an optional parameter “expectedPaidWith” cosmetic
    • “search_expenses” added an optional parameter “paymentStatus” cosmetic
    • “search_expenses” added an optional parameter “includePaidWith” cosmetic
    • “scan_gmail_years” added an optional parameter “provider” cosmetic
    • “scan_gmail” added an optional parameter “provider” cosmetic
    • “get_scan_status” added an optional parameter “provider” cosmetic
    • “get_scan_status” added an optional parameter “jobId” cosmetic
    • “search_expenses” reworded the description of “dateRange” cosmetic
    • “search_expenses” reworded the description of “clientEmail” cosmetic
    • “list_reports” reworded the description of “clientEmail” cosmetic
    • “list_client_invoices” reworded the description of “clientEmail” cosmetic
    • “get_trip_suggestions” reworded the description of “clientEmail” cosmetic
    • “get_subscription_audit” reworded the description of “dateRange” cosmetic
    • “get_statement_import_status” reworded the description of “clientEmail” cosmetic
    • “get_spending_summary” reworded the description of “dateRange” cosmetic
    • “get_spending_summary” reworded the description of “clientEmail” cosmetic
    • “get_report_details” reworded the description of “clientEmail” cosmetic
    • “get_pnl” reworded the description of “dateRange” cosmetic
    • “get_pnl” reworded the description of “clientEmail” cosmetic
    • “get_per_tag_pnl” reworded the description of “dateRange” cosmetic
    • “get_monthly_books_review” reworded the description of “clientEmail” cosmetic
    • “get_mileage_summary” reworded the description of “dateRange” cosmetic
    • “get_income_summary” reworded the description of “dateRange” cosmetic
    • “get_expense_splits” reworded the description of “clientEmail” cosmetic
    • “get_deep_analytics” reworded the description of “dateRange” cosmetic
    • “get_credits_refunds” reworded the description of “clientEmail” cosmetic
    • “get_client_invoice” reworded the description of “clientEmail” cosmetic
    • “get_client_advance_balances” reworded the description of “clientEmail” cosmetic
    • “create_report” reworded the description of “dateRange” cosmetic
  • 30 Oct 26 0
    • Tool “get_trip_suggestions” rewrote its description, which is the text the model reads security
  • 27 Oct 26 0
    • Tool “create_report” rewrote its description, which is the text the model reads security
    • Tool “add_cash_expense” rewrote its description, which is the text the model reads security
    • Tool “add_income_from_file” rewrote its description, which is the text the model reads security
    • Tool “correct_expenses” rewrote its description, which is the text the model reads security
    • Tool “create_tag” rewrote its description, which is the text the model reads security
    • Tool “fix_compliance” rewrote its description, which is the text the model reads security
    • Tool “get_last_receipt_result” rewrote its description, which is the text the model reads security
    • Tool “get_spreadsheet_url” rewrote its description, which is the text the model reads security
    • Tool “get_trip_suggestions” rewrote its description, which is the text the model reads security
    • Tool “group_expenses” rewrote its description, which is the text the model reads security
    • Tool “search_expenses” rewrote its description, which is the text the model reads security
    • Tool “send_report_to_accounting” rewrote its description, which is the text the model reads security
    • Tool “submit_receipt” rewrote its description, which is the text the model reads security
    • Tool “update_expense” rewrote its description, which is the text the model reads security
    • “get_trip_suggestions” added an optional parameter “area” cosmetic
    • “get_trip_suggestions” added an optional parameter “dateRange” cosmetic
    • “get_trip_suggestions” added an optional parameter “destination” cosmetic
    • “get_trip_suggestions” added an optional parameter “includeCandidates” cosmetic
    • “get_trip_suggestions” added an optional parameter “includePossibleAdditions” cosmetic
    • “get_trip_suggestions” added an optional parameter “mode” cosmetic
    • “get_trip_suggestions” added an optional parameter “offset” cosmetic
    • “get_trip_suggestions” added an optional parameter “refresh” cosmetic
    • “add_income_from_file” reworded the description of “rowEdits” cosmetic
    • “create_report” reworded the description of “dateRange” cosmetic
    • “get_client_advance_balances” reworded the description of “clientEmail” cosmetic
    • “get_client_invoice” reworded the description of “clientEmail” cosmetic
    • “get_credits_refunds” reworded the description of “clientEmail” cosmetic
    • “get_deep_analytics” reworded the description of “dateRange” cosmetic
    • “get_expense_splits” reworded the description of “clientEmail” cosmetic
    • “get_income_summary” reworded the description of “dateRange” cosmetic
    • “get_mileage_summary” reworded the description of “dateRange” cosmetic
    • “get_monthly_books_review” reworded the description of “clientEmail” cosmetic
    • “get_per_tag_pnl” reworded the description of “dateRange” cosmetic
    • “get_pnl” reworded the description of “clientEmail” cosmetic
    • “get_pnl” reworded the description of “dateRange” cosmetic
    • “get_report_details” reworded the description of “checkFreshness” cosmetic
    • “get_report_details” reworded the description of “clientEmail” cosmetic
    • “get_spending_summary” reworded the description of “clientEmail” cosmetic
    • “get_spending_summary” reworded the description of “dateRange” cosmetic
    • “get_statement_import_status” reworded the description of “clientEmail” cosmetic
    • “get_subscription_audit” reworded the description of “dateRange” cosmetic
    • “get_trip_suggestions” reworded the description of “clientEmail” cosmetic
    • “get_trip_suggestions” reworded the description of “limit” cosmetic
    • “list_client_invoices” reworded the description of “clientEmail” cosmetic
    • “list_reports” reworded the description of “clientEmail” cosmetic
    • “search_expenses” reworded the description of “clientEmail” cosmetic
    • “search_expenses” reworded the description of “dateRange” cosmetic
    • “search_expenses” reworded the description of “query” cosmetic
    • “submit_receipt” reworded the description of “filesToUpload” cosmetic
    • “submit_receipt” reworded the description of “note” cosmetic
    • “submit_receipt” reworded the description of “tag” cosmetic
    • “submit_receipt” reworded the description of “uploadRefs” cosmetic
  • 26 Oct 26 0
    • Tool “search_expenses” rewrote its description, which is the text the model reads security
    • Tool “group_expenses” rewrote its description, which is the text the model reads security
    • New tool “create_tag” functional
    • “search_expenses” added an optional parameter “tagAssignment” cosmetic
    • “search_expenses” added an optional parameter “groupBy” cosmetic
    • “search_expenses” added an optional parameter “countries” cosmetic
    • “group_expenses” added an optional parameter “replaceExistingTags” cosmetic
  • 23 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
  • 22 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
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 4 Nov 2026 · Probed https://mcp.expensebot.ai/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=mcp.expensebot.ai CN=YR2,O=Let's Encrypt,C=US 8 Sept 2026 7 Dec 2026 RSA 2048 SHA256-RSA 69f8cf9d11963ed221401116573c17f0a84
SANs: mcp.expensebot.ai
CN=YR2,O=Let's Encrypt,C=US (CA) CN=Root YR,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 RSA 2048 SHA256-RSA 4ebd24947e24d394802d84a52fd5b319
CN=Root YR,O=ISRG,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 RSA 4096 SHA256-RSA f24b6d17f9d9ad7cb1c9fea78782699f

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of mcp.expensebot.ai. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
ai. present 1814, 3799 8, 8 Verified
expensebot.ai. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.expensebot.ai/mcp Verified 200
http (plaintext) http://mcp.expensebot.ai/mcp HTTPS enforced 308 https://mcp.expensebot.ai/mcp
MCP tools · 65 exposed · ~13,164 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 ~329

Add one receiptless expense or client-provided expense advance to the expense sheet after the user confirms; no server preview, it writes on call. Ordinary expenses: list_categories first; use a configured Expense Account. Advances: isClientAdvance=true + clientName reuses/creates the canonical client group, applies Cash advance received and writes a negative expense. Only client money provided before spending; never for vendor refunds, reimbursements, earned fees, retainers or generic deposits. Multiple/incomplete entries, refunds, tax/tip/per diem: Manual expense link from get_spreadsheet_url.

NameTypeReqDescription
categorystring–A configured Expense Account returned by list_categories. Do not invent a category.
citystring–City/location
clientNamestring–Client name for a client advance, in ordinary language. ExpenseBot resolves the canonical Client – Name group.
currencystring–Currency code (default: USD)
datestringyesExpense date (YYYY-MM-DD)
isClientAdvanceboolean–True only when a client supplied money in advance for expenses. Requires clientName and does not require category.
merchantstring–Merchant/vendor name for an ordinary expense. Not needed for a client advance; ExpenseBot derives it from clientName.
notesstring–Notes or description
subtotalnumber–Subtotal before tax
taxnumber–Tax amount
tipnumber–Tip amount
totalnumberyesPositive amount paid or received. ExpenseBot stores a client advance as negative.
NameTypeReqDescription
dataobject––
expenseobject––
finalAnswerstring––
messagestringyes–
recordIdstring––
responseGuidancestring––
reviewExpensesUrlstring––
rowNumberinteger––
spreadsheetUrlstring|null––
successbooleanyes–

No examples provided.

add_income ~325

Log exactly one confirmed income payment (cash/check/Stripe/etc.) to Income, e.g. income absent from Gmail/Plaid; no server preview, it writes on call. Never loop over statements/exports/tables/lists. Multiple payments: add_income_from_csv for CSV/TSV/text or add_income_from_file for image/PDF; both duplicate-check, preview and require confirmation. Call list_income_categories first; use fixed tax categories. Omitted category defaults to Service income; unknown is rejected.

NameTypeReqDescription
amountnumberyesIncome amount (>0)
categorystring–A category returned by list_income_categories (optional; defaults to Service income)
currencystring–Currency code (default: home currency)
datestringyesIncome date (YYYY-MM-DD). Required. Use the date the user gives; for "today" send today's calendar date in their timezone. If no date was given, ask.
descriptionstring–What the income was for
feesnumber–Processor/transfer fees deducted
notesstring––
paymentMethodstringyesHow you got paid: Cash, Check, Bank transfer, Wallet app, Credit/Debit card, Payment processor or Other; labels like Stripe or Venmo are normalized.
referencestring–Invoice or transaction reference
sourcestringyesWho paid you (client name, customer, etc.)
tagstring–Tag for client/project attribution
taxCollectednumber–Sales tax/GST/HST collected
NameTypeReqDescription
dataobject––
dedupedboolean––
destinationsobject––
finalAnswerstring––
matchedRowobject––
messagestringyes–
recordIdstring––
responseGuidancestring––
rowNumberinteger––
successbooleanyes–
tabCreatedboolean––

No examples provided.

add_income_from_csv ~313

Use this to import the user's CSV/TSV/text income export (max 500 KB). Step 1 stages a duplicate-checked previewId without writing Income rows. Show it and obtain approval. Step 2 uses confirm:true and that previewId to write the approved rows/edits; duplicates require explicit keep approval. Unknown or expired previews never write (15-minute expiry). Return spreadsheetUrl and reviewIncomeUrl after success. Accepts user-provided attachments or inline text, not arbitrary web URLs.

NameTypeReqDescription
bulkNotestring–Step 2 note prepended to confirmed rows (max 120 characters).
confirmboolean–Step 2: true writes the staged selection only after user approval.
csvContentobject–Step 1 ChatGPT attachment; securely downloaded and decoded.
csvTextstring–Step 1 inline CSV/TSV/text fallback; ChatGPT should use csvContent.
keepBothIndexesarray–Step 2 duplicate indexes the user explicitly approved keeping.
paymentMethodstring–Fallback payment rail only when absent from the parsed row.
previewIdstring–Step 2 ID returned by the unexpired preview.
rowEditsarray–Step 2 approved edits; at most 50 selected preview rows.
selectedIndexesarray–Step 2 preview row indexes to write; omit for all staged rows.
tagstring–Optional client/project tag for staged or confirmed rows.
NameTypeReqDescription
confirmationContractstring––
confirmedboolean––
dedupedinteger––
duplicateCountinteger––
duplicatesarray––
entriesarray––
entryCountinteger––
expiresAtstring––
expiresInMinutesinteger––
failedinteger––
finalAnswerstring––
idempotentReplayboolean––
maxChatEntriesinteger––
messagestringyes–
previewboolean––
previewIdstring––
projectionTruncatedboolean––
refundRowCountinteger––
rejectedRowsarray––
responseGuidancestring––
reviewImportUrlstring––
reviewIncomeUrlstring––
spreadsheetUrlstring|null––
successbooleanyes–
tooLargeForChatboolean––
totalinteger––
totalsByCurrencyobject––
unattemptedinteger––
warningsarray––
writteninteger––

No examples provided.

add_income_from_file ~535

Import income from attached JPEG/PNG/WebP/HEIC/HEIF screenshots/images or PDF (payment/wallet/payout/bank statement; max 10 MB). Step 1: file WITHOUT confirm uses Add Income's parser and Income-tab duplicate check. Returns previewId, exact count, currency totals, rows, duplicate flags/rejections; parses only, saves nothing. Attachment is not write consent. Show rows/duplicates. Step 2: confirm:true + previewId writes only user-approved selectedIndexes/keepBothIndexes/rowEdits/tag/bulkNote. Skip flagged duplicates unless explicitly approved in keepBothIndexes. Unknown/expired previews (15 minutes) never write. Success: show spreadsheetUrl + reviewIncomeUrl. Mixed income/expense or many edits: Add Income link from get_spreadsheet_url.

NameTypeReqDescription
bulkNotestring–Step 2 only: one note (max 120 chars) prepended to every confirmed row's Notes, same as the app's 'Add note to all entries'.
confirmboolean–Step 2 only: true writes the staged rows. Omit it (with previewId absent) to parse and preview without writing.
keepBothIndexesarray–Step 2 only: preview indexes of duplicate-flagged rows the user explicitly wants to keep anyway (the app's 'Keep Both').
mimeTypestring–MIME type of the file (default: image/jpeg)
paymentMethodstring–Fallback payment rail for rows where the parser found none (Cash, Check, Bank transfer, Wallet app, Credit/Debit card, Payment processor, or Other).
photoobject–Attached image or PDF supplied by ChatGPT for step 1. The server downloads and parses the attachment securely.
photoBase64string–Legacy fallback for MCP clients that send complete image/PDF bytes as base64. ChatGPT should use photo.
previewIdstring–Step 2 only: the previewId returned by the step-1 call.
rowEditsarray–Step 2 only: user-approved corrections, max 50 rows (date YYYY-MM-DD, source, amount, currency, category, paymentMethod, description, notes, reference, fees, taxCollected, tag).
selectedIndexesarray–Step 2 only: preview row indexes to write. Omit to write all staged rows.
tagstring–Optional client/project tag. In step 1 it pre-fills the staged rows; in step 2 it applies to the confirmed selection.
NameTypeReqDescription
confirmationContractstring––
confirmedboolean––
dedupedinteger––
duplicateCountinteger––
duplicatesarray––
entriesarray––
entryCountinteger––
expiresAtstring––
expiresInMinutesinteger––
failedinteger––
finalAnswerstring––
idempotentReplayboolean––
maxChatEntriesinteger––
messagestringyes–
previewboolean––
previewIdstring––
projectionTruncatedboolean––
refundRowCountinteger––
rejectedRowsarray––
responseGuidancestring––
reviewImportUrlstring––
reviewIncomeUrlstring––
spreadsheetUrlstring|null––
successbooleanyes–
tooLargeForChatboolean––
totalinteger––
totalsByCurrencyobject––
unattemptedinteger––
warningsarray––
writteninteger––

No examples provided.

add_mileage_entry ~263

Log one business trip as a calculated-value expense row; no server preview, it writes on call with only user-given details. Requires a configured mileage rate (cents/km or cents/mi) and unit (mi/km). For route calculation, mileage settings, repeated trips, calendar/rideshare imports, per diem or visual review use Mileage and travel from get_spreadsheet_url.

NameTypeReqDescription
categorystring–Override the user's default mileage category (optional)
citystring–City (optional)
datestringyesTrip date (YYYY-MM-DD). Required. Use the date the user gives; for "today" send today's calendar date in their timezone. If no date was given, ask.
destinationstring–Destination address or location (optional)
distancenumberyesDistance traveled in the user's configured unit (miles or km)
notesstring–Optional user-supplied context stored with the mileage entry.
purposestringyesBusiness purpose / description of the trip (e.g., 'Client meeting at 1234 Main St')
roundTripboolean–If true, doubles the distance (return trip)
tagstring–Tag for client/project attribution (optional)
NameTypeReqDescription
dataobject––
finalAnswerstring––
messagestringyes–
responseGuidancestring––
reviewExpensesUrlstring––
rowNumberinteger––
settingsobject––
spreadsheetUrlstring|null––
successbooleanyes–

No examples provided.

check_compliance ~122

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
analysisRequestedbooleanyesTrue only when the user explicitly asked for this report's compliance analysis. Never ask for or copy their message or infer consent from report creation, sharing or billing.
reportIdstringyesReport ID to check
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 ~185

Use this when the user asks for general deduction guidance for an expense type, such as business meals or home-office expenses. Looks up reference rules using the account's tax-country/home settings and current year. A verified rule may return a percentage and reference; unverified rules return unknown/reviewRequired without a percentage. Read-only: it does not classify saved expenses, prepare a return, or determine the user's actual tax liability. Do not use for tax refunds received as income; use get_income_summary for recorded refunds. General guidance is not a tax professional's determination.

NameTypeReqDescription
categorystring–Optional expense category to match the reference rule.
merchantstring–Optional merchant name only when relevant to the expense type.
querystringyesBrief expense-type deduction question, e.g. 'are business meals deductible?'; no account numbers or unrelated personal context.
NameTypeReqDescription
dataobject––
messagestring––
successbooleanyes–

No examples provided.

complete_setup ~152

Preview explicit setup answers; never infer settings or recipients. Show changes/access/recipients; after explicit approval confirm only proposalId + confirm:true. Owner/revision-bound; rejects changed state. Lost response: proposalId + status:true; never resend blindly. Read get_setup_status after completion. Personal Rules require validation/activation; invitations are not accepted client access. OAuth/bank/required reviews use returned screens. No financial writes or client acting.

NameTypeReqDescription
answers––Explicit answers for one operation.
confirmboolean–Approve exact preview.
operationstring–Preview operation.
proposalIdstring–Returned setup proposal ID.
statusboolean–Read outcome; do not replay.
NameTypeReqDescription
handoffUrlstring–Required screen; navigation is not completion.
messagestring–Outcome or next action.
operationstring–Setup operation.
proposalIdstring–Setup proposal ID for confirm/status.
proposedobject–Exact proposed changes; show before approval.
resultobject|null–Verified save/invitation/learning outcomes.
revisionstring–Bound readiness revision.
statusstring–Authoritative stage; pending is not saved.
successbooleanyesOperation succeeded.

No examples provided.

correct_expenses ~291

Preview and correct category, business purpose or user-supplied attendees on one or more exact expenses; first search_expenses for full expenseIds. Automatic preview with confirm omitted/false: show exact count and before/after changes, ask approval once, then repeat identical operationId/selection/change with confirm:true; early confirm returns preview. Never infer attendee names/business context. attendeeMode add preserves existing attendees; replace changes only that Notes segment. Preserve card, description, inbox and other structured Notes segments; skip Formula Notes/overflow. Terminal result gives applied/conflicted/failed counts, status and Undo. Does not omit duplicates, change amounts/dates or do broad Calendar matching; omit/restore via omit_expenses; one row's merchant or tag: update_expense. Mixed (e.g. category plus attendees), unsupported or over-100-row cleanup: https://www.expensebot.ai/review-expenses?source=mcp.

NameTypeReqDescription
changeobject–Exactly one correction; its type selects the required value field.
confirmboolean–Omit/false for preview; true only after explicit approval.
operationIdstringyesIdempotency key generated once and reused unchanged.
selectionobject–Exact expenses from search_expenses approved for this correction.
statusboolean–Read status by operationId.
undoboolean–Undo within the Undo window.
NameTypeReqDescription
changeobject––
confirmationobject––
finalAnswerstring––
manifestobject––
messagestring––
operationIdstring––
previewobject––
requiresConfirmationboolean––
responseGuidancestring––
reviewExpensesUrlstring––
statusstringyes–
successbooleanyes–
undoobject––

No examples provided.

create_client_invoice ~145

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
confirmTaxboolean–True only after the user confirms the displayed tax label and rate.
operationIdstring–Optional retry key. Reuse it after an uncertain response.
preparationIdstringyesShort-lived ID returned by prepare_client_invoice.
NameTypeReqDescription
advanceAppliednumber––
artifactWarningstring––
clientNamestring|null––
currencystring––
documentUrlstring|null––
docxUrlstring|null––
dueDatestring|null––
grandTotalnumber––
invoiceIdstring|null––
invoiceNumberstring|null––
issueDatestring|null––
pdfUrlstring|null––
recoveredboolean––
sourceReportIdstring|null––
statusstring––
successbooleanyes–
totalnumber––

No examples provided.

create_report ~343

Create a report for clear date/client/project/trip/category/merchant criteria. Tags group clients/projects/codes/trips; list_tags if unclear. excludePersonal=true excludes both Personal tag and Personal expense category, as in Report Wizard. Returns summary, exact report/Bill Client links, filters and a prefilled Report Wizard for visual criteria. Optional shareWith recipients (user-named only; emailed). No server preview: creates on call. Group-scoped reports exclude rows on other ordinary reports. No unreported matches: explain existing Reports; never duplicate. Use role-aware accountingHandoffUrls only for the requested destination; opening is not export proof. Complete directly; no check_compliance/get_report_details/tax/deductibility analysis before or after unless explicitly requested.

NameTypeReqDescription
categoriesarray–Optional configured expense categories to include in the report.
dateRange––One period variant matching user wording.
excludePersonalboolean–Exclude expenses whose Tag is Personal or whose Expense Category is Personal.
excludedCategoriesarray–Expense categories to exclude from the report.
excludedTagsarray–Existing ExpenseBot groups to exclude from the report.
recipientRolestring–Access for every shareWith recipient: reviewer for one-report review, comments, approval or changes; accountant only when the user explicitly wants ongoing report management and accounting-software a…
shareWitharray–Email addresses to share the report with
tagsarray–Existing ExpenseBot groups to include, such as a client, project, project code, property, or trip. Use list_tags first when uncertain.
titlestring–Custom report title
NameTypeReqDescription
accountingHandoffUrlsobject––
accountingSetupUrlstring––
billClientUrlstring––
creationStatusstring––
dataobject––
finalAnswerstring––
nextActionsarray––
reportIdstring––
reportUrlstring––
responseGuidancestring––
successbooleanyes–

No examples provided.

create_tag ~209

Create a standalone group/tag without selecting or changing any expenses. The first call prepares a preview; after the user explicitly chooses to create it, send confirm:true with the returned operationId (fresh duplicate checks run). A first call with confirm:true still returns a preview. An exact canonical duplicate is a no-op; archived tags are not reactivated. Similar names are returned as choices; set allowSimilar:true only when the user explicitly chooses a distinct new group despite them. Use list_tags to inspect all groups.

NameTypeReqDescription
allowSimilarboolean–Allow creation alongside similar names only when the user explicitly chooses a new distinct group.
confirmboolean–Confirm only after the user approves the preview; a first confirm call remains preview-only.
namestringyesName of the new group/tag.
operationIdstring–Server-issued preview operation ID to confirm a staged create.
statusboolean–When true, read the verified outcome for operationId without creating or changing a tag.
NameTypeReqDescription
canonicalNamestring––
choicesarray––
confirmationobject––
confirmationRequiredboolean––
createdboolean––
errorobject––
existingMatchesarray––
existingTagobject|null––
existingTagCountinteger––
existingTagsarray––
existingTagsTruncatedboolean––
groupManagementUrlstring––
messagestring––
namestring––
operationIdstring––
outcomeVerifiedboolean––
previewStaleboolean––
requestedNamestring––
requiresConfirmationboolean––
retryableboolean––
similarTagsarray––
statusstring––
successbooleanyes–

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
NameTypeReqDescription
availableInReportarrayyes–
expiresAtstringyes–
notesstringyes–
reportobjectyes–
successbooleanyes–
urlsobjectyes–

No examples provided.

fetch ~250

Fetch full details for a specific item returned by `search`. The id encodes the item type: • 'expense:<expenseId>' — the durable Column-Q Receipt ID returned by `search`, URL-encoded, e.g. 'expense:RR-123%3A%3Adrive%2Ffile%209'. Never a sheet row number: rows move when the sheet is prepended. • 'report:<reportId>' — the alphanumeric Firestore document id from `search` or `list_reports`, e.g., 'report:FQqDglExofsyyQv7aYy4' • 'kb:<entryId>' — the knowledge-base entry id from `search` Use ids exactly as returned; never alter them. Returns full text + metadata to cite. Outside Deep Research read one expense with get_expense_by_id.

NameTypeReqDescription
idstringyesItem ID from a previous `search` or `list_reports` call. Format: 'expense:<URL-encoded Column-Q expenseId>', 'report:<reportId>' (alphanumeric Firestore doc id, ~20 chars), or 'kb:<entryId>' (knowled…
NameTypeReqDescription
idstringyesEchoed back from the input
metadataobject––
textstringyesFull text content for the AI to cite
titlestringyes–
urlstring––

No examples provided.

fix_compliance ~225

Fix recorded expenses only after an explicit request to fix check_compliance findings; follow correct_expenses. Use exact expenseIds from search_expenses; never select all report rows or infer purpose/category/attendees. First call always gives a no-write before/after preview, even with early confirm:true; show changes and ask approval, then repeat identical operationId/selection/change with confirm:true. Terminal result gives applied/conflicted/failed counts, status and Undo. Group via group_expenses. Unsupported or over 100 rows: https://www.expensebot.ai/review-expenses?source=mcp.

NameTypeReqDescription
changeobject–Exactly one correction; its type selects the required value field.
confirmboolean–Omit/false for preview; true only after explicit approval.
operationIdstringyesIdempotency key generated once and reused unchanged.
selectionobject–Exact expenses from search_expenses approved for this correction.
statusboolean–Read status by operationId.
undoboolean–Undo within the Undo window.
NameTypeReqDescription
changeobject––
confirmationobject––
finalAnswerstring––
manifestobject––
messagestring––
operationIdstring––
previewobject––
requiresConfirmationboolean––
responseGuidancestring––
reviewExpensesUrlstring––
statusstringyes–
successbooleanyes–
undoobject––

No examples provided.

get_accounting_integration_status ~152

Read the owner's accounting connection/setup state, selected organization/company/business, rollout state and one connect/reconnect setupUrl. Pass an existing reportId to open that exact report's provider setup control; otherwise general Reports setup. Never posts data. Agent posting: Zoho Books only; QuickBooks Online, Xero, Wave and FreeAgent (beta) are connection/status only (writesAuthorized=false).

NameTypeReqDescription
providerstringyesAccounting destination provider. QuickBooks Online, Xero, Wave, FreeAgent (beta), or Zoho Books.
reportIdstring–Optional existing ExpenseBot report ID. When supplied, setupUrl opens this exact report and highlights the selected accounting provider's setup control.
NameTypeReqDescription
dataobject–Per-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 ~160

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
clientEmailstring–Accountants: accepted client email only.
clientNamestring–Optional 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 ~140

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
clientEmailstring–Accountants: accepted client email only.
invoiceIdstring–Stable invoice ID from list_client_invoices. Required unless invoiceNumber is supplied.
invoiceNumberstring–Human invoice number when invoiceId is unavailable; it must identify one unique invoice.
NameTypeReqDescription
invoiceobject–The invoice record. Absent only on the error branch (not-found), which never carries structuredContent.
messagestring––
successbooleanyes–

No examples provided.

get_credits_refunds ~165

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
clientEmailstring–Accountants: accepted client email only.
dateRangeobject–Optional open-ended or closed window to narrow results. Supply startDate, endDate, or both; supplied bounds are inclusive YYYY-MM-DD dates.
limitnumber–Maximum results to return (default 25, max 100).
NameTypeReqDescription
creditsarray––
dataobject––
messagestring––
refundsarray––
successbooleanyes–

No examples provided.

get_deep_analytics ~113

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
dateRange––One period variant matching user wording.
querystringyesThe analytics question to answer
NameTypeReqDescription
dataobject|null–Inline analytics; null without sheet/data.
estimatedTimenumber–Async: seconds.
jobIdstring–Async branch only.
messagestring–Narrative.
pollEndpointstring–Async branch only.
pollIntervalnumber–Async: milliseconds.
responsestring–Chat alias of message.
successboolean–Async branch only.
typestring–Async analytics_pending: poll pollEndpoint/poll_analytics(jobId).

No examples provided.

get_expense_by_id ~155

Read one existing expense from the authenticated user's ExpenseBot spreadsheet. Supply the exact expenseId returned by search_expenses (Receipt ID in Column Q), or the user's specified rowNumber. Never invent an identifier. Returns sheetName, rowNumber, headers, values, labeled fields and, when available, reviewExpenseUrl. This tool does not edit, submit, delete, share, or scan anything. Also returns Paid with context (unavailable differs from blank) and typed bookkeeping paymentStatus, never bank settlement proof.

NameTypeReqDescription
expenseIdstring–Exact full ExpenseBot Receipt ID from Column Q
rowNumberinteger–1-indexed sheet row (row 1 is headers, so ≥ 2)
NameTypeReqDescription
headersarray––
labeledobject––
paidWithobject––
paymentStatusobject––
reviewExpenseUrlstring––
rowNumberinteger–Resolved sheet row for the expense.
sheetNamestring––
successbooleanyes–
valuesarray––

No examples provided.

get_expense_splits ~175

Read a payment's category/client/property/business-personal allocation. Returns one parent with nested split lines; never count split lines as separate expenses. Use for 'how is this expense split' or 'business portion'. Edit splits in ExpenseBot Review workspace.

NameTypeReqDescription
clientEmailstring–Accountants: accepted client email only.
dateRangeobject–Optional open-ended or closed window to search for split expenses. Supply startDate, endDate, or both; supplied bounds are inclusive YYYY-MM-DD dates.
limitnumber–Max parent expenses to return (default 25, max 100).
onlySplitboolean–Return only expenses with active splits (default true). Set false to inspect an unsplit Receipt ID.
receiptIdstring–Optional Receipt ID for one expense.
NameTypeReqDescription
dataobject––
messagestring––
splitsarray––
successbooleanyes–

No examples provided.

get_income_summary ~185

Use this when the user asks about income already recorded in their ExpenseBot Income tab. Read totals; group by source, category, month, payment method or tag; filter by dateRange/incomeTagPrefix. Query supports period comparisons (e.g. 'income YTD by source', 'income this year vs last'). Returns message and data with total and optional breakdown, comparison, sampleMeta. No scanning, imports, mutations, tax returns or liability determination.

NameTypeReqDescription
dateRange––One period variant matching user wording.
groupBystring–How to group the breakdown
incomeTagPrefixstring–Optional tag prefix (e.g. 'Prop –', 'Client –'); filters to income rows tagged with it.
querystring–Natural language income question (e.g., 'income YTD by source', 'rental income last month')
NameTypeReqDescription
dataobject|null–Inline analytics; null without sheet/data.
estimatedTimenumber–Async: seconds.
jobIdstring–Async branch only.
messagestring–Narrative.
pollEndpointstring–Async branch only.
pollIntervalnumber–Async: milliseconds.
responsestring–Chat alias of message.
successboolean–Async branch only.
typestring–Async analytics_pending: poll pollEndpoint/poll_analytics(jobId).

No examples provided.

get_last_receipt_result ~246

Read the authoritative outcome of a receipt batch: a submit_receipt batch by its exact ID (submissionId), or the latest upload (including in-app) via withinSeconds. Poll at the returned interval/time allowance (small batch at least 5 minutes; larger longer). Pending is normal: never blindly resubmit. found:false = pending/no terminal verdict; found:true = terminal. Returns added/duplicate/skipped/held_for_review/errored per-file outcomes, exact counts and up to 10 summaries. Held files (missing details or a possible duplicate) were not added; relay only their message's next step (e.g. Files to review on Add Expenses), do not invent a missing card or direct held uploads to Gmail Action Needed. Show spreadsheetUrl/reviewExpensesUrl for rows actually added, not for held files. Unknown outcomes stay unknown. Gmail scans use get_scan_status. Read-only.

NameTypeReqDescription
submissionIdstring–Exact submissionId returned by submit_receipt. Strongly preferred because it binds the result to this upload instead of an earlier receipt.
withinSecondsinteger–Lookback seconds for the latest upload when there is no submissionId.
NameTypeReqDescription
countsobject––
dataobject––
foundbooleanyes–
messagestringyes–
receiptsarray–Processed receipt summaries. Held files are not listed here; see data.outcomes.
reviewExpensesUrlstring––
spreadsheetUrlstring|null––
statestring–Present on pending polls for a specific submission.
submissionIdstring|null––
successbooleanyes–
timestampstring|null––
verdictstring–Terminal only. held_for_review: every file was held, none added; mixed also covers batches with held files.

No examples provided.

get_mileage_summary ~136

Mileage totals and month/client/purpose/category breakdowns; country-aware IRS/CRA cents-per-mile/km deduction estimates. Use for mileage this year/by month/for Acme, business miles last quarter or deduction estimate. Supports YoY/MoM/QoQ comparisons. Returns message/data with totalDistance, optional deductionEstimate/breakdown/comparison/sampleMeta.

NameTypeReqDescription
dateRange––One period variant matching user wording.
groupBystring–How to group the breakdown
querystring–Natural language mileage question (e.g., 'mileage this year', 'miles driven for Acme client')
NameTypeReqDescription
dataobject|null––
messagestring––
successboolean–Present only on the error branch (out of scope) / async path.

No examples provided.

get_monthly_books_review ~124

Review one calendar month's recorded income, spending, net, top categories/merchants and unusual alerts ('monthly review', 'how did last month go', 'what did I make and spend'). Defaults to last completed month. Advisory estimates are not tax advice. closeReadiness gives recorded-book checks/Action Needed links; explain unknown coverage/limits. Never closes books or certifies tax completeness.

NameTypeReqDescription
clientEmailstring–Accountants: accepted client email only.
periodstring–Calendar month in YYYY-MM format. Defaults to the last completed month.
NameTypeReqDescription
closeReadinessobject––
dataobject––
messagestring––
successbooleanyes–

No examples provided.

get_per_tag_pnl ~204

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. 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
dateRange––One period variant matching user wording.
querystring–Natural language per-tag P&L question
tagPrefixstring–Optional 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|null–Inline analytics; null without sheet/data.
estimatedTimenumber–Async: seconds.
jobIdstring–Async branch only.
messagestring–Narrative.
pollEndpointstring–Async branch only.
pollIntervalnumber–Async: milliseconds.
responsestring–Chat alias of message.
successboolean–Async branch only.
typestring–Async analytics_pending: poll pollEndpoint/poll_analytics(jobId).

No examples provided.

get_pnl ~196

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 shows as a multiplier in loss (e.g. 'expenses 5.4x revenue'). Returns: { message, data: { revenue, expenses, netIncome, margin, comparison?, sampleMeta? } }.

NameTypeReqDescription
clientEmailstring–Accountants: accepted client email only.
dateRange––One period variant matching user wording.
querystring–Natural language P&L question (e.g., 'P&L for Q1 2025', 'am I profitable')
NameTypeReqDescription
dataobject|null–Inline analytics; null without sheet/data.
estimatedTimenumber–Async: seconds.
jobIdstring–Async branch only.
messagestring–Narrative.
pollEndpointstring–Async branch only.
pollIntervalnumber–Async: milliseconds.
responsestring–Chat alias of message.
successboolean–Async branch only.
typestring–Async analytics_pending: poll pollEndpoint/poll_analytics(jobId).

No examples provided.

get_recent_activity ~104

Read recent MCP assistant tool calls: tool, time, arguments and success, not document processing history. Use for 'what did I do this week' or 'which tools has my assistant run'. Returns audit entries, default 20, max 100.

NameTypeReqDescription
actionIdstring–Optional: filter to a single tool/action name
limitinteger––
sinceDaysinteger–Only show actions from the last N days (default 7)
NameTypeReqDescription
actionsarrayyes–
countintegeryes–
successbooleanyes–

No examples provided.

get_report_details ~234

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. Without checkFreshness:true, returns the stored report only. When explicitly requested together with analysisRequested:true, freshness reads canonical Google Sheets sources with a 5-second bound; if full tax-year replay is unavailable, status is unknown, not current. Never call this as a preflight or follow-up to creating, sharing, or billing from a report; those tools already return the requested result and links.

NameTypeReqDescription
analysisRequestedbooleanyesTrue only when the user explicitly asked to inspect this report. Never ask for or copy their message or infer consent from report creation, sharing or billing.
checkFreshnessboolean–True only when the user explicitly asks if this Year End report is current. Needs analysisRequested:true; a bounded Sheets check that may return unknown. Never after report creation, sharing or billi…
clientEmailstring–Accountants: accepted client email only.
reportIdstringyesThe report/spreadsheet ID
NameTypeReqDescription
freshnessobject––
reportobjectyesThe full stored report record.
successbooleanyes–

No examples provided.

get_scan_status ~147

Check authoritative scan status; defaults to Gmail. provider:outlook reads gated mailbox status or exact jobId, not overall processing completion. Starts require the returned screen. Gmail returns the active lock, live phase/progress, queued or attention-needed periods, completed calendar years, tax-period statuses with their returned labels and inclusive ISO bounds, exclusions and recent outcomes. Use when asked if a scan is running, finished, stuck, or what it is doing. On completion show spreadsheetUrl or reviewExpensesUrl; for setup/reconnection show gmailScanUrl. Read-only.

NameTypeReqDescription
jobIdstring–Optional exact Outlook historical job ID, never guessed.
providerstring–Default Gmail.
NameTypeReqDescription
accountsarray––
coveragestring––
dataobject––
gmailScanUrlstring|null––
jobobject––
latestScanobject|null–Most recent scan outcome (success, emailsFound, emailsTagged, timestamp).
lockobject–Scan-lock state (active, startedAt, ageSeconds, dispatchComplete, pendingProcessingCount).
messagestring––
outlookSettingsUrlstring––
providerstring––
reviewExpensesUrlstring|null––
scanInProgressboolean––
scanInitiatedboolean––
scanWorkspaceUrlstring––
spreadsheetUrlstring|null––
statusstring|null–Scan lifecycle state.
successbooleanyes–

No examples provided.

get_setup_status ~54

Read authoritative setup, known answers, next question and eligible actions for the current workspace. Ask only missing prerequisites; optional setup must not block a specific expense task. Unknown is not empty/complete. No client acting/writes.

Input schema present but exposes no named parameters.

NameTypeReqDescription
decisionsobject|null–Saved checklist decisions.
handoffsobject–Returned settings/personalRules/inbox/bank/clients links.
limitationsarray–Unknowns and restrictions.
nextQuestionobject|null–Next applicable question or null.
personalLearningobject|null–Learning revision, questions, proposals and lastChangeId.
personalRulesobject–Completion and saved preferences.
revisionstring–Current scope-bound revision.
scopestring–Current actor role.
statesobject–Authoritative account/personal_rules/checklist/expense readiness.
statusstring–Read availability.
successbooleanyesRead succeeded.
suggestionsarray–Eligible actions; unknown stays unknown.

No examples provided.

Install

How do I install the ExpenseBot MCP server?

ExpenseBot is a hosted endpoint at https://mcp.expensebot.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.expensebot.ai

# add to Claude Code
claude mcp add --transport http totesmagotes-mcp-server-auth 'https://mcp.expensebot.ai/mcp'
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. Receipt ingestion, Gmail capture, expense analysis, and reviewed reports for AI-agent workflows. This page covers its hosted endpoint (https://mcp.expensebot.ai/mcp).

Is the ExpenseBot MCP server safe to use?

ExpenseBot scores 75 out of 100 on VerifyMCP. 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 65 tools: get_setup_status, complete_setup, search_expenses, get_spending_summary, get_deep_analytics, and 60 more. Their descriptions and schemas cost roughly 13,164 tokens of context every time the server is loaded.

Does the ExpenseBot MCP server require authentication?

No. We connected to ExpenseBot without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the ExpenseBot MCP server still maintained?

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