Skip to main content
Glama

Senaro Personal Finance

Debt-to-Income Calculator

calculate_debt_to_income
Read-onlyIdempotent

Calculation, not advice. Verify with a professional before acting. Calculate your debt-to-income ratio and check qualification for conventional, FHA, VA, and USDA mortgage programs. Accepts existing debts and an optional proposed new debt or home price. Pick this to measure DTI ratios and mortgage-program qualification against existing debts; pick compare_debt_consolidation when the question is whether a consolidation loan costs less than keeping the current credit cards, and pick compare_rent_vs_buy when the question is whether to buy a home at all rather than what DTI a given price implies.

Returns current DTI, front-end and back-end ratios with proposed housing, maximum affordable home price, and what-if scenarios showing the resulting DTI and which programs would then qualify if a given debt were paid off, plus income-increase and home-price-reduction variants. Includes the 10-month rule (Fannie Mae) for debts near payoff.

qualification.<program>.qualification_status is a tri-state verdict ('qualifies' | 'underwriting_dependent' | 'ineligible'):

  • 'underwriting_dependent' means the manual-underwriting baseline is exceeded but further underwriting can still approve it, an automated-underwriting system for conventional and FHA, either automated or manual underwriting for USDA, or a supervisory underwriter's written justification under 38 CFR 36.4340(c)(2) for VA (never an automated decision), so qualification.<program>.qualifies=false does NOT by itself mean the borrower is blocked

  • Read qualification_status, not the bare qualifies boolean, for the real answer; qualification.<program>.note explains the specific underwriting or hard-cap context, naming which mechanism applies

  • VA's back-end overage alone never returns 'ineligible' either (38 CFR 36.4340(c)(2)/(c)(3) both contemplate approval above 41%), and conventional is now the only program that ever returns 'ineligible', since FHA, VA and USDA are each disclosure-only above their baselines

  • what_if.scenarios[].qualifies_va and changes_qualification_va are decided on the scenario's unrounded VA ratio rounded to a whole percent under 38 CFR 36.4340(d), not on new_back_end_dti_va (two decimals), so a scenario showing 41.44 can qualify; qualification.va.your_back_end_compared states the rounded figure VA's row compares with max_back_end

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
family_sizeNoHousehold size for the VA residual income guideline. Supply family_size and property_state together, or neither. Optional; must be between 1 and 20.
hoa_monthlyNoMonthly homeowners association dues in dollars. Optional; defaults to 0 when omitted. Must be zero or more.
pmi_monthlyNoMonthly PMI (private mortgage insurance) in dollars. Optional; if omitted, auto-estimated at 0.5% of the loan annually when loan-to-value exceeds 80%. Feeds the conventional-basis PITI, so it moves with_proposed.front_end_dti, with_proposed.back_end_dti, with_proposed.front_end_breakdown, the conventional qualification row, and what_if.scenarios[].new_front_end_dti and new_back_end_dti. VA carries no PMI, and FHA and USDA always compute their own upfront-plus-annual mortgage insurance instead, at every loan-to-value, never this override. Must be zero or more.
annual_incomeNoAnnual gross income in dollars, divided by 12 to get monthly income. Exactly one of gross_monthly_income or annual_income is required. Must be at least $0.01, one cent, the smallest amount of money.
proposed_debtNoA proposed new debt, as an alternative to proposed_home_price. Provide at most one of proposed_debt or proposed_home_price; providing neither computes the current DTI only. Optional; a JSON null is treated as omitted, the same as leaving the field out.
existing_debtsNoExisting debts to include in the DTI calculation. Optional; omit it or send an empty array for no existing debts. A JSON null is rejected; omit the field instead. At most 50 debts are allowed.
property_stateNoTwo-letter USPS state code, or 'DC'/'PR'/'GU'/'VI'/'AS'/'MP'. Supply family_size and property_state together, or neither. Together these compute the VA residual income guideline (38 CFR 36.4340(e)) in va_residual_income_guideline: the dollar amount VA's tables require for this family size, region, and loan amount (derived from proposed_home_price; not computable without it), plus the 38 CFR 36.4340(c)(3) review-waiver figure. Computed only for family_size 1-7 and a property_state among the 50 states, DC, or PR (not GU, VI, AS, or MP; 38 CFR 36.4340(e) assigns no region to those four); outside those bounds, or without proposed_home_price, va_residual_income_guideline.status reads 'not_computable' with the reason instead. This block alone is a LOOKUP, not a verdict: it never compares against your actual residual income by itself. Optional.
include_what_ifNoWhether to generate what-if scenarios showing how paying off a debt, increasing income, or reducing the home price would improve DTI. Optional; defaults to true when omitted.
additional_incomeNoAdditional monthly income: side income, rental income, or bonuses. Optional; defaults to 0 when omitted. Must be zero or more.
proposed_rate_pctNoProposed mortgage interest rate as a percent, e.g. 7.0 for 7.0%. Optional; the 7.0% default applies whenever this field is omitted, whether the proposal is proposed_debt or proposed_home_price. The default-rate warning fires only when proposed_home_price is used. Must be between 0 and 20.
property_tax_annualNoAnnual property tax in dollars. Optional; if omitted, estimated at 0.88% of the proposed home price. Must be zero or more.
proposed_home_priceNoProposed home purchase price in dollars. Provide at most one of proposed_debt or proposed_home_price; providing neither computes the current DTI only. Auto-calculates full PITI (principal, interest, taxes, insurance). Optional; must be at least $0.01, one cent, the smallest amount of money.
proposed_term_yearsNoProposed mortgage term in years. Optional; defaults to 30 when omitted. Must be between 1 and 40.
transaction_purposeNoMortgage transaction purpose: 'purchase', 'refinance', or 'streamlined_assist'. Optional, defaults to 'purchase' when omitted. Affects USDA only, and only what is disclosed. USDA's 32% PITI and 44% Total Debt figures are purchase-transaction waiver conditions (HB-1-3555 11.3.A.2), disclosed rather than applied as ceilings: Senaro cannot observe how the file is underwritten, so a USDA ratio overage is never 'ineligible' on any transaction purpose. For a refinance, 11.3.B states debt ratios 'are not limited to the maximum purchase debt ratio thresholds', so where the note fires it names both figures and states that neither applies. Streamlined-assist refinances require no debt ratio calculation at all. Conventional, FHA and VA are unaffected.
gross_monthly_incomeNoGross monthly income in dollars. Exactly one of gross_monthly_income or annual_income is required. Must be at least $0.01, one cent, the smallest amount of money.
home_insurance_annualNoAnnual home insurance in dollars. Optional; if omitted, estimated at 0.65% of the proposed home price. Must be zero or more.
proposed_down_payment_pctNoDown payment as a percent of the proposed home price, e.g. 20 for 20%. Optional; defaults to 20 when omitted. Must be between 0 and 99.9 (100% cash purchases are not supported).
va_funding_fee_financed_monthlyNoThe additional monthly payment from financing a VA funding fee into the loan balance, if any. 38 CFR 36.4313(e)'s applicable percentage depends on down payment, prior VA-loan use, and service category, none of which Senaro collects, so there is no default. If omitted while any VA figure that depends on it is produced, meaning qualification.va.your_back_end and its verdict, any what_if VA ratio, what_if.max_affordable_home.va, or qualification.va.residual_income_comparison, a VA_FUNDING_FEE_NOT_MODELED warning discloses that no fee is assumed. The home-price-reduction what_if scenario's hypothetical price is fixed before the fee is considered, so a supplied fee is scaled to that EXACT hypothetical loan size, since 38 CFR 36.4313(e)'s fee is a percentage of loan principal. what_if.max_affordable_home.va is a two-pass approximation instead, so its supplied fee is scaled to an ESTIMATE of the hypothetical loan size, not the exact figure reported; the published price itself passes an exact forward VA check under 38 CFR 36.4340(d) with that reserved fee, and one dollar more fails it, so only this fee-scaling step is approximate. Without proposed_home_price there is no reference loan size to scale from either way, so the raw fee is reserved unscaled instead, and a VA_FUNDING_FEE_NOT_SCALED warning discloses it. This is mutually exclusive with VA_FUNDING_FEE_NOT_MODELED by construction, since one requires the fee omitted and the other requires it supplied. Optional; must be zero or more.
monthly_maintenance_and_utilitiesNoEstimated monthly maintenance and utilities for the proposed property. 38 CFR 36.4340 calls for a realistic estimate of this figure for the property and local utility rates and sets no numeric multiplier itself, but VA underwriting guidance (the Lender's Handbook, Pamphlet 26-7) publishes a per-square-foot multiplier for this same estimate. Applying it needs the property's square footage, which this tool does not currently collect, so Senaro has no default to offer here and you supply the aggregate monthly amount instead. Supplying BOTH this field and monthly_taxes_and_retirement_withholding, together with proposed_home_price and a computable family_size/property_state, computes qualification.va.residual_income_comparison: your ACTUAL monthly residual income, its ratio to the va_residual_income_guideline figure, and whether residual_income_meets_review_waiver_margin (residual income at or above 120% of the guideline) is met. The shelter expense used here excludes any PMI (VA loans carry no monthly PMI; 38 CFR 36.4313(e) sets a funding fee instead, commonly financed into the loan; see va_funding_fee_financed_monthly for the financed-fee field). 38 CFR 36.4340(c)(3)'s review-waiver condition is CONJUNCTIVE: it also requires the back-end debt-to-income ratio, rounded to a whole percent under 38 CFR 36.4340(d) (qualification.va.your_back_end_compared), to exceed 41%, which this field does not by itself confirm. Check both fields together. Even when both hold, (c)(3) only WAIVES a second-level review requirement; it is not itself an approval. Whether this file is actually approved is an underwriting determination Senaro does not make and no input combination here determines. Missing any one of the needed inputs reads qualification.va.residual_income_comparison.status 'not_computable' with every reason named. Optional; must be zero or more.
monthly_taxes_and_retirement_withholdingNoYour federal, state, and FICA tax withholding, plus any amount paid or withheld for retirement, monthly. 38 CFR 36.4340(f)(13) treats these as one class of deduction from gross income. Optional; must be zero or more.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / monthly_maintenance_and_utilities / description
      Previous value: -"Estimated monthly maintenance and utilities for the proposed property. 38 CFR 36.4340 calls for a realistic estimate of this figure for the property and local utility rates and sets no numeric multiplier itself, but VA underwriting guidance (the Lender's Handbook, Pamphlet 26-7) publishes a per-square-foot multiplier for this same estimate. Applying it needs the property's square footage, which this tool does not currently collect, so Senaro has no default to offer here and you supply the aggregate monthly amount instead. Supplying BOTH this field and monthly_taxes_and_retirement_withholding, together with proposed_home_price and a computable family_size/property_state, computes qualification.va.residual_income_comparison: your ACTUAL monthly residual income, its ratio to the va_residual_income_guideline figure, and whether residual_income_meets_review_waiver_margin (residual income at or above 120% of the guideline) is met. The shelter expense used here excludes any PMI (VA loans carry no monthly PMI; 38 CFR 36.4313(e) sets a funding fee instead, commonly financed into the loan; see va_funding_fee_financed_monthly for the financed-fee field). 38 CFR 36.4340(c)(3)'s review-waiver condition is CONJUNCTIVE: it also requires the back-end debt-to-income ratio (qualification.va.your_back_end) to exceed 41%, which this field does not by itself confirm. Check both fields together. Even when both hold, (c)(3) only WAIVES a second-level review requirement; it is not itself an approval. Whether this file is actually approved is an underwriting determination Senaro does not make and no input combination here determines. Missing any one of the needed inputs reads qualification.va.residual_income_comparison.status 'not_computable' with every reason named. Optional; must be zero or more."New value: +"Estimated monthly maintenance and utilities for the proposed property. 38 CFR 36.4340 calls for a realistic estimate of this figure for the property and local utility rates and sets no numeric multiplier itself, but VA underwriting guidance (the Lender's Handbook, Pamphlet 26-7) publishes a per-square-foot multiplier for this same estimate. Applying it needs the property's square footage, which this tool does not currently collect, so Senaro has no default to offer here and you supply the aggregate monthly amount instead. Supplying BOTH this field and monthly_taxes_and_retirement_withholding, together with proposed_home_price and a computable family_size/property_state, computes qualification.va.residual_income_comparison: your ACTUAL monthly residual income, its ratio to the va_residual_income_guideline figure, and whether residual_income_meets_review_waiver_margin (residual income at or above 120% of the guideline) is met. The shelter expense used here excludes any PMI (VA loans carry no monthly PMI; 38 CFR 36.4313(e) sets a funding fee instead, commonly financed into the loan; see va_funding_fee_financed_monthly for the financed-fee field). 38 CFR 36.4340(c)(3)'s review-waiver condition is CONJUNCTIVE: it also requires the back-end debt-to-income ratio, rounded to a whole percent under 38 CFR 36.4340(d) (qualification.va.your_back_end_compared), to exceed 41%, which this field does not by itself confirm. Check both fields together. Even when both hold, (c)(3) only WAIVES a second-level review requirement; it is not itself an approval. Whether this file is actually approved is an underwriting determination Senaro does not make and no input combination here determines. Missing any one of the needed inputs reads qualification.va.residual_income_comparison.status 'not_computable' with every reason named. Optional; must be zero or more."
    • changedInput schema / properties / va_funding_fee_financed_monthly / description
      Previous value: -"The additional monthly payment from financing a VA funding fee into the loan balance, if any. 38 CFR 36.4313(e)'s applicable percentage depends on down payment, prior VA-loan use, and service category, none of which Senaro collects, so there is no default. If omitted while any VA figure that depends on it is produced, meaning qualification.va.your_back_end and its verdict, any what_if VA ratio, what_if.max_affordable_home.va, or qualification.va.residual_income_comparison, a VA_FUNDING_FEE_NOT_MODELED warning discloses that no fee is assumed. The home-price-reduction what_if scenario's hypothetical price is fixed before the fee is considered, so a supplied fee is scaled to that EXACT hypothetical loan size, since 38 CFR 36.4313(e)'s fee is a percentage of loan principal. what_if.max_affordable_home.va is a two-pass approximation instead, so its supplied fee is scaled to an ESTIMATE of the hypothetical loan size, not the exact figure reported; the PMI, tax, and insurance reservation itself is an EXACT closed-form solve, so only this fee-scaling step is approximate. Without proposed_home_price there is no reference loan size to scale from either way, so the raw fee is reserved unscaled instead, and a VA_FUNDING_FEE_NOT_SCALED warning discloses it. This is mutually exclusive with VA_FUNDING_FEE_NOT_MODELED by construction, since one requires the fee omitted and the other requires it supplied. Optional; must be zero or more."New value: +"The additional monthly payment from financing a VA funding fee into the loan balance, if any. 38 CFR 36.4313(e)'s applicable percentage depends on down payment, prior VA-loan use, and service category, none of which Senaro collects, so there is no default. If omitted while any VA figure that depends on it is produced, meaning qualification.va.your_back_end and its verdict, any what_if VA ratio, what_if.max_affordable_home.va, or qualification.va.residual_income_comparison, a VA_FUNDING_FEE_NOT_MODELED warning discloses that no fee is assumed. The home-price-reduction what_if scenario's hypothetical price is fixed before the fee is considered, so a supplied fee is scaled to that EXACT hypothetical loan size, since 38 CFR 36.4313(e)'s fee is a percentage of loan principal. what_if.max_affordable_home.va is a two-pass approximation instead, so its supplied fee is scaled to an ESTIMATE of the hypothetical loan size, not the exact figure reported; the published price itself passes an exact forward VA check under 38 CFR 36.4340(d) with that reserved fee, and one dollar more fails it, so only this fee-scaling step is approximate. Without proposed_home_price there is no reference loan size to scale from either way, so the raw fee is reserved unscaled instead, and a VA_FUNDING_FEE_NOT_SCALED warning discloses it. This is mutually exclusive with VA_FUNDING_FEE_NOT_MODELED by construction, since one requires the fee omitted and the other requires it supplied. Optional; must be zero or more."
  2. Changed13 schema fields changed
    • addedInput schema / properties / annual_income / minimum
      Added value: +0.01
    • changedInput schema / properties / existing_debts / items / properties / name / description
      Previous value: -"Optional label for this debt, e.g. 'Car Loan'."New value: +"Optional label for this debt, e.g. 'Car Loan'. At most 120 characters."
    • addedInput schema / properties / existing_debts / items / properties / name / maxLength
      Added value: +120
    • changedInput schema / properties / existing_debts / items / properties / type / description
      Previous value: -"Debt type: 'auto', 'student', 'credit_card', 'personal', 'mortgage', 'heloc', 'child_support', or 'other'. Optional, defaults to 'other' when omitted; an unrecognized value warns rather than rejects."New value: +"Debt type: 'auto', 'student', 'credit_card', 'personal', 'mortgage', 'heloc', 'child_support', or 'other'. Optional, defaults to 'other' when omitted. An unrecognized value of at most 120 characters warns rather than rejects; a longer one is rejected."
    • addedInput schema / properties / existing_debts / items / properties / type / maxLength
      Added value: +120
    • addedInput schema / properties / existing_debts / maxItems
      Added value: +50
    • addedInput schema / properties / family_size / maximum
      Added value: +20
    • addedInput schema / properties / gross_monthly_income / minimum
      Added value: +0.01
    • changedInput schema / properties / proposed_debt / properties / name / description
      Previous value: -"Optional label for this proposed debt."New value: +"Optional label for this proposed debt. At most 120 characters."
    • addedInput schema / properties / proposed_debt / properties / name / maxLength
      Added value: +120
    • addedInput schema / properties / proposed_debt / properties / type / enum
      Added value: +[
      +  "credit_card",
      +  "auto",
      +  "student",
      +  "personal",
      +  "mortgage",
      +  "heloc",
      +  "child_support",
      +  "other",
      +  null
      +]
    • addedInput schema / properties / proposed_home_price / minimum
      Added value: +0.01
    • addedInput schema / properties / transaction_purpose / enum
      Added value: +[
      +  "purchase",
      +  "refinance",
      +  "streamlined_assist",
      +  null
      +]
  3. Changed22 schema fields changed
    • addedInput schema / properties / additional_income
      Added value: +{
      +  "default": null,
      +  "description": "Additional monthly income: side income, rental income, or bonuses. Optional; defaults to 0 when omitted. Must be zero or more.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / annual_income
      Added value: +{
      +  "default": null,
      +  "description": "Annual gross income in dollars, divided by 12 to get monthly income. Exactly one of gross_monthly_income or annual_income is required. Must be at least $0.01, one cent, the smallest amount of money.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / existing_debts
      Added value: +{
      +  "default": null,
      +  "description": "Existing debts to include in the DTI calculation. Optional; omit it or send an empty array for no existing debts. A JSON null is rejected; omit the field instead. At most 50 debts are allowed.",
      +  "items": {
      +    "properties": {
      +      "apr_pct": {
      +        "description": "Annual percentage rate, as a percentage (0-100), e.g. 18.5 for 18.5%. Optional.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "balance": {
      +        "description": "Current balance in dollars. Optional; used for payoff cost analysis in what-if scenarios.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "monthly_payment": {
      +        "description": "Monthly payment in dollars. Required per debt; must be positive.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "months_remaining": {
      +        "description": "Months remaining on this debt. Optional; used for the 10-month rule exclusion.",
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "name": {
      +        "description": "Optional label for this debt, e.g. 'Car Loan'.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "description": "Debt type: 'auto', 'student', 'credit_card', 'personal', 'mortgage', 'heloc', 'child_support', or 'other'. Optional, defaults to 'other' when omitted; an unrecognized value warns rather than rejects.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": [
      +      "object",
      +      "null"
      +    ]
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / family_size
      Added value: +{
      +  "default": null,
      +  "description": "Household size for the VA residual income guideline. Supply family_size and property_state together, or neither. Optional; must be between 1 and 20.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / gross_monthly_income
      Added value: +{
      +  "default": null,
      +  "description": "Gross monthly income in dollars. Exactly one of gross_monthly_income or annual_income is required. Must be at least $0.01, one cent, the smallest amount of money.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / hoa_monthly
      Added value: +{
      +  "default": null,
      +  "description": "Monthly homeowners association dues in dollars. Optional; defaults to 0 when omitted. Must be zero or more.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / home_insurance_annual
      Added value: +{
      +  "default": null,
      +  "description": "Annual home insurance in dollars. Optional; if omitted, estimated at 0.65% of the proposed home price. Must be zero or more.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / include_what_if
      Added value: +{
      +  "default": null,
      +  "description": "Whether to generate what-if scenarios showing how paying off a debt, increasing income, or reducing the home price would improve DTI. Optional; defaults to true when omitted.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / monthly_maintenance_and_utilities
      Added value: +{
      +  "default": null,
      +  "description": "Estimated monthly maintenance and utilities for the proposed property. 38 CFR 36.4340 calls for a realistic estimate of this figure for the property and local utility rates and sets no numeric multiplier itself, but VA underwriting guidance (the Lender's Handbook, Pamphlet 26-7) publishes a per-square-foot multiplier for this same estimate. Applying it needs the property's square footage, which this tool does not currently collect, so Senaro has no default to offer here and you supply the aggregate monthly amount instead. Supplying BOTH this field and monthly_taxes_and_retirement_withholding, together with proposed_home_price and a computable family_size/property_state, computes qualification.va.residual_income_comparison: your ACTUAL monthly residual income, its ratio to the va_residual_income_guideline figure, and whether residual_income_meets_review_waiver_margin (residual income at or above 120% of the guideline) is met. The shelter expense used here excludes any PMI (VA loans carry no monthly PMI; 38 CFR 36.4313(e) sets a funding fee instead, commonly financed into the loan; see va_funding_fee_financed_monthly for the financed-fee field). 38 CFR 36.4340(c)(3)'s review-waiver condition is CONJUNCTIVE: it also requires the back-end debt-to-income ratio (qualification.va.your_back_end) to exceed 41%, which this field does not by itself confirm. Check both fields together. Even when both hold, (c)(3) only WAIVES a second-level review requirement; it is not itself an approval. Whether this file is actually approved is an underwriting determination Senaro does not make and no input combination here determines. Missing any one of the needed inputs reads qualification.va.residual_income_comparison.status 'not_computable' with every reason named. Optional; must be zero or more.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / monthly_taxes_and_retirement_withholding
      Added value: +{
      +  "default": null,
      +  "description": "Your federal, state, and FICA tax withholding, plus any amount paid or withheld for retirement, monthly. 38 CFR 36.4340(f)(13) treats these as one class of deduction from gross income. Optional; must be zero or more.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / pmi_monthly
      Added value: +{
      +  "default": null,
      +  "description": "Monthly PMI (private mortgage insurance) in dollars. Optional; if omitted, auto-estimated at 0.5% of the loan annually when loan-to-value exceeds 80%. Feeds the conventional-basis PITI, so it moves with_proposed.front_end_dti, with_proposed.back_end_dti, with_proposed.front_end_breakdown, the conventional qualification row, and what_if.scenarios[].new_front_end_dti and new_back_end_dti. VA carries no PMI, and FHA and USDA always compute their own upfront-plus-annual mortgage insurance instead, at every loan-to-value, never this override. Must be zero or more.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / property_state
      Added value: +{
      +  "default": null,
      +  "description": "Two-letter USPS state code, or 'DC'/'PR'/'GU'/'VI'/'AS'/'MP'. Supply family_size and property_state together, or neither. Together these compute the VA residual income guideline (38 CFR 36.4340(e)) in va_residual_income_guideline: the dollar amount VA's tables require for this family size, region, and loan amount (derived from proposed_home_price; not computable without it), plus the 38 CFR 36.4340(c)(3) review-waiver figure. Computed only for family_size 1-7 and a property_state among the 50 states, DC, or PR (not GU, VI, AS, or MP; 38 CFR 36.4340(e) assigns no region to those four); outside those bounds, or without proposed_home_price, va_residual_income_guideline.status reads 'not_computable' with the reason instead. This block alone is a LOOKUP, not a verdict: it never compares against your actual residual income by itself. Optional.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / property_tax_annual
      Added value: +{
      +  "default": null,
      +  "description": "Annual property tax in dollars. Optional; if omitted, estimated at 0.88% of the proposed home price. Must be zero or more.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / proposed_debt
      Added value: +{
      +  "default": null,
      +  "description": "A proposed new debt, as an alternative to proposed_home_price. Provide at most one of proposed_debt or proposed_home_price; providing neither computes the current DTI only. Optional; a JSON null is treated as omitted, the same as leaving the field out.",
      +  "properties": {
      +    "includes_tax_insurance": {
      +      "description": "Whether monthly_payment already includes tax and insurance. Optional, defaults to true when omitted; if false and type is 'mortgage', warns that lenders use full PITI for DTI.",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "monthly_payment": {
      +      "description": "Monthly payment in dollars. Required; must be positive.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "name": {
      +      "description": "Optional label for this proposed debt.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "type": {
      +      "description": "Debt type: 'auto', 'student', 'credit_card', 'personal', 'mortgage', 'heloc', 'child_support', or 'other'. Optional, defaults to 'mortgage' when omitted; an unrecognized value is rejected.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / proposed_down_payment_pct
      Added value: +{
      +  "default": null,
      +  "description": "Down payment as a percent of the proposed home price, e.g. 20 for 20%. Optional; defaults to 20 when omitted. Must be between 0 and 99.9 (100% cash purchases are not supported).",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / proposed_home_price
      Added value: +{
      +  "default": null,
      +  "description": "Proposed home purchase price in dollars. Provide at most one of proposed_debt or proposed_home_price; providing neither computes the current DTI only. Auto-calculates full PITI (principal, interest, taxes, insurance). Optional; must be at least $0.01, one cent, the smallest amount of money.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / proposed_rate_pct
      Added value: +{
      +  "default": null,
      +  "description": "Proposed mortgage interest rate as a percent, e.g. 7.0 for 7.0%. Optional; the 7.0% default applies whenever this field is omitted, whether the proposal is proposed_debt or proposed_home_price. The default-rate warning fires only when proposed_home_price is used. Must be between 0 and 20.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / proposed_term_years
      Added value: +{
      +  "default": null,
      +  "description": "Proposed mortgage term in years. Optional; defaults to 30 when omitted. Must be between 1 and 40.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • removedInput schema / properties / toolArguments
      Removed value: -{
      -  "description": "JSON object with these parameters:\n\ngross_monthly_income: decimal > 0 (REQUIRED; OR provide annual_income instead)\nannual_income: decimal > 0 (alternative to gross_monthly_income; divided by 12)\nadditional_income: decimal >= 0 (optional, default 0; side income, rental income, bonuses. Monthly.)\n\nexisting_debts: array of debt objects (optional, can be empty):\n  - name: string (optional label, e.g. 'Car Loan')\n  - type: 'auto' | 'student' | 'credit_card' | 'personal' | 'mortgage' | 'heloc' | 'child_support' | 'other'\n  - monthly_payment: decimal > 0 (REQUIRED per debt)\n  - balance: decimal (optional; for payoff cost analysis in what-if scenarios)\n  - apr_pct: decimal 0-100 as PERCENTAGE (optional)\n  - months_remaining: int (optional; used for 10-month rule exclusion)\n\nproposed_debt: object (optional; OR use proposed_home_price instead):\n  - name: string (optional)\n  - type: 'auto' | 'student' | 'credit_card' | 'personal' | 'mortgage' | 'heloc' | 'child_support' | 'other' (optional, default 'mortgage')\n  - monthly_payment: decimal > 0 (REQUIRED)\n  - includes_tax_insurance: bool (optional, default true; if false and type is mortgage, warns that lenders use PITI)\n\nproposed_home_price: decimal > 0 (optional; auto-calculates full PITI. Cannot combine with proposed_debt.)\nproposed_down_payment_pct: decimal 0-99.9 as PERCENTAGE (optional, default 20)\nproposed_rate_pct: decimal 0-20 as PERCENTAGE (optional, default 7.0 with warning)\nproposed_term_years: int 1-40 (optional, default 30)\n\nproperty_tax_annual: decimal >= 0 (optional. For the PITI estimate, uses 0.88% national average if omitted)\nhome_insurance_annual: decimal >= 0 (optional. Uses 0.65% national average if omitted)\npmi_monthly: decimal >= 0 (optional. Auto-estimated at 0.5% of loan when LTV > 80%. Feeds the\n  conventional-basis PITI, so it moves with_proposed.front_end_dti, with_proposed.back_end_dti,\n  with_proposed.front_end_breakdown, the conventional qualification row, and\n  what_if.scenarios[].new_front_end_dti / new_back_end_dti. VA carries no PMI, and FHA/USDA always\n  compute their own upfront-plus-annual mortgage insurance instead, at every LTV, never this\n  override)\nhoa_monthly: decimal >= 0 (optional, default 0)\n\ninclude_what_if: bool (optional, default true; generate scenarios to improve DTI)\n\ntransaction_purpose: 'purchase' | 'refinance' | 'streamlined_assist' (optional, default 'purchase')\n  Affects USDA only, and only what is disclosed. USDA's 32% PITI and 44% Total Debt figures are\n  purchase-transaction waiver conditions (HB-1-3555 11.3.A.2), disclosed rather than applied as\n  ceilings: Senaro cannot observe how the file is underwritten, so a USDA ratio overage is never 'ineligible'\n  on any transaction purpose. For a refinance, 11.3.B states debt ratios 'are not limited to the\n  maximum purchase debt ratio thresholds', so where the note fires it names both figures and states that neither applies. Streamlined-assist\n  refinances require no debt ratio calculation at all. Conventional, FHA and VA are unaffected.\n\nfamily_size: int 1-20 (optional; must be supplied together with property_state, or neither fires)\nproperty_state: two-letter USPS state code, or 'DC'/'PR'/'GU'/'VI'/'AS'/'MP' (optional; must be supplied together with family_size)\n  Together these compute the VA residual income guideline (38 CFR 36.4340(e)) in\n  va_residual_income_guideline: the dollar amount VA's tables require for this family size, region,\n  and loan amount (derived from proposed_home_price; not computable without it), plus the 38 CFR\n  36.4340(c)(3) review-waiver figure. Computed only for family_size 1-7 and a property_state among\n  the 50 states, DC, or PR (not GU, VI, AS, or MP; 38 CFR 36.4340(e) assigns no region to those\n  four); outside those bounds, or without proposed_home_price, va_residual_income_guideline.status\n  reads 'not_computable' with the reason instead. This block alone is a LOOKUP, not a verdict: it\n  never compares against your actual residual income by itself.\n\nmonthly_taxes_and_retirement_withholding: decimal >= 0 (optional; your federal, state, and FICA tax\n  withholding, PLUS any amount paid or withheld for retirement, monthly. 38 CFR 36.4340(f)(13)\n  treats these as one class of deduction from gross income.)\nmonthly_maintenance_and_utilities: decimal >= 0 (optional; estimated monthly maintenance and utilities\n  for the proposed property. 38 CFR 36.4340 calls for a realistic estimate of this figure for the\n  property and local utility rates and sets no numeric multiplier itself, but VA underwriting\n  guidance (the Lender's Handbook, Pamphlet 26-7) publishes a per-square-foot multiplier for this\n  same estimate; applying it needs the property's square footage, which this tool does not\n  currently collect, so Senaro has no default to offer here and you supply the aggregate monthly\n  amount instead.)\n  Supplying BOTH of these, together with proposed_home_price and a computable family_size/\n  property_state above, computes qualification.va.residual_income_comparison: your ACTUAL monthly\n  residual income, its ratio to the va_residual_income_guideline figure, and whether\n  residual_income_meets_review_waiver_margin (residual income at or above 120% of the guideline) is\n  met. The shelter expense used here excludes any PMI (VA loans carry no monthly PMI; 38 CFR\n  36.4313(e) sets a funding fee instead, commonly financed into the loan -- see\n  va_funding_fee_financed_monthly below). 38 CFR 36.4340(c)(3)'s review-waiver condition is\n  CONJUNCTIVE: it also requires the back-end debt-to-income ratio (qualification.va.your_back_end)\n  to exceed 41%, which this field does not by itself confirm -- check both fields together. Even\n  when both hold, (c)(3) only WAIVES a second-level review requirement; it is not itself an\n  approval. Whether this file is actually approved is an underwriting determination Senaro does\n  not make and no input combination here determines. Missing any one of the needed inputs reads\n  qualification.va.residual_income_comparison.status 'not_computable' with every reason named.\nva_funding_fee_financed_monthly: decimal >= 0 (optional; the additional monthly payment from\n  financing a VA funding fee into the loan balance, if any. 38 CFR 36.4313(e)'s applicable\n  percentage depends on down payment, prior VA-loan use, and service category, none of which\n  Senaro collects, so there is no default; if omitted while any VA figure that depends on it is\n  produced -- qualification.va.your_back_end and its verdict, any what_if VA ratio,\n  what_if.max_affordable_home.va, or the residual-income comparison above -- a\n  VA_FUNDING_FEE_NOT_MODELED warning discloses that no fee is assumed. The home-price-reduction\n  what_if scenario's hypothetical price is fixed before the fee is considered, so a supplied fee\n  is scaled to that EXACT hypothetical loan size, since 38 CFR 36.4313(e)'s fee is a percentage\n  of loan principal. what_if.max_affordable_home.va is a two-pass approximation instead, so its\n  supplied fee is scaled to an ESTIMATE of the hypothetical loan size, not the exact figure\n  reported; the PMI, tax, and insurance reservation itself is an EXACT closed-form solve, so\n  only this fee-scaling step is approximate. Without proposed_home_price there is no reference\n  loan size to scale from either way, so the raw fee is reserved unscaled instead and a\n  VA_FUNDING_FEE_NOT_SCALED warning discloses it --\n  mutually exclusive with VA_FUNDING_FEE_NOT_MODELED by construction, since one requires the fee\n  omitted and the other requires it supplied.)"
      -}
    • addedInput schema / properties / transaction_purpose
      Added value: +{
      +  "default": null,
      +  "description": "Mortgage transaction purpose: 'purchase', 'refinance', or 'streamlined_assist'. Optional, defaults to 'purchase' when omitted. Affects USDA only, and only what is disclosed. USDA's 32% PITI and 44% Total Debt figures are purchase-transaction waiver conditions (HB-1-3555 11.3.A.2), disclosed rather than applied as ceilings: Senaro cannot observe how the file is underwritten, so a USDA ratio overage is never 'ineligible' on any transaction purpose. For a refinance, 11.3.B states debt ratios 'are not limited to the maximum purchase debt ratio thresholds', so where the note fires it names both figures and states that neither applies. Streamlined-assist refinances require no debt ratio calculation at all. Conventional, FHA and VA are unaffected.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / va_funding_fee_financed_monthly
      Added value: +{
      +  "default": null,
      +  "description": "The additional monthly payment from financing a VA funding fee into the loan balance, if any. 38 CFR 36.4313(e)'s applicable percentage depends on down payment, prior VA-loan use, and service category, none of which Senaro collects, so there is no default. If omitted while any VA figure that depends on it is produced, meaning qualification.va.your_back_end and its verdict, any what_if VA ratio, what_if.max_affordable_home.va, or qualification.va.residual_income_comparison, a VA_FUNDING_FEE_NOT_MODELED warning discloses that no fee is assumed. The home-price-reduction what_if scenario's hypothetical price is fixed before the fee is considered, so a supplied fee is scaled to that EXACT hypothetical loan size, since 38 CFR 36.4313(e)'s fee is a percentage of loan principal. what_if.max_affordable_home.va is a two-pass approximation instead, so its supplied fee is scaled to an ESTIMATE of the hypothetical loan size, not the exact figure reported; the PMI, tax, and insurance reservation itself is an EXACT closed-form solve, so only this fee-scaling step is approximate. Without proposed_home_price there is no reference loan size to scale from either way, so the raw fee is reserved unscaled instead, and a VA_FUNDING_FEE_NOT_SCALED warning discloses it. This is mutually exclusive with VA_FUNDING_FEE_NOT_MODELED by construction, since one requires the fee omitted and the other requires it supplied. Optional; must be zero or more.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • removedInput schema / required
      Removed value: -[
      -  "toolArguments"
      -]
  4. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/closed-world, and the description goes well beyond them: it discloses the tri-state `qualification_status` semantics, the meaning of the bare `qualifies` boolean, the CF A rounding rule for VA scenarios, and the conditional WARNING behavior for unmodeled VA fees. This is unusually rich behavioral context for a read-only calculator.

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

Conciseness3/5

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

The purpose and routing are correctly front-loaded, but the body is very long and duplicates blocks that the input schema already spells out verbatim (VA funding-fee scaling, PMI/tax/insurance defaults). For a domain this complex some length is earned, but the repetition with structured data costs it.

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

Completeness4/5

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

With no output schema and 20 parameters, the description compensates well by describing return fields (current DTI, front/back-end ratios, max affordable price, what-if scenarios) and the tri-state verdict semantics. A few mechanics (e.g., what `changes_qualification_va` contains) are named but not fully unpacked, keeping it short of a 5.

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

Parameters3/5

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

Schema description coverage is 100% and the parameter descriptions are themselves extremely detailed, so the schema does the heavy lifting. The description adds framing ('Accepts existing debts and an optional proposed new debt or home price') but no parameter-level syntax or constraints beyond what the schema already provides, so the baseline of 3 applies.

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 ('Calculate your debt-to-income ratio and check qualification for conventional, FHA, VA, and USDA mortgage programs') and explicitly names the sibling tools it is not (`compare_debt_consolidation`, `compare_rent_vs_buy`). An agent can route to it without opening any 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?

Explicitly states when to pick this tool ('to measure DTI ratios and mortgage-program qualification against existing debts') and gives two named alternatives with the exact question each answers. This is textbook when/when-not/alternative guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources