Receipt Collection MCP

For AI-system builders and automation consultants

Add Receipt Collection to Your AI Workflow

Add receipt collection to your AI workflow without building Gmail ingestion, receipt-file handling, extraction, duplicate detection, exception handling, or Google Drive storage. ExpenseBot is the receipt-ingestion layer. Your system stays the orchestrator.

Build a receipt-collection workflowView MCP tools and workflow recipes

Last updated October 1, 2026

Quick answer: is there an MCP server for receipt collection?

Yes. ExpenseBot is a receipt collection MCP server that takes receipt images, PDFs, and Gmail receipts from your agent, extracts them, checks for duplicates, and writes the expense record to a Google Sheet the customer owns. Connect an MCP client to https://mcp.expensebot.ai/mcp, submit a receipt once, then poll for the verdict: added, duplicate, skipped, held for review, or errored for a single receipt, with mixed and unknown covering batches and unclear completions. It is not a workflow engine or an accounting ledger.

The receipt-ingestion layer for an AI accounting workflow

You supply orchestration, business rules, review policy, and downstream systems. ExpenseBot supplies receipt intake, extraction, duplicate handling, expense records, exception states, and evidence in the customer’s own Google Sheet and Drive.

  1. 1. Your workflow

    Receipt source

    An image or PDF arrives from the channel you already run: an inbox, a shared folder, a chat channel, a form, a client portal.

  2. 2. ExpenseBot

    ExpenseBot MCP

    Your agent submits the file once, or starts a bounded Gmail scan in the customer's connected account.

  3. 3. ExpenseBot

    Processing status and exceptions

    Extraction and duplicate checks run in the background. Your workflow polls for the authoritative outcome.

  4. 4. ExpenseBot

    Expense record and evidence

    An added receipt becomes a row in the customer's Google Sheet, with the source document kept in their Google Drive.

  5. 5. Your workflow

    Your agent or automation

    Your rules decide what happens next: review, notification, matching, coding, approval.

  6. 6. Your workflow

    Accounting or review destination

    The ledger or review queue your design names stays the source of truth.

Read as a sentence: a receipt source feeds the ExpenseBot MCP server, which returns a processing status and any exceptions, then an expense record with its evidence, which your agent or automation carries to the accounting or review destination you chose. ExpenseBot owns the three middle stages. It does not act inside the systems your agent connects to, so anything your agent does there runs on your agent’s own connections.

If you are still deciding what the whole pipeline should look like, AI accounting automation that starts with the receipt covers the end-to-end assembly. This page covers one decision: whether ExpenseBot can own the receipt leg of a system you are building.

Build the workflow, not the receipt plumbing

Receipt collection looks like one step on a whiteboard and turns into seven jobs in production. ExpenseBot already runs each of them, so your build starts at the point where the receipt is a record.

  • File intake. Images and PDFs, including mixed batches, go through signed uploads. Your agent does not have to hold or host the files.
  • Bounded Gmail scans. A recent-window scan covers roughly the last 60 days. Completed prior years are scanned one year at a time, after a preview and an explicit confirmation.
  • Extraction. Vendor, amount, date, tax, and category are read from the document.
  • Duplicate outcomes. A receipt ExpenseBot already holds comes back as a duplicate instead of a second row.
  • Delayed processing. Extraction is asynchronous. A row usually appears within one to three minutes, and PDFs or large batches take longer.
  • Held-for-review outcomes. A file with missing details or a possible duplicate is withheld and reported, not guessed at.
  • Persistent evidence. The record lands in the customer’s Google Sheet and the source document in their Google Drive.

One point shapes everything downstream: submission is not extraction. submit_receipt starts the job and returns. get_last_receipt_result is the authoritative status tool, and it can stay pending. Design your workflow around that wait instead of assuming a result in the same call.

Exact MCP workflow contracts

These are the tools the receipt-collection job uses, with the state your workflow should expect from each. The connected tool list your client discovers is authoritative; this table is rendered from the same generated catalog.

