MCP Server
Listed on the official MCP Registry

Run ExpenseBot from Inside ChatGPT, Claude, Cursor, or Any AI Assistant

Submit receipts, scan Gmail, build tax reports — all from inside the AI assistant you already use. ChatGPT and Claude.ai connect with one click. Desktop clients take 3 minutes.

WORKS WITH:ChatGPTClaude.aiClaude DesktopCursorClaude CodeContinue / Cline / Windsurf
Open in ChatGPT →Connect to Claude.ai →Get token for desktop →

60-day free trial · No credit card · ChatGPT & Claude.ai users skip the token entirely

See it in action — receipt to spreadsheet, P&L summary, and accountant email, all in chat.

What people use it for

Mobile snapper

"Find my receipt photos from this week and submit them"

→ Photos parsed, categorized, in your spreadsheet

Inbox forwarder

"Scan my Gmail for any receipts I missed last month"

→ Hidden receipts found and added automatically

Quarterly closer

"Show me my profit by client this year"

→ Per-client revenue, costs, and profit table

Tax-time

"Generate a Schedule C report for 2025 and email it to my accountant"

→ Report built, accountant emailed, link delivered in chat

What is the ExpenseBot MCP server?

MCP — the Model Context Protocol — is an open standard that lets AI assistants plug into outside tools and data using one consistent interface. Instead of every product building a one-off Claude plugin or ChatGPT plugin, the product publishes an MCP server and any MCP-compatible client speaks to it. Anthropic introduced the protocol in late 2024; it now ships natively in Claude Desktop, Cursor, Continue, and a growing list of clients.

ExpenseBot publishes two MCP servers on npm. The first, @expensebot/mcp-server, is read-only and unauthenticated — it exposes the public knowledge base and feature documentation so an AI assistant can answer "what is ExpenseBot?" or "does it work with Sage 50 Canada?" without any login. Useful for evaluation and for AI agents that want to cite our capabilities. The second, @expensebot/mcp-server-auth, is the full account-scoped version: 44 tools across search, capture, Gmail scan, reports, analytics, and document tracing, all gated behind a personal access token you generate in Settings. This is the one most users want — it talks to your actual receipts, your actual Google Sheet, and your actual spending history. ChatGPT and Claude.ai users connect to the remote server at mcp.expensebot.ai, which advertises 43 submitted tools after commerce-tool exclusions plus the search/fetch shims. Both delivery methods are listed on the official MCP Registry.

What can my AI assistant do?

Once connected, you can ask in plain English. Some example prompts that all work today:

  • "Find every Uber receipt I expensed last quarter."
  • "Submit this receipt to ExpenseBot." (drag a photo into ChatGPT or Claude)
  • "Scan my Gmail for new receipts from the last 30 days."
  • "What were my top 5 software vendors in Q1?"
  • "Generate a Schedule C report for 2025 and share it with my accountant."
  • "I paid $80 cash for parking at the airport — log it."
  • "Show me my profit and loss for 2026 year to date."

Behind the scenes, those prompts route to one of 44 authenticated tools in the stdio package, or 43 submitted tools in the remote connector after commerce-tool exclusions plus search/fetch. You don't call these by name; your AI assistant picks the right one based on what you ask.

Full tool reference — 41 tools across 8 categories ▸
Search & analytics
  • get_deep_analyticsreads
    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.
  • get_spending_summaryreads
    Unified analytics endpoint — handles expenses, income, P&L, per-tag P&L (per-client / per-property / per-event), Schedule B drill-in (interest, dividends, tax refunds, security deposits), mileage, and subscription audits in ONE tool. Examples: 'how much did I spend last month', 'income YTD', 'rental income by property', 'P&L for Q1', 'profit by client', 'mileage this year', 'recurring subscriptions', 'price increases', 'duplicate subscriptions', 'trial conversions'. Supports period comparison phrasing — 'this year vs last' (YoY), 'vs last month' (MoM), 'Q1 vs Q2' (QoQ), same-month-prev-year. Margin renders as multiplier ('expenses 5.4× revenue') when in loss territory. Returns: { message, data: { total, breakdown?, comparison?, sampleMeta? } }.
  • list_categoriesreads
    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.
  • list_income_categoriesreads
    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.
  • list_tagsreads
    List the user's configured tags. Tags are used for client/project attribution (e.g., 'Client: Acme', 'Q1 Trip', 'Property: 123 Main'). Use this BEFORE calling tools that filter or assign tags so you pass valid tag names, not guesses.
  • search_expensesreads
    Search and filter the user's expenses. Returns matching expense rows from their spreadsheet. Filter by category, merchant, date range, amount, or tags.
  • search_knowledgereads
    Search the ExpenseBot knowledge base for help articles and how-to guides. Use when the user asks about ExpenseBot features.
