Receipt Extraction
AU GST/ABN receipt extraction — assigns entertainment/ITC tax codes per line, not just OCR.
Open source Repository Open in the app JSON README (API)
About
AU GST/ABN receipt extraction — assigns entertainment/ITC tax codes per line, not just OCR.
Details
- Kind
- MCP servers
- Topic
- Finance & crypto
- Publisher
- com.acjlabs
- Origin
- official
- Category
- ferramentas
- Transport
- http
- Version
- 0.1.2
- Stars
- 2
- Last push
- 2026-08-08T08:31:07Z
- Repository state
- ativo
- Added
- 2026-08-29 03:00:51
- Updated
- 2026-08-29 03:00:51
- Origin id
com.acjlabs/receipt-extraction
README
# Receipt Extraction
**AU GST/ABN-aware receipt & invoice extraction** — applies documented AU entertainment/ITC tax-code
rules per line item, returning a `tax_code`, a `confidence`, and a one-line `rationale` for each, not
just OCR text. You supply the document; get validated structured JSON: vendor, line items, tax, totals —
with Australian GST and ABN checksum validation built in from day one. One API call, no hand-rolled
vision-LLM prompts, no re-deriving ABN/GST rules from the ATO's own documentation.
## What it does
- Accepts a receipt/invoice image or PDF (base64), returns a clean, versioned `Receipt` JSON object.
- Validates the vendor's ABN (11-digit modulus-89 checksum) and cross-checks GST across line items and
totals, excluding non-creditable GST on entertainment-coded expenses per the documented rule set.
- Each line item carries its `tax_code` plus a `confidence` (0–1) and a one-line `rationale` naming the
actual rule applied (e.g. "entertainment ITC denied, no exception context", or the incidental-to-travel
exception that flips a restaurant-style meal back to claimable) — so you can check the call, not just
trust it.
- Works as an MCP server (`extract_receipt` tool) or a plain HTTPS API — usable from Claude, Cursor, or
any HTTP client.
GST handling reflects publicly documented Australian tax law and is provided as software output, not
tax advice.
### Example (MCP tool call)
```json
{
"tool": "extract_receipt",
"input": { "document_base64": "<base64 image or PDF>", "mime_type": "image/jpeg" }
}
```
```json
{
"vendor": { "name": "Acme Pty Ltd", "abn": "51824753556", "abn_valid": true },
"date": "2026-07-14",
"line_items": [
{
"description": "Widget",
"qty": 2,
"unit_price": 12.5,
"gst": 2.5,
"tax_code": "taxable",
"confidence": 0.95,
"rationale": "Standard-rated retail good; 10% GST applies."
}
],
"totals": { "subtotal": 25.0, "gst": 2.5, "total": 27.5 },
"schema_version": "1.0"
}
```
## Pricing
The free tier is self-serve today; paid plans are opening soon.
- **Free** — 20 documents/month, no card required. Self-serve today.
- **Pay-as-you-go** *(opening soon)* — $0.02/document, no minimum.
- **Pro** *(opening soon)* — $19/month for 1,500 documents (~$0.013/doc effective), with priority support.
Want a paid plan now?
[Register your interest](https://receipt-extraction-signup.acjlabs.com/#pro-intent) and we'll set you up first.
## Getting a key
The MCP server is live at `https://receipt-extraction.acjlabs.com/mcp` (the alternate
`https://acjlabs-receipt-extraction.acjlabs.workers.dev/mcp` address reaches the same deployment and
keeps working, so existing configurations need no change). Free-tier keys
self-serve — `POST /v1/signup` with `{ "email": "you@example.com" }` returns your key directly in the
response, good for 20 documents/month, no card required. **Store it immediately — it is shown once and
cannot be recovered if lost** (re-signup for a new one). Paid keys provision the same way via a
one-time claim link once Pro/pay-as-you-go billing is live. See
**<https://acjlabs-receipts.pages.dev>** for the same steps plus pricing and a comparison against
alternatives.
## Connecting it to an MCP client
With Claude Code:
```bash
claude mcp add --transport http receipt-extraction \
https://receipt-extraction.acjlabs.com/mcp \
--header "Authorization: Bearer YOUR_API_KEY"
```
Any other MCP client that supports a remote HTTP server with a custom header (Cursor, Cline, VS Code,
etc.) works the same way: point it at the URL above with an `Authorization: Bearer YOUR_API_KEY`
header. A gateway or scanner that can only forward the raw key value (no `Bearer` prefix) also works —
both forms authenticate. Tool discovery (`initialize`/`tools/list`) doesn't require a key at all; only
calling `extract_receipt` does.
See [docs/quickstart.md](docs/quickstart.md) for a full copy-paste walkthrough (getting a key, per-client
configs, confirming the connection with `curl`) if you'd rather follow one linear guide.
## How accurate is it?
Validated 4/4 against hand-built (but genuinely readable) test documents covering net-priced,
GST-inclusive-only, checksum-invalid-ABN, and unreadable-document cases. Real production accuracy
across more document formats will be tracked once live traffic exists.
## npm client
Prefer a typed function over hand-rolling MCP JSON-RPC calls?
[`@acjlabs/receipt-extraction-client`](https://www.npmjs.com/package/@acjlabs/receipt-extraction-client)
(live on npm) wraps the `extract_receipt` tool call:
```sh
npm install @acjlabs/receipt-extraction-client
```
```ts
import { createReceiptExtractionClient } from "@acjlabs/receipt-extraction-client";
const client = createReceiptExtractionClient({
baseUrl: "https://receipt-extraction.acjlabs.com",
apiKey: "...",
});
const receipt = await client.extractReceipt(base64EncodedImageOrPdf, "image/png");
```
## Why not just use generic OCR?
Generic OCR extraction APIs return raw fields. None of them apply the AU layer on top: that an
Australian ABN carries an 11-digit modulus-89 checksum, or that GST apportionment differs for
entertainment-coded expenses. You'd build and maintain that yourself, against someone else's schema
that can change under you. See the [full comparison](docs/comparison.md), or read
[why AU GST rules break most receipt-extraction tools](docs/au-gst-receipt-extraction.md) (the ABN
checksum, the three real GST cases, and how to test any tool against them).
## Source availability & support
This repository hosts the documentation for the hosted service. The service implementation is not open source. Bug reports and feature requests are welcome in this repo's Issues; you can also reach us at <contact@acjlabs.com>.