ToolInputPending stateTerminal stateSafe next action
submit_receiptStarts work or writesReceipt images and PDFs, mixed in one batch. List the files, upload each to the signed URL the tool returns, then make one call that references every upload. Optional note and tag per file.Returns a submission ID with a polling interval and time allowance. Extraction has started, not finished.None from this tool. It starts the job.Persist the submission ID against your own event ID. Do not submit the same file again.
get_last_receipt_resultRead-onlyThe exact submission ID.found:false means still processing. That is normal, especially for PDFs and larger batches.found:true with one verdict for the submission: added, duplicate, skipped, held_for_review, errored, mixed, or unknown, plus exact counts and per-file outcomes where available.Branch on the verdict, and on the counts and per-file outcomes for a batch. If the time allowance ends while still pending, report that processing is continuing and check again later.
scan_gmailStarts work or writesNo file. Starts a background scan of the Gmail account the customer connected inside ExpenseBot, roughly the last 60 days by default.Returns immediately; the scan runs in the background.Read from get_scan_status.Poll get_scan_status rather than starting another scan.
scan_gmail_yearsStarts work or writesOne or more completed prior calendar years. Call first without confirmStart to preview which years are eligible.A long-running job. The first eligible year starts and the rest queue, one at a time.Read from get_scan_status.Show the preview to the account owner and send confirmStart:true only after they agree.
get_scan_statusRead-onlyNone required.Reports the active scan, its live phase and item progress, and queued years.Completed years, recent outcomes, and anything that needs attention, with the link to open next.Route attention-needed items to a person. Hand the returned Sheet or review link to your next step.
search_expensesRead-onlyFilters for category, merchant, date range, amount, or tag, plus an optional plain-language query.Not asynchronous. Results are paginated.Matching rows, each with the durable expense ID.When hasMore is true, call again with the same filters and pass the returned nextCursor value in the cursor parameter.
get_expense_by_idRead-onlyA sheet row number or the durable expense ID.Not asynchronous.One row as headers, values, and a labelled map.Pass the labelled record to your downstream step with both systems' identifiers.
get_spreadsheet_urlRead-onlyNone required.Not asynchronous.The customer's Google Sheet link and the relevant ExpenseBot workspace links.Give a reviewer the one or two links that match the outcome.
trace_documentRead-onlyA merchant, sender, subject, or phrase to search for, or a known receipt ID or Gmail message ID.Not asynchronous.A read-only timeline of what happened to that document, including skipped and duplicate outcomes.Use it to answer "where did this receipt go?" before anyone resubmits.

The remote server publishes more tools than these, covering reports, income, mileage, and analytics. They are listed on the MCP page. A receipt-collection workflow rarely needs them, and requesting only the scopes this job uses keeps the connection narrow.

A reference receipt-collection workflow

Submit once, keep the submission ID, wait for the terminal verdict, then branch. Five steps cover the whole receipt leg.

  1. Receive a receipt from a source your workflow already supports.
  2. Submit the image or PDF once and persist the returned submission ID next to your own event ID.
  3. Poll at the interval and within the time allowance the tool returned. For a small batch that is currently a check about every 20 seconds for up to five minutes, and longer for larger batches. Use the values in the response, not these.
  4. Branch on the verdict. Not every terminal result is a success, and a batch needs its per-file outcomes read.
  5. Pass the result and the evidence links to your review, notification, or accounting step.
on receipt_received(file, source_event_id):
    if store.has(source_event_id):        # already submitted, never resubmit
        submission_id = store.get(source_event_id)
    else:
        response      = call submit_receipt(file)
        submission_id = response.submissionId
        store.put(source_event_id, submission_id)

    repeat on the interval the response gave, within its time allowance:
        result = call get_last_receipt_result(submissionId = submission_id)
        if result.found: break

    if not result.found:
        notify "still processing, check again later"   # do not resubmit
        return

    switch result.verdict:
        added            -> hand record + evidence links to the next step
        duplicate        -> mark handled, reference the existing record
        skipped          -> report to a person
        held_for_review  -> relay the returned next step to the account owner
        errored          -> surface the error and stop
        mixed            -> handle each file from counts + per-file outcomes
        unknown, other   -> send to a person, do not resubmit

