Skip to main content
Glama
Australian Accounting MCP

Australian Accounting MCP

Review a Division 7A loan

review_div7a_loan
Read-onlyIdempotent

Reviews an amalgamated Division 7A loan by running the s 109N gate and s 109E minimum yearly repayment, returning verdicts, reasons and caveats with unknowns left UNKNOWN.

Instructions

Review one operator-supplied amalgamated Division 7A loan.

The tool runs the s 109N gate and then the s 109E minimum yearly repayment. Unknown facts may be omitted or passed as null; they remain UNKNOWN and are never coerced to false or zero. Rates are decimal strings. Amounts are AUD decimal strings such as "1000.00": finite, at most 2 decimal places, absolute value at most 1000000000000.00; omit or null means not supplied, and "0.00" is only for an established zero. response_detail defaults to summary; pass full for the complete engine audit. Returns gate and repayment verdicts, reasons and caveats. Use get_div7a_benchmark_rate for rate-only lookups; unsupported matters remain refused by refuse_div7a. This tool does not form amalgamated loans or classify payments under s 109R. Runs locally with no network, writes or lodgements. Experimental review aid, not a tax determination or advice.

Input Schema

NameRequiredDescriptionDefault
loan_idNoOperator loan reference echoed in the result; defaults to "mcp-div7a-1". No loan record is looked up or written.mcp-div7a-1
year_loan_madeNoIncome year the loan was made, YYYY-YY, e.g. "2024-25". Omit or null if unknown.
year_of_incomeYesIncome year being reviewed, YYYY-YY, e.g. "2025-26". Years outside the engine reviewed rate table return UNKNOWN.
response_detailNo"summary" (default) returns the concise result; "full" includes the complete engine audit and provenance.summary
written_agreementNoWhether the loan agreement is in writing. Omit or null means UNKNOWN, not false.
maximum_term_yearsNoActual agreed loan term in years as a decimal string, e.g. "7"; not the statutory maximum. Omit or null if unknown.
remaining_term_yearsNoRemaining statutory term for the supplied amalgamated loan, as a decimal string. The engine rounds fractional years up. Omit or null if unknown.
security_coverage_at_first_madeNoProperty market value less prior secured liabilities, divided by the loan at inception; decimal ratio, e.g. "1.10" means 110%. Omit or null if unknown.
payments_applied_during_the_yearNoAmount the operator establishes as applied during the income year. The tool does not classify payments under s 109R; omit if not established.
terms_in_place_before_lodgment_dayNoOperator assertion that terms were in place before the relevant lodgment day. The engine does not compute that day. Omit or null if unknown.
interest_rate_for_years_after_year_loan_madeNoAgreed interest rate as a decimal fraction, e.g. "0.08" means 8%, not "8". Omit or null if unknown; do not assume a current benchmark rate.
amalgamated_loan_unpaid_at_end_of_previous_yearNoOperator-established amalgamated-loan balance at the end of the preceding income year.The tool does not form amalgamated loans.
secured_by_registered_mortgage_over_real_propertyNoWhether the loan has a registered mortgage over real property. Omit or null means UNKNOWN, not false.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv0.1.22
    • addedInput schema / properties / amalgamated_loan_unpaid_at_end_of_previous_year / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
    • addedInput schema / properties / payments_applied_during_the_year / pattern
      Added value: +"^\\s*-?[0-9]+(?:\\.[0-9]{1,2})?\\s*$"
  2. Changed1 schema field changedv0.1.15
    • changedInput schema / properties / payments_applied_during_the_year / description
      Previous value: -"Amount the operator establishes as applied during the income year. The tool does notclassify payments under s 109R; omit if not established."New value: +"Amount the operator establishes as applied during the income year. The tool does not classify payments under s 109R; omit if not established."
  3. Changed25 schema fields changedv0.1.13
    • changedInput schema / properties / amalgamated_loan_unpaid_at_end_of_previous_year / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / amalgamated_loan_unpaid_at_end_of_previous_year / description
      Previous value: -"Operator-established amalgamated-loan balance at the end of the preceding income year. The tool does not form amalgamated loans. 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: +"Operator-established amalgamated-loan balance at the end of the preceding income year.The tool does not form amalgamated loans."
    • changedInput schema / properties / interest_rate_for_years_after_year_loan_made / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 30,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / loan_id / maxLength
      Added value: +120
    • changedInput schema / properties / maximum_term_years / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 30,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / payments_applied_during_the_year / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 60,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / payments_applied_during_the_year / description
      Previous value: -"Amount the operator establishes as applied during the income year. The tool does not classify payments under s 109R; omit if not established. 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: +"Amount the operator establishes as applied during the income year. The tool does notclassify payments under s 109R; omit if not established."
    • changedInput schema / properties / remaining_term_years / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 30,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / security_coverage_at_first_made / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 30,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / year_loan_made / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 7,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / year_of_income / maxLength
      Added value: +7
    • addedOutput schema / $defs / Div7aGate / properties / reason_codes
      Added value: +{
      +  "description": "Stable token per reason, aligned with `reasons` by position.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "title": "Reason Codes",
      +  "type": "array"
      +}
    • changedOutput schema / $defs / Div7aGate / required
      Previous value: -[
      -  "verdict",
      -  "loan_id",
      -  "benchmark_year_used",
      -  "benchmark_rate",
      -  "maximum_term_years_allowed",
      -  "reasons",
      -  "caveats"
      -]New value: +[
      +  "verdict",
      +  "loan_id",
      +  "benchmark_year_used",
      +  "benchmark_rate",
      +  "maximum_term_years_allowed",
      +  "reasons",
      +  "reason_codes",
      +  "caveats"
      +]
    • addedOutput schema / $defs / Div7aRepayment / properties / reason_codes
      Added value: +{
      +  "description": "Stable token per reason, aligned with `reasons` by position.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "title": "Reason Codes",
      +  "type": "array"
      +}
    • changedOutput schema / $defs / Div7aRepayment / required
      Previous value: -[
      -  "verdict",
      -  "loan_id",
      -  "year_of_income",
      -  "gate_verdict",
      -  "benchmark_rate",
      -  "amalgamated_loan_unpaid_at_end_of_previous_year",
      -  "remaining_term_years_used",
      -  "myr_required",
      -  "payments_applied",
      -  "shortfall",
      -  "experimental_deemed_dividend_exposure",
      -  "rounding",
      -  "reasons",
      -  "caveats"
      -]New value: +[
      +  "verdict",
      +  "loan_id",
      +  "year_of_income",
      +  "gate_verdict",
      +  "benchmark_rate",
      +  "amalgamated_loan_unpaid_at_end_of_previous_year",
      +  "remaining_term_years_used",
      +  "myr_required",
      +  "payments_applied",
      +  "shortfall",
      +  "experimental_deemed_dividend_exposure",
      +  "rounding",
      +  "reasons",
      +  "reason_codes",
      +  "caveats"
      +]
    • addedOutput schema / $defs / GateFull / properties / manifest
      Added value: +{
      +  "$ref": "#/$defs/Manifest"
      +}
    • addedOutput schema / $defs / GateFull / properties / reason_codes
      Added value: +{
      +  "description": "Stable token per reason, aligned with `reasons` by position.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "title": "Reason Codes",
      +  "type": "array"
      +}
    • changedOutput schema / $defs / GateFull / required
      Previous value: -[
      -  "verdict",
      -  "loan_id",
      -  "benchmark_year_used",
      -  "benchmark_rate",
      -  "maximum_term_years_allowed",
      -  "reasons",
      -  "caveats",
      -  "benchmark_provenance",
      -  "limbs",
      -  "statutory_trace"
      -]New value: +[
      +  "verdict",
      +  "loan_id",
      +  "benchmark_year_used",
      +  "benchmark_rate",
      +  "maximum_term_years_allowed",
      +  "reasons",
      +  "reason_codes",
      +  "caveats",
      +  "benchmark_provenance",
      +  "manifest",
      +  "limbs",
      +  "statutory_trace"
      +]
    • addedOutput schema / $defs / Manifest
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Which statutory tables a figure was computed from, and their digests.",
      +  "properties": {
      +    "rate_table_uris": {
      +      "description": "Statutory rate tables this answer consumed, each with the digest of what was read. Empty when no rate table was consulted.",
      +      "items": {
      +        "$ref": "#/$defs/RateTableSource"
      +      },
      +      "title": "Rate Table Uris",
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "rate_table_uris"
      +  ],
      +  "title": "Manifest",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / RateTableSource
      Added value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "sha256": {
      +      "description": "SHA-256 of the table text the figure was computed from.",
      +      "title": "Sha256",
      +      "type": "string"
      +    },
      +    "uri": {
      +      "description": "The rate table the engine read.",
      +      "title": "Uri",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "uri",
      +    "sha256"
      +  ],
      +  "title": "RateTableSource",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / RepaymentFull / properties / manifest
      Added value: +{
      +  "$ref": "#/$defs/Manifest"
      +}
    • addedOutput schema / $defs / RepaymentFull / properties / reason_codes
      Added value: +{
      +  "description": "Stable token per reason, aligned with `reasons` by position.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "title": "Reason Codes",
      +  "type": "array"
      +}
    • changedOutput schema / $defs / RepaymentFull / required
      Previous value: -[
      -  "verdict",
      -  "loan_id",
      -  "year_of_income",
      -  "gate_verdict",
      -  "benchmark_rate",
      -  "amalgamated_loan_unpaid_at_end_of_previous_year",
      -  "remaining_term_years_used",
      -  "myr_required",
      -  "payments_applied",
      -  "shortfall",
      -  "experimental_deemed_dividend_exposure",
      -  "rounding",
      -  "reasons",
      -  "caveats",
      -  "benchmark_provenance",
      -  "statutory_trace"
      -]New value: +[
      +  "verdict",
      +  "loan_id",
      +  "year_of_income",
      +  "gate_verdict",
      +  "benchmark_rate",
      +  "amalgamated_loan_unpaid_at_end_of_previous_year",
      +  "remaining_term_years_used",
      +  "myr_required",
      +  "payments_applied",
      +  "shortfall",
      +  "experimental_deemed_dividend_exposure",
      +  "rounding",
      +  "reasons",
      +  "reason_codes",
      +  "caveats",
      +  "benchmark_provenance",
      +  "manifest",
      +  "statutory_trace"
      +]
    • addedOutput schema / $defs / VerificationSource / properties / rate_table_uris
      Added value: +{
      +  "description": "Statutory rate tables this answer consumed, each with the digest of what was read. Empty when the figure came from the request alone.",
      +  "items": {
      +    "$ref": "#/$defs/RateTableSource"
      +  },
      +  "title": "Rate Table Uris",
      +  "type": "array"
      +}
    • changedOutput schema / $defs / VerificationSource / required
      Previous value: -[
      -  "verify_at"
      -]New value: +[
      +  "verify_at",
      +  "rate_table_uris"
      +]
  4. Changed1 schema field changedv0.1.10
    • addedInput schema / additionalProperties
      Added value: +false
  5. Changed4 schema fields changedv0.1.9
    • changedOutput schema / $defs / Div7aGate / properties / benchmark_year_used / anyOf
      Previous value: -[
      -  {
      -    "description": "Income or dataset year in YYYY-YY form.",
      -    "pattern": "^[0-9]{4}-[0-9]{2}$",
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Income or dataset year in YYYY-YY form.",
      +    "pattern": "^[0-9]{4}-[0-9]{2}$",
      +    "type": "string"
      +  },
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / $defs / Div7aGate / properties / benchmark_year_used / description
      Previous value: -"Engine benchmark year, YYYY-YY, if known."New value: +"Engine benchmark year, YYYY-YY, or empty/null when unknown."
    • changedOutput schema / $defs / GateFull / properties / benchmark_year_used / anyOf
      Previous value: -[
      -  {
      -    "description": "Income or dataset year in YYYY-YY form.",
      -    "pattern": "^[0-9]{4}-[0-9]{2}$",
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Income or dataset year in YYYY-YY form.",
      +    "pattern": "^[0-9]{4}-[0-9]{2}$",
      +    "type": "string"
      +  },
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / $defs / GateFull / properties / benchmark_year_used / description
      Previous value: -"Engine benchmark year, YYYY-YY, if known."New value: +"Engine benchmark year, YYYY-YY, or empty/null when unknown."
  6. Changed4 schema fields changedv0.1.8
    • addedOutput schema / $defs
      Added value: +{
      +  "Div7aGate": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "benchmark_rate": {
      +        "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 Rate"
      +      },
      +      "benchmark_year_used": {
      +        "anyOf": [
      +          {
      +            "description": "Income or dataset year in YYYY-YY form.",
      +            "pattern": "^[0-9]{4}-[0-9]{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Engine benchmark year, YYYY-YY, if known.",
      +        "title": "Benchmark Year Used"
      +      },
      +      "caveats": {
      +        "description": "Limitations to retain when presenting the result.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Caveats",
      +        "type": "array"
      +      },
      +      "loan_id": {
      +        "description": "Operator loan reference.",
      +        "title": "Loan Id",
      +        "type": "string"
      +      },
      +      "maximum_term_years_allowed": {
      +        "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": "Maximum Term Years Allowed"
      +      },
      +      "reasons": {
      +        "description": "Engine reasons for the reported verdict.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Reasons",
      +        "type": "array"
      +      },
      +      "verdict": {
      +        "description": "Reviewed s 109N gate only; UNKNOWN never means false or compliant.",
      +        "enum": [
      +          "COMPLYING",
      +          "NOT_COMPLYING",
      +          "UNKNOWN"
      +        ],
      +        "title": "Verdict",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "verdict",
      +      "loan_id",
      +      "benchmark_year_used",
      +      "benchmark_rate",
      +      "maximum_term_years_allowed",
      +      "reasons",
      +      "caveats"
      +    ],
      +    "title": "Div7aGate",
      +    "type": "object"
      +  },
      +  "Div7aRepayment": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "amalgamated_loan_unpaid_at_end_of_previous_year": {
      +        "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": "Amalgamated Loan Unpaid At End Of Previous Year"
      +      },
      +      "benchmark_rate": {
      +        "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 Rate"
      +      },
      +      "caveats": {
      +        "description": "Limitations to retain when presenting the result.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Caveats",
      +        "type": "array"
      +      },
      +      "experimental_deemed_dividend_exposure": {
      +        "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": "Experimental AUD exposure only, not an assessed dividend; null if unknown.",
      +        "title": "Experimental Deemed Dividend Exposure"
      +      },
      +      "gate_verdict": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "s 109N gate outcome used in the repayment review.",
      +        "title": "Gate Verdict"
      +      },
      +      "loan_id": {
      +        "description": "Operator loan reference.",
      +        "title": "Loan Id",
      +        "type": "string"
      +      },
      +      "myr_required": {
      +        "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": "Required repayment in AUD; null if not determined.",
      +        "title": "Myr Required"
      +      },
      +      "payments_applied": {
      +        "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": "Payments Applied"
      +      },
      +      "reasons": {
      +        "description": "Engine reasons for the reported verdict.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Reasons",
      +        "type": "array"
      +      },
      +      "remaining_term_years_used": {
      +        "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": "Remaining Term Years Used"
      +      },
      +      "rounding": {
      +        "description": "Rounding rule reported by the engine.",
      +        "title": "Rounding",
      +        "type": "string"
      +      },
      +      "shortfall": {
      +        "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": "Shortfall"
      +      },
      +      "verdict": {
      +        "description": "Engine s 109E outcome, including MYR_MET, MYR_SHORT, UNKNOWN or REFUSED.",
      +        "title": "Verdict",
      +        "type": "string"
      +      },
      +      "year_of_income": {
      +        "description": "Income or dataset year in YYYY-YY form.",
      +        "pattern": "^[0-9]{4}-[0-9]{2}$",
      +        "title": "Year Of Income",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "verdict",
      +      "loan_id",
      +      "year_of_income",
      +      "gate_verdict",
      +      "benchmark_rate",
      +      "amalgamated_loan_unpaid_at_end_of_previous_year",
      +      "remaining_term_years_used",
      +      "myr_required",
      +      "payments_applied",
      +      "shortfall",
      +      "experimental_deemed_dividend_exposure",
      +      "rounding",
      +      "reasons",
      +      "caveats"
      +    ],
      +    "title": "Div7aRepayment",
      +    "type": "object"
      +  },
      +  "GateFull": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "benchmark_provenance": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": true,
      +            "description": "Unmodified engine source metadata and review provenance.",
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Benchmark Provenance"
      +      },
      +      "benchmark_rate": {
      +        "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 Rate"
      +      },
      +      "benchmark_year_used": {
      +        "anyOf": [
      +          {
      +            "description": "Income or dataset year in YYYY-YY form.",
      +            "pattern": "^[0-9]{4}-[0-9]{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Engine benchmark year, YYYY-YY, if known.",
      +        "title": "Benchmark Year Used"
      +      },
      +      "caveats": {
      +        "description": "Limitations to retain when presenting the result.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Caveats",
      +        "type": "array"
      +      },
      +      "limbs": {
      +        "description": "Individual s 109N findings.",
      +        "items": {
      +          "additionalProperties": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "title": "Limbs",
      +        "type": "array"
      +      },
      +      "loan_id": {
      +        "description": "Operator loan reference.",
      +        "title": "Loan Id",
      +        "type": "string"
      +      },
      +      "maximum_term_years_allowed": {
      +        "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": "Maximum Term Years Allowed"
      +      },
      +      "reasons": {
      +        "description": "Engine reasons for the reported verdict.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Reasons",
      +        "type": "array"
      +      },
      +      "statutory_trace": {
      +        "description": "Engine statutory citations and audit trace; full only.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Statutory Trace",
      +        "type": "array"
      +      },
      +      "verdict": {
      +        "description": "Reviewed s 109N gate only; UNKNOWN never means false or compliant.",
      +        "enum": [
      +          "COMPLYING",
      +          "NOT_COMPLYING",
      +          "UNKNOWN"
      +        ],
      +        "title": "Verdict",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "verdict",
      +      "loan_id",
      +      "benchmark_year_used",
      +      "benchmark_rate",
      +      "maximum_term_years_allowed",
      +      "reasons",
      +      "caveats",
      +      "benchmark_provenance",
      +      "limbs",
      +      "statutory_trace"
      +    ],
      +    "title": "GateFull",
      +    "type": "object"
      +  },
      +  "RepaymentFull": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "amalgamated_loan_unpaid_at_end_of_previous_year": {
      +        "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": "Amalgamated Loan Unpaid At End Of Previous Year"
      +      },
      +      "benchmark_provenance": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": true,
      +            "description": "Unmodified engine source metadata and review provenance.",
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Benchmark Provenance"
      +      },
      +      "benchmark_rate": {
      +        "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 Rate"
      +      },
      +      "caveats": {
      +        "description": "Limitations to retain when presenting the result.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Caveats",
      +        "type": "array"
      +      },
      +      "experimental_deemed_dividend_exposure": {
      +        "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": "Experimental AUD exposure only, not an assessed dividend; null if unknown.",
      +        "title": "Experimental Deemed Dividend Exposure"
      +      },
      +      "gate_verdict": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "s 109N gate outcome used in the repayment review.",
      +        "title": "Gate Verdict"
      +      },
      +      "loan_id": {
      +        "description": "Operator loan reference.",
      +        "title": "Loan Id",
      +        "type": "string"
      +      },
      +      "myr_required": {
      +        "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": "Required repayment in AUD; null if not determined.",
      +        "title": "Myr Required"
      +      },
      +      "payments_applied": {
      +        "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": "Payments Applied"
      +      },
      +      "reasons": {
      +        "description": "Engine reasons for the reported verdict.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Reasons",
      +        "type": "array"
      +      },
      +      "remaining_term_years_used": {
      +        "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": "Remaining Term Years Used"
      +      },
      +      "rounding": {
      +        "description": "Rounding rule reported by the engine.",
      +        "title": "Rounding",
      +        "type": "string"
      +      },
      +      "shortfall": {
      +        "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": "Shortfall"
      +      },
      +      "statutory_trace": {
      +        "description": "Engine statutory citations and audit trace; full only.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Statutory Trace",
      +        "type": "array"
      +      },
      +      "verdict": {
      +        "description": "Engine s 109E outcome, including MYR_MET, MYR_SHORT, UNKNOWN or REFUSED.",
      +        "title": "Verdict",
      +        "type": "string"
      +      },
      +      "year_of_income": {
      +        "description": "Income or dataset year in YYYY-YY form.",
      +        "pattern": "^[0-9]{4}-[0-9]{2}$",
      +        "title": "Year Of Income",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "verdict",
      +      "loan_id",
      +      "year_of_income",
      +      "gate_verdict",
      +      "benchmark_rate",
      +      "amalgamated_loan_unpaid_at_end_of_previous_year",
      +      "remaining_term_years_used",
      +      "myr_required",
      +      "payments_applied",
      +      "shortfall",
      +      "experimental_deemed_dividend_exposure",
      +      "rounding",
      +      "reasons",
      +      "caveats",
      +      "benchmark_provenance",
      +      "statutory_trace"
      +    ],
      +    "title": "RepaymentFull",
      +    "type": "object"
      +  },
      +  "ReviewFull": {
      +    "additionalProperties": true,
      +    "not": {
      +      "required": [
      +        "response_detail"
      +      ]
      +    },
      +    "properties": {
      +      "disclaimer": {
      +        "description": "Experimental scope and human-review requirements.",
      +        "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"
      +      },
      +      "gate": {
      +        "$ref": "#/$defs/GateFull",
      +        "description": "s 109N gate with full audit fields."
      +      },
      +      "law_compilation": {
      +        "description": "Compiled law identified by the engine.",
      +        "title": "Law Compilation",
      +        "type": "string"
      +      },
      +      "law_content_date": {
      +        "description": "Date in YYYY-MM-DD form.",
      +        "format": "date",
      +        "pattern": "^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])$",
      +        "title": "Law Content Date",
      +        "type": "string"
      +      },
      +      "minimum_yearly_repayment": {
      +        "$ref": "#/$defs/RepaymentFull",
      +        "description": "s 109E review with full audit fields."
      +      },
      +      "ok": {
      +        "const": true,
      +        "description": "The review ran; this does not mean compliance or a known verdict.",
      +        "title": "Ok",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "ok",
      +      "engine",
      +      "engine_version",
      +      "law_content_date",
      +      "law_compilation",
      +      "disclaimer",
      +      "gate",
      +      "minimum_yearly_repayment"
      +    ],
      +    "title": "ReviewFull",
      +    "type": "object"
      +  },
      +  "ReviewSummary": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "disclaimer": {
      +        "description": "Experimental scope and human-review requirements.",
      +        "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"
      +      },
      +      "gate": {
      +        "$ref": "#/$defs/Div7aGate",
      +        "description": "s 109N gate outcome and reasons."
      +      },
      +      "law_compilation": {
      +        "description": "Compiled law identified by the engine.",
      +        "title": "Law Compilation",
      +        "type": "string"
      +      },
      +      "law_content_date": {
      +        "description": "Date in YYYY-MM-DD form.",
      +        "format": "date",
      +        "pattern": "^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])$",
      +        "title": "Law Content Date",
      +        "type": "string"
      +      },
      +      "minimum_yearly_repayment": {
      +        "$ref": "#/$defs/Div7aRepayment",
      +        "description": "s 109E review or refusal."
      +      },
      +      "ok": {
      +        "const": true,
      +        "description": "The review ran; this does not mean compliance or a known verdict.",
      +        "title": "Ok",
      +        "type": "boolean"
      +      },
      +      "response_detail": {
      +        "const": "summary",
      +        "description": "Summary response marker.",
      +        "title": "Response Detail",
      +        "type": "string"
      +      },
      +      "source": {
      +        "$ref": "#/$defs/VerificationSource",
      +        "description": "Concise verification source."
      +      }
      +    },
      +    "required": [
      +      "ok",
      +      "engine",
      +      "engine_version",
      +      "law_content_date",
      +      "law_compilation",
      +      "disclaimer",
      +      "response_detail",
      +      "source",
      +      "gate",
      +      "minimum_yearly_repayment"
      +    ],
      +    "title": "ReviewSummary",
      +    "type": "object"
      +  },
      +  "VerificationSource": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "verify_at": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Engine verification URL; empty or null when none is available.",
      +        "title": "Verify At"
      +      }
      +    },
      +    "required": [
      +      "verify_at"
      +    ],
      +    "title": "VerificationSource",
      +    "type": "object"
      +  }
      +}
    • removedOutput schema / additionalProperties
      Removed value: -true
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "$ref": "#/$defs/ReviewSummary"
      +  },
      +  {
      +    "$ref": "#/$defs/ReviewFull"
      +  }
      +]
    • changedOutput schema / title
      Previous value: -"review_div7a_loanDictOutput"New value: +"Div7aReview"
  7. Changed13 schema fields changedv0.1.7
    • addedInput schema / properties / amalgamated_loan_unpaid_at_end_of_previous_year / description
      Added value: +"Operator-established amalgamated-loan balance at the end of the preceding income year. The tool does not form amalgamated loans. 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 / interest_rate_for_years_after_year_loan_made / description
      Added value: +"Agreed interest rate as a decimal fraction, e.g. \"0.08\" means 8%, not \"8\". Omit or null if unknown; do not assume a current benchmark rate."
    • addedInput schema / properties / loan_id / description
      Added value: +"Operator loan reference echoed in the result; defaults to \"mcp-div7a-1\". No loan record is looked up or written."
    • addedInput schema / properties / maximum_term_years / description
      Added value: +"Actual agreed loan term in years as a decimal string, e.g. \"7\"; not the statutory maximum. Omit or null if unknown."
    • addedInput schema / properties / payments_applied_during_the_year / description
      Added value: +"Amount the operator establishes as applied during the income year. The tool does not classify payments under s 109R; omit if not established. 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 / remaining_term_years / description
      Added value: +"Remaining statutory term for the supplied amalgamated loan, as a decimal string. The engine rounds fractional years up. Omit or null if unknown."
    • addedInput schema / properties / response_detail / description
      Added value: +"\"summary\" (default) returns the concise result; \"full\" includes the complete engine audit and provenance."
    • addedInput schema / properties / secured_by_registered_mortgage_over_real_property / description
      Added value: +"Whether the loan has a registered mortgage over real property. Omit or null means UNKNOWN, not false."
    • addedInput schema / properties / security_coverage_at_first_made / description
      Added value: +"Property market value less prior secured liabilities, divided by the loan at inception; decimal ratio, e.g. \"1.10\" means 110%. Omit or null if unknown."
    • addedInput schema / properties / terms_in_place_before_lodgment_day / description
      Added value: +"Operator assertion that terms were in place before the relevant lodgment day. The engine does not compute that day. Omit or null if unknown."
    • addedInput schema / properties / written_agreement / description
      Added value: +"Whether the loan agreement is in writing. Omit or null means UNKNOWN, not false."
    • addedInput schema / properties / year_loan_made / description
      Added value: +"Income year the loan was made, YYYY-YY, e.g. \"2024-25\". Omit or null if unknown."
    • addedInput schema / properties / year_of_income / description
      Added value: +"Income year being reviewed, YYYY-YY, e.g. \"2025-26\". Years outside the engine reviewed rate table return UNKNOWN."
  8. Added

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds genuinely new behavioral context: it runs locally with no network, writes or lodgements, treats unknown facts as UNKNOWN rather than coercing to false/zero, and is explicitly an experimental review aid rather than a tax determination. Strong added value, though the UNKNOWN semantics is also echoed in the schema.

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