Income, P&L & books
  • get_income_summaryreads
    Get income totals, breakdowns, and analytics from the Income tab. Covers Schedule C / T2125 income, Schedule B drill-in (interest, dividends, tax refunds, security deposits), rental income, and per-source / per-payment-method / per-category / per-month / per-tag breakdowns. Schedule-C-style category exclusions match year-end T6 routing (security deposits, refunds excluded from taxable totals). Examples: 'income YTD', 'income by source', 'rental income by property', 'interest income this year', 'dividends YTD', 'tax refunds 2024', 'income this year vs last' (YoY). Supports period comparison phrasing — YoY ('vs last year'), MoM ('vs last month'), QoQ ('Q1 vs Q2'), same-month-prev-year. Returns: { message, data: { total, breakdown?, comparison?, sampleMeta? } }.
  • get_mileage_summaryreads
    Mileage analytics — totals, breakdowns by month / client / purpose / category, plus deduction framing (cents-per-mile or cents-per-km × distance, country-aware IRS / CRA rates). Examples: 'mileage this year', 'miles driven for Acme', 'mileage by month', 'mileage deduction estimate', 'business miles last quarter'. Supports YoY / MoM / QoQ comparison phrasing. Returns: { message, data: { totalDistance, deductionEstimate?, breakdown?, comparison?, sampleMeta? } }.
  • get_monthly_books_reviewreads
    Get the user's Monthly Books Review: recorded income, spending, net, top categories and merchants, plus deterministic cash-pulse alerts for one calendar month. Defaults to the last completed month. Advisory fields are estimates and retain ExpenseBot's tax-professional disclaimer.
  • get_per_tag_pnlreads
    Per-tag P&L — revenue, cost, profit, and margin grouped by tag (per-client, per-property, per-event, per-realtor-deal). Requires both income AND expense rows to be tagged with matching labels. Common tag-prefix shortcuts: 'Prop –' (rentals), 'Client –' (client billings), 'Wedding –' (events), 'Realtor –' (real estate deals). Examples: 'per-tag P&L this year', 'profit by client', 'profit by property', 'profit on the Smith wedding', 'per-client P&L this year vs last' (YoY). Supports YoY / MoM / QoQ comparison phrasing. Margin renders as multiplier in loss territory. Defaults to year-to-date if no date range given.
  • get_pnlreads
    Compute Profit & Loss (P&L / net income / margin) by combining the Income tab with expense tabs. Examples: 'am I profitable this year', 'P&L for Q1', 'net income last quarter', 'what's my margin', 'P&L this year vs last' (YoY). Supports period comparison — YoY, MoM, QoQ, same-month-prev-year. Margin renders as multiplier in loss territory ('expenses 5.4× revenue') so the user gets a readable signal instead of '-436.9% margin'. Returns: { message, data: { revenue, expenses, netIncome, margin, comparison?, sampleMeta? } }.
  • get_subscription_auditreads
    Subscription audit — wraps the Subscription Auditor engine to find recurring charges, duplicates, price increases, and trial-conversion suspects in the user's expenses. Examples: 'recurring subscriptions', 'duplicate subscriptions', 'price increases', 'trial conversions', 'subscriptions over $20/month'. Returns: { message, data: { recurring, duplicates, priceIncreases, trialConversions, totalMonthlyCost, sampleMeta? } }.