That is pseudocode for your orchestrator, not an ExpenseBot SDK. There is no webhook to subscribe to in this flow; the workflow learns the outcome by polling.

VerdictWhat it meansWhat your workflow does
addedThe receipt was processed and a row was written to the customer's Google Sheet.Continue. Pass the record and its evidence links to the next step.
duplicateExpenseBot recognised the receipt as one it already holds. No second row was written.Treat as handled. Do not retry. Reference the existing record if you need one.
skippedThe file was not processed as a receipt, most often because it was a bank or card statement.Report it to a person with the returned message. Do not loop.
held_for_reviewThe file was withheld for missing details or a possible duplicate. It was not added.Relay the next step from the returned message to the account owner. A person resolves it in ExpenseBot.
erroredProcessing failed and nothing was added.Surface the error and stop. Resubmit only after a person has confirmed nothing was added.
mixedA batch ended with more than one outcome, for example some files added and others duplicates or held for review.Do not treat it as success or failure. Read the counts and the per-file outcomes and handle each file.
unknownProcessing completed but the outcome is unclear.Send it to a person to check the Sheet. Do not resubmit.

The verdict describes the whole submission. A one-receipt submission ends in one of the first five. A multi-file batch is not summarised reliably by a single word: a batch can report added while one of its files was skipped, so for batches read the counts and the per-file outcomes, which use added, duplicate, skipped, failed, and held_for_review. The rule behind every row: an unknown outcome stays unknown. A pending receipt is not a failed receipt, and submitting the same file again can create a duplicate expense.

Connect each customer’s account safely

Each customer signs in and authorises their own ExpenseBot account. A connection acts as that one account, so there is no shared credential that spans your client list.

  • Remote agents add https://mcp.expensebot.ai/mcp. The server supports OAuth discovery, Dynamic Client Registration, and PKCE, so a client that supports them needs no hand-copied client ID or secret. The account owner completes sign-in and consent in the browser.
  • Registration is not open to every callback. Automatic registration covers desktop clients that use a local loopback address and the connector platforms ExpenseBot has reviewed. A hosted agent outside that set uses a named, revocable token instead.
  • Clients without remote OAuth MCP use the stdio package and token setup documented on the MCP page. Keep the token in the client’s secret store. A chat conversation is not a secret store, and neither is an email.
  • Respect scopes and annotations. Access is granted per scope: reading expenses, writing expenses, Gmail scanning, reading reports, writing reports, and compliance. Request only what the job needs. Each tool is annotated as read-only or not, and your calling system should honour that when deciding what may run unattended.
  • Verify read-only first. Before any write, ask for something harmless such as the top five expense categories this month and confirm the answer belongs to the right account.

Per-client instructions for ChatGPT, Claude, Gemini, remote agents, and desktop clients are in the connection chooser. The category background, including what a connector can and cannot see, is in what an MCP connector does.

Workflow recipes builders can adapt

The common receipt workflows are already written up as individual recipes, each one a verified workflow shape. Start from the closest one instead of designing from zero.

The division of labour on this page is one a firm already runs. An accounting firm connected ExpenseBot over MCP to Viktor, the AI agent it was already using, with Zoho Books as its ledger. ExpenseBot captures the receipt and keeps the evidence, the firm’s agent applies the firm’s rules, and Zoho Books remains the accounting source of truth.

“The MCP connection itself is working well, and it gives us a practical way to combine ExpenseBot’s receipt capture with Viktor’s access to Zoho and our accounting rules.”John, an accounting firm using ExpenseBot with its own AI agent

What that shows is the connection and the split of responsibilities. It does not show ExpenseBot reconciling anyone’s books, and the firm’s full reconciliation routine still has to be validated on its own data. The setup and the review-first prompt are in using ExpenseBot with Viktor and Zoho Books.

MCP, native Zapier, or the ExpenseBot app?

