totesmagotes avatar

ExpenseBot

totesmagotes/expensebot-mcp

This connects Claude to ExpenseBot's financial tracking system, letting you submit receipts and run analytics without leaving your conversation. You get direct access to income reporting, P&L calculations, mileage tracking, and subscription analysis through natural language. Reach for this when you're managing business expenses or personal finances and want to ask questions about your spending patterns, generate reports, or log receipts on the fly. The stdio transport means it runs locally, so your financial data stays on your machine while Claude helps you make sense of it.

tools
65
transport
STDIO, HTTP
last updated
Nov 11, 2026

Install

From registry metadata
$ npx add-mcp https://mcp.expensebot.ai/mcp --name auth

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http auth https://mcp.expensebot.ai/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 65 tools

Verified live against the running server on Nov 6, 2026.

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

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.

No parameters. Call it with no arguments.

complete_setupPreview explicit setup answers, never infer. Show changes/access/recipients; approval then proposalId+confirm:true only. Owner/revision-bound; rejects changed state. Lost reply: proposalId+status:true; never resend blindly. Re-read get_setup_status. Personal Rules need validat...5 params

Preview explicit setup answers, never infer. Show changes/access/recipients; approval then proposalId+confirm:true only. Owner/revision-bound; rejects changed state. Lost reply: proposalId+status:true; never resend blindly. Re-read get_setup_status. Personal Rules need validat...