Capture & edit
  • add_cash_expensewrites
    Add an expense without a receipt (cash purchase, tip, etc.). Writes directly to the user's expense spreadsheet. Call list_categories first and choose one of the user's configured Expense Accounts. A unique account-label alias may be canonicalized, but unknown or ambiguous categories are rejected.
  • add_incomewrites
    Log an income entry manually (cash, check, Stripe payout, etc.). Writes to the Income tab of the user's expense spreadsheet. Useful for income that isn't auto-detected from Gmail or Plaid. Call list_income_categories first and use one of its fixed tax categories; an omitted category defaults to Service income and an unknown category is rejected.
  • add_mileage_entrywrites
    Log a business mileage trip in ExpenseBot. Useful for realtors, consultants, contractors, and anyone who drives for work. Requires the user to have configured their mileage rate (cents/km or cents/mi) and unit (mi/km) in ExpenseBot Settings. The trip writes a row to their expense spreadsheet with the calculated dollar value.
  • get_expense_by_idreads
    Fetch a single expense row by its sheet row number or by its ExpenseBot expenseId (the value in column J). Returns the row's headers + values + a labeled {header → value} map so you can refer to a specific expense the user mentioned. Read-only.
  • parse_expensereads
    Parse a natural language expense description into structured fields. Does NOT add the expense — just returns the parsed fields for review. Example: "Lunch at Chipotle $15.50 today" → {merchant: "Chipotle", total: 15.50, ...}
  • submit_receiptwrites
    Submit a photo or PDF of a receipt for processing. The receipt image is sent as base64, validated, uploaded to cloud storage, and processed by AI to extract vendor, amount, date, tax, and category. The expense appears in the user's spreadsheet within 30 seconds.
  • update_expensewrites
    Update a single existing expense row's category, tag, merchant, or business purpose (e.g. 'recategorize expense X to Meals' or 'tag it Client – Acme'). Identify the row by expenseId (Col J) or rowNumber. ALWAYS call first WITHOUT confirm to preview the current→proposed change, then ask the user to confirm, then call again with confirm:true. Only category/tag/merchant/businessPurpose are editable — amounts, dates, and notes are not editable via the assistant. Does not create or delete rows.
Gmail
  • get_scan_statusreads
    Check the status of the user's Gmail receipt scans: whether a scan is running right now, which years are queued for scanning, and recent scan history (per inbox, with date range and counts). Call this when the user asks how their scan is going or whether a year has finished. Read-only.
  • process_gmail_receiptswrites
    Process 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 in ExpenseBot settings.
  • scan_gmailwrites
    Trigger 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 Gmail" in the UI. For whole PAST YEARS (e.g. 2023, or 2020-2022) use scan_gmail_years instead; to check a scan's progress use get_scan_status.
  • scan_gmail_yearswrites
    Scan one or more COMPLETED PRIOR years of the user's Gmail for receipts (e.g. years:[2023] or years:[2020,2021,2022]). Long-running background job: the first eligible year starts immediately and the rest queue, running one at a time (each full year typically takes a couple of hours; the user can close the app). ALWAYS call first WITHOUT confirmStart to preview which years are eligible, then ask the user to confirm, then call again with confirmStart:true. For receipts from the last ~60 days use scan_gmail instead. To check how a scan is going, use get_scan_status. The current in-progress year cannot be year-scanned.
Reports & receivables
  • create_reportwrites
    Create an expense report from filtered expenses. Returns the report ID and summary. Can optionally share with recipients.
  • export_reportreads
    Get download URLs for an expense report. Returns the Google Sheets view URL plus direct PDF / CSV / XLSX export URLs. The user needs to be signed into the Google account that owns the report to download (no separate auth from the AI client). Use list_reports first to find the reportId.
  • get_credits_refundsreads
    List recently reviewed card refunds, rewards, and statement credits that are already recorded as negative expenses or matched to an existing offset. Read-only: it never scans cards, changes review decisions, or adds rows.
  • get_expense_splitsreads
    Show how an expense is split or allocated across categories, clients, properties, or business and personal portions. Returns one parent payment with nested allocation lines; it never treats split lines as separate expenses. Read-only — edit splits in ExpenseBot's Review workspace.
  • get_report_detailsreads
    Get full details of a specific expense report including all expenses, totals, and compliance status.
  • list_client_invoicesreads
    List the user's issued client invoices (accounts receivable) — open or paid, with totals and due dates. Use when the user asks what clients owe them, which invoices are outstanding or overdue, or before running whatif_client on a client. Read-only.
  • list_reportsreads
    List the user's expense reports with pagination. Filter by status (All, Draft, Submitted, Shared).
  • share_reportwrites
    Share an expense report with one or more email addresses for review or approval.