Pick by how much the workflow has to decide for itself. Remote MCP is for an agent that chooses among tools, Zapier is for fixed mapped steps, and the app is for someone who wants the finished product.

RouteUse it whenStart here
Remote MCPAn agent must choose among allowed tools inside a workflow whose handling varies from one receipt to the next.Remote agent setup
Native Zapier appThe workflow is a deterministic trigger and action sequence, and you want every field mapped explicitly.Connect ExpenseBot to Zapier
ExpenseBot app or an assistant connectionThe person wants the complete product, or wants to work in ChatGPT, Claude, or Gemini instead of assembling a system.Connection chooser

ExpenseBot connects over remote MCP to custom agents, through a native app to Zapier, and through listed connectors to ChatGPT and Claude. For the Zapier decision specifically, including the current status of each Zapier route, see native Zapier app or Zapier MCP Client. The routes are separate connections and do not conflict, so a deterministic Zap and an agent can run against the same account.

Start with one test receipt

Prove the receipt leg on one account and one harmless file before you attach anything downstream.

  1. Connect one test ExpenseBot account, not a client’s.
  2. Let your client discover the tools and confirm the ones in the table above are present.
  3. Submit one non-sensitive test receipt.
  4. Persist the submission ID.
  5. Wait for the authoritative result. Do not resubmit while it is pending.
  6. Open the account’s Google Sheet and Drive and confirm the row and the receipt document are there.
  7. Only then add the downstream actions.

No test account yet? Create one with a 60-day free trial, no credit card, then come back to the setup steps.

Give your workflow a receipt leg you did not have to build

Connect a test account, submit one receipt, and read back the verdict. The setup route covers remote agents, desktop clients, and token-based platforms.

Build a receipt-collection workflow

Frequently asked questions

Can I use ExpenseBot as the receipt-ingestion layer in my own AI agent?

Yes. Point an agent that supports remote MCP at https://mcp.expensebot.ai/mcp, have the account owner sign in and approve access, and the agent can submit receipt images and PDFs, start Gmail receipt scans, read the processing outcome, and look up the resulting expense records. Your agent keeps the orchestration, the business rules, and its own access to any downstream system.

How does my workflow know when a submitted receipt has finished processing?

submit_receipt returns a submission ID together with a polling interval and a time allowance. Call get_last_receipt_result with that exact ID on that interval. A found:false response means the receipt is still processing. A found:true response is terminal and carries the verdict: added, duplicate, skipped, held_for_review, or errored, with mixed for a batch that ended with more than one outcome and unknown when the outcome is unclear. For a batch, read the counts and per-file outcomes as well.

What should my workflow do with a duplicate or held-for-review receipt?

Neither one is a failure to retry. A duplicate means ExpenseBot already holds that receipt and did not write a second row, so mark the item handled. A held-for-review file was withheld for missing details or a possible duplicate and was not added, so relay the next step in the returned message to the account owner, who resolves it in ExpenseBot.

I build automations for several clients. Can one shared credential connect all of them?

No. A connection acts as the ExpenseBot account that authorised it, so each customer signs in and approves access to their own account. Where a platform needs a stored credential instead of a browser sign-in, generate one named, revocable token per customer account and keep it in that platform's secret store. Never reuse one person's token across client accounts.

Does ExpenseBot replace QuickBooks, Zoho Books, or my accounting agent?

No. ExpenseBot supplies receipt capture, the expense record, and the receipt evidence. It is not a general ledger and it does not reconcile your books. Your accounting package stays the source of truth, and the agent or automation you build applies your rules between the two.

Should I use ExpenseBot over MCP or through the native Zapier app?

Use remote MCP when an agent has to choose among allowed tools inside a workflow whose handling varies. Use the native ExpenseBot app for Zapier when the workflow is a fixed trigger and action sequence with every field mapped by hand. The two are separate connections and can run side by side.

Where are the customer's receipt records and files stored?

The expense records live in a Google Sheet in the connected customer's own Google Drive, and the receipt documents are stored in that Drive as well. ExpenseBot keeps the limited account, authorization, audit, and duplicate-prevention metadata needed to run and secure the service.