Skip to main content

Aus Accounting MCP

+--------------------------------------------------------+
|                   Aus Accounting MCP                   |
+--------------------------------------------------------+
|          MCP server for AU tax review engines          |
+---------------------------+----------------------------+
| DR  what it gives you     | CR  what it needs          |
+---------------------------+----------------------------+
| AU tax review MCP tools   | MCP-capable host client    |
| uses reviewed engines     | uv or uvx to install it    |
| synthetic SBR fixtures    | -                          |
+---------------------------+----------------------------+

tests PyPI Python Model Context Protocol MCP Registry Glama License: MIT

30-second proof · Install · Client setup · Tool reference · Release notes

Aus Accounting MCP provides Australian accounting review tools for ATO benchmarks, Payday Super timing and limited Division 7A loan reviews, plus synthetic CTR/BAS fixtures for integration tests. Compatible with Claude Desktop, Claude Code, Cursor, Codex and Antigravity.

Payday Super and Division 7A are experimental reviews, not compliance or tax determinations. SBR payloads are synthetic fixtures, not lodgments.

[!WARNING] Not tax advice. This server returns structured results, refusals, and citations. It does not lodge, and it does not replace a registered agent. See DISCLAIMER.md.

This MCP applies defined tests to figures the operator supplies: Payday Super timing, ATO small-business benchmark ratios, and a limited Division 7A loan review. It holds no ATO documents. For looking up rulings, use a document-retrieval MCP. Comparison: Australian tax tools for AI agents.

This server does not reimplement tax law. Payday Super, ATO benchmark and Division 7A computations are delegated to:

The Division 7A adapter covers reviewed s 109N loan terms and benchmark rates plus s 109E minimum yearly repayments for one operator-supplied amalgamated loan. It fails closed on unknown facts and refuses unsupported matters such as forming amalgamated loans, s 109R repayment classification, unpaid present entitlements, distributable surplus, interposed entities, debt forgiveness, and Commissioner discretion.

30-second proof

Static terminal proof of synthetic BAS output and Division 7A loan review

Release proof: from apps/aus-accounting-mcp/ in a repository checkout, run the fabricated demonstration without starting the stdio server:

uv run --locked aus-accounting-mcp-demo

The checked text transcript is the accessible source of truth for the image. Its registered MCP calls return a synthetic BAS fixture with synthetic: true and not_a_lodgment: true, then review fabricated Division 7A loan facts through the delegated engine.

Expected structured success:

synthetic: true
not_a_lodgment: true
form_type: BAS_AU_ACTIVITY_STATEMENT
summary.total_payable_to_ato: "42500.00"

Expected structured Division 7A review:

engine: div7a-loan-review
gate.verdict: COMPLYING
minimum_yearly_repayment.verdict: MYR_MET
minimum_yearly_repayment.myr_required: "108770.00"
minimum_yearly_repayment.shortfall: "0.00"

The example is fabricated, is not a lodgment or Division 7A determination, is not tax advice, and requires human review before any consequential accounting action. It does not model s 109R, distributable surplus, unpaid present entitlements or the other refused areas. It neither uses client data nor contacts external services.

Asset provenance

Asset Purpose Source Licence Creation SHA-256 Refresh trigger
docs/quick-proof.webp Static terminal summary of the two checked demonstration outcomes docs/quick-proof.txt, emitted by aus-accounting-mcp-demo MIT uv run --locked --extra dev python scripts/render_demo_image.py docs/quick-proof.txt docs/quick-proof.webp with Pillow 12.3.0 90f983a9b8f76455e9f473330c8b999f9929870731f0c9fbc70e87cd790a43df Regenerate when the transcript, demo output, render constants or pinned Pillow version changes

Name mapping: public name Aus Accounting MCP; repository australian-accounting; Python distribution aus-accounting-mcp; stdio MCP executable aus-accounting-mcp; demonstration executable aus-accounting-mcp-demo; MCP Registry identity io.github.ryanduguid/aus-accounting.

Canonical published release and compatibility references: CI, v0.1.9 release, PyPI 0.1.9, MCP Registry 0.1.9, and compatibility.json. Treat a version as published only after its target resolves and matches the compatibility record. The record links each engine's maintained source and release. The runtime law_content_date and source fields stay engine-owned.

Install

Python 3.10+ and uv. This server and its engines are published to PyPI, and the server pins its reviewed engines to exact versions.

uvx aus-accounting-mcp

Use CITATION.cff for this source version. The latest published provenance is the v0.1.9 release record.

For a local editable tree, clone the repository, change into apps/aus-accounting-mcp/, then run pip install -e .. The repository root is not an installable package.

The executable waits for a client over stdio; it does not open a web page or start an HTTP service. No API key is required. Installation downloads packages; tool calls use bundled data locally without writing records or contacting services.