Conciseness4/5

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

Front-loaded with purpose, then scope, then conventions, then routing to siblings and disclaimers — a sensible order. It is dense but nearly every sentence earns its place; the only mild slack is repetition of the omit-or-null/UNKNOWN rule that the schema also carries per field.

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, mutation-free analytical tool with an output schema present, the description supplies everything needed: what it computes, how inputs are interpreted, what it returns at a high level, sibling routing, and its non-determinative status. Nothing material is missing.

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%, so the baseline is 3, but the description contributes cross-cutting conventions the per-field schema does not: rates are decimal fractions in decimal strings, amounts are AUD decimal strings bounded to 2 dp with a stated absolute maximum, '0.00' is reserved for an established zero, and omission/null means not supplied. That materially reduces misuse of the numeric-string parameters.

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 and resource ('Review one operator-supplied amalgamated Division 7A loan') and immediately names the two statutory tests it runs (s 109N gate, s 109E minimum yearly repayment). It also distinguishes itself from the closest siblings by naming get_div7a_benchmark_rate and refuse_div7a, so the agent can route 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 Guidelines5/5

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

Explicit when-to-use is given via named alternatives ('Use get_div7a_benchmark_rate for rate-only lookups; unsupported matters remain refused by refuse_div7a'), and clear exclusions are listed ('does not form amalgamated loans or classify payments under s 109R'). The agent knows both the trigger and the boundaries.

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