Compliance & tax
  • check_compliancereads
    Check an expense report for compliance issues (missing business purpose, policy violations, etc.).
  • check_tax_deductibilityreads
    Look up whether a specific expense type or purchase is tax-DEDUCTIBLE (business write-off rules) based on the user's country/jurisdiction. This is a deductibility *advice* tool — use it for questions like 'is Uber deductible', 'can I write off home office', 'are client dinners 50% or 100%'. Do NOT use it for questions about tax REFUNDS received as income (use get_spending_summary with a 'tax refunds' query for those — they're routed to the Income tab, not deduction rules).
  • fix_compliancewrites
    Bulk-fix compliance issues in a report (e.g., apply the same business purpose to all flagged expenses).
Cash-flow what-if
  • whatif_affordreads
    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 add a $200/mo software subscription'. Requires at least 3 months of income history — otherwise returns insufficient_data rather than a guess.
  • whatif_clientreads
    What if a client pays late or leaves? mode='late30' shifts that client's OPEN invoice amounts out of the near-term expectation (they still owe it, it's just not landing this month). mode='gone' removes that client's trailing monthly income contribution and recomputes Safe Draw against the reduced baseline. Use for questions like 'what if Acme Corp pays 30 days late' or 'what happens if I lose my biggest client'. Client identity is matched against the Income tab's tag/source/description fields — best effort, not a guaranteed match.
  • whatif_tax_setasidereads
    What should I set aside for taxes? Surfaces the same monthly tax set-aside estimate already computed for Safe Monthly Draw — wiring, not new math. Flat-rate estimate (default 30%) against trailing income minus recurring + variable spend. Use for 'how much should I set aside for taxes this month'.
Account & utility
  • check_featurereads
    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.
  • get_recent_activityreads
    Show what the user (or their AI assistants) has recently done in ExpenseBot via this MCP server: which tools were called, when, with what arguments, and whether they succeeded. Useful for ambient questions like 'what did I do this week', 'did my last receipt submission work', or to give the user transparency into AI-assisted actions. Returns the most recent N entries from the audit log (default 20, max 100).
  • trace_documentreads
    Trace 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 to income, deduped, or removed as a duplicate. Returns a read-only timeline from the user's lineage audit trail.
ChatGPT Deep Research shims
search, fetch

Remote connector only (mcp.expensebot.ai). Not counted in the 41 above.

You don't call these tools by name — Claude picks the right one based on what you ask. The list is here so you know what's possible. Power users link the MCP from their freelancer workflow so their AI assistant becomes the front-end for bookkeeping.

Connect ExpenseBot to ChatGPT

ChatGPT users connect via Developer Mode — OpenAI's standard pre-verified flow. The one-time informational warning disappears once the verified-connector approval lands (review currently pending).

  1. Open ChatGPT → Settings → Apps & Connectors → Developer Mode
  2. Click Add custom app and paste the server URL:
    https://mcp.expensebot.ai/mcp
  3. Click Connect → Google login → Allow
  4. 43 submitted tools appear in your ChatGPT tool list. Try: "Find my receipt photos from last week and submit them to ExpenseBot"

Connect ExpenseBot to Claude.ai

Claude.ai Pro users connect via the Connectors panel — no config files, no npm. Dynamic Client Registration (DCR) means you leave the OAuth fields blank; Claude handles the handshake automatically.

  1. Open Claude.ai → Settings → Connectors → Add custom connector
  2. Server URL:
    https://mcp.expensebot.ai/mcp
    Leave all OAuth fields blank (DCR handles registration automatically).
  3. Click AddConnect → consent screen → Allow
  4. Try it: attach a receipt photo and type "Submit this Uber receipt to ExpenseBot"

Already using a desktop AI client? Use the npm package below — 44 authenticated tools plus CLI-friendly token rotation.