Client integration

Standard config works with hosts that run a local stdio MCP server:

{
  "mcpServers": {
    "aus-accounting": {
      "command": "uvx",
      "args": [
        "aus-accounting-mcp"
      ]
    }
  }
}

Ready-made copies live in clients/.

Cursor

Add to Cursor

Or drop the standard config into ~/.cursor/mcp.json.

Claude Desktop

Paste the standard config into claude_desktop_config.json (%APPDATA%\Claude\ on Windows, ~/Library/Application Support/Claude/ on macOS).

Claude Code

claude mcp add aus-accounting -- uvx aus-accounting-mcp

Codex

codex mcp add aus-accounting -- uvx aus-accounting-mcp

Tools

Tool Job Engine
list_ato_benchmark_industries List or search the shipped ATO business types ato-benchmark-compare
get_ato_benchmarks Compare operator-supplied bucket totals to ATO ranges ato-benchmark-compare
calc_payday_super_deadline Review one contribution against Payday Super timing payday-super-checker
get_div7a_benchmark_rate Return the reviewed s 109N(2) rate for a year, or UNKNOWN div7a-loan-review
review_div7a_loan Review s 109N terms and s 109E minimum yearly repayment for one operator-supplied amalgamated loan div7a-loan-review
refuse_div7a Refuse Division 7A matters outside the reviewed engine scope. Takes no arguments MCP policy
generate_synthetic_sbr_fixture Synthetic CTR/BAS for agent tests (synthetic: true) local fixture

refuse_div7a answers the questions this server does not review, and those arrive with no loan facts, so it requires none. Call it with no arguments: the refusal is the same whatever is passed, and every input it still accepts is a retained legacy field that is ignored. Do not invent a borrower, a lender or a principal to reach it. A loan_principal that is supplied is still validated as an amount.

Every tool also publishes a human-readable title for host menus.

MCP initialization supplies server-wide instructions for choosing tools and handling missing facts. Every tool publishes an output schema describing its returned fields, including verdicts, decimal strings, warnings and source information. ok: true means the tool ran, not that the review passed; retain UNKNOWN, REFUSED, not_supplied and null results when presenting findings. Engine audit fields are preserved, and clients receive the same payload in structured content and JSON text. An unavailable Division 7A benchmark_year_used may be the engine's empty string or null; neither is evidence of a reviewed year.

The Division 7A tools default to response_detail="summary", retaining outcomes, amounts, caveats, versions and a verification link while reducing tool-result size. Pass response_detail="full" when the complete provenance, statutory trace and per-limb audit material are required.

For concise industry discovery, call list_ato_benchmark_industries with {"search":"shop","year":"2023-24","limit":20}. count is the number returned; total_count is the number matching the search, while total_business_types covers the whole dataset. If has_more is true, pass next_offset as offset with the same search, limit and returned benchmark_year as year. next_offset is null at the end. Limits must be integers from 1 to 100 and offsets non-negative integers. Omitting limit or setting it to null preserves full-list calls; an offset still skips that many matching entries. Source metadata accompanies every page.

Ten fabricated, read-only agent evaluation questions are in evaluation/questions.xml, each with its exact expected answer and the tools a correct answer needs. The normal pytest suite replays them through a real stdio MCP session using the locked engines, checking both the answer and that reaching it called exactly the published tools, so that list cannot drift from what the server actually requires. The fixed dataset years and engine versions define the evaluation baseline; review expected answers when upgrading an engine.

Answer reproducibility is not tool-selection quality: the replay is told which tool to call. To measure the other half, evaluation/tool_selection.py prints the context a host puts in front of a model and the questions with the answer and tool elements stripped, then scores a recorded run against the published selection:

python evaluation/tool_selection.py context
python evaluation/tool_selection.py questions
python evaluation/tool_selection.py score runs/recorded.json

The recorded file maps each question id to the tool names the client called, in any order. Scoring reports the tools each answer missed and the ones it called that the answer does not need. This is a supplementary check, not a CI gate: the step in the middle is a model, and a gate whose result depends on one would fail for reasons that are not this repository's.

calc_payday_super_deadline requires as_at. It does not invent clearing-house latency and cannot confirm LCR 2026/1 transition allocation. A remittance date alone cannot produce ON_TIME.

Omitted ATO expense buckets are not_supplied, not zero. Every ATO ratio divides by turnover, which the ATO rule takes from sales or from total business income, so omitting other_income leaves every ratio not_supplied until you establish that figure. Pass 0 where you have established there is none. Withholding covers the engine's prose as well as the structured fields: each engine notes and checks_to_make entry declares the figures needed to state it, and an entry resting on a bucket you omitted is withheld rather than published beside that bucket's null. notes records how many were withheld. key_ratio is withheld the same way, so an omitted cost_of_sales does not trigger the ATO's total-expenses fallback.

