Skip to main content
Glama
ryanduguid

Australian Accounting MCP

Compare figures to ATO benchmarks

get_ato_benchmarks
Read-onlyIdempotent

Compare your business expense buckets and turnover against ATO small-business benchmark ratios and ranges to identify figures that fall outside the ATO's published ranges.

Instructions

Compare bucket totals against ATO small-business benchmarks.

Every amount is an AUD decimal string such as "1000.00": finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use "0.00" only for an established zero. industry is an ATO business-type name (see list_ato_benchmark_industries). other_income is needed for any ratio: the ATO turnover rule reads it to choose the denominator, so without it every ratio is not_supplied. Pass 0 only where the operator established the business has no other income. This is a comparison, not a finding that anything is wrong. Supply at least one expense bucket; omitted buckets remain not_supplied, never evidenced zeros. Returns ratios, ranges, source citations and warnings from ato-benchmark-compare. Runs locally with no network, writes or lodgements. Not tax advice.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
w1NoActivity statement W1 total for the same period; used by the engine when greater than the reconstructed salary and wages label. Supply associated_persons too.
rentNoBusiness rent expenses for the comparison period.
yearNoBenchmark dataset year in YYYY-YY form, e.g. "2023-24". Omit or null selects the latest shipped dataset, not a live ATO lookup.
industryYesATO business-type name returned by list_ato_benchmark_industries. Select an industry before comparing figures.
turnoverYesSales of goods and services, excluding other income.
other_incomeNoNon-sales business income, e.g. interest or grants. Required to establish any ratio denominator.
salary_wagesNoSalary and wages outside cost of sales, excluding separately bucketed payments to associated persons.
cost_of_salesNoCost of sales excluding salary and wages; put that labour in cost_of_sales_labour.
motor_vehicleNoBusiness motor vehicle expenses for the comparison period.
other_expenseNoOther expenses, including superannuation and depreciation; exclude amounts already in another bucket and income tax expense.
associated_personsNoPayments to associated persons, kept separate from salary/wage buckets to avoid double counting. Needed for labour comparison when w1 is supplied.
cost_of_sales_labourNoSalary and wages within cost of sales, excluding separately bucketed payments to associated persons.
contractor_commissionNoContractor, subcontractor and commission expenses.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
okYesThe review ran; this does not mean compliance or a known verdict.
notesYesDataset and missing-fact explanations.
engineYesDelegated distribution that produced this result.
ratiosYesComparisons, including unevidenced ratios.
sourceYesUnmodified engine source metadata and review provenance.
figuresYesEngine figures; unevidenced totals are null.
turnoverYesEngine decimal string, or null when unavailable; null is not zero.
key_ratioYesSelected ATO key-ratio identifier.
disclaimerYesEngine limitations on using benchmark comparisons.
bucket_totalsYesBucket amounts; omitted inputs remain null.
business_typeYesSelected ATO industry name.
turnover_bandYesSelected dataset band and label, or null if unavailable.
benchmark_yearYesIncome or dataset year in YYYY-YY form.
checks_to_makeYesSuggested human checks, not findings of wrongdoing.
engine_versionYesInstalled version of that engine.
turnover_basisYesEngine denominator basis; null if unestablished.
omitted_bucketsYesBuckets not supplied; never evidence of zero.
complete_bucketsYesWhether all required expense buckets were supplied.
supplied_bucketsYesBuckets explicitly supplied by the operator.
unreviewed_accountsYesUnknown: this tool receives totals, not an account ledger.
industry_page_sourceYesThe ATO industry page behind any ato_industry_page range in the selected band (address, QC reference, retrieval date, text digest, reuse terms), or null.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changedv0.1.22
    • addedInput schema / properties / associated_persons / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
    • addedInput schema / properties / contractor_commission / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
    • addedInput schema / properties / cost_of_sales / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
    • addedInput schema / properties / cost_of_sales_labour / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
    • addedInput schema / properties / motor_vehicle / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
    • addedInput schema / properties / other_expense / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
    • addedInput schema / properties / other_income / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
    • addedInput schema / properties / rent / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
    • addedInput schema / properties / salary_wages / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
    • addedInput schema / properties / turnover / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
    • addedInput schema / properties / w1 / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
  2. Changed4 schema fields changedv0.1.21
    • addedOutput schema / $defs / BenchmarkRatio / properties / benchmark_source
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Where the range came from: ato_dataset, or ato_industry_page for an ATO other benchmark that is a guide only and never the key ratio; null without a range.",
      +  "title": "Benchmark Source"
      +}
    • changedOutput schema / $defs / BenchmarkRatio / required
      Previous value: -[
      -  "ratio",
      -  "label",
      -  "value",
      -  "percent",
      -  "benchmark_min",
      -  "benchmark_max",
      -  "status",
      -  "is_key_ratio"
      -]New value: +[
      +  "ratio",
      +  "label",
      +  "value",
      +  "percent",
      +  "benchmark_min",
      +  "benchmark_max",
      +  "status",
      +  "is_key_ratio",
      +  "benchmark_source"
      +]
    • addedOutput schema / properties / industry_page_source
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The ATO industry page behind any ato_industry_page range in the selected band (address, QC reference, retrieval date, text digest, reuse terms), or null.",
      +  "title": "Industry Page Source"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "ok",
      -  "engine",
      -  "engine_version",
      -  "benchmark_year",
      -  "business_type",
      -  "key_ratio",
      -  "turnover",
      -  "turnover_basis",
      -  "turnover_band",
      -  "figures",
      -  "bucket_totals",
      -  "ratios",
      -  "unreviewed_accounts",
      -  "notes",
      -  "checks_to_make",
      -  "source",
      -  "disclaimer",
      -  "supplied_buckets",
      -  "omitted_buckets",
      -  "complete_buckets"
      -]New value: +[
      +  "ok",
      +  "engine",
      +  "engine_version",
      +  "benchmark_year",
      +  "business_type",
      +  "key_ratio",
      +  "turnover",
      +  "turnover_basis",
      +  "turnover_band",
      +  "figures",
      +  "bucket_totals",
      +  "ratios",
      +  "unreviewed_accounts",
      +  "notes",
      +  "checks_to_make",
      +  "source",
      +  "industry_page_source",
      +  "disclaimer",
      +  "supplied_buckets",
      +  "omitted_buckets",
      +  "complete_buckets"
      +]
  3. Changed6 schema fields changedv0.1.15
    • changedInput schema / properties / associated_persons / description
      Previous value: -"Payments to associated persons, kept separate from salary/wage buckets to avoid doublecounting. Needed for labour comparison when w1 is supplied."New value: +"Payments to associated persons, kept separate from salary/wage buckets to avoid double counting. Needed for labour comparison when w1 is supplied."
    • changedInput schema / properties / cost_of_sales_labour / description
      Previous value: -"Salary and wages within cost of sales, excluding separately bucketed payments toassociated persons."New value: +"Salary and wages within cost of sales, excluding separately bucketed payments to associated persons."
    • changedInput schema / properties / other_expense / description
      Previous value: -"Other expenses, including superannuation and depreciation; exclude amounts already inanother bucket and income tax expense."New value: +"Other expenses, including superannuation and depreciation; exclude amounts already in another bucket and income tax expense."
    • changedInput schema / properties / other_income / description
      Previous value: -"Non-sales business income, e.g. interest or grants. Required to establish any ratiodenominator."New value: +"Non-sales business income, e.g. interest or grants. Required to establish any ratio denominator."
    • changedInput schema / properties / salary_wages / description
      Previous value: -"Salary and wages outside cost of sales, excluding separately bucketed payments toassociated persons."New value: +"Salary and wages outside cost of sales, excluding separately bucketed payments to associated persons."
    • changedInput schema / properties / w1 / description
      Previous value: -"Activity statement W1 total for the same period; used by the engine when greater thanthe reconstructed salary and wages label. Supply associated_persons too."New value: +"Activity statement W1 total for the same period; used by the engine when greater than the reconstructed salary and wages label. Supply associated_persons too."
  4. Changed24 schema fields changedv0.1.13
    • changedInput schema / properties / associated_persons / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / associated_persons / description
      Previous value: -"Payments to associated persons, kept separate from salary/wage buckets to avoid double counting. Needed for labour comparison when w1 is supplied. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."New value: +"Payments to associated persons, kept separate from salary/wage buckets to avoid doublecounting. Needed for labour comparison when w1 is supplied."
    • changedInput schema / properties / contractor_commission / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / contractor_commission / description
      Previous value: -"Contractor, subcontractor and commission expenses. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."New value: +"Contractor, subcontractor and commission expenses."
    • changedInput schema / properties / cost_of_sales / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / cost_of_sales / description
      Previous value: -"Cost of sales excluding salary and wages; put that labour in cost_of_sales_labour. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."New value: +"Cost of sales excluding salary and wages; put that labour in cost_of_sales_labour."
    • changedInput schema / properties / cost_of_sales_labour / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / cost_of_sales_labour / description
      Previous value: -"Salary and wages within cost of sales, excluding separately bucketed payments to associated persons. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."New value: +"Salary and wages within cost of sales, excluding separately bucketed payments toassociated persons."
    • addedInput schema / properties / industry / maxLength
      Added value: +120
    • changedInput schema / properties / motor_vehicle / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / motor_vehicle / description
      Previous value: -"Business motor vehicle expenses for the comparison period. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."New value: +"Business motor vehicle expenses for the comparison period."
    • changedInput schema / properties / other_expense / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / other_expense / description
      Previous value: -"Other expenses, including superannuation and depreciation; exclude amounts already in another bucket and income tax expense. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."New value: +"Other expenses, including superannuation and depreciation; exclude amounts already inanother bucket and income tax expense."
    • changedInput schema / properties / other_income / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / other_income / description
      Previous value: -"Non-sales business income, e.g. interest or grants. Required to establish any ratio denominator. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."New value: +"Non-sales business income, e.g. interest or grants. Required to establish any ratiodenominator."
    • changedInput schema / properties / rent / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / rent / description
      Previous value: -"Business rent expenses for the comparison period. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."New value: +"Business rent expenses for the comparison period."
    • changedInput schema / properties / salary_wages / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / salary_wages / description
      Previous value: -"Salary and wages outside cost of sales, excluding separately bucketed payments to associated persons. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."New value: +"Salary and wages outside cost of sales, excluding separately bucketed payments toassociated persons."
    • changedInput schema / properties / turnover / description
      Previous value: -"Sales of goods and services, excluding other income. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00."New value: +"Sales of goods and services, excluding other income."
    • addedInput schema / properties / turnover / maxLength
      Added value: +60
    • changedInput schema / properties / w1 / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / w1 / description
      Previous value: -"Activity statement W1 total for the same period; used by the engine when greater than the reconstructed salary and wages label. Supply associated_persons too. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."New value: +"Activity statement W1 total for the same period; used by the engine when greater thanthe reconstructed salary and wages label. Supply associated_persons too."
    • changedInput schema / properties / year / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 7,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  5. Changed1 schema field changedv0.1.10
    • addedInput schema / additionalProperties
      Added value: +false
  6. Changed4 schema fields changedv0.1.8
    • addedOutput schema / $defs
      Added value: +{
      +  "BenchmarkRatio": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "benchmark_max": {
      +        "anyOf": [
      +          {
      +            "description": "Finite engine decimal string, including exponent notation; retain its precision.",
      +            "pattern": "^[+-]?(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Engine decimal string, or null when unavailable; null is not zero.",
      +        "title": "Benchmark Max"
      +      },
      +      "benchmark_min": {
      +        "anyOf": [
      +          {
      +            "description": "Finite engine decimal string, including exponent notation; retain its precision.",
      +            "pattern": "^[+-]?(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Engine decimal string, or null when unavailable; null is not zero.",
      +        "title": "Benchmark Min"
      +      },
      +      "is_key_ratio": {
      +        "description": "Whether this is the selected ATO key ratio.",
      +        "title": "Is Key Ratio",
      +        "type": "boolean"
      +      },
      +      "label": {
      +        "description": "Human-readable ratio name.",
      +        "title": "Label",
      +        "type": "string"
      +      },
      +      "percent": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Formatted percentage, or null if unavailable.",
      +        "title": "Percent"
      +      },
      +      "ratio": {
      +        "description": "Ratio identifier.",
      +        "title": "Ratio",
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Engine comparison status; not_supplied means facts do not establish the ratio.",
      +        "title": "Status",
      +        "type": "string"
      +      },
      +      "value": {
      +        "anyOf": [
      +          {
      +            "description": "Finite engine decimal string, including exponent notation; retain its precision.",
      +            "pattern": "^[+-]?(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Engine decimal string, or null when unavailable; null is not zero.",
      +        "title": "Value"
      +      }
      +    },
      +    "required": [
      +      "ratio",
      +      "label",
      +      "value",
      +      "percent",
      +      "benchmark_min",
      +      "benchmark_max",
      +      "status",
      +      "is_key_ratio"
      +    ],
      +    "title": "BenchmarkRatio",
      +    "type": "object"
      +  }
      +}
    • addedOutput schema / properties
      Added value: +{
      +  "benchmark_year": {
      +    "description": "Income or dataset year in YYYY-YY form.",
      +    "pattern": "^[0-9]{4}-[0-9]{2}$",
      +    "title": "Benchmark Year",
      +    "type": "string"
      +  },
      +  "bucket_totals": {
      +    "additionalProperties": {
      +      "anyOf": [
      +        {
      +          "description": "Finite engine decimal string, including exponent notation; retain its precision.",
      +          "pattern": "^[+-]?(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$",
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Engine decimal string, or null when unavailable; null is not zero."
      +    },
      +    "description": "Bucket amounts; omitted inputs remain null.",
      +    "title": "Bucket Totals",
      +    "type": "object"
      +  },
      +  "business_type": {
      +    "description": "Selected ATO industry name.",
      +    "title": "Business Type",
      +    "type": "string"
      +  },
      +  "checks_to_make": {
      +    "description": "Suggested human checks, not findings of wrongdoing.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "title": "Checks To Make",
      +    "type": "array"
      +  },
      +  "complete_buckets": {
      +    "description": "Whether all required expense buckets were supplied.",
      +    "title": "Complete Buckets",
      +    "type": "boolean"
      +  },
      +  "disclaimer": {
      +    "description": "Engine limitations on using benchmark comparisons.",
      +    "title": "Disclaimer",
      +    "type": "string"
      +  },
      +  "engine": {
      +    "description": "Delegated distribution that produced this result.",
      +    "title": "Engine",
      +    "type": "string"
      +  },
      +  "engine_version": {
      +    "description": "Installed version of that engine.",
      +    "title": "Engine Version",
      +    "type": "string"
      +  },
      +  "figures": {
      +    "additionalProperties": {
      +      "anyOf": [
      +        {
      +          "description": "Finite engine decimal string, including exponent notation; retain its precision.",
      +          "pattern": "^[+-]?(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$",
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Engine decimal string, or null when unavailable; null is not zero."
      +    },
      +    "description": "Engine figures; unevidenced totals are null.",
      +    "title": "Figures",
      +    "type": "object"
      +  },
      +  "key_ratio": {
      +    "description": "Selected ATO key-ratio identifier.",
      +    "title": "Key Ratio",
      +    "type": "string"
      +  },
      +  "notes": {
      +    "description": "Dataset and missing-fact explanations.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "title": "Notes",
      +    "type": "array"
      +  },
      +  "ok": {
      +    "const": true,
      +    "description": "The review ran; this does not mean compliance or a known verdict.",
      +    "title": "Ok",
      +    "type": "boolean"
      +  },
      +  "omitted_buckets": {
      +    "description": "Buckets not supplied; never evidence of zero.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "title": "Omitted Buckets",
      +    "type": "array"
      +  },
      +  "ratios": {
      +    "description": "Comparisons, including unevidenced ratios.",
      +    "items": {
      +      "$ref": "#/$defs/BenchmarkRatio"
      +    },
      +    "title": "Ratios",
      +    "type": "array"
      +  },
      +  "source": {
      +    "additionalProperties": true,
      +    "description": "Unmodified engine source metadata and review provenance.",
      +    "title": "Source",
      +    "type": "object"
      +  },
      +  "supplied_buckets": {
      +    "description": "Buckets explicitly supplied by the operator.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "title": "Supplied Buckets",
      +    "type": "array"
      +  },
      +  "turnover": {
      +    "anyOf": [
      +      {
      +        "description": "Finite engine decimal string, including exponent notation; retain its precision.",
      +        "pattern": "^[+-]?(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$",
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "description": "Engine decimal string, or null when unavailable; null is not zero.",
      +    "title": "Turnover"
      +  },
      +  "turnover_band": {
      +    "anyOf": [
      +      {
      +        "additionalProperties": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "description": "Selected dataset band and label, or null if unavailable.",
      +    "title": "Turnover Band"
      +  },
      +  "turnover_basis": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "description": "Engine denominator basis; null if unestablished.",
      +    "title": "Turnover Basis"
      +  },
      +  "unreviewed_accounts": {
      +    "description": "Unknown: this tool receives totals, not an account ledger.",
      +    "title": "Unreviewed Accounts",
      +    "type": "null"
      +  }
      +}
    • addedOutput schema / required
      Added value: +[
      +  "ok",
      +  "engine",
      +  "engine_version",
      +  "benchmark_year",
      +  "business_type",
      +  "key_ratio",
      +  "turnover",
      +  "turnover_basis",
      +  "turnover_band",
      +  "figures",
      +  "bucket_totals",
      +  "ratios",
      +  "unreviewed_accounts",
      +  "notes",
      +  "checks_to_make",
      +  "source",
      +  "disclaimer",
      +  "supplied_buckets",
      +  "omitted_buckets",
      +  "complete_buckets"
      +]
    • changedOutput schema / title
      Previous value: -"get_ato_benchmarksDictOutput"New value: +"BenchmarkComparison"
  7. Changed13 schema fields changedv0.1.7
    • addedInput schema / properties / associated_persons / description
      Added value: +"Payments to associated persons, kept separate from salary/wage buckets to avoid double counting. Needed for labour comparison when w1 is supplied. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."
    • addedInput schema / properties / contractor_commission / description
      Added value: +"Contractor, subcontractor and commission expenses. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."
    • addedInput schema / properties / cost_of_sales / description
      Added value: +"Cost of sales excluding salary and wages; put that labour in cost_of_sales_labour. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."
    • addedInput schema / properties / cost_of_sales_labour / description
      Added value: +"Salary and wages within cost of sales, excluding separately bucketed payments to associated persons. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."
    • addedInput schema / properties / industry / description
      Added value: +"ATO business-type name returned by list_ato_benchmark_industries. Select an industry before comparing figures."
    • addedInput schema / properties / motor_vehicle / description
      Added value: +"Business motor vehicle expenses for the comparison period. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."
    • addedInput schema / properties / other_expense / description
      Added value: +"Other expenses, including superannuation and depreciation; exclude amounts already in another bucket and income tax expense. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."
    • addedInput schema / properties / other_income / description
      Added value: +"Non-sales business income, e.g. interest or grants. Required to establish any ratio denominator. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."
    • addedInput schema / properties / rent / description
      Added value: +"Business rent expenses for the comparison period. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."
    • addedInput schema / properties / salary_wages / description
      Added value: +"Salary and wages outside cost of sales, excluding separately bucketed payments to associated persons. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."
    • addedInput schema / properties / turnover / description
      Added value: +"Sales of goods and services, excluding other income. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00."
    • addedInput schema / properties / w1 / description
      Added value: +"Activity statement W1 total for the same period; used by the engine when greater than the reconstructed salary and wages label. Supply associated_persons too. AUD decimal string, e.g. \"1000.00\"; finite, at most 2 decimal places, absolute value at most 1000000000000.00. Omit or null means not supplied; use \"0.00\" only for an established zero."
    • addedInput schema / properties / year / description
      Added value: +"Benchmark dataset year in YYYY-YY form, e.g. \"2023-24\". Omit or null selects the latest shipped dataset, not a live ATO lookup."
  8. First observedv0.1.6

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive and closed-world. The description adds genuine behavioral context beyond them: runs locally with no network/writes/lodgements, is a comparison not a finding of error, omitted buckets stay not_supplied rather than becoming evidenced zeros, and it disclaims tax advice.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and safety are front-loaded, then a dense block of semantics. Every sentence carries a distinct operational rule with no filler, despite the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter, 2-required comparison tool with an output schema, the description supplies the input semantics, ratio preconditions, and safety/write disclosure an agent needs. Return values are handled by the output schema, so no gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3), and the description goes further: it defines the AUD decimal-string format and bounds, the omit-vs-'0.00' distinction, the other_income denominator rule for ratios, and the w1/associated_persons labour linkage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Compare bucket totals against ATO small-business benchmarks') and explicitly names the sibling list_ato_benchmark_industries as the prerequisite for the industry name, so it is distinguishable from neighbors without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear conditional guidance: select an industry first, other_income is required for any ratio and without it ratios are not_supplied, and at least one expense bucket must be supplied. It does not, however, contrast itself against other analysis siblings (e.g. benchmark-rate tools), so it falls short of explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.