Skip to main content
Glama
ryanduguid

Australian Accounting MCP

Review a Division 7A loan

review_div7a_loan
Read-onlyIdempotent

Review a Division 7A loan by running the s 109N gate and s 109E minimum yearly repayment checks, returning verdicts, reasons, and caveats while leaving unknown facts as 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

TableJSON 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

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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."
  2. 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"
      +]
  3. Changed1 schema field changedv0.1.10
    • addedInput schema / additionalProperties
      Added value: +false
  4. 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."
  5. 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"
  6. 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."
  7. Added

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, non-destructive), the description adds crucial behavior: nulls remain UNKNOWN and are never coerced, rates/amounts have strict decimal-string formats, response_detail defaults to summary, and the tool 'runs locally with no network, writes or lodgements.' It also labels itself as an 'experimental review aid, not a tax determination or advice,' which sets proper expectations.

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?

The description is dense but every sentence earns its place. The first sentence states the purpose; subsequent sentences cover engine logic, null semantics, input formats, response detail, return values, sibling routing, exclusions, execution environment, and disclaimer. No filler or repetition of schema content.

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?

Despite the complex 13-parameter tool, the description covers the engine stages, input conventions, return content, and safe-execution guarantees. With the output schema present and 100% schema description coverage, nothing an agent needs to correctly invoke the tool 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 adds cross-cutting input semantics beyond the schema: decimal-string constraints for rates and amounts, the special meaning of '0.00', and the rule that omitted/null means not supplied. These global rules clarify parameters without restating each schema description.

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?

The description opens with a precise verb and resource: 'Review one operator-supplied amalgamated Division 7A loan' and immediately specifies the two engine stages ('s 109N gate' and 's 109E minimum yearly repayment'). It also distinguishes itself from siblings by naming get_div7a_benchmark_rate and refuse_div7a and stating exclusions ('does not form amalgamated loans or classify payments under s 109R').

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 routing guidance is provided: 'Use get_div7a_benchmark_rate for rate-only lookups; unsupported matters remain refused by refuse_div7a.' It also clearly states what the tool does not do, which helps the agent avoid misusing it for amalgamation or s 109R classification tasks.

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