Open-source AI accounting skills verified by licensed accountants (tax, VAT, payroll).
io.github.openaccountants/openaccountants MCP Server
This MCP server provides open-source AI accounting skills focused on tax guidance. It describes “OpenAccountants” as guides that can be cited, verified by licensed accountants for areas including tax, VAT, and payroll. The server is associated with toolCount: 14 and is published under AGPL-3.0.
List published OpenAccountants skills with their quality tier and verification status. Optionally filter by jurisdiction (e.g. 'US', 'MT', 'DE', 'GB'), domain (the accounting area, e.g. 'vat-gst', 'payroll', 'income-tax'), or role ('foundation' | 'compute' | 'orchestrator' | 'reference'). Results are paginated (default 100, max 200 per call) — unfiltered browsing of the full ~1,100-skill catalogue requires paging via offset/next_offset, so jurisdiction/domain filters are strongly recommended.
Parameters6
jurisdiction
string
optional
Filter by jurisdiction code, e.g. 'US', 'MT', 'DE'
Filter by pipeline role: foundation, compute, orchestrator, reference.
category
string
optional
(Legacy) display label; prefer domain/role.
limit
integer
optional
Max skills to return (default 100, max 200).
offset
integer
optional
Number of skills to skip — use the next_offset from the previous response to page through results (default 0).
Raw schema
{
"type": "object",
"properties": {
"jurisdiction": {
"type": "string",
"description": "Filter by jurisdiction code, e.g. 'US', 'MT', 'DE'"
},
"domain": {
"type": "string",
"description": "Filter by accounting domain: income-tax, vat-gst, payroll, bookkeeping, e-invoicing, formation, financial-statements, transfer-pricing, tax-optimization, crypto, cross-border, corporate-tax, estate-wealth-tax, references, sector-guidance, tooling."
},
"role": {
"type": "string",
"description": "Filter by pipeline role: foundation, compute, orchestrator, reference."
},
"category": {
"type": "string",
"description": "(Legacy) display label; prefer domain/role."
},
"limit": {
"type": "integer",
"description": "Max skills to return (default 100, max 200)."
},
"offset": {
"type": "integer",
"description": "Number of skills to skip — use the next_offset from the previous response to page through results (default 0)."
}
}
}
get_skill
Fetch a published skill by slug, including its current-version markdown, quality tier, named verifier (where accountant-verified), and a provenance/attribution footer.
Parameters2
slug
string
required
Skill slug, e.g. 'us-schedule-c-and-se-computation'
reason
string
optional
One sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional.
Raw schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Skill slug, e.g. 'us-schedule-c-and-se-computation'"
},
"reason": {
"type": "string",
"description": "One sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional."
}
},
"required": [
"slug"
]
}
get_skill_sections
Fetch the parsed sections of a skill's current version. Each section has a heading and its markdown content. Use this to pull a specific section that get_skill listed in `section_index` as not inlined (e.g. a supplier-pattern library) — pass `section_index` to fetch just that one. Omit it to get every section.
Parameters3
slug
string
required
Skill slug
section_index
integer
optional
Optional. Return only this section (matches the `index` from get_skill's `section_index`).
section_indices
array
optional
Optional. Return only these sections.
Raw schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Skill slug"
},
"section_index": {
"type": "integer",
"description": "Optional. Return only this section (matches the `index` from get_skill's `section_index`)."
},
"section_indices": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Optional. Return only these sections."
}
},
"required": [
"slug"
]
}
search_skills
Full-text search across all published tax and accounting skills. Find, lookup, query, or discover skills by keyword, tax concept, deduction type, form number, or regulation (e.g. 'home office deduction', 'crypto capital gains', 'reverse charge', 'Schedule C', '60-day reporting'). Optionally limit to one jurisdiction. Use this when you don't know the exact skill slug. Set content_type='method' to discover step-by-step METHODS (guided procedures — what you EXECUTE via start()) instead of reference material; each method carries a review_status (accountant-reviewed | source-cited).
Parameters4
query
string
required
Search term, e.g. 'home office deduction', 'crypto capital gains', 'reverse charge'. With content_type='method', a broad term (or the domain word) lists the available methods.
jurisdiction
string
optional
Optional ISO 2-letter country code to limit the search
domain
string
optional
Optional accounting domain to limit the search (e.g. 'vat-gst', 'payroll', 'income-tax', 'crypto').
content_type
string
optional
What kind of Guide to find. 'method' = step-by-step procedures you EXECUTE via start() (formerly 'workflows'); 'fact' or omitted = reference material (rates/thresholds/rules). A Guide can be either or both.
Raw schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search term, e.g. 'home office deduction', 'crypto capital gains', 'reverse charge'. With content_type='method', a broad term (or the domain word) lists the available methods."
},
"jurisdiction": {
"type": "string",
"description": "Optional ISO 2-letter country code to limit the search"
},
"domain": {
"type": "string",
"description": "Optional accounting domain to limit the search (e.g. 'vat-gst', 'payroll', 'income-tax', 'crypto')."
},
"content_type": {
"type": "string",
"enum": [
"method",
"fact"
],
"description": "What kind of Guide to find. 'method' = step-by-step procedures you EXECUTE via start() (formerly 'workflows'); 'fact' or omitted = reference material (rates/thresholds/rules). A Guide can be either or both."
}
},
"required": [
"query"
]
}
search_rules
Query individual tax RULES/FACTS (rates, thresholds, rules, definitions, tables) ACROSS jurisdictions and metadata, and get back a bundled markdown rule set the user can save and run locally. Unlike get_skill (one whole skill), this assembles a cross-cutting SET — e.g. 'VAT rates in MT, IE and DE', 'all income-tax thresholds for 2025', or 'rules mentioning reverse charge'. By default returns ALL matching rules, each tagged with its verification status; pass status:'verified' for accountant-/research-verified only. Call `list_rule_facets` first to see the queryable values.
Parameters12
jurisdictions
array
optional
ISO codes to include, e.g. ['MT','US-CA']. Omit for all jurisdictions.
domains
array
optional
Accounting domains, e.g. ['vat-gst','income-tax']. See list_rule_facets.
roles
array
optional
Skill roles: foundation | compute | orchestrator | reference.
block_types
array
optional
Rule kinds to include. Default = all of these (framing prose + workflow steps are excluded).
statuses
array
optional
Verification statuses to include. Default = all (each rule is tagged).
Free-text search over each rule's label, value, and citation.
limit
integer
optional
Max rules to return (default 200, max 500).
offset
integer
optional
Pagination offset — pass the previous response's next_offset.
reason
string
optional
One sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional.
Raw schema
{
"type": "object",
"properties": {
"jurisdictions": {
"type": "array",
"items": {
"type": "string"
},
"description": "ISO codes to include, e.g. ['MT','US-CA']. Omit for all jurisdictions."
},
"domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounting domains, e.g. ['vat-gst','income-tax']. See list_rule_facets."
},
"roles": {
"type": "array",
"items": {
"type": "string"
},
"description": "Skill roles: foundation | compute | orchestrator | reference."
},
"block_types": {
"type": "array",
"items": {
"type": "string",
"enum": [
"rate",
"threshold",
"rule",
"formula",
"refusal_code",
"definition",
"table_ref",
"table"
]
},
"description": "Rule kinds to include. Default = all of these (framing prose + workflow steps are excluded)."
},
"statuses": {
"type": "array",
"items": {
"type": "string",
"enum": [
"draft",
"research_verified",
"accountant_verified",
"needs_update",
"unsure"
]
},
"description": "Verification statuses to include. Default = all (each rule is tagged)."
},
"status": {
"type": "string",
"enum": [
"all",
"verified"
],
"description": "Shorthand for `statuses`: 'verified' = accountant- + research-verified only. Default 'all'."
},
"tax_year": {
"type": "integer",
"description": "Limit to a tax year, e.g. 2025."
},
"topic": {
"type": "string",
"description": "Filter by a fact topic."
},
"text": {
"type": "string",
"description": "Free-text search over each rule's label, value, and citation."
},
"limit": {
"type": "integer",
"description": "Max rules to return (default 200, max 500)."
},
"offset": {
"type": "integer",
"description": "Pagination offset — pass the previous response's next_offset."
},
"reason": {
"type": "string",
"description": "One sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional."
}
}
}
get_deadlines
Upcoming filing/payment deadlines and recurring filing rhythms (monthly VAT, quarterly instalments) for a country or US state, from the OpenAccountants tax calendar. Use it whenever the user asks 'when is X due', mentions a filing date, or when a heads-up about an imminent deadline would help. Signed-in users with a saved home jurisdiction can omit `jurisdiction` — it fills from their profile (the response marks jurisdiction_source accordingly).
Parameters2
jurisdiction
string
optional
ISO code, slug, or name ('MT', 'US-CA', 'Malta'). Optional for signed-in users with a saved home jurisdiction.
horizon_days
integer
optional
How far ahead to look (default 120, max 366).
Raw schema
{
"type": "object",
"properties": {
"jurisdiction": {
"type": "string",
"description": "ISO code, slug, or name ('MT', 'US-CA', 'Malta'). Optional for signed-in users with a saved home jurisdiction."
},
"horizon_days": {
"type": "integer",
"description": "How far ahead to look (default 120, max 366)."
}
}
}
list_rule_facets
Returns the metadata you can filter on with `search_rules` — the live jurisdictions, the domains, roles, block types (rule kinds), statuses, tax years, and a sample of topics — plus the defaults. Call this before `search_rules` to learn the valid filter values rather than guessing.
Parameters
No parameters.
Raw schema
{
"type": "object",
"properties": {}
}
start_help
No-argument front door — call this FIRST whenever a user asks 'how can you help me?', 'what can you do?', 'where do I start?', or otherwise opens vaguely (do NOT answer such questions by listing your tools or calling list_jurisdictions). For a signed-in approved accountant it returns a personalized `orientation` briefing (their standing + what their jurisdiction needs + one next action). For everyone else it returns the two scoping questions plus the available intents and jurisdictions. Once you have an intent, call `start(intent, jurisdiction)`.
Parameters
No parameters.
Raw schema
{
"type": "object",
"properties": {}
}
start
Front door for any tax / accounting question once you know what the user wants. `intent` is REQUIRED (e.g. 'taxes', 'VAT return', 'set up a company', 'find deductions', 'classify transactions', 'payroll'); pass a jurisdiction too (ISO 2-letter, e.g. 'MT', 'GB', 'US-CA'). If you don't yet have an intent, call `start_help` first. Returns either a clarification request (if jurisdiction is missing) or a ready-to-execute plan with the list of skills to load. Call this FIRST (after start_help if needed) whenever the user asks for tax help.
Parameters5
intent
string
required
User intent — REQUIRED. Free text, e.g. 'taxes', 'VAT return', 'set up a company'.
jurisdiction
string
optional
ISO 2-letter code or US state code (e.g. 'MT', 'GB', 'US-CA').
acting_as
string
required
REQUIRED. Who the user is: 'self' = a taxpayer handling their OWN taxes; 'client' = a professional (accountant/advisor) working on behalf of a CLIENT. Establish this before calling — if it isn't clear from the conversation, ask the user one short question ('Are these your own taxes, or are you helping a client?'). Never guess.
reason
string
optional
One sentence, in the user's own words, on what they actually asked for here — captured only to improve routing. E.g. 'user sold ETH and wants to know what to report'. Optional but helpful.
taxpayer_type
string
optional
The taxpayer's occupation, when known. Some return-prep workflows fork by it (an employee's Form 1040 is a different guide from a freelancer's). Pass it if the conversation already makes it clear; otherwise omit — start() only asks for it (status:'needs_clarification', needs:['taxpayer_type']) when the guides for this jurisdiction/intent genuinely split by occupation. 'employee' = W-2 wages only; 'self-employed' = freelance / 1099 / sole-proprietor; 'both' = employed AND self-employed; 'company' = a corporate entity. Don't guess — ask the user one short question if unsure.
Raw schema
{
"type": "object",
"properties": {
"intent": {
"type": "string",
"description": "User intent — REQUIRED. Free text, e.g. 'taxes', 'VAT return', 'set up a company'."
},
"jurisdiction": {
"type": "string",
"description": "ISO 2-letter code or US state code (e.g. 'MT', 'GB', 'US-CA')."
},
"acting_as": {
"type": "string",
"enum": [
"self",
"client"
],
"description": "REQUIRED. Who the user is: 'self' = a taxpayer handling their OWN taxes; 'client' = a professional (accountant/advisor) working on behalf of a CLIENT. Establish this before calling — if it isn't clear from the conversation, ask the user one short question ('Are these your own taxes, or are you helping a client?'). Never guess."
},
"reason": {
"type": "string",
"description": "One sentence, in the user's own words, on what they actually asked for here — captured only to improve routing. E.g. 'user sold ETH and wants to know what to report'. Optional but helpful."
},
"taxpayer_type": {
"type": "string",
"enum": [
"employee",
"self-employed",
"both",
"company",
"other"
],
"description": "The taxpayer's occupation, when known. Some return-prep workflows fork by it (an employee's Form 1040 is a different guide from a freelancer's). Pass it if the conversation already makes it clear; otherwise omit — start() only asks for it (status:'needs_clarification', needs:['taxpayer_type']) when the guides for this jurisdiction/intent genuinely split by occupation. 'employee' = W-2 wages only; 'self-employed' = freelance / 1099 / sole-proprietor; 'both' = employed AND self-employed; 'company' = a corporate entity. Don't guess — ask the user one short question if unsure."
}
},
"required": [
"intent",
"acting_as"
]
}
list_jurisdictions
Returns every jurisdiction with published skills — countries (ISO 2), US states (US-XX), Canadian provinces — with skill counts, accountant-verified counts, and named lead verifier. Use when the user asks 'which countries does OpenAccountants cover?' or 'what's available for [country]?' Avoids paginating through list_skills to compute this.
Parameters
No parameters.
Raw schema
{
"type": "object",
"properties": {}
}
list_verifiers
Returns named licensed accountants who have signed off on OpenAccountants jurisdictions. Use ONLY when the user explicitly asks to see the verifier network or 'who verified this skill'. Do NOT use this to check whether a jurisdiction is covered before calling request_accountant_review — just call request_accountant_review directly, it routes to the right person regardless.
Parameters1
jurisdiction
string
optional
Optional ISO code filter — only return verifiers for this jurisdiction.
Raw schema
{
"type": "object",
"properties": {
"jurisdiction": {
"type": "string",
"description": "Optional ISO code filter — only return verifiers for this jurisdiction."
}
}
}
validate_vat_number
Check whether a business's VAT / tax-registration number is real and registered, in real time against the official government registry — and return the registered business NAME and ADDRESS when the authority discloses them. This is an authoritative, unfakeable confirmation you cannot get from a knowledge lookup or from training data. Use it whenever a user wants to verify a supplier's or customer's tax ID: before applying a B2B reverse charge, zero-rating a cross-border sale, or onboarding a vendor. COVERAGE TODAY IS EU ONLY — the 27 EU member states plus 'XI' (Northern Ireland), live via the European Commission's VIES registry (use 'EL' for Greece). Other jurisdictions (e.g. UK/HMRC and beyond) are NOT supported yet but are on the roadmap — for a non-EU number, tell the user live validation isn't available for that country yet rather than guessing a verdict. This is a LIVE external lookup — if the registry is temporarily unavailable it says so plainly rather than inventing an answer.
Parameters2
country_code
string
optional
2-letter EU member-state code of the VAT number, e.g. 'DE', 'IE', 'FR'. Use 'EL' for Greece and 'XI' for Northern Ireland. May be omitted if the country prefix is already part of vat_number.
vat_number
string
required
The VAT number, with or without the country prefix and spaces, e.g. 'IE6388047V', 'IE 6388047V', or '6388047V'.
Raw schema
{
"type": "object",
"properties": {
"country_code": {
"type": "string",
"description": "2-letter EU member-state code of the VAT number, e.g. 'DE', 'IE', 'FR'. Use 'EL' for Greece and 'XI' for Northern Ireland. May be omitted if the country prefix is already part of vat_number."
},
"vat_number": {
"type": "string",
"description": "The VAT number, with or without the country prefix and spaces, e.g. 'IE6388047V', 'IE 6388047V', or '6388047V'."
}
},
"required": [
"vat_number"
]
}
check_audit_exemption
DETERMINISTIC check of whether a private limited company qualifies for statutory audit exemption, from aggregate figures any ledger can provide (turnover, balance sheet total, average employees). Returns a determination ('exempt' | 'review' | 'audit_required' | 'cannot_determine'), the per-criterion threshold table showing exactly why, the canonical rule citation it rests on, and the LIVE verification envelope (whether a named accountant has attested the thresholds — surface that status prominently; 'draft' means treat as a source-cited draft). COVERAGE TODAY: MT (Article 185(2) micro thresholds) and GB (small-company thresholds, both pre and post 6 April 2025 eras). Most exemption regimes are two-consecutive-years tests, so pass prior_year figures when available — without them a qualifying year returns 'review', not 'exempt'; that is correct behaviour, not an error. 'cannot_determine' is a first-class outcome (unsupported jurisdiction, wrong currency, entity shapes needing judgment, or the cited fact changed since calibration). Never override the determination with training-data thresholds.
Parameters9
jurisdiction
string
required
ISO-style code. MT and GB supported today.
financial_year_end
string
required
ISO date the financial year ends, e.g. '2025-12-31'.
turnover
number
required
Revenue/turnover for the year, in the jurisdiction's currency.
balance_sheet_total
number
required
Total assets at the balance sheet date.
employees_average
number
required
Average number of employees during the year.
currency
string
required
Currency of the figures — must match the regime (EUR for MT, GBP for GB); convert first, never guess a rate.
entity_type
string
optional
Optional. 'private_ltd' (default), 'plc', 'branch'. Non-private shapes route to a human.
group_member
boolean
optional
Optional. True if the company is part of a group — group thresholds need a reviewer, so this forces 'review'.
prior_year
object
optional
Prior-year figures for the two-consecutive-years test.
Raw schema
{
"type": "object",
"properties": {
"jurisdiction": {
"type": "string",
"description": "ISO-style code. MT and GB supported today."
},
"financial_year_end": {
"type": "string",
"description": "ISO date the financial year ends, e.g. '2025-12-31'."
},
"turnover": {
"type": "number",
"description": "Revenue/turnover for the year, in the jurisdiction's currency."
},
"balance_sheet_total": {
"type": "number",
"description": "Total assets at the balance sheet date."
},
"employees_average": {
"type": "number",
"description": "Average number of employees during the year."
},
"currency": {
"type": "string",
"description": "Currency of the figures — must match the regime (EUR for MT, GBP for GB); convert first, never guess a rate."
},
"entity_type": {
"type": "string",
"description": "Optional. 'private_ltd' (default), 'plc', 'branch'. Non-private shapes route to a human."
},
"group_member": {
"type": "boolean",
"description": "Optional. True if the company is part of a group — group thresholds need a reviewer, so this forces 'review'."
},
"prior_year": {
"type": "object",
"description": "Prior-year figures for the two-consecutive-years test.",
"properties": {
"turnover": {
"type": "number"
},
"balance_sheet_total": {
"type": "number"
},
"employees_average": {
"type": "number"
}
}
}
},
"required": [
"jurisdiction",
"financial_year_end",
"turnover",
"balance_sheet_total",
"employees_average",
"currency"
]
}
share_with_openaccountants
THE one outbound channel — the single place ALL feedback and any review go. OpenAccountants' goal is to give good information and GATHER intelligence to improve it; human review is an OPTIONAL extra the user can take if they want it. At your closing, make ONE warm offer AND give the user a short trigger to reply with (never make them type a long sentence): "Want me to send this back to OpenAccountants to help improve the guidance? It's anonymous — just say 'send it'. Or if you'd like [the reviewing Partner] to review your actual figures before you file, say 'review it'." Then call this ONCE. What it carries: (1) `note` — an anonymized improvement DIFF (the DEFAULT, low-friction ask): what the loaded guidance covered vs what YOU had to ADD or work around and why (e.g. 'workflow didn't cover the disposal side', 'us-sales-tax wasn't surfaced', 'no state rate for X'). Send whenever the user agrees to help — especially if you augmented. (2) `skill_slug` (optional) — set it when the note is a bug in a SPECIFIC skill ('the rate in us-sales-tax looks outdated'); this replaces the old submit_feedback. (3) OPTIONAL review — set `request_review: true` ONLY if the user WANTS a licensed Partner to check their real numbers, and then also pass `working_paper` (COMPLETE), `jurisdiction`, `scenario`, `contact_email` (ask first). It saves to the user's own queue + returns a booking link; nothing is sent to an accountant until they engage; the professional review is a paid engagement (never say it's free). Review is NEVER mandatory or auto-routed — only when the user asks for it. ANONYMIZE the note hard: NO names, amounts, or PII. Do NOT use any other tool for feedback or review — everything goes through here.
Parameters9
note
string
required
Anonymized improvement note/DIFF: what the guidance covered vs what you ADDED or worked around and WHY, OR a bug in a specific skill. No names, amounts, or PII. Send whenever the user agrees to help improve.
skill_slug
string
optional
Optional: set when the note is feedback about a SPECIFIC skill (e.g. 'us-sales-tax'). Replaces the old submit_feedback.
request_review
boolean
optional
true ONLY if the user WANTS a licensed Partner to review their actual figures. Never mandatory. Requires working_paper + jurisdiction + scenario + contact_email. Omit/false = just the note.
jurisdiction
string
optional
Review only: ISO code or slug for the user's tax jurisdiction (e.g. 'US-CA').
scenario
string
optional
Review only: brief description of the situation to review.
contact_email
string
optional
Review only, REQUIRED when request_review: the user's email. Ask for it first.
contact_name
string
optional
Review only: the user's name.
tax_year
integer
optional
Review only: tax year, if relevant.
working_paper
string
optional
Review only: the COMPLETE working paper markdown — every line item and assumption, not a summary.
Raw schema
{
"type": "object",
"properties": {
"note": {
"type": "string",
"description": "Anonymized improvement note/DIFF: what the guidance covered vs what you ADDED or worked around and WHY, OR a bug in a specific skill. No names, amounts, or PII. Send whenever the user agrees to help improve."
},
"skill_slug": {
"type": "string",
"description": "Optional: set when the note is feedback about a SPECIFIC skill (e.g. 'us-sales-tax'). Replaces the old submit_feedback."
},
"request_review": {
"type": "boolean",
"description": "true ONLY if the user WANTS a licensed Partner to review their actual figures. Never mandatory. Requires working_paper + jurisdiction + scenario + contact_email. Omit/false = just the note."
},
"jurisdiction": {
"type": "string",
"description": "Review only: ISO code or slug for the user's tax jurisdiction (e.g. 'US-CA')."
},
"scenario": {
"type": "string",
"description": "Review only: brief description of the situation to review."
},
"contact_email": {
"type": "string",
"description": "Review only, REQUIRED when request_review: the user's email. Ask for it first."
},
"contact_name": {
"type": "string",
"description": "Review only: the user's name."
},
"tax_year": {
"type": "integer",
"description": "Review only: tax year, if relevant."
},
"working_paper": {
"type": "string",
"description": "Review only: the COMPLETE working paper markdown — every line item and assumption, not a summary."
}
},
"required": [
"note"
]
}
Open-source Tax Guides your AI can cite — reviewed by named, licensed accountants.
Every AI can do tax math. None of them can stand behind an answer. Here, real accountants put their name, credential and review date on the Guides your AI reads — publicly, on the record, in this repo.
Then ask a question your AI would otherwise guess at:
"What's the combined sales tax rate in Manatee County, Florida for 2026?"
Without OpenAccountants, models answer from training data. With it, the answer cites the current Guide — and names the accountant who reviewed it.
code
You: "I'm a freelancer in South Africa. What do I owe?"
↓ loads za-income-tax, za-provisional-tax
AI: ITR12 working paper · IRP6 provisional schedule
Medical credits · Retirement annuity deduction
─────────────────────────────────────────
Reviewed by Werner Britz CA(SA)
Prefer self-hosting or manual files?
pip MCP server:pip install openaccountants-mcp (mirrors this repo's packages/)
Manual: download your jurisdiction's folder from packages/ and upload the files to your AI. Start with your country's main package; index.json is the machine-readable inventory.
Two states, greppable honesty
Every Guide is in exactly one state — and the repo greps honestly:
State
Meaning
Accountant-reviewed
A named, licensed accountant reviewed the complete Guide. Their name is in the frontmatter (reviewed_by:) and on the public roster
Source-cited draft
Written from primary legislation, every figure cited to its source — not yet professionally reviewed
⚠️ General reference, not advice. Guides may be incomplete, outdated, or wrong for your facts. Have a qualified professional review outputs before filing, payment, or action.
Are you an accountant?
Your name on the tax knowledge AI actually uses — with attribution built in:
Build a Guide for the work you know cold: openaccountants.com/skills/new. It publishes credited to you, and lands in this repo under your name.
Review a Guide in your jurisdiction — your name, credential and review date go on it, here and on every AI answer that cites it.
Set your GitHub username in your profile and your platform edits are committed to this repo as you — your contribution graph reflects your work.
The current roster: VERIFIERS.md (generated nightly from the platform).
How it stays accurate
A tax library is only as good as its worst stale number, so machines re-check this one
every night:
The maths check re-reads every guide and flags sums that do not add up, tax bands
with gaps, totals that do not total, and years that disagree.
The source watch visits the official pages the figures came from and raises a hand
when a page changes.
The refresh engine re-derives the stalest guides from official sources on a fixed
monthly budget, refusing to publish any figure without a link.
The nightly exam tests whether AIs actually said what the guides say that day, or
improvised. Improvisation gets caught, counted and fixed at the source.
The sync runs both ways: platform edits land here as commits under the author's own name,
and merged PRs here flow back into what every AI serves, credited to you. A guide with an
accountant's byline never changes without that accountant's one-click approval.
Independent, open-source review aids and calculation tools that complement the OpenAccountants guide library:
payday-super-checker (MIT) — Verifies superannuation contributions against Australian Payday Super deadlines (in force since 1 July 2026) and estimates SG charge exposure on late payments, with all workings and statutory assumptions disclosed.
div7a-loan-review (MIT) — Reviews Division 7A loan terms and minimum yearly repayments against the ATO benchmark interest rate, with fabricated inputs and explicit refusal boundaries.
xero-trial-balance-export (MIT) — Exports a Xero trial balance to CSV only when month-movement and YTD column pairs both balance exactly.
ato-benchmark-compare (MIT) — Evaluates business P&L statements locally against the Australian Taxation Office (ATO) small business performance benchmarks, surfacing variance flags and ratio analyses.
(External tools provide computational review assistance and do not constitute tax or legal advice.)