How to connect it (3 minutes) — Claude Desktop

  1. Generate a token. In ExpenseBot, go to Settings → AI Assistant Tokens → Generate. Copy the token — it's shown once. Tokens are scoped to your account and can be revoked any time.
  2. Add to Claude Desktop config. Open the config file in any text editor:
    • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows: %APPDATA%\Claude\claude_desktop_config.json

    Paste this block (replace the token):

    {
      "mcpServers": {
        "expensebot": {
          "command": "npx",
          "args": ["-y", "@expensebot/mcp-server-auth"],
          "env": {
            "EXPENSEBOT_TOKEN": "your-personal-access-token-here"
          }
        }
      }
    }

    Just want the read-only docs server? No token needed:

    {
      "mcpServers": {
        "expensebot-docs": {
          "command": "npx",
          "args": ["-y", "@expensebot/mcp-server"]
        }
      }
    }
  3. Restart Claude Desktop and test. Fully quit and reopen Claude. Try "show me my top 5 software vendors last quarter". Claude will ask permission to run the get_spending_summary tool — approve once, and the integration is live.

Other MCP clients

The same npm package works with every MCP-compatible client — only the config location changes.

Claude Code (CLI)

One command — no JSON editing:

claude mcp add expensebot -- npx -y @expensebot/mcp-server-auth --token=YOUR_TOKEN_HERE

Add --scope user to make it available across every Claude Code project.

Cursor

Edit ~/.cursor/mcp.json:

{
  "mcpServers": {
    "expensebot": {
      "command": "npx",
      "args": ["-y", "@expensebot/mcp-server-auth", "--token=YOUR_TOKEN_HERE"]
    }
  }
}

In Cursor: Settings → Tools & Integrations → look for the green dot next to expensebot. In chat, switch to Agent mode and prompt as usual.

Continue, Cline, Windsurf, custom MCP clients

Same npx -y @expensebot/mcp-server-auth --token=... command — drop it into your client's MCP config block.

ChatGPT and Claude.ai web use the remote server at mcp.expensebot.ai — see setup instructions above ( ChatGPT, Claude.ai ).

Security & trust

🔐
OAuth 2.1 + PKCE + DCR
No token copy/paste for ChatGPT or Claude.ai
🎛️
6 fine-grained scopes
Choose exactly what to share
🚫
Revoke anytime
Settings → AI Assistant Tokens
📋
All actions audit-logged
Full history in your account
🏅
CASA Tier 2 certified
Google's highest security standard
🔒
SHA-256 hashed tokens
Max 5 per account, staff can't read them

Why use AI Assistant access?

  • Faster than the dashboard for ad-hoc questions. "What did I spend at Costco last month?" is one sentence in Claude versus four clicks in the UI.
  • No app switching. If you live in Claude or Cursor for writing and code, your expense answers come to you.
  • Conversational receipt submission. Drag a photo into chat, say what it was for, and it lands as a row in your sheet — categorized, with vendor and total extracted.
  • Complex analytics in natural language. get_deep_analytics surfaces top vendors, anomalies, month-over-month deltas and unusual spend without you writing a single SQL query or pivot table.
  • Cash entry by description. "$80 cash for airport parking yesterday" becomes a properly tagged cash expense with date, amount, category, and notes.

Security & token model

Personal access tokens (PATs) are the one credential the MCP server cares about. Each token is scoped to your account only — it can't read another user's data, even if leaked. Tokens have a configurable expiry you choose at issue time, and you can revoke any token from Settings → AI Assistant Tokens with immediate effect (the next request fails 401). Token issuance, use, and revocation are audit-logged in Firestore against your account so you can review what was used when. Tokens themselves are stored hashed (SHA-256) — even ExpenseBot staff can't read the original string out of the database.

Your underlying expense data never moves. Receipts stay in your Google Drive, your sheet stays in your Drive, and each MCP tool call reads or writes those files using your existing OAuth grants. The only data that flows through your AI provider is the specific tool result your assistant asked for — same trust model as any LLM tool-use call. If you're inviting an accountant later, the share happens through Google Drive sharing, not through the MCP token.

Compatible AI assistants

MCP support is growing quickly. Today the ExpenseBot MCP works out of the box with:

  • ChatGPT — Plus/Pro plans. Connect via Developer Mode in Apps & Connectors. (setup ↑)
  • Claude.ai — Pro plan. Connect via Settings → Connectors. (setup ↑)
  • Claude Desktop — Mac, Windows, Linux. Native MCP support via npm package. (setup ↑)
  • Cursor IDE — Mac, Windows, Linux. Add via Settings → Tools & Integrations. (setup ↑)
  • Claude Code (CLI) — one command. (setup ↑)
  • Continue, Cline, Windsurf — same npm package, different config path. (setup ↑)
  • Custom agents built on the Anthropic, OpenAI, or open-source MCP SDKs.