Amounts, including Division 7A loan balances and payments, are decimal strings, finite, at most two decimal places, and no greater than AUD 1,000,000,000,000.00. Dates are ISO-8601. Payday Super uses payday-super-checker's national SGAA 1992 s 6(1) calendar.

Payday Super dates come out of a payroll or clearing-house export, so calc_payday_super_deadline reads the shapes those exports hold, through the engine's own parser rather than one of its own: 2027-07-13, day-first 13/07/2027 or 13-07-2027, 13 Jul 2027, and a date-time with no timezone marker, whose time the law ignores. Two are refused. A stamp carrying Z or a UTC offset is the engine's refusal, because a UTC evening is already the next day in Australia and keeping the written day could pass a receipt that was really a day later; convert it to the Australian calendar date first. A numeric date is refused at this boundary only where the two readings give different days, such as 01/07/2027: it is read day first, nothing in the text rules out the other reading, and the difference is a month in a date that decides the verdict. Send those as YYYY-MM-DD. Two things settle the reading and are accepted: a component above 12 can only be the day, so 13/07/2027 is the 13th, and equal components land on the same date either way, so 12/12/2027 is the 12th of December. Results are always ISO-8601.

Division 7A already takes a loan in the shape a register row holds: every review_div7a_loan argument is one column of the engine's register CSV, passed through the engine's own GateFacts and MyrFacts readers. Whole files and multi-loan registers stay out of scope, because the engines expose those only behind a file path and reading one here would mean this facade owning input handling the engines do not.

Prompts

The three documented workflows are registered as MCP prompts, so a host can offer them from its prompt menu rather than having you paste the text. Each argument is optional: supply it and the prompt names it, omit it and the prompt asks you for it instead of assuming one.

Prompt Argument Job
compare_ato_benchmarks industry Compare supplied P&L buckets, leaving omitted buckets out rather than passing zero
review_payday_super_contribution as_at Review one contribution, without inventing a fund-receipt date or an SG charge
review_div7a_loan_terms year_of_income Review one amalgamated loan for s 109N and s 109E, refusing matters outside that scope

The same texts, to paste by hand:

Compare these P&L buckets to the ATO small-business benchmarks for this industry. Omit buckets I have not supplied. Do not treat missing as zero.
Review this Payday Super contribution. QE day, remitted date, and fund-receipt date are in the CSV. as_at is today. Do not invent an SGC charge.
Review this operator-supplied Division 7A amalgamated loan for s 109N terms and the s 109E minimum yearly repayment. Leave unknown facts unknown and refuse questions outside the reviewed scope.

Resources

Four read-only resources carry context a host can show without spending a tool call. Each is built from the installed engines rather than from a repository file, so it describes the server that is actually running.

Resource Contents
aus-accounting://disclaimer The boundary and no-advice statement, plus each delegated engine's own disclaimer
aus-accounting://div7a-scope What Division 7A this server reviews, and the matters that stay refused. The same text refuse_div7a returns
aus-accounting://benchmark-dataset-years The shipped ATO benchmark years with publisher, resource URL, retrieval date and SHA-256. Bundled data, not a live lookup
aus-accounting://component-versions The server and engine versions installed here, which are the versions reported beside results as engine_version

Licence

MIT License. Created by Ryan Duguid. Boundary statement: DISCLAIMER.md. Discovery copy: docs/DISCOVERY.md. Cite: CITATION.cff.

Release files for aus-accounting-mcp 0.1.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aus-accounting-mcp 0.1.9
File Size Uploaded
aus_accounting_mcp-0.1.9.tar.gz 229.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aus-accounting-mcp 0.1.9
File Interpreter ABI Platform
aus_accounting_mcp-0.1.9-py3-none-any.whl Python 3 none any Details

Total release size: 267.6 kB

Release files / aus_accounting_mcp-0.1.9.tar.gz

Download URL aus_accounting_mcp-0.1.9.tar.gz
Size 229.3 kB
Tags Source
SHA-256 checksum
How to use checksums
61b2685c65dd02fc548ee54dc5e92adb95c56893b36ac1005b68a751df508213
BLAKE2b-256 checksum
How to use checksums
7cad3fcfd6e28f231ff8cac282fffaafbfac2b2b9a314b7d9cde2a7cb66942f5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release files / aus_accounting_mcp-0.1.9-py3-none-any.whl

Download URL aus_accounting_mcp-0.1.9-py3-none-any.whl
Size 38.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f1724798375add9f1de9ffc9de92885642516b8eb8fff87b214c9e61d6e8c356
BLAKE2b-256 checksum
How to use checksums
75dcd9365997981d6e4c758a15b69c8b14a5ca59b2c3daa1721e12a26c41fd81
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

This release

0.1.9 This release

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page