Parameters* required
answersvalue
Explicit answers for one operation.
confirmboolean
Approve exact preview.
operationstring
Preview operation.one of general_settings · personal_rules · setup_decision · personal_learning · invite_clients
proposalIdstring
Returned setup proposal ID.
statusboolean
Read outcome; do not replay.
search_expensesSearch spreadsheet expenses by category, merchant, dates, amount or tags. When hasMore, reuse nextCursor with identical filters; avoid overlapping ranges. Optional query does deterministic non-embedding recall over merchant, city/location, Notes (e.g. receipt items, delivery s...16 params

Search spreadsheet expenses by category, merchant, dates, amount or tags. When hasMore, reuse nextCursor with identical filters; avoid overlapping ranges. Optional query does deterministic non-embedding recall over merchant, city/location, Notes (e.g. receipt items, delivery s...

Parameters* required
categoriesarray
Filter by expense categories (e.g., ['Travel', 'Meals'])
clientEmailstring
Accountants: accepted client email only.
countriesarray
Country-review filter: supported country names/codes, or unknown. Never infer a country from currency or an ambiguous city.
cursorstring
Opaque nextCursor returned by the previous search_expenses page. Reuse the same filters; never construct or edit this value.
dateRangevalue
One period variant matching user wording.
groupBystring
Read-only country review; requires explicit dateRange.start/end and at most 100 matches.one of country
hasReceiptboolean
When true, return only expenses with a receipt link. When false, return only expenses without one.
includePaidWithboolean
Page labels only; unavailable differs from blank. No label filter.
limitinteger
Results per page (default 20, maximum 50)default: 20
maxAmountnumber
Maximum expense amount
merchantsarray
Filter by merchant names (e.g., ['Uber', 'Starbucks'])
minAmountnumber
Minimum expense amount
paymentStatusstring
Bookkeeping prefix filter before pagination; not bank settlement. Ordinary search only.one of paid · unpaid · unknown
querystring
Optional case-insensitive keyword recall over the fields listed in the tool description; ANDed with structured filters.
tagAssignmentstring
Country review: unassigned = blank/Business; no_client = no canonical client tag (incl. project/trip tags). Neither implies business use.one of all · unassigned · no_client
tagsarray
Filter by tags
get_spending_summarySummarize 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. Income or profit questions: get_income_summary/get_pnl. Re...6 params

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. Income or profit questions: get_income_summary/get_pnl. Re...

Parameters* required
categoriesarray
Optional configured expense categories to include in the summary.
clientEmailstring
Accountants: accepted client email only.
dateRangevalue
One period variant matching user wording.
groupBystring
one of category · merchant · month · tag · source · paymentMethod
metricstring
one of total · count · average
querystring
Natural language question (e.g., 'how much did I spend in March', 'top merchants this quarter')
get_deep_analyticsRun 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 sample...2 params

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

Parameters* required
dateRangevalue
One period variant matching user wording.
query*string
The analytics question to answer
create_reportCreate 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...9 params

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

Parameters* required
categoriesarray
Optional configured expense categories to include in the report.
dateRangevalue
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...one of reviewer · accountantdefault: reviewer
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
list_reportsList 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; th...4 params

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

Parameters* required
clientEmailstring
Accountants: accepted client email only.
filterstring
Optional report-status filter; All returns every authorized status.one of All · Draft · Submitted · Shareddefault: All
limitinteger
Maximum reports to return on this page.default: 20
pageinteger
One-based results page to return.default: 1
request_accounting_integrationRequest an exact accounting package only after checking reviewed direct/import-file destinations and finding no match. Do not use this for a listed or Beta destination or general compatibility. A confirmation-gated write: after user approval, creates one deduplicated request b...1 params

Request an exact accounting package only after checking reviewed direct/import-file destinations and finding no match. Do not use this for a listed or Beta destination or general compatibility. A confirmation-gated write: after user approval, creates one deduplicated request b...

Parameters* required
packageName*string
Exact accounting package requested by the user.
get_report_detailsGet 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...4 params

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

Parameters* required
analysisRequested*boolean
True 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.one of true
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 bil...one of true
clientEmailstring
Accountants: accepted client email only.
reportId*string
The report/spreadsheet ID
share_reportShare one existing expense report with user-named recipients. No server preview: shares and emails on call. Default to reviewer: they can open and edit that report's Google Sheet, inspect receipts, comment, approve, or request changes, but cannot act for the owner or use accou...3 params

Share one existing expense report with user-named recipients. No server preview: shares and emails on call. Default to reviewer: they can open and edit that report's Google Sheet, inspect receipts, comment, approve, or request changes, but cannot act for the owner or use accou...

Parameters* required
recipientRolestring
Use reviewer for report-only approval. Use accountant only for explicit ongoing accountant access.one of reviewer · accountantdefault: reviewer
recipients*array
reportId*string
check_complianceUse 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 to...2 params

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

Parameters* required
analysisRequested*boolean
True 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.one of true
reportId*string
Report ID to check
fix_complianceFix 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,...6 params

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

Parameters* required
changeobject
Exactly one correction; its type selects the required value field.
confirmboolean
Omit/false for preview; true only after explicit approval.
operationId*string
Idempotency 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.
check_tax_deductibilityUse 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; unver...3 params

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

Parameters* required
categorystring
Optional expense category to match the reference rule.
merchantstring
Optional merchant name only when relevant to the expense type.
query*string
Brief expense-type deduction question, e.g. 'are business meals deductible?'; no account numbers or unrelated personal context.
search_knowledgeSearch ExpenseBot's complete product and help knowledge base. Use this before guessing when the user asks how a feature works, what ExpenseBot supports, or needs setup, billing, Gmail, scan, report, workflow, or troubleshooting instructions. Set fullAnswer:true on the first ca...3 params

Search ExpenseBot's complete product and help knowledge base. Use this before guessing when the user asks how a feature works, what ExpenseBot supports, or needs setup, billing, Gmail, scan, report, workflow, or troubleshooting instructions. Set fullAnswer:true on the first ca...

Parameters* required
fullAnswerboolean
True on the first call for complete or step-by-step instructions.default: false
limitinteger
Number of ranked matching articles to return (1-10).default: 5
query*string
Search terms
submit_receiptProcess receipt images/PDFs, including 'log this', 'save this receipt', 'expense this', 'add this to my expenses' or a shared receipt/invoice photo. Starts on call (no server preview); AI extracts vendor, amount, date, tax and category (usually 1–3 minutes; longer for PDFs/bat...9 params

Process receipt images/PDFs, including 'log this', 'save this receipt', 'expense this', 'add this to my expenses' or a shared receipt/invoice photo. Starts on call (no server preview); AI extracts vendor, amount, date, tax and category (usually 1–3 minutes; longer for PDFs/bat...

Parameters* required
filenamestring
Optional filename (e.g., 'lunch_receipt.jpg')
filesToUploadarray
Every file the user provided, in one call. Returns signedUrl + uploadRef per file; upload each, then call with uploadRefs.
mimeTypestring
MIME type of the file (default: image/jpeg)one of image/jpeg · image/png · image/heic · image/webp · application/pdf
notestring
Batch-level note for every file; a file may override it. Stored in the Notes column (L).
photoobject
Single attached receipt image or PDF supplied by ChatGPT. For multiple files or large files, use filesToUpload and uploadRefs instead.
photoBase64string
Legacy fallback for MCP clients that send one small image as complete base64 data. ChatGPT should use photo or uploadRefs instead.
tagstring
Batch-level project or client tag for every row; a file may override it. Stored in the Tag column (K).
uploadRefstring
Single-file shorthand for uploadRefs. Use uploadRefs when there is more than one file.
uploadRefsarray
Every uploadRef from the filesToUpload step, as ONE batch. If any file fails validation nothing is processed.
get_last_receipt_resultRead 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:...2 params

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

Parameters* required
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.default: 600
add_cash_expenseAdd 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/cre...12 params

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

Parameters* required
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)
date*string
Expense 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
total*number
Positive amount paid or received. ExpenseBot stores a client advance as negative.
parse_expenseParse a natural language expense description into structured fields. Does NOT add the expense: returns fields to show the user; once they approve, save with add_cash_expense. Example: "Lunch at Chipotle $15.50 today" → {merchant: "Chipotle", total: 15.50, ...}1 params

Parse a natural language expense description into structured fields. Does NOT add the expense: returns fields to show the user; once they approve, save with add_cash_expense. Example: "Lunch at Chipotle $15.50 today" → {merchant: "Chipotle", total: 15.50, ...}

Parameters* required
text*string
Natural language expense (e.g., "Coffee at Starbucks $6.50 yesterday")
process_gmail_receiptsProcess specific Gmail emails as receipts when the user supplies Gmail message IDs; to find receipts use scan_gmail. No server preview: on call each email is converted to PDF, extracted by AI and added to the user's expense spreadsheet. Max 25 emails per request. Requires Gmai...2 params

Process specific Gmail emails as receipts when the user supplies Gmail message IDs; to find receipts use scan_gmail. No server preview: on call each email is converted to PDF, extracted by AI and added to the user's expense spreadsheet. Max 25 emails per request. Requires Gmai...

Parameters* required
accountEmailstring
Optional: which Gmail account to use (for users with multiple linked accounts)
emailIds*array
Gmail message IDs to process as receipts
scan_gmailTrigger a background Gmail scan to discover and process receipt emails from the last ~60 days (default). No server preview: starts on call and runs in the background; the user gets an email summary when done. Like clicking "Find Receipts in Gmail" in the UI. For whole PAST YEA...5 params

Trigger a background Gmail scan to discover and process receipt emails from the last ~60 days (default). No server preview: starts on call and runs in the background; the user gets an email summary when done. Like clicking "Find Receipts in Gmail" in the UI. For whole PAST YEA...

Parameters* required
accountEmailstring
Optional: which Gmail account to scan
endDatestring
Optional: explicit end date (YYYY-MM-DD)
lookbackDaysinteger
How many days back to scan (default 60, max depends on subscription)default: 60
providerstring
Default Gmail.one of gmail · outlook
startDatestring
Optional: explicit start date (YYYY-MM-DD) instead of lookbackDays
add_mileage_entryLog one user-confirmed business trip; writes on call, no server preview. Saved mode selects rate-based expense or distance-only trip; trackingMode overrides. For routes, vehicle setup/readings, imports or review, open Mileage and travel via get_spreadsheet_url.13 params

Log one user-confirmed business trip; writes on call, no server preview. Saved mode selects rate-based expense or distance-only trip; trackingMode overrides. For routes, vehicle setup/readings, imports or review, open Mileage and travel via get_spreadsheet_url.

Parameters* required
categorystring
Mileage category override.
citystring
City.
date*string
Required YYYY-MM-DD. Use the given date; for today use the user's timezone. Ask if missing.
destinationstring
Destination.
distance*number
Distance in configured miles/km.
notesstring
User context.
operationIdstring
Stable ID required for trip_log; reuse for the same request; never repeat an unverified save.
purpose*string
Business trip purpose.
roundTripboolean
Double distance for return trip.default: false
tagstring
Client/project tag.
trackingModestring
Optional override; otherwise saved mode. Never infer from country or occupation.one of expense · trip_log
unitstring
Trip-log unit; omit for saved. Expense uses configured unit.one of km · mi
vehicleIdstring
Existing vehicle ID; omit for unassigned; never invent.
add_incomeLog 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_f...12 params

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

Parameters* required
amount*number
Income amount (>0)
categorystring
A category returned by list_income_categories (optional; defaults to Service income)
currencystring
Currency code (default: home currency)
date*string
Income 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
paymentMethod*string
How 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
source*string
Who paid you (client name, customer, etc.)
tagstring
Tag for client/project attribution
taxCollectednumber
Sales tax/GST/HST collected
add_income_from_fileImport 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, duplica...11 params

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

Parameters* required
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)one of image/jpeg · image/png · image/webp · image/heic · image/heif · application/pdf
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.
add_income_from_csvUse 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 explici...10 params

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

Parameters* required
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.
get_accounting_integration_statusRead 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...2 params

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

Parameters* required
provider*string
Accounting destination provider. QuickBooks Online, Xero, Wave, FreeAgent (beta), or Zoho Books.one of zoho_books · quickbooks · xero · wave · freeagent
reportIdstring
Optional existing ExpenseBot report ID. When supplied, setupUrl opens this exact report and highlights the selected accounting provider's setup control.
send_report_to_accountingPreview then post an owner's report to accounting. Step 1: provider/reportId, optional mode/mappings, NO confirm. Reads live report/destination, enforces Omit/Personal/split/date/currency rules and Zoho bank-feed checks; returns complete frozen proposal + proposalId, posts not...9 params

Preview then post an owner's report to accounting. Step 1: provider/reportId, optional mode/mappings, NO confirm. Reads live report/destination, enforces Omit/Personal/split/date/currency rules and Zoho bank-feed checks; returns complete frozen proposal + proposalId, posts not...

Parameters* required
accountMappingsobject
Step 1 only: ExpenseBot category to live destination account ID overrides.
confirmboolean
Step 2 only: true posts the exact staged proposal. No other options may change.
forceRepushboolean
Step 1 only: explicitly include disclosed uncertain prior outcomes in the frozen proposal.
modestring
Step 1 only (Zoho Books): automatic document treatment, paid expenses, or bills.one of auto · expense · bill
proposalIdstring
Step 2 only: proposalId returned by the read-only preview.
provider*string
Accounting destination provider. Agent-driven posting is currently available only for Zoho Books.one of zoho_books
reportIdstring
Step 1 only: ExpenseBot report ID owned by the signed-in account.
reportingTagMappingsobject
Step 1 only: ExpenseBot tag to live destination reporting-tag option.
taxMappingsobject
Step 1 only: observed tax-rate string to live destination tax ID overrides.
get_accounting_push_statusRead 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 w...2 params

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

Parameters* required
provider*string
Accounting destination provider used for the prior posting attempt.one of zoho_books · quickbooks · xero · wave · freeagent
reportId*string
Exact ExpenseBot report ID from the prior proposal or posting attempt.
list_categoriesList 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.

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.

No parameters. Call it with no arguments.

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

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

No parameters. Call it with no arguments.

create_tagCreate 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 retur...5 params

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

Parameters* required
allowSimilarboolean
Allow creation alongside similar names only when the user explicitly chooses a new distinct group.default: false
confirmboolean
Confirm only after the user approves the preview; a first confirm call remains preview-only.default: false
name*string
Name 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.default: false
get_income_summaryUse 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 yea...4 params

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

Parameters* required
dateRangevalue
One period variant matching user wording.
groupBystring
How to group the breakdownone of source · category · month · paymentMethod · tag
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')
get_pnlCompute 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-...3 params

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

Parameters* required
clientEmailstring
Accountants: accepted client email only.
dateRangevalue
One period variant matching user wording.
querystring
Natural language P&L question (e.g., 'P&L for Q1 2025', 'am I profitable')
get_per_tag_pnlPer-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...3 params

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

Parameters* required
dateRangevalue
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.
list_income_categoriesList 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.

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.

No parameters. Call it with no arguments.

get_recent_activityRead 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.3 params

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.

Parameters* required
actionIdstring
Optional: filter to a single tool/action name
limitinteger
default: 20
sinceDaysinteger
Only show actions from the last N days (default 7)default: 7
trace_documentRead a receipt/invoice/forwarded email/Gmail receipt/PDF's lineage timeline: missing, skipped, income-routed, deduped or duplicate-removed documents. Not Gmail scan-job status/progress/completion (running/queued/finished/stuck): use get_scan_status; a scan is not a document.7 params

Read a receipt/invoice/forwarded email/Gmail receipt/PDF's lineage timeline: missing, skipped, income-routed, deduped or duplicate-removed documents. Not Gmail scan-job status/progress/completion (running/queued/finished/stuck): use get_scan_status; a scan is not a document.

Parameters* required
daysinteger
How many days back to search.default: 30
limitinteger
Maximum lineage events to return.default: 80
messageIdstring
Gmail message ID if known.
outcomestring
Optional processing outcome filter.one of all · created · skipped · suggested · income_routed · dedupeddefault: all
querystring
Merchant, sender, subject, invoice number, or phrase to search for, e.g. 'Blue Rocket', 'Driversnote', 'Uber receipt'.
receiptIdstring
ExpenseBot receipt/invoice ID if known, e.g. IR-123, RO-abc, RR-456.
threadIdstring
Gmail thread ID if known.
get_mileage_summaryRecorded mileage expenses and Trip Log distances, with month/client/purpose/category breakdowns and date ranges. Expense amounts are not tax-deductibility determinations.3 params

Recorded mileage expenses and Trip Log distances, with month/client/purpose/category breakdowns and date ranges. Expense amounts are not tax-deductibility determinations.

Parameters* required
dateRangevalue
One period variant matching user wording.
groupBystring
Grouping.one of month · tag · purpose · category
querystring
Mileage query.
get_subscription_auditFind recurring subscriptions, duplicate charges, price increases and trial-conversion suspects in recorded expenses, optionally by cost (e.g. over $20/month). Returns message/data with recurring, duplicates, priceIncreases, trialConversions, totalMonthlyCost and sampleMeta.3 params

Find recurring subscriptions, duplicate charges, price increases and trial-conversion suspects in recorded expenses, optionally by cost (e.g. over $20/month). Returns message/data with recurring, duplicates, priceIncreases, trialConversions, totalMonthlyCost and sampleMeta.

Parameters* required
dateRangevalue
One period variant matching user wording.
focusstring
Narrow the audit to a single category (default: all)one of recurring · duplicates · price_increases · trial_conversions · all
querystring
Natural language subscription question (e.g., 'find duplicate subscriptions', 'price increases this year')
get_expense_by_idRead 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, labele...2 params

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

Parameters* required
expenseIdstring
Exact full ExpenseBot Receipt ID from Column Q
rowNumberinteger
1-indexed sheet row (row 1 is headers, so ≥ 2)
export_reportGet 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...1 params

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

Parameters* required
reportId*string
Report ID from list_reports
get_spreadsheet_urlReturn the master Google Sheet and authenticated workspace links, including the Year-End screen link. Show only 1–2 relevant returned links. Open/view/edit spreadsheet: Sheet. Receipt added: Review expenses + Sheet; income added: Review income + Sheet. Gmail scan/connection: S...

Return the master Google Sheet and authenticated workspace links, including the Year-End screen link. Show only 1–2 relevant returned links. Open/view/edit spreadsheet: Sheet. Receipt added: Review expenses + Sheet; income added: Review income + Sheet. Gmail scan/connection: S...

No parameters. Call it with no arguments.

check_featureCheck 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.1 params

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.

Parameters* required
feature*string
Feature or integration to check (e.g., 'Xero', 'mileage tracking', 'Plaid')
whatif_affordCan I afford $X/month? Recomputes the user's Safe Monthly Draw (how much they can safely pay themselves) with an added recurring monthly cost, and returns a yes/tight/no verdict plus the before/after numbers. Use for questions like 'can I afford a $500/mo hire' or 'what if I a...1 params

Can I afford $X/month? Recomputes the user's Safe Monthly Draw (how much they can safely pay themselves) with an added recurring monthly cost, and returns a yes/tight/no verdict plus the before/after numbers. Use for questions like 'can I afford a $500/mo hire' or 'what if I a...

Parameters* required
deltaMonthly*number
The new recurring monthly cost being considered, in the user's home currency
whatif_clientWhat if a client pays late or leaves? mode='late30' shifts that client's OPEN invoice amounts out of the near-term expectation mode='gone' removes that client's trailing monthly income contribution and recomputes Safe Draw against the reduced baseline. Use for questions like '...2 params

What if a client pays late or leaves? mode='late30' shifts that client's OPEN invoice amounts out of the near-term expectation mode='gone' removes that client's trailing monthly income contribution and recomputes Safe Draw against the reduced baseline. Use for questions like '...

Parameters* required
clientName*string
The client's name as it appears on invoices or income rows
mode*string
'late30' = shift open invoices 30 days late; 'gone' = client stops paying entirelyone of late30 · gone
whatif_tax_setasideWhat should I set aside for taxes? Returns the monthly tax set-aside estimate already computed for Safe Monthly Draw. Flat-rate estimate (default 30%) against trailing income minus recurring + variable spend. Use for 'how much should I set aside for taxes this month'.

What should I set aside for taxes? Returns the monthly tax set-aside estimate already computed for Safe Monthly Draw. Flat-rate estimate (default 30%) against trailing income minus recurring + variable spend. Use for 'how much should I set aside for taxes this month'.

No parameters. Call it with no arguments.

scan_gmail_yearsprovider:outlook returns a handoff; never starts. Scan completed Gmail periods for receipts. In eligible split-tax-year accounts, a number is the period's ending year (2025 = 2024–25 tax year); otherwise it is a calendar year. Use returned tax-period labels and inclusive ISO b...4 params

provider:outlook returns a handoff; never starts. Scan completed Gmail periods for receipts. In eligible split-tax-year accounts, a number is the period's ending year (2025 = 2024–25 tax year); otherwise it is a calendar year. Use returned tax-period labels and inclusive ISO b...

Parameters* required
accountEmailstring
Optional: which connected Gmail inbox to scan (multi-inbox users). Defaults to the primary.
confirmStartboolean
Omit or false = preview only (no scan starts). Must be exactly true to start scanning.
providerstring
Default Gmail.one of gmail · outlook
years*array
Completed periods; ending year for eligible tax-year accounts (2025 = 2024–25), calendar year otherwise. Max 10.
get_scan_statusCheck 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, comple...2 params

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

Parameters* required
jobIdstring
Optional exact Outlook historical job ID, never guessed.
providerstring
Default Gmail.one of gmail · outlook
get_statement_import_statusCheck 'Did my statement finish importing?' for at most five jobs. Returns status and authenticated review link. Extraction isn't saved; read/save jobs may overlap, so counts aren't statement totals. No job found doesn't prove no import; older non-job imports are excluded. Read...1 params

Check 'Did my statement finish importing?' for at most five jobs. Returns status and authenticated review link. Extraction isn't saved; read/save jobs may overlap, so counts aren't statement totals. No job found doesn't prove no import; older non-job imports are excluded. Read...

Parameters* required
clientEmailstring
Accountants: accepted client email only.
list_client_invoicesList 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' (de...4 params

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' (de...

Parameters* required
clientEmailstring
Accountants: accepted client email only.
clientNamestring
Optional: exact client name (case-insensitive).
limitnumber
Max invoices to return (default 25, max 100).
statusstring
Filter by invoice status (default active/outstanding).one of active · open · overdue · needs_review · paid · void
get_client_invoiceGet 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; i...3 params

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

Parameters* required
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.
prepare_client_invoicePrepare a client invoice from a saved ExpenseBot report without creating it. Reads canonical report rows, allocates a unique invoice number, verifies the client ledger identity and advance, and returns exact totals plus a short-lived preparationId. Call this first, show the pr...14 params

Prepare a client invoice from a saved ExpenseBot report without creating it. Reads canonical report rows, allocates a unique invoice number, verifies the client ledger identity and advance, and returns exact totals plus a short-lived preparationId. Call this first, show the pr...

Parameters* required
advanceAppliednumber
Verified client advance to apply against this invoice.
billToEmailstring
Optional client email printed on the invoice. This does not send email.
clientAddressstring
Optional billing address printed in the invoice's Bill To section.
clientName*string
Full client or business name shown on the invoice.
customLineItemsarray
Optional fee/service lines. They are taxed but never marked up.
invoiceNumberstring
Optional custom invoice number. ExpenseBot allocates one when omitted.
issueDate*string
Calendar-valid invoice date in YYYY-MM-DD format.
markupPctnumber
Markup applied only to rebilled expense rows.
mentionSupportingReceiptsboolean
When true, note on the invoice that supporting receipts are available.
paymentTermsstring
Invoice due terms. Defaults to the client's billing profile or net30.one of due_on_receipt · net7 · net14 · net15 · net30 · net45
receiptIdsarray
Optional exact report receipt IDs. Defaults to every current report expense.
reportId*string
Saved ExpenseBot report ID to invoice.
taxLabelstring
Tax label such as HST, GST, or VAT.
taxPctnumber
Tax percentage applied after markup and custom line items; use 0 for no tax.
create_client_invoiceCreate 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 olde...3 params

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

Parameters* required
confirmTaxboolean
True only after the user confirms the displayed tax label and rate.
operationIdstring
Optional retry key. Reuse it after an uncertain response.
preparationId*string
Short-lived ID returned by prepare_client_invoice.
mark_client_invoice_paidMark 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...4 params

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

Parameters* required
invoiceId*string
Stable invoice ID from list_client_invoices.
paidAmountnumber
Optional amount received.
paidDate*string
Calendar-valid payment date in YYYY-MM-DD format.
paidViastring
Optional payment method or source, such as bank transfer or check.
get_expense_splitsRead 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.5 params

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.

Parameters* required
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.
get_monthly_books_reviewReview 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 recor...2 params

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

Parameters* required
clientEmailstring
Accountants: accepted client email only.
periodstring
Calendar month in YYYY-MM format. Defaults to the last completed month.
list_client_close_readinessAccountant-only month-end overview of accepted client workspaces. Returns page-level readiness and affected-client category counts with an authenticated Client Reports link. Use for 'how many clients need attention before month end'. No client identities, amounts, or individua...3 params

Accountant-only month-end overview of accepted client workspaces. Returns page-level readiness and affected-client category counts with an authenticated Client Reports link. Use for 'how many clients need attention before month end'. No client identities, amounts, or individua...

Parameters* required
limitinteger
Client workspaces per page; default and maximum 5.
pageinteger
Page number; starts at 1. Use nextPage from the previous result.
periodstring
Calendar month YYYY-MM; defaults to the last completed UTC month.
get_credits_refundsList 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 mo...3 params

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

Parameters* required
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).
get_client_advance_balancesRead 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 refu...2 params

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

Parameters* required
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.
get_trip_suggestionsReview trips from the Review Expenses Find engine. Default is high-confidence only; for the trip list set includeCandidates:true (real trips first, second homes and regular spots grouped); page with offset while remaining > 0. Name a trip by destination (e.g. Copenhagen); mode...10 params

Review trips from the Review Expenses Find engine. Default is high-confidence only; for the trip list set includeCandidates:true (real trips first, second homes and regular spots grouped); page with offset while remaining > 0. Name a trip by destination (e.g. Copenhagen); mode...

Parameters* required
areastring
Country or city for mode area, e.g. "Denmark" or "Copenhagen, Denmark". Ambiguous places return candidates to ask about.
clientEmailstring
Accountants: accepted client email only.
dateRangeobject
Inclusive period to find overlapping trips; returns full trip membership, including boundary dates outside the period.
destinationstring
Trip the user named, e.g. "Copenhagen". Several matches return them for clarification; never guess.
includeCandidatesboolean
Default false: high-confidence only. True: also show uncertain candidates without saving recommendations or changing expenses.default: false
includePossibleAdditionsboolean
Default false. True only when the user explicitly asks to include the separate possible additions in the selection.
limitinteger
Result cap (default 3, max 10), not an exhaustive list; see remaining.
modestring
episode (default): trips. area: every expense located in the area.one of episode · area
offsetinteger
Skip this many results to page through remaining trips.
refreshboolean
Recheck current recorded expenses for suggested trips; never change their tags.
group_expensesGroup exact expenses for a user-named client/project/trip/job, with an optional report. Reuse existing groups; propose new only if needed. Full expenseIds from search_expenses. Preserve assignments unless explicitly replacing (replaceExistingTags:true). First call previews eve...13 params

Group exact expenses for a user-named client/project/trip/job, with an optional report. Reuse existing groups; propose new only if needed. Full expenseIds from search_expenses. Preserve assignments unless explicitly replacing (replaceExistingTags:true). First call previews eve...

Parameters* required
approveNewGroupboolean
True only when the preview says a new group is required.
confirmboolean
Omit/false for preview; true only after explicit approval.
createReportboolean
Create a report from the exact eligible grouped expenses.
excludePersonalboolean
Exclude Personal-tagged and Personal-category expenses from both grouping and the exact report.
excludedCategoriesarray
Expense categories to exclude before preview and grouping.
excludedTagsarray
Existing groups to exclude before preview and grouping.
groupobject
The user-named destination group to apply to every eligible selected expense.
operationId*string
Stable idempotency key generated once for the preview and reused unchanged.
replaceExistingTagsboolean
Default false keeps existing assignments; true only after the user explicitly asks to replace; preview shows both.
reportTitlestring
Optional title when createReport is true; otherwise ExpenseBot derives one from the group.
selectionobject
Exact expenses returned by search_expenses and approved for this bounded operation.
statusboolean
Read operation status using operationId.
undoboolean
Undo a completed grouping within its undo window.
update_expenseUpdate a single existing expense row's category, tag, merchant or business purpose (e.g. 'recategorize expense X to Meals', 'tag it Client – Acme'). Identify it only by the exact expenseId from search_expenses (the full Receipt ID from Column Q); never a date, displayed number...4 params

Update a single existing expense row's category, tag, merchant or business purpose (e.g. 'recategorize expense X to Meals', 'tag it Client – Acme'). Identify it only by the exact expenseId from search_expenses (the full Receipt ID from Column Q); never a date, displayed number...

Parameters* required
confirmboolean
Omit or false = preview only (no write). Must be exactly true to apply the change.
expectedPaidWithobject
expenseId*string
Exact full Receipt ID from Column Q, returned as expenseId by search_expenses.
fields*object
Partial update object. Include one or more of these optional keys; omit every field that should remain unchanged.
correct_expensesPreview 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...6 params

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

Parameters* required
changeobject
Exactly one correction; its type selects the required value field.
confirmboolean
Omit/false for preview; true only after explicit approval.
operationId*string
Idempotency 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.
omit_expensesOmit exact recorded expenses from reports, insights and exports, or restore them (leave out, exclude, don't count). First search_expenses for full expenseId values. A grounded preview is automatic with confirm omitted/false: show exact rows (date, merchant, amount), count and...7 params

Omit exact recorded expenses from reports, insights and exports, or restore them (leave out, exclude, don't count). First search_expenses for full expenseId values. A grounded preview is automatic with confirm omitted/false: show exact rows (date, merchant, amount), count and...

Parameters* required
actionstring
omit hides rows from reports, insights and exports; restore puts omitted rows back.one of omit · restore
confirmboolean
Omit/false previews only; true only after the user approves the preview.
expenseIdsarray
Full expenseId (Column Q Receipt ID) values from search_expenses; never dates, rows or merchants.
operationId*string
Idempotency key; generate once and reuse unchanged to confirm.
reasonstring
The user's own short reason, shown in the Omitted view. Never invent one.
statusboolean
Read status by operationId.
undoboolean
Undo within the Undo window.
searchSearch the user's ExpenseBot data — expenses, reports, and knowledge base. Returns matching items with id, title, and url. Use the returned id with the `fetch` tool to get full details. Powers Deep Research and Company Knowledge integrations. For filtered expense lists, totals...1 params

Search the user's ExpenseBot data — expenses, reports, and knowledge base. Returns matching items with id, title, and url. Use the returned id with the `fetch` tool to get full details. Powers Deep Research and Company Knowledge integrations. For filtered expense lists, totals...

Parameters* required
query*string
Natural language search (e.g., 'Uber rides in March', 'Q1 client report', 'mileage Acme')
fetchFetch 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 she...1 params

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

Parameters* required
id*string
Item 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>' (knowl...

Sponsors

Readme

ExpenseBot logo

ExpenseBot MCP

Expense management and Gmail receipt capture for AI assistants and automation platforms.

Public installation and discovery metadata for the hosted ExpenseBot Model Context Protocol server.

ExpenseBot gives AI assistants and automation platforms structured access to expense data, Gmail receipt capture, reports, income, mileage, compliance checks, and accounting handoffs. ExpenseBot remains the system that captures and organizes receipts; downstream accounting software remains the source of truth for the books.

Receipt ingestion for agent workflows

ExpenseBot can also be the receipt-intake component inside a larger AI or automation workflow. Your agent owns orchestration, business rules, review policy, and downstream systems; ExpenseBot handles supported receipt intake, extraction, duplicate detection, terminal processing status, and customer-owned evidence in Google Sheets and Drive.

A reliable integration should:


View the full README on GitHub

Details

Repository
github.com/totesmagotes/expensebot-mcp
Website
www.expensebot.ai/receipt-collection-mcp?utm_source=official_mcp_registry&utm_medium=referral&utm_campaign=mcp-builder-receipt-infrastructure&utm_content=server_listing
Categories
AI & LLM Tools, Communication & Messaging
Package
@expensebot/mcp-server-auth
Transport
STDIO, HTTP
Registry
MCP registry, active
Tools verified
Nov 6, 2026

Related AI & LLM Tools MCP servers

View all
1tradeos-ai avatarTradeOS (test)tradeos-ai/tradeos-mcp[TEST] TradeOS MCP bridge: ticker search, My Agent, chart TA, macro news. npm or HTTP.0stars
2virgen101 avatarxportalxio.github.virgen101/xportalxAI agent gateway with web fetching, data extraction, crypto pricing, and x402 payments0stars
3whichmodel avatarWhichModelwhichmodel/whichmodel-mcpCost-optimized LLM model routing recommendations for autonomous AI agents0stars
4whitemarmot avatarPostboltwhitemarmot/postbolt-mcpPublish to 13+ social media platforms from any AI agent via MCP.0stars
5xkumakichi avatarXaip Mcp Serverxkumakichi/xaip-protocolAI agents get on-chain identity, credentials, reputation, escrow, and persistent memory on XRPL.0stars
6mohganji avatarmindmap.iomohganji/mindmapio-mcpCreate mindmaps of any topic from Claude, Cursor or any AI agent. Every node can be an AI chat.0stars