If your client follows the MCP wire format (JSON-RPC over stdio), ExpenseBot works. The official and constantly-updated client list lives at modelcontextprotocol.io/clients.

Why this matters

Most expense apps see receipts. The ExpenseBot MCP lets your AI act on them — search, submit, scan Gmail, generate a tax report, share it with your accountant — using your actual Google Sheet as the source of truth. There's no separate mirror database to drift, no proprietary ledger to escape from, no "export to CSV" step. Your AI assistant reads the same sheet you read, writes the same rows you'd write, and triggers the same Gmail scanner you'd trigger from the dashboard.

That's the Gmail-Sheets-native angle. ExpenseBot was built from day one around the data your life already runs on — receipts in Gmail, ledger in Google Sheets, files in Drive — instead of on a closed app database. The MCP server inherits that. When you ask Claude to scan Gmail for new receipts, it triggers the same scanner that runs nightly. When it submits a receipt, the row lands in the sheet you already own. We're listed on the official MCP Registry at io.github.TotesMagotes/mcp-server-auth so registry-aware clients can find us automatically.

See pricing plans for full feature breakdown. The MCP servers are public on npm; account-scoped tools require an active ExpenseBot account.

New to the AI-first workflow? The tutorial walkthrough Manage Expenses from Inside ChatGPT or Claude shows real prompts, the 5-minute connector setup for ChatGPT and 3-minute setup for Claude.ai, the 5 workflows that replace separate apps, and the OAuth security model.

Coming from ChatGPT rather than a developer client? The ChatGPT expense tracker page covers the one-click app-directory connect — no server URL, no token — and what the 43 connector tools do in a conversation.

Frequently asked questions

What is MCP (Model Context Protocol)?

Model Context Protocol (MCP) is an open standard introduced by Anthropic that lets AI assistants connect to external tools and data sources through a uniform interface. Instead of every app building a one-off ChatGPT plugin or Claude integration, an app publishes one MCP server and any MCP-compatible client (Claude Desktop, Cursor, Continue, custom agents) can talk to it. Think of it as USB-C for AI — one cable, many devices. ExpenseBot publishes two MCP servers on npm so your AI assistant can search your receipts, submit new ones, and analyze your spending using the same data you see in your dashboard. Learn more at modelcontextprotocol.io.

Do I need to be a developer to use the ExpenseBot MCP?

Not really. If you can edit a JSON config file in a text editor, you can set it up — the entire flow is: (1) generate a token in ExpenseBot Settings, (2) paste a 9-line block into Claude Desktop's config file, (3) restart Claude. No npm, no terminal commands, no coding. Claude Desktop downloads the MCP server automatically the first time it runs via npx. The harder part is knowing what to ask Claude once it's connected — and we cover that with example prompts on this page. If you do hit trouble, support@expensebot.ai will walk you through it.

What's the difference between the two ExpenseBot MCP servers?

@expensebot/mcp-server is read-only and unauthenticated — it exposes the public ExpenseBot knowledge base and documentation so an AI assistant can answer questions about features, pricing, and tax-form mapping without any login. Useful for prospects evaluating the product or for AI agents that need to cite ExpenseBot capabilities. @expensebot/mcp-server-auth is the full version: 44 tools across search, capture, Gmail scan, reports, analytics, and document tracing, all scoped to your personal account via a personal access token. This is what most users want — it's the one that searches your actual receipts and submits new ones. ChatGPT and Claude.ai users connect to the remote server at mcp.expensebot.ai, which advertises 43 submitted tools after commerce-tool exclusions plus the search/fetch shims.

Does the MCP server work with ChatGPT?

Yes — ExpenseBot is listed in the ChatGPT app directory (approved July 2026): search for ExpenseBot in ChatGPT and click Try in chat. Native MCP support shipped in ChatGPT for paid plans in 2025, and OpenAI's Agents SDK supports MCP servers as well. You can also use the ExpenseBot MCP from any custom agent built on the Anthropic, OpenAI, or other LLM SDKs — the protocol is open. The most polished out-of-the-box experience today is Claude Desktop, where MCP shipped first and configuration is a single JSON file. Cursor IDE has built-in MCP support too. For other clients, see the up-to-date list at modelcontextprotocol.io/clients.

