ExpenseBot
by @TotesMagotes · io.github.TotesMagotes/mcp-server-auth
Receipt ingestion, Gmail capture, expense analysis, and reviewed reports for AI-agent workflows.
- Category
- Messaging and email
- Connection
- Remote (HTTP)
- Tools
- 60 reported
- Status
- Online
Connect it to your AI
Claude Code
claude mcp add --transport http mcp-server-auth https://mcp.expensebot.ai/mcpClaude, ChatGPT, Cursor and other apps
Add it as a custom connector with this URL (Streamable HTTP):
https://mcp.expensebot.ai/mcpOr run it locally (npm)
claude mcp add mcp-server-auth -- npx -y @expensebot/mcp-server-auth@0.6.26Cursor, VS Code and other apps (mcp.json)
{
"mcpServers": {
"mcp-server-auth": {
"url": "https://mcp.expensebot.ai/mcp"
}
}
}Tools it offers
60 tools, as the server itself reported during our check on Oct 31, 2026.
search_expensesSearch and filter the user's expenses; returns matching rows from their spreadsheet. Filter by category, merchant, date range, amount or tags. Results are paginated: when hasMore is true, call again with nextCursor and tget_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. Rget_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). Retucreate_reportCreate an expense report from a clear date, client, project, trip, category or merchant request. Tags are ExpenseBot's grouping layer for clients, projects, project codes and trips; call list_tags when the intended grouplist_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 trequest_accounting_integrationRequest support for an accounting package only after checking ExpenseBot's reviewed direct and import-file destinations and finding no matching package. Do not use this for a listed or Beta destination, a general compatiget_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 thshare_reportShare one existing expense report after confirmation. 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 accheck_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 billingfix_complianceSafely correct compliance issues on an exact bounded set of recorded expenses. Use only after the user explicitly asks to fix issues found by check_compliance. Use search_expenses to get each full expenseId and pass thoscheck_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 vsearch_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 troublessubmit_receiptSubmit a photo or PDF of a receipt for processing. Covers 'log this', 'save this receipt', 'expense this', 'add this to my expenses', including when the user simply shares a photo of a receipt or invoice. The file is valget_last_receipt_resultCheck the authoritative final outcome of a receipt image/PDF batch submitted with submit_receipt. After submit_receipt returns submissionId, call this tool with that exact ID, using the polling interval and time allowancadd_cash_expenseAdd an expense without a receipt, or record money a client provided in advance. Writes directly to the user's expense spreadsheet after confirmation. For an ordinary expense, call list_categories first and provide a confparse_expenseParse a natural language expense description into structured fields. Does NOT add the expense — just returns the parsed fields for review. Example: "Lunch at Chipotle $15.50 today" → {merchant: "Chipotle", total: 15.50,process_gmail_receiptsProcess specific Gmail emails as receipts. Pass Gmail message IDs and they'll be converted to PDF, extracted by AI, and added to the user's expense spreadsheet. Max 25 emails per request. Requires Gmail to be connected iscan_gmailTrigger a background Gmail scan to discover and process receipt emails from the last ~60 days (default). Runs asynchronously — returns immediately, user gets an email summary when done. Like clicking "Find Receipts in Gmadd_mileage_entryLog a business mileage trip in ExpenseBot. Useful for realtors, consultants, contractors, and anyone who drives for work. Requires the user to have configured their mileage rate (cents/km or cents/mi) and unit (mi/km) inadd_incomeLog exactly one user-confirmed income payment manually (cash, check, Stripe payout, etc.). Never loop this tool over a statement, export, table, or multi-row list. For two or more payments, use add_income_from_csv for CSadd_income_from_fileImport income from an attached screenshot, image (JPEG, PNG, WebP, HEIC/HEIF) or PDF (payment screenshots, wallet apps, payout or bank statements; max 10 MB). Two steps. STEP 1: call with the file and WITHOUT confirm. Exadd_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 toget_accounting_integration_statusCheck whether an accounting destination is connected and read-only setup state for the owner. Returns the selected organization/company/business, stored connection state, rollout state, and the single setup link for connsend_report_to_accountingReview and then post an ExpenseBot report to the owner's accounting destination. STEP 1: call with provider, reportId and optional mode/mappings, without confirm. The server reads the live report and destination, appliesget_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, polist_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, nolist_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 'whatcreate_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 duplicatget_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 cget_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'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. Common tag-prefix shortcutslist_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.get_recent_activityShow what the user (or their AI assistants) has recently done in ExpenseBot via this MCP server: which tools were called, when, with what arguments, and whether they succeeded. This is a log of assistant TOOL CALLS, nottrace_documentTrace what happened to a specific receipt, invoice, forwarded email, Gmail receipt, or PDF in ExpenseBot processing. Use when the user asks where a document went, why it did not show up, whether it was skipped, routed toget_mileage_summaryMileage analytics — totals, breakdowns by month / client / purpose / category, plus deduction framing (cents-per-mile or cents-per-km × distance, country-aware IRS / CRA rates). Examples: 'mileage this year', 'miles drivget_subscription_auditSubscription audit — wraps the Subscription Auditor engine to find recurring charges, duplicates, price increases, and trial-conversion suspects in the user's expenses. Examples: 'recurring subscriptions', 'duplicate subget_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 identifiexport_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 otget_spreadsheet_urlReturn the user's master ExpenseBot Google Sheet plus authenticated workspace links, each with a label and when-to-use description. Use when the user asks to open, view or edit their spreadsheet; review expenses or incomcheck_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
Questions
What is the ExpenseBot MCP server?
Receipt ingestion, Gmail capture, expense analysis, and reviewed reports for AI-agent workflows. It is made by @TotesMagotes and listed in the official MCP Registry as io.github.TotesMagotes/mcp-server-auth. MCP (Model Context Protocol) is the open standard that lets AI apps like Claude, ChatGPT and Cursor use outside tools.
How do I add ExpenseBot to Claude?
In the Claude app or claude.ai, open Settings, then Connectors, choose "Add custom connector" and paste https://mcp.expensebot.ai/mcp. In Claude Code, run: claude mcp add --transport http mcp-server-auth https://mcp.expensebot.ai/mcp
How do I add ExpenseBot to ChatGPT?
ChatGPT can use remote MCP servers as connectors. In ChatGPT settings, under Apps and Connectors, turn on developer mode if asked, create a new connector and paste https://mcp.expensebot.ai/mcp.
How do I add ExpenseBot to Cursor?
Open Cursor settings, go to MCP, choose "Add new MCP server" (or edit ~/.cursor/mcp.json) and add: { "mcpServers": { "mcp-server-auth": { "url": "https://mcp.expensebot.ai/mcp" } } }
Does ExpenseBot work right now?
Yes. It responded when we last checked on 31 Oct 2026. We check remote MCP servers every day.
What can ExpenseBot do?
It gives your AI 60 tools, including search_expenses, get_spending_summary, get_deep_analytics, create_report, list_reports. The full list is on this page.
Is this your server? Get the badge for your README
Markdown (GitHub README)
[](https://chen.media/mcp/github-totesmagotes-mcp-server-auth)HTML (switches to dark mode on its own)
<a href="https://chen.media/mcp/github-totesmagotes-mcp-server-auth"><picture><source media="(prefers-color-scheme: dark)" srcset="https://chen.media/mcp/badge/github-totesmagotes-mcp-server-auth.svg?theme=dark"><img src="https://chen.media/mcp/badge/github-totesmagotes-mcp-server-auth.svg" alt="Listed on chen.media/mcp" height="40"></picture></a>More in Messaging and email
See allPickly
usepickly.comMake group polls from a chat and check who's winning. Voters need no account.
VerifyPulse: email deliverability checks
@MohDev212Daily SPF, DKIM, DMARC and MX monitoring with webhook alerts, plus free sending-domain audits.
Portaur
portaur.comAsk Portaur about its services and leave a message or callback request for the team.
Odile answering lines
odilelabs.comA phone line for your app or business that answers calls, takes messages and bookings.
disdex: Discord server search
disdex.ioFind public Discord servers by topic, language and size, check invite links, see member growth.
Inkbind
onmax.meTurn a story, memoir or recipes from the chat into a printed hardcover or softcover book.