Menu

AI

Expense Categorization with MCP: A Step-by-Step Playbook

Categorize business expenses with an AI assistant over MCP: LedgerMCP, QuickBooks, Xero, Ramp and Expensify tools, a weekly workflow, prompts and guardrails.

By: Irina ShvayaOctober 28, 2026

Expense Categorization with MCP: A Step-by-Step Playbook

This playbook is part of our MCP playbooks, within The MCP Guide. Want help setting it up for your team? Request a free MCP readiness review.

Expense categorization means assigning every bank and card transaction to the right account in your books, such as software, meals or contractor costs. A bookkeeper or the owner usually does it weekly, one row at a time. Over MCP (Model Context Protocol, the open standard that connects AI apps to business tools), an assistant can propose categories in bulk, apply your rules and flag the rows it isn't sure about.

The catch is that documented support varies a lot by product. Some MCP servers can post categories, some can only read, and some do it only during import. This playbook shows which is which, as of October 2026.

Key Takeaways

  • Write your categorization rules down first. The AI follows rules far better than it guesses.
  • LedgerMCP (built by eSEOspace) documents categorize, bulk categorize, split and preview tools; QuickBooks's hosted connector categorizes during import.
  • Ramp's MCP server lets admins edit GL coding on card transactions; Expensify's is read-only.
  • Always preview a bulk change before it posts, and send unclear rows to a person.
  • Track the share of rows that need correction, not just how many got done.

What you need

  • An MCP client such as Claude or ChatGPT.
  • One of these servers:
ProductWhat its MCP docs say about categorizing
LedgerMCP (built by eSEOspace)categorize_transaction, bulk_categorize (up to 200 rows), split_transaction, dry_run previews, rules via add_convention
QuickBooks OnlineHosted connector's import "Categorizes and imports transactions into your General Ledger"; local server supports search and update on Purchase records
XeroLocal server has update-bank-transaction and list-accounts; the hosted connector is read-only
RampAdmins can "edit transactions (memo, coding, trip)" and look up accounting categories
ExpensifyRead-only search of expenses, categories and receipts

Sources: LedgerMCP's docs, Intuit's QuickBooks connector article, Intuit's local server README, Xero's MCP repository, Ramp's MCP guide and Expensify's MCP article.

Read the profiles for setup: Ramp, Expensify and Xero.

The workflow

  1. Write the rules. List recurring vendors and their accounts ("Adobe goes to Software"), plus rules for meals, travel and owner spending. In LedgerMCP, the AI stores each rule with add_convention and reads them back with list_conventions. The docs note that "Conventions are guidance you follow, not automation the server runs." With other servers, keep the rules in a document you paste in.
  2. Load the chart of accounts. The AI needs the real account names. Use list_accounts in LedgerMCP or list-accounts in Xero's local server. In Ramp, look up accounting categories.
  3. Pull uncategorized rows. LedgerMCP's list_transactions filters by status. In Xero's local server, use list-bank-transactions. With QuickBooks's hosted connector, categorizing happens as part of quickbooks-transaction-import, so review the result with quickbooks-import-status.
  4. Preview in bulk. Ask for a proposed category per row, with the rule it used and a confidence note. In LedgerMCP, run bulk_categorize with dry_run, which shows the exact journal lines without writing.
  5. Post the clear ones. Post rows that match a written rule. Use split_transaction in LedgerMCP when one charge covers several accounts. In Xero's local server, the write is update-bank-transaction. In Ramp, an admin applies GL coding through transaction edits.
  6. Park the unclear ones. Anything new, large or personal-looking goes to a person. LedgerMCP's ask_user saves the question in the ledger so the next session sees it.
  7. Attach receipts and mark reviewed. LedgerMCP's attach_receipt files a receipt on a transaction, and mark_reviewed flags it as checked. Expensify's read-only server can find "all expenses over $100 missing receipts," one of the example prompts in its docs.
  8. Fix mistakes the right way. In LedgerMCP, recategorizing "auto-reverses the prior entry," so history stays intact.

A sample rule set

Short, specific rules work best. For example: "Charges from our web host go to Hosting." "Any meal over $75 needs a note on who attended." "Card charges from the owner's personal card are owner contributions, not expenses." "Anything over the asset threshold your accountant sets is checked as a possible fixed asset." Write rules like these once, and the AI can apply them every week. Ask your accountant to review the list before you rely on it.

Example prompts

  • "List my conventions and chart of accounts, then preview categories for all uncategorized October transactions with dry_run." (LedgerMCP: list_conventions, list_accounts, bulk_categorize)
  • "Split the Costco charge on October 12 between Office Supplies and Meals as shown on this receipt." (LedgerMCP: split_transaction)
  • "Save a rule: Google Workspace charges go to Software Subscriptions." (LedgerMCP: add_convention)
  • "Show me all expenses over $100 missing receipts." (Expensify, from its docs)
  • "List bank transactions from last week and the account each is coded to." (Xero local server: list-bank-transactions)

Guardrails

  • Least privilege. Ramp says company-wide tools such as GL coding "require admin or business-owner permissions," and admins can restrict access by role, department or user. Expensify's scope only reads what your account can already see. Read excessive permissions in MCP before handing out write access.
  • Disable what you don't need. Intuit's local server can drop write, update or delete tools with QUICKBOOKS_DISABLE_WRITE, QUICKBOOKS_DISABLE_UPDATE and QUICKBOOKS_DISABLE_DELETE.
  • Preview, then post. Never approve a bulk change you haven't seen as a list.
  • Keep tax calls human. Meals, vehicle use, home office and owner spending have tax rules. A person, ideally your accountant, decides those.
  • Vendor names are untrusted text. A merchant string could carry instructions. See the MCP security center.

What to measure

  • Uncategorized rows at the start of each week.
  • Share of AI-proposed categories a person changed.
  • Rows sent to a person, and how fast they get answered.
  • Missing receipts over your threshold.
  • Recategorizations after month end, which point to weak rules.

Compare against a few weeks of your current process.

Next step

See how this fits the wider close in MCP for Accounting and Bookkeeping, and find more finance workflows in the MCP playbooks hub.

Frequently asked questions

Can the AI categorize expenses in QuickBooks?

Intuit says the hosted connector categorizes transactions as it imports them into your general ledger. Intuit's open-source local server supports search and update on Purchase records. Review the results in QuickBooks either way.

Can Expensify's MCP server fix categories?

No. Expensify's help article says the assistant "cannot create, edit, or delete anything in Expensify." It's useful for finding missing receipts and spending by category.

What does dry_run do?

In LedgerMCP (built by eSEOspace), dry_run previews the exact journal lines a categorize, split or entry would post, without writing anything.

How many transactions can the AI do at once?

LedgerMCP documents up to 200 per bulk_categorize call. Other servers don't publish a batch limit on the pages we checked, so work in small batches you can review.

You Might Also like to Read

Get a FREE Website Audit

Enter your website and get a 20–30 page SEO, GEO, AEO & CRO audit within 24 hours. Completely free.

Don't have a site yet? Get in touch →

Ready to speak with a marketing expert?
Give us a call! (916) 866-7893

Websites Launched
1407
Websites Launched
Marketing Experts
29
Marketing Experts
Hours of Dedicated Work
204533
Hours of Dedicated Work
Irina S.Benjamin G.Jeanette M.David G.