Is my expense data sent to Anthropic / OpenAI when I use the MCP?

Only the parts your AI assistant explicitly reads. When you ask Claude 'how much did I spend on software last quarter,' Claude calls the ExpenseBot MCP server's get_spending_summary tool, the server fetches that summary from your Google Sheet, and the result text becomes part of the conversation Claude sees — and is therefore sent to Anthropic as context like any other Claude message. ExpenseBot doesn't send data to Anthropic itself. Your full ledger never leaves your Google Drive; only the specific tool results requested in each conversation flow through the AI provider. This is the same trust model as any LLM tool-use call.

How do I revoke access if my token leaks?

Open ExpenseBot → Settings → AI Assistant Tokens, find the token row, and click Revoke. The token is invalidated immediately on the server side; the next MCP request from any client using it will fail with 401 Unauthorized. Generate a new token, paste it into your Claude Desktop config, restart Claude, and you're back. All token issuance, use, and revocation events are audit-logged in Firestore against your account. Tokens themselves are stored hashed (SHA-256) — even ExpenseBot staff can't read them out of the database.

Can I use the MCP server with my own AI agent / custom client?

Yes. Both servers follow the standard MCP wire format (JSON-RPC over stdio), so any MCP client library works — Anthropic's TypeScript / Python SDKs, the official MCP SDKs at github.com/modelcontextprotocol, or your own implementation. Run @expensebot/mcp-server-auth as a subprocess and pass EXPENSEBOT_TOKEN in the environment. The server advertises its 44 tools via the standard tools/list response so your agent can discover them at runtime. We're also listed on the official MCP Registry at io.github.TotesMagotes/mcp-server-auth so registry-aware clients can find us automatically.

Does this work on Windows or only Mac?

Both, plus Linux. The MCP servers ship as Node.js packages on npm and run anywhere Node 18+ runs. Claude Desktop has native installers for Mac and Windows; the config file lives at ~/Library/Application Support/Claude/claude_desktop_config.json on Mac and %APPDATA%\Claude\claude_desktop_config.json on Windows. Cursor IDE's MCP config works identically across all three operating systems. The only platform-specific step is finding the right config path — once it's edited, the integration behaves the same everywhere.

Do I need ChatGPT Plus or Claude Pro to use this?

Yes. ChatGPT requires a paid plan (Plus or Pro) to use custom connectors in Developer Mode. Claude.ai requires a Pro subscription to use the Connectors feature. ExpenseBot itself stays free for the 60-day trial regardless of which client you connect from.

What's the difference between Developer Mode and the official connector directory?

Identical functionality — the same submitted remote tool surface, the same OAuth flow, the same data access. Developer Mode is OpenAI's and Anthropic's standard pre-verified flow: you paste the server URL and connect immediately. Directory listing adds discoverability — and ExpenseBot is now LIVE in the ChatGPT app directory: search for ExpenseBot in ChatGPT (or open chatgpt.com/plugins/plugin_asdk_app_69fca56e8244819185cb4a9c2462def9) and click Try in chat — no URL pasting needed. Claude.ai directory verification is still in review; connect there via the server URL.

Will my existing Claude Desktop or Cursor setup keep working?

Yes, unchanged. The stdio npm package (@expensebot/mcp-server-auth) is not affected by the remote server launch. Both delivery methods expose the same ExpenseBot tools — the remote server adds ChatGPT and Claude.ai web support on top of what the npm package already does. No migration required.

What data does ChatGPT or Claude.ai see?

Only what you explicitly authorize on the consent screen. ExpenseBot uses six fine-grained OAuth scopes: expenses.read, expenses.write, gmail.scan, reports.read, reports.write, and compliance. Deny any scope at sign-in and the corresponding tools simply don't appear in the AI's tool list. Your full spreadsheet never leaves Google Drive — each tool call fetches only the specific result requested, exactly like any other LLM tool-use call.

Ready to connect ExpenseBot to your AI assistant?

Pick the path that matches your AI client. ChatGPT and Claude.ai are one-click connector adds; desktop clients use a token.

Open in ChatGPT →Connect to Claude.ai →Sign in for desktop token →

60-day free trial · No credit card · Cancel any time

ExpenseBot